blob: 5e9ea6819e8fd235ae547629adab6df3ee455c02 [file] [log] [blame]
Eric Christopherb39156d2015-08-26 04:23:11 +00001//===--- Targets.cpp - Implement target feature support -------------------===//
Chris Lattner5ba61f02006-10-14 07:39:34 +00002//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner5b12ab82007-12-29 19:59:25 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Chris Lattner5ba61f02006-10-14 07:39:34 +00007//
8//===----------------------------------------------------------------------===//
9//
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000010// This file implements construction of a TargetInfo object from a
Ted Kremenek6f6ff372007-12-12 18:05:32 +000011// target triple.
Chris Lattner5ba61f02006-10-14 07:39:34 +000012//
13//===----------------------------------------------------------------------===//
14
Saleem Abdulrasool10a49722016-04-08 16:52:00 +000015#include "clang/Basic/TargetInfo.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000016#include "clang/Basic/Builtins.h"
17#include "clang/Basic/Diagnostic.h"
Chris Lattnerc7c6dd42008-12-04 22:54:33 +000018#include "clang/Basic/LangOptions.h"
Chandler Carruth26b29a02010-01-20 06:13:02 +000019#include "clang/Basic/MacroBuilder.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000020#include "clang/Basic/TargetBuiltins.h"
21#include "clang/Basic/TargetOptions.h"
Tim Northover756447a2015-10-30 16:30:36 +000022#include "clang/Basic/Version.h"
Eli Friedman7cef49e2008-05-20 14:27:34 +000023#include "llvm/ADT/APFloat.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000024#include "llvm/ADT/STLExtras.h"
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +000025#include "llvm/ADT/StringExtras.h"
Daniel Dunbar58bc48c2009-08-19 20:04:03 +000026#include "llvm/ADT/StringRef.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000027#include "llvm/ADT/StringSwitch.h"
Chris Lattner859c37a2009-08-12 06:24:27 +000028#include "llvm/ADT/Triple.h"
Chris Lattner30ba6742009-08-10 19:03:04 +000029#include "llvm/MC/MCSectionMachO.h"
David Blaikie76bd3c82011-09-23 05:35:21 +000030#include "llvm/Support/ErrorHandling.h"
Renato Golinf5c4dec2015-05-27 13:33:00 +000031#include "llvm/Support/TargetParser.h"
Benjamin Kramerdc2f0062010-01-09 18:20:57 +000032#include <algorithm>
Ahmed Charlesdfca6f92014-03-09 11:36:40 +000033#include <memory>
Hans Wennborg7eb54642015-09-10 17:07:54 +000034
Chris Lattner5ba61f02006-10-14 07:39:34 +000035using namespace clang;
36
Chris Lattner5ba61f02006-10-14 07:39:34 +000037//===----------------------------------------------------------------------===//
Chris Lattner1f5ad112006-10-14 18:32:12 +000038// Common code shared among targets.
Chris Lattner5ba61f02006-10-14 07:39:34 +000039//===----------------------------------------------------------------------===//
40
Chris Lattner1e1c0b92009-03-20 16:06:38 +000041/// DefineStd - Define a macro name and standard variants. For example if
42/// MacroName is "unix", then this will define "__unix", "__unix__", and "unix"
43/// when in GNU mode.
Chris Lattner0e62c1c2011-07-23 10:55:15 +000044static void DefineStd(MacroBuilder &Builder, StringRef MacroName,
Chris Lattner1e1c0b92009-03-20 16:06:38 +000045 const LangOptions &Opts) {
46 assert(MacroName[0] != '_' && "Identifier should be in the user's namespace");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000047
Chris Lattner1e1c0b92009-03-20 16:06:38 +000048 // If in GNU mode (e.g. -std=gnu99 but not -std=c99) define the raw identifier
49 // in the user's namespace.
50 if (Opts.GNUMode)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000051 Builder.defineMacro(MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000052
Chris Lattner1e1c0b92009-03-20 16:06:38 +000053 // Define __unix.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000054 Builder.defineMacro("__" + MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000055
Chris Lattner1e1c0b92009-03-20 16:06:38 +000056 // Define __unix__.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000057 Builder.defineMacro("__" + MacroName + "__");
Chris Lattner1e1c0b92009-03-20 16:06:38 +000058}
59
Benjamin Kramere3b442d2012-01-10 11:50:09 +000060static void defineCPUMacros(MacroBuilder &Builder, StringRef CPUName,
61 bool Tuning = true) {
62 Builder.defineMacro("__" + CPUName);
63 Builder.defineMacro("__" + CPUName + "__");
64 if (Tuning)
65 Builder.defineMacro("__tune_" + CPUName + "__");
66}
67
Justin Lebar76945b22016-04-29 23:05:19 +000068static TargetInfo *AllocateTarget(const llvm::Triple &Triple,
69 const TargetOptions &Opts);
70
Chris Lattner09d98f52008-10-05 21:50:58 +000071//===----------------------------------------------------------------------===//
72// Defines specific to certain operating systems.
73//===----------------------------------------------------------------------===//
Chris Lattner30ba6742009-08-10 19:03:04 +000074
Torok Edwinb2b37c62009-06-30 17:10:35 +000075namespace {
Douglas Gregorc05d2a12009-07-01 15:12:53 +000076template<typename TgtInfo>
77class OSTargetInfo : public TgtInfo {
Torok Edwinb2b37c62009-06-30 17:10:35 +000078protected:
Daniel Dunbar40165182009-08-24 09:10:05 +000079 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000080 MacroBuilder &Builder) const=0;
Torok Edwinb2b37c62009-06-30 17:10:35 +000081public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +000082 OSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
83 : TgtInfo(Triple, Opts) {}
Craig Topper3164f332014-03-11 03:39:26 +000084 void getTargetDefines(const LangOptions &Opts,
85 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000086 TgtInfo::getTargetDefines(Opts, Builder);
87 getOSDefines(Opts, TgtInfo::getTriple(), Builder);
Torok Edwin4e054162009-06-30 17:00:25 +000088 }
Torok Edwinb2b37c62009-06-30 17:10:35 +000089
90};
Chris Lattner30ba6742009-08-10 19:03:04 +000091
Eric Christopher7d0c7252015-09-24 21:17:04 +000092// CloudABI Target
93template <typename Target>
94class CloudABITargetInfo : public OSTargetInfo<Target> {
95protected:
96 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
97 MacroBuilder &Builder) const override {
98 Builder.defineMacro("__CloudABI__");
99 Builder.defineMacro("__ELF__");
100
101 // CloudABI uses ISO/IEC 10646:2012 for wchar_t, char16_t and char32_t.
102 Builder.defineMacro("__STDC_ISO_10646__", "201206L");
103 Builder.defineMacro("__STDC_UTF_16__");
104 Builder.defineMacro("__STDC_UTF_32__");
105 }
106
107public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000108 CloudABITargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
109 : OSTargetInfo<Target>(Triple, Opts) {}
Eric Christopher7d0c7252015-09-24 21:17:04 +0000110};
111
Daniel Dunbard86666f2010-01-26 01:44:04 +0000112static void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000113 const llvm::Triple &Triple,
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000114 StringRef &PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000115 VersionTuple &PlatformMinVersion) {
Bob Wilson834400b2013-08-19 20:23:37 +0000116 Builder.defineMacro("__APPLE_CC__", "6000");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000117 Builder.defineMacro("__APPLE__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000118 Builder.defineMacro("OBJC_NEW_PROPERTIES");
Alexander Potapenkob4f81902012-09-20 10:10:01 +0000119 // AddressSanitizer doesn't play well with source fortification, which is on
120 // by default on Darwin.
Alexey Samsonovedf99a92014-11-07 22:29:38 +0000121 if (Opts.Sanitize.has(SanitizerKind::Address))
122 Builder.defineMacro("_FORTIFY_SOURCE", "0");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000123
John McCall460ce582015-10-22 18:38:17 +0000124 // Darwin defines __weak, __strong, and __unsafe_unretained even in C mode.
125 if (!Opts.ObjC1) {
John McCall31168b02011-06-15 23:02:42 +0000126 // __weak is always defined, for use in blocks and with objc pointers.
127 Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))");
John McCall460ce582015-10-22 18:38:17 +0000128 Builder.defineMacro("__strong", "");
John McCall31168b02011-06-15 23:02:42 +0000129 Builder.defineMacro("__unsafe_unretained", "");
John McCall31168b02011-06-15 23:02:42 +0000130 }
Eric Christopher0c912c52011-07-07 22:55:26 +0000131
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000132 if (Opts.Static)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000133 Builder.defineMacro("__STATIC__");
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000134 else
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000135 Builder.defineMacro("__DYNAMIC__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000136
137 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000138 Builder.defineMacro("_REENTRANT");
Daniel Dunbar497ff132009-04-10 19:52:24 +0000139
Daniel Dunbarecf13562011-04-19 21:40:34 +0000140 // Get the platform type and version number from the triple.
Daniel Dunbar497ff132009-04-10 19:52:24 +0000141 unsigned Maj, Min, Rev;
Bob Wilson8e5acc52012-01-31 23:52:58 +0000142 if (Triple.isMacOSX()) {
143 Triple.getMacOSXVersion(Maj, Min, Rev);
Manman Renccf25bb2016-06-28 20:55:30 +0000144 PlatformName = "macos";
Daniel Dunbarecf13562011-04-19 21:40:34 +0000145 } else {
Bob Wilson8e5acc52012-01-31 23:52:58 +0000146 Triple.getOSVersion(Maj, Min, Rev);
147 PlatformName = llvm::Triple::getOSTypeName(Triple.getOS());
Daniel Dunbarecf13562011-04-19 21:40:34 +0000148 }
Daniel Dunbard86666f2010-01-26 01:44:04 +0000149
Sebastian Pop422377c2012-01-20 22:01:23 +0000150 // If -target arch-pc-win32-macho option specified, we're
Eric Christopherb081ba62011-07-29 21:20:35 +0000151 // generating code for Win32 ABI. No need to emit
Chad Rosierb90e4022011-07-19 20:00:06 +0000152 // __ENVIRONMENT_XX_OS_VERSION_MIN_REQUIRED__.
153 if (PlatformName == "win32") {
154 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
155 return;
156 }
157
Evan Cheng31dd9a62014-01-26 23:12:43 +0000158 // Set the appropriate OS version define.
159 if (Triple.isiOS()) {
160 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
161 char Str[6];
162 Str[0] = '0' + Maj;
163 Str[1] = '0' + (Min / 10);
164 Str[2] = '0' + (Min % 10);
165 Str[3] = '0' + (Rev / 10);
166 Str[4] = '0' + (Rev % 10);
167 Str[5] = '\0';
Tim Northover67465f82015-10-30 16:30:30 +0000168 if (Triple.isTvOS())
169 Builder.defineMacro("__ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__", Str);
170 else
171 Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__",
172 Str);
173
174 } else if (Triple.isWatchOS()) {
175 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
176 char Str[6];
177 Str[0] = '0' + Maj;
178 Str[1] = '0' + (Min / 10);
179 Str[2] = '0' + (Min % 10);
180 Str[3] = '0' + (Rev / 10);
181 Str[4] = '0' + (Rev % 10);
182 Str[5] = '\0';
183 Builder.defineMacro("__ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__", Str);
Evan Cheng31dd9a62014-01-26 23:12:43 +0000184 } else if (Triple.isMacOSX()) {
185 // Note that the Driver allows versions which aren't representable in the
186 // define (because we only get a single digit for the minor and micro
187 // revision numbers). So, we limit them to the maximum representable
188 // version.
189 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
Bob Wilson2a3710e2014-08-08 21:45:53 +0000190 char Str[7];
191 if (Maj < 10 || (Maj == 10 && Min < 10)) {
192 Str[0] = '0' + (Maj / 10);
193 Str[1] = '0' + (Maj % 10);
194 Str[2] = '0' + std::min(Min, 9U);
195 Str[3] = '0' + std::min(Rev, 9U);
196 Str[4] = '\0';
197 } else {
198 // Handle versions > 10.9.
199 Str[0] = '0' + (Maj / 10);
200 Str[1] = '0' + (Maj % 10);
201 Str[2] = '0' + (Min / 10);
202 Str[3] = '0' + (Min % 10);
203 Str[4] = '0' + (Rev / 10);
204 Str[5] = '0' + (Rev % 10);
205 Str[6] = '\0';
206 }
Evan Cheng31dd9a62014-01-26 23:12:43 +0000207 Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
Daniel Dunbar497ff132009-04-10 19:52:24 +0000208 }
Daniel Dunbarecf13562011-04-19 21:40:34 +0000209
Tim Northover157d9112014-01-16 08:48:16 +0000210 // Tell users about the kernel if there is one.
211 if (Triple.isOSDarwin())
212 Builder.defineMacro("__MACH__");
213
Chris Bieneman46977b62016-04-29 17:53:00 +0000214 // The Watch ABI uses Dwarf EH.
215 if(Triple.isWatchABI())
216 Builder.defineMacro("__ARM_DWARF_EH__");
217
Daniel Dunbarecf13562011-04-19 21:40:34 +0000218 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
Eli Friedman3fd920a2008-08-20 02:34:37 +0000219}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000220
Torok Edwinb2b37c62009-06-30 17:10:35 +0000221template<typename Target>
222class DarwinTargetInfo : public OSTargetInfo<Target> {
223protected:
Craig Topper3164f332014-03-11 03:39:26 +0000224 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
225 MacroBuilder &Builder) const override {
Eric Christopher0c912c52011-07-07 22:55:26 +0000226 getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000227 this->PlatformMinVersion);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000228 }
Mike Stump11289f42009-09-09 15:08:12 +0000229
Torok Edwinb2b37c62009-06-30 17:10:35 +0000230public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000231 DarwinTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
232 : OSTargetInfo<Target>(Triple, Opts) {
Tim Northovera12d0a92016-01-07 09:04:46 +0000233 // By default, no TLS, and we whitelist permitted architecture/OS
234 // combinations.
235 this->TLSSupported = false;
236
237 if (Triple.isMacOSX())
238 this->TLSSupported = !Triple.isMacOSXVersionLT(10, 7);
239 else if (Triple.isiOS()) {
240 // 64-bit iOS supported it from 8 onwards, 32-bit from 9 onwards.
241 if (Triple.getArch() == llvm::Triple::x86_64 ||
242 Triple.getArch() == llvm::Triple::aarch64)
243 this->TLSSupported = !Triple.isOSVersionLT(8);
244 else if (Triple.getArch() == llvm::Triple::x86 ||
245 Triple.getArch() == llvm::Triple::arm ||
246 Triple.getArch() == llvm::Triple::thumb)
247 this->TLSSupported = !Triple.isOSVersionLT(9);
248 } else if (Triple.isWatchOS())
249 this->TLSSupported = !Triple.isOSVersionLT(2);
250
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000251 this->MCountName = "\01mcount";
252 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000253
Craig Topper3164f332014-03-11 03:39:26 +0000254 std::string isValidSectionSpecifier(StringRef SR) const override {
Chris Lattner30ba6742009-08-10 19:03:04 +0000255 // Let MCSectionMachO validate this.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000256 StringRef Segment, Section;
Chris Lattner30ba6742009-08-10 19:03:04 +0000257 unsigned TAA, StubSize;
Daniel Dunbar75942372011-03-19 02:06:21 +0000258 bool HasTAA;
Chris Lattner30ba6742009-08-10 19:03:04 +0000259 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
Daniel Dunbar75942372011-03-19 02:06:21 +0000260 TAA, HasTAA, StubSize);
Chris Lattner30ba6742009-08-10 19:03:04 +0000261 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000262
Craig Topper3164f332014-03-11 03:39:26 +0000263 const char *getStaticInitSectionSpecifier() const override {
Anders Carlsson851318a2010-06-08 22:47:50 +0000264 // FIXME: We should return 0 when building kexts.
265 return "__TEXT,__StaticInit,regular,pure_instructions";
266 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000267
John McCalleed64c72012-01-29 01:20:30 +0000268 /// Darwin does not support protected visibility. Darwin's "default"
269 /// is very similar to ELF's "protected"; Darwin requires a "weak"
270 /// attribute on declarations that can be dynamically replaced.
Craig Topper3164f332014-03-11 03:39:26 +0000271 bool hasProtectedVisibility() const override {
John McCalleed64c72012-01-29 01:20:30 +0000272 return false;
273 }
Akira Hatanaka68ab7fe2016-03-31 06:36:07 +0000274
275 unsigned getExnObjectAlignment() const override {
276 // The alignment of an exception object is 8-bytes for darwin since
277 // libc++abi doesn't declare _Unwind_Exception with __attribute__((aligned))
278 // and therefore doesn't guarantee 16-byte alignment.
279 return 64;
280 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000281};
282
Chris Lattner30ba6742009-08-10 19:03:04 +0000283
Torok Edwinb2b37c62009-06-30 17:10:35 +0000284// DragonFlyBSD Target
285template<typename Target>
286class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
287protected:
Craig Topper3164f332014-03-11 03:39:26 +0000288 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
289 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000290 // DragonFly defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000291 Builder.defineMacro("__DragonFly__");
292 Builder.defineMacro("__DragonFly_cc_version", "100001");
293 Builder.defineMacro("__ELF__");
294 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
295 Builder.defineMacro("__tune_i386__");
296 DefineStd(Builder, "unix", Opts);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000297 }
298public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000299 DragonFlyBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
300 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000301 switch (Triple.getArch()) {
302 default:
303 case llvm::Triple::x86:
304 case llvm::Triple::x86_64:
305 this->MCountName = ".mcount";
306 break;
307 }
Eli Friedman4286fba2012-02-10 23:02:29 +0000308 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000309};
310
Dimitry Andricc6d924c2016-05-20 17:27:22 +0000311#ifndef FREEBSD_CC_VERSION
312#define FREEBSD_CC_VERSION 0U
313#endif
314
Torok Edwinb2b37c62009-06-30 17:10:35 +0000315// FreeBSD Target
316template<typename Target>
317class FreeBSDTargetInfo : public OSTargetInfo<Target> {
318protected:
Craig Topper3164f332014-03-11 03:39:26 +0000319 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
320 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000321 // FreeBSD defines; list based off of gcc output
322
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000323 unsigned Release = Triple.getOSMajorVersion();
324 if (Release == 0U)
Dimitry Andricc6d924c2016-05-20 17:27:22 +0000325 Release = 8U;
326 unsigned CCVersion = FREEBSD_CC_VERSION;
327 if (CCVersion == 0U)
328 CCVersion = Release * 100000U + 1U;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000329
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000330 Builder.defineMacro("__FreeBSD__", Twine(Release));
Dimitry Andricc6d924c2016-05-20 17:27:22 +0000331 Builder.defineMacro("__FreeBSD_cc_version", Twine(CCVersion));
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000332 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
333 DefineStd(Builder, "unix", Opts);
334 Builder.defineMacro("__ELF__");
Ed Schoutend0621462013-09-29 07:54:52 +0000335
336 // On FreeBSD, wchar_t contains the number of the code point as
337 // used by the character set of the locale. These character sets are
338 // not necessarily a superset of ASCII.
Richard Smith00a4a852015-01-13 01:47:45 +0000339 //
340 // FIXME: This is wrong; the macro refers to the numerical values
341 // of wchar_t *literals*, which are not locale-dependent. However,
342 // FreeBSD systems apparently depend on us getting this wrong, and
343 // setting this to 1 is conforming even if all the basic source
344 // character literals have the same encoding as char and wchar_t.
Ed Schoutend0621462013-09-29 07:54:52 +0000345 Builder.defineMacro("__STDC_MB_MIGHT_NEQ_WC__", "1");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000346 }
347public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000348 FreeBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
349 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000350 switch (Triple.getArch()) {
351 default:
352 case llvm::Triple::x86:
353 case llvm::Triple::x86_64:
354 this->MCountName = ".mcount";
355 break;
356 case llvm::Triple::mips:
357 case llvm::Triple::mipsel:
358 case llvm::Triple::ppc:
359 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +0000360 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000361 this->MCountName = "_mcount";
362 break;
363 case llvm::Triple::arm:
364 this->MCountName = "__mcount";
365 break;
Duncan Sands9cb27e92009-07-08 13:55:08 +0000366 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000367 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000368};
369
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000370// GNU/kFreeBSD Target
371template<typename Target>
372class KFreeBSDTargetInfo : public OSTargetInfo<Target> {
373protected:
Craig Topper3164f332014-03-11 03:39:26 +0000374 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
375 MacroBuilder &Builder) const override {
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000376 // GNU/kFreeBSD defines; list based off of gcc output
377
378 DefineStd(Builder, "unix", Opts);
379 Builder.defineMacro("__FreeBSD_kernel__");
380 Builder.defineMacro("__GLIBC__");
381 Builder.defineMacro("__ELF__");
382 if (Opts.POSIXThreads)
383 Builder.defineMacro("_REENTRANT");
384 if (Opts.CPlusPlus)
385 Builder.defineMacro("_GNU_SOURCE");
386 }
387public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000388 KFreeBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
389 : OSTargetInfo<Target>(Triple, Opts) {}
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000390};
391
Reid Kleckner330fb172016-05-11 16:19:05 +0000392// Haiku Target
393template<typename Target>
394class HaikuTargetInfo : public OSTargetInfo<Target> {
395protected:
396 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
397 MacroBuilder &Builder) const override {
398 // Haiku defines; list based off of gcc output
399 Builder.defineMacro("__HAIKU__");
400 Builder.defineMacro("__ELF__");
401 DefineStd(Builder, "unix", Opts);
402 }
403public:
404 HaikuTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
405 : OSTargetInfo<Target>(Triple, Opts) {
406 this->SizeType = TargetInfo::UnsignedLong;
407 this->IntPtrType = TargetInfo::SignedLong;
408 this->PtrDiffType = TargetInfo::SignedLong;
409 this->ProcessIDType = TargetInfo::SignedLong;
410 this->TLSSupported = false;
411
412 }
413};
414
Chris Lattner3e2ee142010-07-07 16:01:42 +0000415// Minix Target
416template<typename Target>
417class MinixTargetInfo : public OSTargetInfo<Target> {
418protected:
Craig Topper3164f332014-03-11 03:39:26 +0000419 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
420 MacroBuilder &Builder) const override {
Chris Lattner3e2ee142010-07-07 16:01:42 +0000421 // Minix defines
422
423 Builder.defineMacro("__minix", "3");
424 Builder.defineMacro("_EM_WSIZE", "4");
425 Builder.defineMacro("_EM_PSIZE", "4");
426 Builder.defineMacro("_EM_SSIZE", "2");
427 Builder.defineMacro("_EM_LSIZE", "4");
428 Builder.defineMacro("_EM_FSIZE", "4");
429 Builder.defineMacro("_EM_DSIZE", "8");
Eli Friedman83de5132011-12-08 23:54:21 +0000430 Builder.defineMacro("__ELF__");
Chris Lattner3e2ee142010-07-07 16:01:42 +0000431 DefineStd(Builder, "unix", Opts);
432 }
433public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000434 MinixTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
435 : OSTargetInfo<Target>(Triple, Opts) {}
Chris Lattner3e2ee142010-07-07 16:01:42 +0000436};
437
Torok Edwinb2b37c62009-06-30 17:10:35 +0000438// Linux target
439template<typename Target>
440class LinuxTargetInfo : public OSTargetInfo<Target> {
441protected:
Craig Topper3164f332014-03-11 03:39:26 +0000442 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
443 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000444 // Linux defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000445 DefineStd(Builder, "unix", Opts);
446 DefineStd(Builder, "linux", Opts);
447 Builder.defineMacro("__gnu_linux__");
448 Builder.defineMacro("__ELF__");
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +0000449 if (Triple.isAndroid()) {
Evgeniy Stepanov94dc4c92012-04-26 12:08:09 +0000450 Builder.defineMacro("__ANDROID__", "1");
Dan Albert84aee012015-03-03 18:28:38 +0000451 unsigned Maj, Min, Rev;
David Majnemer5c2589a2015-06-01 23:38:25 +0000452 Triple.getEnvironmentVersion(Maj, Min, Rev);
Dan Albert84aee012015-03-03 18:28:38 +0000453 this->PlatformName = "android";
454 this->PlatformMinVersion = VersionTuple(Maj, Min, Rev);
455 }
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000456 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000457 Builder.defineMacro("_REENTRANT");
Douglas Gregor3ecc6652010-04-21 05:52:38 +0000458 if (Opts.CPlusPlus)
459 Builder.defineMacro("_GNU_SOURCE");
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +0000460 if (this->HasFloat128)
461 Builder.defineMacro("__FLOAT128__");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000462 }
463public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000464 LinuxTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
465 : OSTargetInfo<Target>(Triple, Opts) {
Douglas Gregore6d6e512011-01-12 21:19:25 +0000466 this->WIntType = TargetInfo::UnsignedInt;
Hal Finkelecdb4542014-03-30 13:00:06 +0000467
468 switch (Triple.getArch()) {
469 default:
470 break;
471 case llvm::Triple::ppc:
472 case llvm::Triple::ppc64:
473 case llvm::Triple::ppc64le:
474 this->MCountName = "_mcount";
475 break;
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +0000476 case llvm::Triple::x86:
477 case llvm::Triple::x86_64:
478 case llvm::Triple::systemz:
479 this->HasFloat128 = true;
480 break;
Hal Finkelecdb4542014-03-30 13:00:06 +0000481 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000482 }
Benjamin Kramera518b222011-10-15 17:53:33 +0000483
Craig Topper3164f332014-03-11 03:39:26 +0000484 const char *getStaticInitSectionSpecifier() const override {
Benjamin Kramera518b222011-10-15 17:53:33 +0000485 return ".text.startup";
486 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000487};
488
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000489// NetBSD Target
490template<typename Target>
491class NetBSDTargetInfo : public OSTargetInfo<Target> {
492protected:
Craig Topper3164f332014-03-11 03:39:26 +0000493 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
494 MacroBuilder &Builder) const override {
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000495 // NetBSD defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000496 Builder.defineMacro("__NetBSD__");
497 Builder.defineMacro("__unix__");
498 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000499 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000500 Builder.defineMacro("_POSIX_THREADS");
Joerg Sonnenbergercc1edb52014-05-13 18:58:36 +0000501
502 switch (Triple.getArch()) {
503 default:
504 break;
505 case llvm::Triple::arm:
506 case llvm::Triple::armeb:
507 case llvm::Triple::thumb:
508 case llvm::Triple::thumbeb:
509 Builder.defineMacro("__ARM_DWARF_EH__");
510 break;
511 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000512 }
513public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000514 NetBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
515 : OSTargetInfo<Target>(Triple, Opts) {
Joerg Sonnenberger740f3f42015-04-10 21:02:53 +0000516 this->MCountName = "_mcount";
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000517 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000518};
519
Torok Edwinb2b37c62009-06-30 17:10:35 +0000520// OpenBSD Target
521template<typename Target>
522class OpenBSDTargetInfo : public OSTargetInfo<Target> {
523protected:
Craig Topper3164f332014-03-11 03:39:26 +0000524 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
525 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000526 // OpenBSD defines; list based off of gcc output
527
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000528 Builder.defineMacro("__OpenBSD__");
529 DefineStd(Builder, "unix", Opts);
530 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000531 if (Opts.POSIXThreads)
Chris Lattner024e12d2012-04-25 06:12:24 +0000532 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000533 }
534public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000535 OpenBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
536 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000537 this->TLSSupported = false;
Eli Friedman3715d1f2011-12-15 02:15:56 +0000538
Eli Friedman3715d1f2011-12-15 02:15:56 +0000539 switch (Triple.getArch()) {
540 default:
541 case llvm::Triple::x86:
542 case llvm::Triple::x86_64:
543 case llvm::Triple::arm:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000544 case llvm::Triple::sparc:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000545 this->MCountName = "__mcount";
546 break;
547 case llvm::Triple::mips64:
548 case llvm::Triple::mips64el:
549 case llvm::Triple::ppc:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000550 case llvm::Triple::sparcv9:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000551 this->MCountName = "_mcount";
552 break;
553 }
554 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000555};
556
Eli Friedman9fa28852012-08-08 23:57:20 +0000557// Bitrig Target
558template<typename Target>
559class BitrigTargetInfo : public OSTargetInfo<Target> {
560protected:
Craig Topper3164f332014-03-11 03:39:26 +0000561 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
562 MacroBuilder &Builder) const override {
Eli Friedman9fa28852012-08-08 23:57:20 +0000563 // Bitrig defines; list based off of gcc output
564
565 Builder.defineMacro("__Bitrig__");
566 DefineStd(Builder, "unix", Opts);
567 Builder.defineMacro("__ELF__");
568 if (Opts.POSIXThreads)
569 Builder.defineMacro("_REENTRANT");
Renato Golin9ba39232015-02-27 16:35:48 +0000570
571 switch (Triple.getArch()) {
572 default:
573 break;
574 case llvm::Triple::arm:
575 case llvm::Triple::armeb:
576 case llvm::Triple::thumb:
577 case llvm::Triple::thumbeb:
578 Builder.defineMacro("__ARM_DWARF_EH__");
579 break;
580 }
Eli Friedman9fa28852012-08-08 23:57:20 +0000581 }
582public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000583 BitrigTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
584 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000585 this->MCountName = "__mcount";
Eli Friedman9fa28852012-08-08 23:57:20 +0000586 }
587};
588
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000589// PSP Target
590template<typename Target>
591class PSPTargetInfo : public OSTargetInfo<Target> {
592protected:
Craig Topper3164f332014-03-11 03:39:26 +0000593 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
594 MacroBuilder &Builder) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000595 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000596 Builder.defineMacro("PSP");
597 Builder.defineMacro("_PSP");
598 Builder.defineMacro("__psp__");
599 Builder.defineMacro("__ELF__");
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000600 }
601public:
James Y Knightb214cbc2016-03-04 19:00:41 +0000602 PSPTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {}
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000603};
604
John Thompsone467e192009-11-19 17:18:50 +0000605// PS3 PPU Target
606template<typename Target>
607class PS3PPUTargetInfo : public OSTargetInfo<Target> {
608protected:
Craig Topper3164f332014-03-11 03:39:26 +0000609 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
610 MacroBuilder &Builder) const override {
John Thompsone467e192009-11-19 17:18:50 +0000611 // PS3 PPU defines.
John Thompson957816f2010-03-25 16:18:32 +0000612 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000613 Builder.defineMacro("__PPU__");
614 Builder.defineMacro("__CELLOS_LV2__");
615 Builder.defineMacro("__ELF__");
616 Builder.defineMacro("__LP32__");
John Thompson07a61a42010-06-24 22:44:13 +0000617 Builder.defineMacro("_ARCH_PPC64");
618 Builder.defineMacro("__powerpc64__");
John Thompsone467e192009-11-19 17:18:50 +0000619 }
620public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000621 PS3PPUTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
622 : OSTargetInfo<Target>(Triple, Opts) {
Nick Lewyckyc0a61732011-12-16 22:32:39 +0000623 this->LongWidth = this->LongAlign = 32;
624 this->PointerWidth = this->PointerAlign = 32;
John Thompson07a61a42010-06-24 22:44:13 +0000625 this->IntMaxType = TargetInfo::SignedLongLong;
John Thompson07a61a42010-06-24 22:44:13 +0000626 this->Int64Type = TargetInfo::SignedLongLong;
John Thompson6f8dba72009-12-18 14:21:08 +0000627 this->SizeType = TargetInfo::UnsignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +0000628 this->resetDataLayout("E-m:e-p:32:32-i64:64-n32:64");
John Thompsone467e192009-11-19 17:18:50 +0000629 }
630};
631
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000632template <typename Target>
633class PS4OSTargetInfo : public OSTargetInfo<Target> {
634protected:
635 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
636 MacroBuilder &Builder) const override {
637 Builder.defineMacro("__FreeBSD__", "9");
638 Builder.defineMacro("__FreeBSD_cc_version", "900001");
639 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
640 DefineStd(Builder, "unix", Opts);
641 Builder.defineMacro("__ELF__");
Paul Robinson9d613612016-05-16 17:22:25 +0000642 Builder.defineMacro("__ORBIS__");
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000643 }
644public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000645 PS4OSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
646 : OSTargetInfo<Target>(Triple, Opts) {
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000647 this->WCharType = this->UnsignedShort;
648
Paul Robinsond30e2ee2015-07-14 20:52:32 +0000649 // On PS4, TLS variable cannot be aligned to more than 32 bytes (256 bits).
650 this->MaxTLSAlign = 256;
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000651
Sunil Srivastava0ce2f222016-02-05 20:50:02 +0000652 // On PS4, do not honor explicit bit field alignment,
653 // as in "__attribute__((aligned(2))) int b : 1;".
654 this->UseExplicitBitFieldAlignment = false;
655
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000656 switch (Triple.getArch()) {
657 default:
658 case llvm::Triple::x86_64:
659 this->MCountName = ".mcount";
660 break;
661 }
662 }
663};
664
Torok Edwinb2b37c62009-06-30 17:10:35 +0000665// Solaris target
666template<typename Target>
667class SolarisTargetInfo : public OSTargetInfo<Target> {
668protected:
Craig Topper3164f332014-03-11 03:39:26 +0000669 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
670 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000671 DefineStd(Builder, "sun", Opts);
672 DefineStd(Builder, "unix", Opts);
673 Builder.defineMacro("__ELF__");
674 Builder.defineMacro("__svr4__");
675 Builder.defineMacro("__SVR4");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000676 // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and
677 // newer, but to 500 for everything else. feature_test.h has a check to
678 // ensure that you are not using C99 with an old version of X/Open or C89
Richard Smithab506ad2014-10-20 23:26:58 +0000679 // with a new version.
680 if (Opts.C99)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000681 Builder.defineMacro("_XOPEN_SOURCE", "600");
682 else
683 Builder.defineMacro("_XOPEN_SOURCE", "500");
David Chisnalle04307e2012-03-02 10:49:52 +0000684 if (Opts.CPlusPlus)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000685 Builder.defineMacro("__C99FEATURES__");
David Chisnall0c1941cb2012-02-17 18:35:11 +0000686 Builder.defineMacro("_LARGEFILE_SOURCE");
687 Builder.defineMacro("_LARGEFILE64_SOURCE");
688 Builder.defineMacro("__EXTENSIONS__");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000689 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000690 }
691public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000692 SolarisTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
693 : OSTargetInfo<Target>(Triple, Opts) {
David Chisnallb526e932012-03-28 18:04:14 +0000694 this->WCharType = this->SignedInt;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000695 // FIXME: WIntType should be SignedLong
696 }
697};
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000698
699// Windows target
700template<typename Target>
701class WindowsTargetInfo : public OSTargetInfo<Target> {
702protected:
Craig Topper3164f332014-03-11 03:39:26 +0000703 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
704 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000705 Builder.defineMacro("_WIN32");
706 }
707 void getVisualStudioDefines(const LangOptions &Opts,
708 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000709 if (Opts.CPlusPlus) {
David Majnemerf6072342014-07-01 22:24:56 +0000710 if (Opts.RTTIData)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000711 Builder.defineMacro("_CPPRTTI");
712
Reid Kleckner16514352015-01-30 21:42:55 +0000713 if (Opts.CXXExceptions)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000714 Builder.defineMacro("_CPPUNWIND");
715 }
716
David Majnemer6a658902015-07-22 22:36:26 +0000717 if (Opts.Bool)
718 Builder.defineMacro("__BOOL_DEFINED");
719
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000720 if (!Opts.CharIsSigned)
721 Builder.defineMacro("_CHAR_UNSIGNED");
722
723 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
724 // but it works for now.
725 if (Opts.POSIXThreads)
726 Builder.defineMacro("_MT");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000727
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +0000728 if (Opts.MSCompatibilityVersion) {
729 Builder.defineMacro("_MSC_VER",
730 Twine(Opts.MSCompatibilityVersion / 100000));
731 Builder.defineMacro("_MSC_FULL_VER", Twine(Opts.MSCompatibilityVersion));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000732 // FIXME We cannot encode the revision information into 32-bits
733 Builder.defineMacro("_MSC_BUILD", Twine(1));
David Majnemeraaf2b842015-03-18 07:53:18 +0000734
David Majnemerb710a932015-05-11 03:57:49 +0000735 if (Opts.CPlusPlus11 && Opts.isCompatibleWithMSVC(LangOptions::MSVC2015))
David Majnemeraaf2b842015-03-18 07:53:18 +0000736 Builder.defineMacro("_HAS_CHAR16_T_LANGUAGE_SUPPORT", Twine(1));
David Majnemer017cf352016-06-28 03:13:16 +0000737
738 if (Opts.isCompatibleWithMSVC(LangOptions::MSVC2015)) {
739 if (Opts.CPlusPlus1z)
740 Builder.defineMacro("_MSVC_LANG", "201403L");
741 else if (Opts.CPlusPlus14)
742 Builder.defineMacro("_MSVC_LANG", "201402L");
743 }
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000744 }
Reid Kleckner6f6e76d2014-04-16 20:10:16 +0000745
746 if (Opts.MicrosoftExt) {
747 Builder.defineMacro("_MSC_EXTENSIONS");
748
749 if (Opts.CPlusPlus11) {
750 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
751 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
752 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
753 }
754 }
755
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000756 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000757 }
758
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000759public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000760 WindowsTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
761 : OSTargetInfo<Target>(Triple, Opts) {}
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000762};
763
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000764template <typename Target>
765class NaClTargetInfo : public OSTargetInfo<Target> {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000766protected:
Craig Topper3164f332014-03-11 03:39:26 +0000767 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
768 MacroBuilder &Builder) const override {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000769 if (Opts.POSIXThreads)
770 Builder.defineMacro("_REENTRANT");
771 if (Opts.CPlusPlus)
772 Builder.defineMacro("_GNU_SOURCE");
773
774 DefineStd(Builder, "unix", Opts);
775 Builder.defineMacro("__ELF__");
776 Builder.defineMacro("__native_client__");
777 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000778
779public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000780 NaClTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
781 : OSTargetInfo<Target>(Triple, Opts) {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000782 this->LongAlign = 32;
783 this->LongWidth = 32;
784 this->PointerAlign = 32;
785 this->PointerWidth = 32;
786 this->IntMaxType = TargetInfo::SignedLongLong;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000787 this->Int64Type = TargetInfo::SignedLongLong;
788 this->DoubleAlign = 64;
789 this->LongDoubleWidth = 64;
790 this->LongDoubleAlign = 64;
Jan Wen Voung1f9c4ee2014-01-15 21:42:41 +0000791 this->LongLongWidth = 64;
792 this->LongLongAlign = 64;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000793 this->SizeType = TargetInfo::UnsignedInt;
794 this->PtrDiffType = TargetInfo::SignedInt;
795 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +0000796 // RegParmMax is inherited from the underlying architecture
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000797 this->LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Rafael Espindola1c09b262013-12-18 23:41:04 +0000798 if (Triple.getArch() == llvm::Triple::arm) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +0000799 // Handled in ARM's setABI().
Rafael Espindola1c09b262013-12-18 23:41:04 +0000800 } else if (Triple.getArch() == llvm::Triple::x86) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000801 this->resetDataLayout("e-m:e-p:32:32-i64:64-n8:16:32-S128");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000802 } else if (Triple.getArch() == llvm::Triple::x86_64) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000803 this->resetDataLayout("e-m:e-p:32:32-i64:64-n8:16:32:64-S128");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000804 } else if (Triple.getArch() == llvm::Triple::mipsel) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000805 // Handled on mips' setDataLayout.
Rafael Espindola1c09b262013-12-18 23:41:04 +0000806 } else {
807 assert(Triple.getArch() == llvm::Triple::le32);
James Y Knightb214cbc2016-03-04 19:00:41 +0000808 this->resetDataLayout("e-p:32:32-i64:64");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000809 }
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000810 }
811};
Torok Edwinb2b37c62009-06-30 17:10:35 +0000812
Dan Gohmanc2853072015-09-03 22:51:53 +0000813// WebAssembly target
814template <typename Target>
815class WebAssemblyOSTargetInfo : public OSTargetInfo<Target> {
816 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Hans Wennborg7eb54642015-09-10 17:07:54 +0000817 MacroBuilder &Builder) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +0000818 // A common platform macro.
819 if (Opts.POSIXThreads)
820 Builder.defineMacro("_REENTRANT");
821 // Follow g++ convention and predefine _GNU_SOURCE for C++.
822 if (Opts.CPlusPlus)
823 Builder.defineMacro("_GNU_SOURCE");
824 }
825
826 // As an optimization, group static init code together in a section.
Hans Wennborg7eb54642015-09-10 17:07:54 +0000827 const char *getStaticInitSectionSpecifier() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +0000828 return ".text.__startup";
829 }
830
831public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000832 explicit WebAssemblyOSTargetInfo(const llvm::Triple &Triple,
833 const TargetOptions &Opts)
834 : OSTargetInfo<Target>(Triple, Opts) {
Dan Gohmanc2853072015-09-03 22:51:53 +0000835 this->MCountName = "__mcount";
Dan Gohmanc2853072015-09-03 22:51:53 +0000836 this->TheCXXABI.set(TargetCXXABI::WebAssembly);
837 }
838};
Dan Gohmanc2853072015-09-03 22:51:53 +0000839
Chris Lattner09d98f52008-10-05 21:50:58 +0000840//===----------------------------------------------------------------------===//
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000841// Specific target implementations.
842//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000843
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000844// PPC abstract base class
845class PPCTargetInfo : public TargetInfo {
846 static const Builtin::Info BuiltinInfo[];
847 static const char * const GCCRegNames[];
848 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Hal Finkel8eb59282012-06-11 22:35:19 +0000849 std::string CPU;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000850
851 // Target cpu features.
852 bool HasVSX;
Bill Schmidt8c184e32014-10-10 17:21:23 +0000853 bool HasP8Vector;
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +0000854 bool HasP8Crypto;
Nemanja Ivanovic35458c22015-04-11 10:43:36 +0000855 bool HasDirectMove;
Hal Finkel0d0a1a52015-03-11 19:14:15 +0000856 bool HasQPX;
Kit Barton8246f282015-03-25 19:41:41 +0000857 bool HasHTM;
Nemanja Ivanovic239eec72015-04-09 23:58:16 +0000858 bool HasBPERMD;
859 bool HasExtDiv;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000860
Ulrich Weigand8afad612014-07-28 13:17:52 +0000861protected:
862 std::string ABI;
863
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000864public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000865 PPCTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Saleem Abdulrasool10a49722016-04-08 16:52:00 +0000866 : TargetInfo(Triple), HasVSX(false), HasP8Vector(false),
867 HasP8Crypto(false), HasDirectMove(false), HasQPX(false), HasHTM(false),
Nemanja Ivanovicd7d45bf2016-04-15 18:04:13 +0000868 HasBPERMD(false), HasExtDiv(false) {
Bill Schmidt778d3872013-07-26 01:36:11 +0000869 BigEndian = (Triple.getArch() != llvm::Triple::ppc64le);
Alexey Bataev00396512015-07-02 03:40:19 +0000870 SimdDefaultAlign = 128;
Nico Weber3435ede2012-01-31 02:07:33 +0000871 LongDoubleWidth = LongDoubleAlign = 128;
872 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble;
873 }
Eli Friedman9ffd4a92009-06-05 07:05:05 +0000874
Hal Finkel6b984f02012-07-03 16:51:04 +0000875 /// \brief Flags for architecture specific defines.
876 typedef enum {
877 ArchDefineNone = 0,
878 ArchDefineName = 1 << 0, // <name> is substituted for arch name.
879 ArchDefinePpcgr = 1 << 1,
880 ArchDefinePpcsq = 1 << 2,
881 ArchDefine440 = 1 << 3,
882 ArchDefine603 = 1 << 4,
883 ArchDefine604 = 1 << 5,
884 ArchDefinePwr4 = 1 << 6,
Bill Schmidt38378a02013-02-01 20:23:10 +0000885 ArchDefinePwr5 = 1 << 7,
886 ArchDefinePwr5x = 1 << 8,
887 ArchDefinePwr6 = 1 << 9,
888 ArchDefinePwr6x = 1 << 10,
889 ArchDefinePwr7 = 1 << 11,
Will Schmidtf0487512014-06-26 13:34:10 +0000890 ArchDefinePwr8 = 1 << 12,
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +0000891 ArchDefinePwr9 = 1 << 13,
892 ArchDefineA2 = 1 << 14,
893 ArchDefineA2q = 1 << 15
Hal Finkel6b984f02012-07-03 16:51:04 +0000894 } ArchDefineTypes;
895
Bill Schmidt38378a02013-02-01 20:23:10 +0000896 // Note: GCC recognizes the following additional cpus:
897 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
898 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
899 // titan, rs64.
Craig Topper3164f332014-03-11 03:39:26 +0000900 bool setCPU(const std::string &Name) override {
Hal Finkel8eb59282012-06-11 22:35:19 +0000901 bool CPUKnown = llvm::StringSwitch<bool>(Name)
902 .Case("generic", true)
903 .Case("440", true)
904 .Case("450", true)
905 .Case("601", true)
906 .Case("602", true)
907 .Case("603", true)
908 .Case("603e", true)
909 .Case("603ev", true)
910 .Case("604", true)
911 .Case("604e", true)
912 .Case("620", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000913 .Case("630", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000914 .Case("g3", true)
915 .Case("7400", true)
916 .Case("g4", true)
917 .Case("7450", true)
918 .Case("g4+", true)
919 .Case("750", true)
920 .Case("970", true)
921 .Case("g5", true)
922 .Case("a2", true)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +0000923 .Case("a2q", true)
Hal Finkelf6d6cb02012-09-18 22:25:03 +0000924 .Case("e500mc", true)
925 .Case("e5500", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000926 .Case("power3", true)
927 .Case("pwr3", true)
928 .Case("power4", true)
929 .Case("pwr4", true)
930 .Case("power5", true)
931 .Case("pwr5", true)
932 .Case("power5x", true)
933 .Case("pwr5x", true)
934 .Case("power6", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000935 .Case("pwr6", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000936 .Case("power6x", true)
937 .Case("pwr6x", true)
938 .Case("power7", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000939 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +0000940 .Case("power8", true)
941 .Case("pwr8", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +0000942 .Case("power9", true)
943 .Case("pwr9", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000944 .Case("powerpc", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000945 .Case("ppc", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000946 .Case("powerpc64", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000947 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +0000948 .Case("powerpc64le", true)
949 .Case("ppc64le", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000950 .Default(false);
951
952 if (CPUKnown)
953 CPU = Name;
954
955 return CPUKnown;
956 }
957
Ulrich Weigand8afad612014-07-28 13:17:52 +0000958
959 StringRef getABI() const override { return ABI; }
960
Craig Topper6c03a542015-10-19 04:51:35 +0000961 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
962 return llvm::makeArrayRef(BuiltinInfo,
963 clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner10a5b382007-01-29 05:24:35 +0000964 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000965
Craig Topper3164f332014-03-11 03:39:26 +0000966 bool isCLZForZeroUndef() const override { return false; }
Bob Wilson19a2f2b2012-01-28 18:02:29 +0000967
Craig Topper3164f332014-03-11 03:39:26 +0000968 void getTargetDefines(const LangOptions &Opts,
969 MacroBuilder &Builder) const override;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000970
Eric Christopher8c47b422015-10-09 18:39:55 +0000971 bool
972 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
973 StringRef CPU,
974 const std::vector<std::string> &FeaturesVec) const override;
Bill Schmidt2fe4c672013-02-01 02:14:03 +0000975
Craig Topper3164f332014-03-11 03:39:26 +0000976 bool handleTargetFeatures(std::vector<std::string> &Features,
977 DiagnosticsEngine &Diags) override;
978 bool hasFeature(StringRef Feature) const override;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +0000979 void setFeatureEnabled(llvm::StringMap<bool> &Features, StringRef Name,
980 bool Enabled) const override;
Craig Topper3164f332014-03-11 03:39:26 +0000981
Craig Topperf054e3a2015-10-19 03:52:27 +0000982 ArrayRef<const char *> getGCCRegNames() const override;
983 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +0000984 bool validateAsmConstraint(const char *&Name,
985 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +0000986 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +0000987 default: return false;
988 case 'O': // Zero
John Thompson07a61a42010-06-24 22:44:13 +0000989 break;
Anders Carlssonf511f642007-11-27 04:11:28 +0000990 case 'b': // Base register
991 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +0000992 Info.setAllowsRegister();
John Thompson07a61a42010-06-24 22:44:13 +0000993 break;
994 // FIXME: The following are added to allow parsing.
995 // I just took a guess at what the actions should be.
996 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000997 case 'd': // Floating point register (containing 64-bit value)
John Thompson07a61a42010-06-24 22:44:13 +0000998 case 'v': // Altivec vector register
999 Info.setAllowsRegister();
1000 break;
1001 case 'w':
1002 switch (Name[1]) {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001003 case 'd':// VSX vector register to hold vector double data
1004 case 'f':// VSX vector register to hold vector float data
1005 case 's':// VSX vector register to hold scalar float data
1006 case 'a':// Any VSX register
Hal Finkelf7a07a52014-03-02 18:24:18 +00001007 case 'c':// An individual CR bit
John Thompson07a61a42010-06-24 22:44:13 +00001008 break;
1009 default:
1010 return false;
1011 }
1012 Info.setAllowsRegister();
1013 Name++; // Skip over 'w'.
1014 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001015 case 'h': // `MQ', `CTR', or `LINK' register
1016 case 'q': // `MQ' register
1017 case 'c': // `CTR' register
1018 case 'l': // `LINK' register
1019 case 'x': // `CR' register (condition register) number 0
1020 case 'y': // `CR' register (condition register)
1021 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson07a61a42010-06-24 22:44:13 +00001022 Info.setAllowsRegister();
1023 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001024 case 'I': // Signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +00001025 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001026 // (use `L' instead for SImode constants)
1027 case 'K': // Unsigned 16-bit constant
1028 case 'L': // Signed 16-bit constant shifted left 16 bits
1029 case 'M': // Constant larger than 31
1030 case 'N': // Exact power of 2
1031 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +00001032 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001033 // register with one instruction per word
John Thompson07a61a42010-06-24 22:44:13 +00001034 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001035 // into a register using three instructions
John Thompson07a61a42010-06-24 22:44:13 +00001036 break;
1037 case 'm': // Memory operand. Note that on PowerPC targets, m can
1038 // include addresses that update the base register. It
1039 // is therefore only safe to use `m' in an asm statement
1040 // if that asm statement accesses the operand exactly once.
1041 // The asm statement must also use `%U<opno>' as a
Sebastian Redldd008712010-08-17 22:42:34 +00001042 // placeholder for the "update" flag in the corresponding
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001043 // load or store instruction. For example:
John Thompson07a61a42010-06-24 22:44:13 +00001044 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001045 // is correct but:
John Thompson07a61a42010-06-24 22:44:13 +00001046 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
1047 // is not. Use es rather than m if you don't want the base
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001048 // register to be updated.
1049 case 'e':
John Thompsonceebdf12010-06-25 00:02:05 +00001050 if (Name[1] != 's')
1051 return false;
Sebastian Redldd008712010-08-17 22:42:34 +00001052 // es: A "stable" memory operand; that is, one which does not
John Thompson07a61a42010-06-24 22:44:13 +00001053 // include any automodification of the base register. Unlike
1054 // `m', this constraint can be used in asm statements that
1055 // might access the operand several times, or that might not
John Thompsonceebdf12010-06-25 00:02:05 +00001056 // access it at all.
John Thompson07a61a42010-06-24 22:44:13 +00001057 Info.setAllowsMemory();
John Thompsonceebdf12010-06-25 00:02:05 +00001058 Name++; // Skip over 'e'.
John Thompson07a61a42010-06-24 22:44:13 +00001059 break;
1060 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001061 // usually better to use `m' or `es' in asm statements)
John Thompson07a61a42010-06-24 22:44:13 +00001062 case 'Z': // Memory operand that is an indexed or indirect from a
1063 // register (it is usually better to use `m' or `es' in
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001064 // asm statements)
John Thompson07a61a42010-06-24 22:44:13 +00001065 Info.setAllowsMemory();
1066 Info.setAllowsRegister();
1067 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001068 case 'R': // AIX TOC entry
John Thompson07a61a42010-06-24 22:44:13 +00001069 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001070 // register (`p' is preferable for asm statements)
1071 case 'S': // Constant suitable as a 64-bit mask operand
1072 case 'T': // Constant suitable as a 32-bit mask operand
1073 case 'U': // System V Release 4 small data area reference
John Thompson07a61a42010-06-24 22:44:13 +00001074 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001075 // instructions
1076 case 'W': // Vector constant that does not require memory
1077 case 'j': // Vector constant that is all zeros.
John Thompson07a61a42010-06-24 22:44:13 +00001078 break;
1079 // End FIXME.
Anders Carlssonf511f642007-11-27 04:11:28 +00001080 }
John Thompson07a61a42010-06-24 22:44:13 +00001081 return true;
Anders Carlssonf511f642007-11-27 04:11:28 +00001082 }
Craig Topper3164f332014-03-11 03:39:26 +00001083 std::string convertConstraint(const char *&Constraint) const override {
Hal Finkelf7a07a52014-03-02 18:24:18 +00001084 std::string R;
1085 switch (*Constraint) {
1086 case 'e':
1087 case 'w':
1088 // Two-character constraint; add "^" hint for later parsing.
1089 R = std::string("^") + std::string(Constraint, 2);
1090 Constraint++;
1091 break;
1092 default:
1093 return TargetInfo::convertConstraint(Constraint);
1094 }
1095 return R;
1096 }
Craig Topper3164f332014-03-11 03:39:26 +00001097 const char *getClobbers() const override {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001098 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +00001099 }
Craig Topper3164f332014-03-11 03:39:26 +00001100 int getEHDataRegisterNumber(unsigned RegNo) const override {
Adhemerval Zanella5d874ae2013-01-22 20:02:45 +00001101 if (RegNo == 0) return 3;
1102 if (RegNo == 1) return 4;
1103 return -1;
1104 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00001105
1106 bool hasSjLjLowering() const override {
1107 return true;
1108 }
David Majnemer2617ea62015-06-09 18:05:33 +00001109
1110 bool useFloat128ManglingForLongDouble() const override {
1111 return LongDoubleWidth == 128 &&
1112 LongDoubleFormat == &llvm::APFloat::PPCDoubleDouble &&
1113 getTriple().isOSBinFormatELF();
1114 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001115};
Anders Carlssonf511f642007-11-27 04:11:28 +00001116
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001117const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00001118#define BUILTIN(ID, TYPE, ATTRS) \
1119 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1120#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1121 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5abdec72009-06-14 01:05:48 +00001122#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001123};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001124
Eric Christopher917e9522014-11-18 22:36:15 +00001125/// handleTargetFeatures - Perform initialization based on the user
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001126/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00001127bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001128 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00001129 for (const auto &Feature : Features) {
1130 if (Feature == "+vsx") {
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001131 HasVSX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001132 } else if (Feature == "+bpermd") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001133 HasBPERMD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001134 } else if (Feature == "+extdiv") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001135 HasExtDiv = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001136 } else if (Feature == "+power8-vector") {
Bill Schmidt8c184e32014-10-10 17:21:23 +00001137 HasP8Vector = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001138 } else if (Feature == "+crypto") {
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001139 HasP8Crypto = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001140 } else if (Feature == "+direct-move") {
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001141 HasDirectMove = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001142 } else if (Feature == "+qpx") {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001143 HasQPX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001144 } else if (Feature == "+htm") {
Kit Barton8246f282015-03-25 19:41:41 +00001145 HasHTM = true;
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001146 } else if (Feature == "+float128") {
1147 HasFloat128 = true;
Kit Barton8246f282015-03-25 19:41:41 +00001148 }
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001149 // TODO: Finish this list and add an assert that we've handled them
1150 // all.
1151 }
Eric Christopher02c33352015-08-25 00:59:11 +00001152
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001153 return true;
1154}
1155
Chris Lattnerecd49032009-03-02 22:27:17 +00001156/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
1157/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001158void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001159 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00001160 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001161 Builder.defineMacro("__ppc__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001162 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001163 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001164 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001165 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001166 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001167 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001168 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001169 Builder.defineMacro("__ppc64__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001170 Builder.defineMacro("__PPC64__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001171 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001172
Chris Lattnerecd49032009-03-02 22:27:17 +00001173 // Target properties.
Bill Schmidt778d3872013-07-26 01:36:11 +00001174 if (getTriple().getArch() == llvm::Triple::ppc64le) {
1175 Builder.defineMacro("_LITTLE_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001176 } else {
1177 if (getTriple().getOS() != llvm::Triple::NetBSD &&
1178 getTriple().getOS() != llvm::Triple::OpenBSD)
1179 Builder.defineMacro("_BIG_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001180 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001181
Ulrich Weigand8afad612014-07-28 13:17:52 +00001182 // ABI options.
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001183 if (ABI == "elfv1" || ABI == "elfv1-qpx")
Ulrich Weigand8afad612014-07-28 13:17:52 +00001184 Builder.defineMacro("_CALL_ELF", "1");
1185 if (ABI == "elfv2")
1186 Builder.defineMacro("_CALL_ELF", "2");
1187
Chris Lattnerecd49032009-03-02 22:27:17 +00001188 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001189 Builder.defineMacro("__NATURAL_ALIGNMENT__");
1190 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001191
Chris Lattnerecd49032009-03-02 22:27:17 +00001192 // FIXME: Should be controlled by command line option.
Roman Divacky13b586f2013-07-03 19:45:54 +00001193 if (LongDoubleWidth == 128)
1194 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001195
John Thompsone467e192009-11-19 17:18:50 +00001196 if (Opts.AltiVec) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001197 Builder.defineMacro("__VEC__", "10206");
1198 Builder.defineMacro("__ALTIVEC__");
John Thompsone467e192009-11-19 17:18:50 +00001199 }
Hal Finkel8eb59282012-06-11 22:35:19 +00001200
1201 // CPU identification.
Hal Finkel6b984f02012-07-03 16:51:04 +00001202 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
1203 .Case("440", ArchDefineName)
1204 .Case("450", ArchDefineName | ArchDefine440)
1205 .Case("601", ArchDefineName)
1206 .Case("602", ArchDefineName | ArchDefinePpcgr)
1207 .Case("603", ArchDefineName | ArchDefinePpcgr)
1208 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1209 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1210 .Case("604", ArchDefineName | ArchDefinePpcgr)
1211 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
1212 .Case("620", ArchDefineName | ArchDefinePpcgr)
Bill Schmidt38378a02013-02-01 20:23:10 +00001213 .Case("630", ArchDefineName | ArchDefinePpcgr)
Hal Finkel6b984f02012-07-03 16:51:04 +00001214 .Case("7400", ArchDefineName | ArchDefinePpcgr)
1215 .Case("7450", ArchDefineName | ArchDefinePpcgr)
1216 .Case("750", ArchDefineName | ArchDefinePpcgr)
1217 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1218 | ArchDefinePpcsq)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001219 .Case("a2", ArchDefineA2)
1220 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
Bill Schmidt38378a02013-02-01 20:23:10 +00001221 .Case("pwr3", ArchDefinePpcgr)
1222 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
1223 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1224 | ArchDefinePpcsq)
1225 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4
1226 | ArchDefinePpcgr | ArchDefinePpcsq)
1227 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5
1228 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1229 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x
1230 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1231 | ArchDefinePpcsq)
1232 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6
1233 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001234 | ArchDefinePpcgr | ArchDefinePpcsq)
1235 .Case("pwr8", ArchDefineName | ArchDefinePwr7 | ArchDefinePwr6x
1236 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1237 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001238 .Case("pwr9", ArchDefineName | ArchDefinePwr8 | ArchDefinePwr7
1239 | ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1240 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1241 | ArchDefinePpcsq)
Bill Schmidt38378a02013-02-01 20:23:10 +00001242 .Case("power3", ArchDefinePpcgr)
1243 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1244 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1245 | ArchDefinePpcsq)
1246 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1247 | ArchDefinePpcgr | ArchDefinePpcsq)
1248 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1249 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1250 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1251 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1252 | ArchDefinePpcsq)
1253 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6
1254 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001255 | ArchDefinePpcgr | ArchDefinePpcsq)
1256 .Case("power8", ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr6x
1257 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1258 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001259 .Case("power9", ArchDefinePwr9 | ArchDefinePwr8 | ArchDefinePwr7
1260 | ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1261 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1262 | ArchDefinePpcsq)
Hal Finkel6b984f02012-07-03 16:51:04 +00001263 .Default(ArchDefineNone);
1264
1265 if (defs & ArchDefineName)
1266 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
1267 if (defs & ArchDefinePpcgr)
1268 Builder.defineMacro("_ARCH_PPCGR");
1269 if (defs & ArchDefinePpcsq)
1270 Builder.defineMacro("_ARCH_PPCSQ");
1271 if (defs & ArchDefine440)
Hal Finkel8eb59282012-06-11 22:35:19 +00001272 Builder.defineMacro("_ARCH_440");
Hal Finkel6b984f02012-07-03 16:51:04 +00001273 if (defs & ArchDefine603)
1274 Builder.defineMacro("_ARCH_603");
1275 if (defs & ArchDefine604)
1276 Builder.defineMacro("_ARCH_604");
Bill Schmidt38378a02013-02-01 20:23:10 +00001277 if (defs & ArchDefinePwr4)
Hal Finkel6b984f02012-07-03 16:51:04 +00001278 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt38378a02013-02-01 20:23:10 +00001279 if (defs & ArchDefinePwr5)
Hal Finkel6b984f02012-07-03 16:51:04 +00001280 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt38378a02013-02-01 20:23:10 +00001281 if (defs & ArchDefinePwr5x)
1282 Builder.defineMacro("_ARCH_PWR5X");
1283 if (defs & ArchDefinePwr6)
Hal Finkel8eb59282012-06-11 22:35:19 +00001284 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt38378a02013-02-01 20:23:10 +00001285 if (defs & ArchDefinePwr6x)
1286 Builder.defineMacro("_ARCH_PWR6X");
1287 if (defs & ArchDefinePwr7)
1288 Builder.defineMacro("_ARCH_PWR7");
Will Schmidtf0487512014-06-26 13:34:10 +00001289 if (defs & ArchDefinePwr8)
1290 Builder.defineMacro("_ARCH_PWR8");
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001291 if (defs & ArchDefinePwr9)
1292 Builder.defineMacro("_ARCH_PWR9");
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001293 if (defs & ArchDefineA2)
1294 Builder.defineMacro("_ARCH_A2");
1295 if (defs & ArchDefineA2q) {
1296 Builder.defineMacro("_ARCH_A2Q");
1297 Builder.defineMacro("_ARCH_QP");
1298 }
1299
1300 if (getTriple().getVendor() == llvm::Triple::BGQ) {
1301 Builder.defineMacro("__bg__");
1302 Builder.defineMacro("__THW_BLUEGENE__");
1303 Builder.defineMacro("__bgq__");
1304 Builder.defineMacro("__TOS_BGQ__");
1305 }
Bill Schmidt38378a02013-02-01 20:23:10 +00001306
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001307 if (HasVSX)
1308 Builder.defineMacro("__VSX__");
Bill Schmidt8c184e32014-10-10 17:21:23 +00001309 if (HasP8Vector)
Bill Schmidt59eb7672014-10-10 15:09:43 +00001310 Builder.defineMacro("__POWER8_VECTOR__");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001311 if (HasP8Crypto)
1312 Builder.defineMacro("__CRYPTO__");
Kit Barton8246f282015-03-25 19:41:41 +00001313 if (HasHTM)
1314 Builder.defineMacro("__HTM__");
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001315 if (HasFloat128)
1316 Builder.defineMacro("__FLOAT128__");
Hal Finkela57b8902015-10-01 13:39:49 +00001317
1318 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
1319 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
1320 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
1321 if (PointerWidth == 64)
1322 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001323
Bill Schmidt38378a02013-02-01 20:23:10 +00001324 // FIXME: The following are not yet generated here by Clang, but are
1325 // generated by GCC:
1326 //
1327 // _SOFT_FLOAT_
1328 // __RECIP_PRECISION__
1329 // __APPLE_ALTIVEC__
Bill Schmidt38378a02013-02-01 20:23:10 +00001330 // __RECIP__
1331 // __RECIPF__
1332 // __RSQRTE__
1333 // __RSQRTEF__
1334 // _SOFT_DOUBLE_
1335 // __NO_LWSYNC__
1336 // __HAVE_BSWAP__
1337 // __LONGDOUBLE128
1338 // __CMODEL_MEDIUM__
1339 // __CMODEL_LARGE__
1340 // _CALL_SYSV
1341 // _CALL_DARWIN
1342 // __NO_FPRS__
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001343}
1344
Eric Christophera8a14c32015-08-31 18:39:16 +00001345// Handle explicit options being passed to the compiler here: if we've
1346// explicitly turned off vsx and turned on power8-vector or direct-move then
1347// go ahead and error since the customer has expressed a somewhat incompatible
1348// set of options.
1349static bool ppcUserFeaturesCheck(DiagnosticsEngine &Diags,
Eric Christopher8c47b422015-10-09 18:39:55 +00001350 const std::vector<std::string> &FeaturesVec) {
Eric Christophera8a14c32015-08-31 18:39:16 +00001351
1352 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "-vsx") !=
1353 FeaturesVec.end()) {
1354 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+power8-vector") !=
1355 FeaturesVec.end()) {
1356 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mpower8-vector"
1357 << "-mno-vsx";
1358 return false;
1359 }
1360
1361 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+direct-move") !=
1362 FeaturesVec.end()) {
1363 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mdirect-move"
1364 << "-mno-vsx";
1365 return false;
1366 }
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001367
1368 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+float128") !=
1369 FeaturesVec.end()) {
1370 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mfloat128"
1371 << "-mno-vsx";
1372 return false;
1373 }
Eric Christophera8a14c32015-08-31 18:39:16 +00001374 }
1375
1376 return true;
1377}
1378
Eric Christopher8c47b422015-10-09 18:39:55 +00001379bool PPCTargetInfo::initFeatureMap(
1380 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
1381 const std::vector<std::string> &FeaturesVec) const {
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001382 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1383 .Case("7400", true)
1384 .Case("g4", true)
1385 .Case("7450", true)
1386 .Case("g4+", true)
1387 .Case("970", true)
1388 .Case("g5", true)
1389 .Case("pwr6", true)
1390 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +00001391 .Case("pwr8", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001392 .Case("pwr9", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001393 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +00001394 .Case("ppc64le", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001395 .Default(false);
Hal Finkelb58ce852013-02-01 18:44:19 +00001396
1397 Features["qpx"] = (CPU == "a2q");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001398 Features["crypto"] = llvm::StringSwitch<bool>(CPU)
1399 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001400 .Case("pwr9", true)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001401 .Case("pwr8", true)
1402 .Default(false);
1403 Features["power8-vector"] = llvm::StringSwitch<bool>(CPU)
1404 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001405 .Case("pwr9", true)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001406 .Case("pwr8", true)
1407 .Default(false);
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001408 Features["bpermd"] = llvm::StringSwitch<bool>(CPU)
1409 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001410 .Case("pwr9", true)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001411 .Case("pwr8", true)
1412 .Case("pwr7", true)
1413 .Default(false);
1414 Features["extdiv"] = llvm::StringSwitch<bool>(CPU)
1415 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001416 .Case("pwr9", true)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001417 .Case("pwr8", true)
1418 .Case("pwr7", true)
1419 .Default(false);
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001420 Features["direct-move"] = llvm::StringSwitch<bool>(CPU)
1421 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001422 .Case("pwr9", true)
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001423 .Case("pwr8", true)
1424 .Default(false);
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001425 Features["vsx"] = llvm::StringSwitch<bool>(CPU)
1426 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001427 .Case("pwr9", true)
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001428 .Case("pwr8", true)
1429 .Case("pwr7", true)
1430 .Default(false);
Eric Christopheref1e2952015-08-28 02:13:58 +00001431
Eric Christophera8a14c32015-08-31 18:39:16 +00001432 if (!ppcUserFeaturesCheck(Diags, FeaturesVec))
1433 return false;
Eric Christopher007b0a02015-08-28 22:32:01 +00001434
Eric Christopher007b0a02015-08-28 22:32:01 +00001435 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001436}
1437
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001438bool PPCTargetInfo::hasFeature(StringRef Feature) const {
Bill Schmidte6e9d152014-11-02 14:56:41 +00001439 return llvm::StringSwitch<bool>(Feature)
1440 .Case("powerpc", true)
1441 .Case("vsx", HasVSX)
1442 .Case("power8-vector", HasP8Vector)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001443 .Case("crypto", HasP8Crypto)
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001444 .Case("direct-move", HasDirectMove)
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001445 .Case("qpx", HasQPX)
Kit Barton8246f282015-03-25 19:41:41 +00001446 .Case("htm", HasHTM)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001447 .Case("bpermd", HasBPERMD)
1448 .Case("extdiv", HasExtDiv)
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001449 .Case("float128", HasFloat128)
Bill Schmidte6e9d152014-11-02 14:56:41 +00001450 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001451}
Chris Lattner17df24e2008-04-21 18:56:49 +00001452
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001453void PPCTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
1454 StringRef Name, bool Enabled) const {
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001455 // If we're enabling direct-move or power8-vector go ahead and enable vsx
1456 // as well. Do the inverse if we're disabling vsx. We'll diagnose any user
1457 // incompatible options.
1458 if (Enabled) {
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001459 if (Name == "direct-move") {
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001460 Features[Name] = Features["vsx"] = true;
1461 } else if (Name == "power8-vector") {
1462 Features[Name] = Features["vsx"] = true;
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001463 } else if (Name == "float128") {
1464 Features[Name] = Features["vsx"] = true;
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001465 } else {
1466 Features[Name] = true;
1467 }
1468 } else {
1469 if (Name == "vsx") {
1470 Features[Name] = Features["direct-move"] = Features["power8-vector"] =
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001471 Features["float128"] = false;
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001472 } else {
1473 Features[Name] = false;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001474 }
1475 }
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001476}
1477
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001478const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001479 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1480 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1481 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1482 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1483 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1484 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1485 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1486 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001487 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001488 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001489 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001490 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1491 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1492 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1493 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001494 "vrsave", "vscr",
1495 "spe_acc", "spefscr",
1496 "sfp"
1497};
Chris Lattner10a5b382007-01-29 05:24:35 +00001498
Craig Topperf054e3a2015-10-19 03:52:27 +00001499ArrayRef<const char*> PPCTargetInfo::getGCCRegNames() const {
1500 return llvm::makeArrayRef(GCCRegNames);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001501}
Chris Lattner5ba61f02006-10-14 07:39:34 +00001502
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001503const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1504 // While some of these aliases do map to different registers
1505 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001506 { { "0" }, "r0" },
1507 { { "1"}, "r1" },
1508 { { "2" }, "r2" },
1509 { { "3" }, "r3" },
1510 { { "4" }, "r4" },
1511 { { "5" }, "r5" },
1512 { { "6" }, "r6" },
1513 { { "7" }, "r7" },
1514 { { "8" }, "r8" },
1515 { { "9" }, "r9" },
1516 { { "10" }, "r10" },
1517 { { "11" }, "r11" },
1518 { { "12" }, "r12" },
1519 { { "13" }, "r13" },
1520 { { "14" }, "r14" },
1521 { { "15" }, "r15" },
1522 { { "16" }, "r16" },
1523 { { "17" }, "r17" },
1524 { { "18" }, "r18" },
1525 { { "19" }, "r19" },
1526 { { "20" }, "r20" },
1527 { { "21" }, "r21" },
1528 { { "22" }, "r22" },
1529 { { "23" }, "r23" },
1530 { { "24" }, "r24" },
1531 { { "25" }, "r25" },
1532 { { "26" }, "r26" },
1533 { { "27" }, "r27" },
1534 { { "28" }, "r28" },
1535 { { "29" }, "r29" },
1536 { { "30" }, "r30" },
1537 { { "31" }, "r31" },
1538 { { "fr0" }, "f0" },
1539 { { "fr1" }, "f1" },
1540 { { "fr2" }, "f2" },
1541 { { "fr3" }, "f3" },
1542 { { "fr4" }, "f4" },
1543 { { "fr5" }, "f5" },
1544 { { "fr6" }, "f6" },
1545 { { "fr7" }, "f7" },
1546 { { "fr8" }, "f8" },
1547 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +00001548 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001549 { { "fr11" }, "f11" },
1550 { { "fr12" }, "f12" },
1551 { { "fr13" }, "f13" },
1552 { { "fr14" }, "f14" },
1553 { { "fr15" }, "f15" },
1554 { { "fr16" }, "f16" },
1555 { { "fr17" }, "f17" },
1556 { { "fr18" }, "f18" },
1557 { { "fr19" }, "f19" },
1558 { { "fr20" }, "f20" },
1559 { { "fr21" }, "f21" },
1560 { { "fr22" }, "f22" },
1561 { { "fr23" }, "f23" },
1562 { { "fr24" }, "f24" },
1563 { { "fr25" }, "f25" },
1564 { { "fr26" }, "f26" },
1565 { { "fr27" }, "f27" },
1566 { { "fr28" }, "f28" },
1567 { { "fr29" }, "f29" },
1568 { { "fr30" }, "f30" },
1569 { { "fr31" }, "f31" },
1570 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001571};
1572
Craig Topperf054e3a2015-10-19 03:52:27 +00001573ArrayRef<TargetInfo::GCCRegAlias> PPCTargetInfo::getGCCRegAliases() const {
1574 return llvm::makeArrayRef(GCCRegAliases);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001575}
Chris Lattner02dffbd2006-10-14 07:50:21 +00001576
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001577class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001578public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001579 PPC32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1580 : PPCTargetInfo(Triple, Opts) {
James Y Knightb214cbc2016-03-04 19:00:41 +00001581 resetDataLayout("E-m:e-p:32:32-i64:64-n32");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001582
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001583 switch (getTriple().getOS()) {
Nico Weber3435ede2012-01-31 02:07:33 +00001584 case llvm::Triple::Linux:
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001585 case llvm::Triple::FreeBSD:
1586 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001587 SizeType = UnsignedInt;
Hal Finkel26908382012-03-02 20:54:36 +00001588 PtrDiffType = SignedInt;
1589 IntPtrType = SignedInt;
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001590 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +00001591 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001592 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001593 }
Roman Divacky816dcd12012-03-13 16:53:54 +00001594
Roman Divacky3ffe7462012-03-13 19:20:17 +00001595 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1596 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001597 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Roman Divacky3ffe7462012-03-13 19:20:17 +00001598 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001599
1600 // PPC32 supports atomics up to 4 bytes.
1601 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divacky965b0b72011-01-06 08:27:10 +00001602 }
1603
Craig Topper3164f332014-03-11 03:39:26 +00001604 BuiltinVaListKind getBuiltinVaListKind() const override {
Roman Divacky965b0b72011-01-06 08:27:10 +00001605 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Inge5d3fb222012-06-16 03:34:49 +00001606 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman873f65a2008-08-21 00:13:15 +00001607 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001608};
Chris Lattner5ba61f02006-10-14 07:39:34 +00001609
Bill Schmidt778d3872013-07-26 01:36:11 +00001610// Note: ABI differences may eventually require us to have a separate
1611// TargetInfo for little endian.
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001612class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001613public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001614 PPC64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1615 : PPCTargetInfo(Triple, Opts) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001616 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001617 IntMaxType = SignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001618 Int64Type = SignedLong;
Roman Divacky816dcd12012-03-13 16:53:54 +00001619
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001620 if ((Triple.getArch() == llvm::Triple::ppc64le)) {
James Y Knightb214cbc2016-03-04 19:00:41 +00001621 resetDataLayout("e-m:e-i64:64-n32:64");
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001622 ABI = "elfv2";
1623 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00001624 resetDataLayout("E-m:e-i64:64-n32:64");
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001625 ABI = "elfv1";
1626 }
1627
1628 switch (getTriple().getOS()) {
1629 case llvm::Triple::FreeBSD:
Roman Divacky3ffe7462012-03-13 19:20:17 +00001630 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001631 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001632 break;
Joerg Sonnenbergeraac82c42014-10-15 19:52:03 +00001633 case llvm::Triple::NetBSD:
1634 IntMaxType = SignedLongLong;
1635 Int64Type = SignedLongLong;
1636 break;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001637 default:
1638 break;
Ulrich Weigand8afad612014-07-28 13:17:52 +00001639 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001640
1641 // PPC64 supports atomics up to 8 bytes.
1642 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001643 }
Craig Topper3164f332014-03-11 03:39:26 +00001644 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001645 return TargetInfo::CharPtrBuiltinVaList;
Roman Divacky965b0b72011-01-06 08:27:10 +00001646 }
Eric Christophere6b7cf42015-07-10 18:25:52 +00001647 // PPC64 Linux-specific ABI options.
Ulrich Weigand8afad612014-07-28 13:17:52 +00001648 bool setABI(const std::string &Name) override {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001649 if (Name == "elfv1" || Name == "elfv1-qpx" || Name == "elfv2") {
Ulrich Weigand8afad612014-07-28 13:17:52 +00001650 ABI = Name;
1651 return true;
1652 }
1653 return false;
1654 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001655};
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001656
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001657class DarwinPPC32TargetInfo : public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001658public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001659 DarwinPPC32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1660 : DarwinTargetInfo<PPC32TargetInfo>(Triple, Opts) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001661 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +00001662 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Eric Christopher917e9522014-11-18 22:36:15 +00001663 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev68d773c2012-01-17 22:40:00 +00001664 LongLongAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001665 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00001666 resetDataLayout("E-m:o-p:32:32-f64:32:64-n32");
Roman Divacky965b0b72011-01-06 08:27:10 +00001667 }
Craig Topper3164f332014-03-11 03:39:26 +00001668 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001669 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001670 }
1671};
1672
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001673class DarwinPPC64TargetInfo : public DarwinTargetInfo<PPC64TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001674public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001675 DarwinPPC64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1676 : DarwinTargetInfo<PPC64TargetInfo>(Triple, Opts) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001677 HasAlignMac68kSupport = true;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001678 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00001679 resetDataLayout("E-m:o-i64:64-n32:64");
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001680 }
1681};
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001682
Eric Christopherc48497a2015-09-18 21:26:24 +00001683static const unsigned NVPTXAddrSpaceMap[] = {
1684 1, // opencl_global
1685 3, // opencl_local
1686 4, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00001687 // FIXME: generic has to be added to the target
Eric Christopherc48497a2015-09-18 21:26:24 +00001688 0, // opencl_generic
1689 1, // cuda_device
1690 4, // cuda_constant
1691 3, // cuda_shared
1692};
1693
1694class NVPTXTargetInfo : public TargetInfo {
1695 static const char *const GCCRegNames[];
1696 static const Builtin::Info BuiltinInfo[];
Reid Klecknerbbc01782014-12-03 21:53:36 +00001697
1698 // The GPU profiles supported by the NVPTX backend
1699 enum GPUKind {
1700 GK_NONE,
1701 GK_SM20,
1702 GK_SM21,
1703 GK_SM30,
1704 GK_SM35,
Eli Bendersky7a0d8912015-03-31 17:03:16 +00001705 GK_SM37,
Artem Belevichffa5fc52016-05-19 17:47:47 +00001706 GK_SM50,
1707 GK_SM52,
1708 GK_SM53,
Reid Klecknerbbc01782014-12-03 21:53:36 +00001709 } GPU;
1710
Eric Christopherc48497a2015-09-18 21:26:24 +00001711public:
Justin Lebar76945b22016-04-29 23:05:19 +00001712 NVPTXTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001713 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00001714 BigEndian = false;
1715 TLSSupported = false;
1716 LongWidth = LongAlign = 64;
1717 AddrSpaceMap = &NVPTXAddrSpaceMap;
1718 UseAddrSpaceMapMangling = true;
1719 // Define available target features
1720 // These must be defined in sorted order!
1721 NoAsmVariants = true;
1722 // Set the default GPU to sm20
1723 GPU = GK_SM20;
Justin Lebar76945b22016-04-29 23:05:19 +00001724
1725 // If possible, get a TargetInfo for our host triple, so we can match its
1726 // types.
1727 llvm::Triple HostTriple(Opts.HostTriple);
1728 if (HostTriple.isNVPTX())
1729 return;
1730 std::unique_ptr<TargetInfo> HostTarget(
1731 AllocateTarget(llvm::Triple(Opts.HostTriple), Opts));
1732 if (!HostTarget) {
1733 return;
1734 }
1735
1736 PointerWidth = HostTarget->getPointerWidth(/* AddrSpace = */ 0);
1737 PointerAlign = HostTarget->getPointerAlign(/* AddrSpace = */ 0);
1738 BoolWidth = HostTarget->getBoolWidth();
1739 BoolAlign = HostTarget->getBoolAlign();
1740 IntWidth = HostTarget->getIntWidth();
1741 IntAlign = HostTarget->getIntAlign();
1742 HalfWidth = HostTarget->getHalfWidth();
1743 HalfAlign = HostTarget->getHalfAlign();
1744 FloatWidth = HostTarget->getFloatWidth();
1745 FloatAlign = HostTarget->getFloatAlign();
1746 DoubleWidth = HostTarget->getDoubleWidth();
1747 DoubleAlign = HostTarget->getDoubleAlign();
1748 LongWidth = HostTarget->getLongWidth();
1749 LongAlign = HostTarget->getLongAlign();
1750 LongLongWidth = HostTarget->getLongLongWidth();
1751 LongLongAlign = HostTarget->getLongLongAlign();
1752 MinGlobalAlign = HostTarget->getMinGlobalAlign();
1753 DefaultAlignForAttributeAligned =
1754 HostTarget->getDefaultAlignForAttributeAligned();
1755 SizeType = HostTarget->getSizeType();
1756 IntMaxType = HostTarget->getIntMaxType();
1757 PtrDiffType = HostTarget->getPtrDiffType(/* AddrSpace = */ 0);
1758 IntPtrType = HostTarget->getIntPtrType();
1759 WCharType = HostTarget->getWCharType();
1760 WIntType = HostTarget->getWIntType();
1761 Char16Type = HostTarget->getChar16Type();
1762 Char32Type = HostTarget->getChar32Type();
1763 Int64Type = HostTarget->getInt64Type();
1764 SigAtomicType = HostTarget->getSigAtomicType();
1765 ProcessIDType = HostTarget->getProcessIDType();
1766
1767 UseBitFieldTypeAlignment = HostTarget->useBitFieldTypeAlignment();
1768 UseZeroLengthBitfieldAlignment =
1769 HostTarget->useZeroLengthBitfieldAlignment();
1770 UseExplicitBitFieldAlignment = HostTarget->useExplicitBitFieldAlignment();
1771 ZeroLengthBitfieldBoundary = HostTarget->getZeroLengthBitfieldBoundary();
1772
1773 // Properties intentionally not copied from host:
1774 // - LargeArrayMinWidth, LargeArrayAlign: Not visible across the
1775 // host/device boundary.
1776 // - SuitableAlign: Not visible across the host/device boundary, and may
1777 // correctly be different on host/device, e.g. if host has wider vector
1778 // types than device.
1779 // - LongDoubleWidth, LongDoubleAlign: nvptx's long double type is the same
1780 // as its double type, but that's not necessarily true on the host.
1781 // TODO: nvcc emits a warning when using long double on device; we should
1782 // do the same.
Eric Christopherc48497a2015-09-18 21:26:24 +00001783 }
1784 void getTargetDefines(const LangOptions &Opts,
1785 MacroBuilder &Builder) const override {
1786 Builder.defineMacro("__PTX__");
1787 Builder.defineMacro("__NVPTX__");
1788 if (Opts.CUDAIsDevice) {
1789 // Set __CUDA_ARCH__ for the GPU specified.
1790 std::string CUDAArchCode;
1791 switch (GPU) {
1792 case GK_SM20:
1793 CUDAArchCode = "200";
1794 break;
1795 case GK_SM21:
1796 CUDAArchCode = "210";
1797 break;
1798 case GK_SM30:
1799 CUDAArchCode = "300";
1800 break;
1801 case GK_SM35:
1802 CUDAArchCode = "350";
1803 break;
1804 case GK_SM37:
1805 CUDAArchCode = "370";
1806 break;
Artem Belevichffa5fc52016-05-19 17:47:47 +00001807 case GK_SM50:
1808 CUDAArchCode = "500";
1809 break;
1810 case GK_SM52:
1811 CUDAArchCode = "520";
1812 break;
1813 case GK_SM53:
1814 CUDAArchCode = "530";
1815 break;
Eric Christopherc48497a2015-09-18 21:26:24 +00001816 default:
1817 llvm_unreachable("Unhandled target CPU");
Reid Klecknerbbc01782014-12-03 21:53:36 +00001818 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001819 Builder.defineMacro("__CUDA_ARCH__", CUDAArchCode);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001820 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001821 }
Craig Topper6c03a542015-10-19 04:51:35 +00001822 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
1823 return llvm::makeArrayRef(BuiltinInfo,
1824 clang::NVPTX::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eric Christopherc48497a2015-09-18 21:26:24 +00001825 }
1826 bool hasFeature(StringRef Feature) const override {
1827 return Feature == "ptx" || Feature == "nvptx";
Peter Collingbournec947aae2012-05-20 23:28:41 +00001828 }
1829
Craig Topperf054e3a2015-10-19 03:52:27 +00001830 ArrayRef<const char *> getGCCRegNames() const override;
1831 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00001832 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00001833 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00001834 }
1835 bool validateAsmConstraint(const char *&Name,
1836 TargetInfo::ConstraintInfo &Info) const override {
1837 switch (*Name) {
1838 default:
1839 return false;
1840 case 'c':
1841 case 'h':
1842 case 'r':
1843 case 'l':
1844 case 'f':
1845 case 'd':
1846 Info.setAllowsRegister();
1847 return true;
Eli Bendersky13467172015-04-01 20:29:18 +00001848 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001849 }
1850 const char *getClobbers() const override {
1851 // FIXME: Is this really right?
1852 return "";
1853 }
1854 BuiltinVaListKind getBuiltinVaListKind() const override {
1855 // FIXME: implement
1856 return TargetInfo::CharPtrBuiltinVaList;
1857 }
1858 bool setCPU(const std::string &Name) override {
1859 GPU = llvm::StringSwitch<GPUKind>(Name)
1860 .Case("sm_20", GK_SM20)
1861 .Case("sm_21", GK_SM21)
1862 .Case("sm_30", GK_SM30)
1863 .Case("sm_35", GK_SM35)
1864 .Case("sm_37", GK_SM37)
Artem Belevichffa5fc52016-05-19 17:47:47 +00001865 .Case("sm_50", GK_SM50)
1866 .Case("sm_52", GK_SM52)
1867 .Case("sm_53", GK_SM53)
Eric Christopherc48497a2015-09-18 21:26:24 +00001868 .Default(GK_NONE);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001869
Eric Christopherc48497a2015-09-18 21:26:24 +00001870 return GPU != GK_NONE;
1871 }
Jan Vesely9674bd42016-06-17 19:02:14 +00001872 void setSupportedOpenCLOpts() override {
1873 auto &Opts = getSupportedOpenCLOpts();
1874 Opts.cl_clang_storage_class_specifiers = 1;
1875 Opts.cl_khr_gl_sharing = 1;
1876 Opts.cl_khr_icd = 1;
1877
1878 Opts.cl_khr_fp64 = 1;
1879 Opts.cl_khr_byte_addressable_store = 1;
1880 Opts.cl_khr_global_int32_base_atomics = 1;
1881 Opts.cl_khr_global_int32_extended_atomics = 1;
1882 Opts.cl_khr_local_int32_base_atomics = 1;
1883 Opts.cl_khr_local_int32_extended_atomics = 1;
1884 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001885};
1886
1887const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1888#define BUILTIN(ID, TYPE, ATTRS) \
1889 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1890#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1891 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
1892#include "clang/Basic/BuiltinsNVPTX.def"
1893};
1894
1895const char *const NVPTXTargetInfo::GCCRegNames[] = {"r0"};
1896
Craig Topperf054e3a2015-10-19 03:52:27 +00001897ArrayRef<const char *> NVPTXTargetInfo::getGCCRegNames() const {
1898 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00001899}
1900
1901class NVPTX32TargetInfo : public NVPTXTargetInfo {
1902public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001903 NVPTX32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1904 : NVPTXTargetInfo(Triple, Opts) {
Artem Belevich236cfdc2015-09-28 22:54:08 +00001905 LongWidth = LongAlign = 32;
Eric Christopherc48497a2015-09-18 21:26:24 +00001906 PointerWidth = PointerAlign = 32;
1907 SizeType = TargetInfo::UnsignedInt;
1908 PtrDiffType = TargetInfo::SignedInt;
1909 IntPtrType = TargetInfo::SignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +00001910 resetDataLayout("e-p:32:32-i64:64-v16:16-v32:32-n16:32:64");
Eric Christopherc48497a2015-09-18 21:26:24 +00001911 }
1912};
1913
1914class NVPTX64TargetInfo : public NVPTXTargetInfo {
1915public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001916 NVPTX64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1917 : NVPTXTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00001918 PointerWidth = PointerAlign = 64;
1919 SizeType = TargetInfo::UnsignedLong;
1920 PtrDiffType = TargetInfo::SignedLong;
1921 IntPtrType = TargetInfo::SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00001922 resetDataLayout("e-i64:64-v16:16-v32:32-n16:32:64");
Eric Christopherc48497a2015-09-18 21:26:24 +00001923 }
1924};
Eli Friedmand13b41e2012-10-12 23:32:00 +00001925
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001926static const unsigned AMDGPUAddrSpaceMap[] = {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001927 1, // opencl_global
1928 3, // opencl_local
1929 2, // opencl_constant
Matt Arsenaultbfe25b22014-12-01 16:46:03 +00001930 4, // opencl_generic
Eli Friedmand13b41e2012-10-12 23:32:00 +00001931 1, // cuda_device
1932 2, // cuda_constant
1933 3 // cuda_shared
1934};
1935
Tom Stellarda96344b2014-08-21 13:58:40 +00001936// If you edit the description strings, make sure you update
1937// getPointerWidthV().
1938
Craig Topper273dbc62015-10-18 05:29:26 +00001939static const char *const DataLayoutStringR600 =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001940 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1941 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001942
Craig Topper273dbc62015-10-18 05:29:26 +00001943static const char *const DataLayoutStringSI =
Matt Arsenault6dc455f2016-05-31 16:58:18 +00001944 "e-p:32:32-p1:64:64-p2:64:64-p3:32:32-p4:64:64-p5:32:32"
Rafael Espindola29db13a2014-01-03 18:13:17 +00001945 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1946 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001947
Matt Arsenault250024f2016-06-08 01:56:42 +00001948class AMDGPUTargetInfo final : public TargetInfo {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001949 static const Builtin::Info BuiltinInfo[];
Tom Stellard7b1059b2015-04-14 14:36:56 +00001950 static const char * const GCCRegNames[];
Matt Arsenault56f008d2014-06-24 20:45:01 +00001951
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001952 /// \brief The GPU profiles supported by the AMDGPU target.
Tom Stellardc74b1e02013-03-04 17:40:53 +00001953 enum GPUKind {
1954 GK_NONE,
1955 GK_R600,
1956 GK_R600_DOUBLE_OPS,
1957 GK_R700,
1958 GK_R700_DOUBLE_OPS,
1959 GK_EVERGREEN,
1960 GK_EVERGREEN_DOUBLE_OPS,
1961 GK_NORTHERN_ISLANDS,
1962 GK_CAYMAN,
Tom Stellard08ded122013-10-29 16:38:29 +00001963 GK_SOUTHERN_ISLANDS,
Tom Stellard5c384402015-06-18 19:14:15 +00001964 GK_SEA_ISLANDS,
1965 GK_VOLCANIC_ISLANDS
Tom Stellardc74b1e02013-03-04 17:40:53 +00001966 } GPU;
1967
Jan Veselyeebeaea2015-05-04 19:53:36 +00001968 bool hasFP64:1;
1969 bool hasFMAF:1;
1970 bool hasLDEXPF:1;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001971
Matt Arsenault250024f2016-06-08 01:56:42 +00001972 static bool isAMDGCN(const llvm::Triple &TT) {
1973 return TT.getArch() == llvm::Triple::amdgcn;
1974 }
1975
Eli Friedmand13b41e2012-10-12 23:32:00 +00001976public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001977 AMDGPUTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Matt Arsenault250024f2016-06-08 01:56:42 +00001978 : TargetInfo(Triple) ,
1979 GPU(isAMDGCN(Triple) ? GK_SOUTHERN_ISLANDS : GK_R600),
1980 hasFP64(false),
1981 hasFMAF(false),
1982 hasLDEXPF(false) {
1983 if (getTriple().getArch() == llvm::Triple::amdgcn) {
Jan Veselya3abd6d2015-05-01 17:38:13 +00001984 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001985 hasFMAF = true;
1986 hasLDEXPF = true;
Tom Stellardd99fb952015-01-28 15:38:44 +00001987 }
Matt Arsenault250024f2016-06-08 01:56:42 +00001988
1989 resetDataLayout(getTriple().getArch() == llvm::Triple::amdgcn ?
1990 DataLayoutStringSI : DataLayoutStringR600);
1991
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001992 AddrSpaceMap = &AMDGPUAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001993 UseAddrSpaceMapMangling = true;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001994 }
1995
Tom Stellarda96344b2014-08-21 13:58:40 +00001996 uint64_t getPointerWidthV(unsigned AddrSpace) const override {
1997 if (GPU <= GK_CAYMAN)
1998 return 32;
1999
2000 switch(AddrSpace) {
2001 default:
2002 return 64;
2003 case 0:
2004 case 3:
2005 case 5:
2006 return 32;
2007 }
2008 }
2009
Craig Topper3164f332014-03-11 03:39:26 +00002010 const char * getClobbers() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00002011 return "";
2012 }
2013
Craig Topperf054e3a2015-10-19 03:52:27 +00002014 ArrayRef<const char *> getGCCRegNames() const override;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002015
Craig Topperf054e3a2015-10-19 03:52:27 +00002016 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
2017 return None;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002018 }
2019
Craig Topper3164f332014-03-11 03:39:26 +00002020 bool validateAsmConstraint(const char *&Name,
Tom Stellardd097e942015-11-19 22:11:58 +00002021 TargetInfo::ConstraintInfo &Info) const override {
2022 switch (*Name) {
2023 default: break;
2024 case 'v': // vgpr
2025 case 's': // sgpr
2026 Info.setAllowsRegister();
2027 return true;
2028 }
2029 return false;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002030 }
2031
Matt Arsenault250024f2016-06-08 01:56:42 +00002032 bool initFeatureMap(llvm::StringMap<bool> &Features,
2033 DiagnosticsEngine &Diags, StringRef CPU,
2034 const std::vector<std::string> &FeatureVec) const override;
2035
Craig Topper6c03a542015-10-19 04:51:35 +00002036 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
2037 return llvm::makeArrayRef(BuiltinInfo,
2038 clang::AMDGPU::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eli Friedmand13b41e2012-10-12 23:32:00 +00002039 }
2040
Craig Topper3164f332014-03-11 03:39:26 +00002041 void getTargetDefines(const LangOptions &Opts,
2042 MacroBuilder &Builder) const override {
Matt Arsenault5e020b22016-02-27 09:06:26 +00002043 if (getTriple().getArch() == llvm::Triple::amdgcn)
2044 Builder.defineMacro("__AMDGCN__");
2045 else
2046 Builder.defineMacro("__R600__");
2047
Jan Veselyeebeaea2015-05-04 19:53:36 +00002048 if (hasFMAF)
2049 Builder.defineMacro("__HAS_FMAF__");
2050 if (hasLDEXPF)
2051 Builder.defineMacro("__HAS_LDEXPF__");
Jan Vesely211ba782016-06-17 02:25:03 +00002052 if (hasFP64)
2053 Builder.defineMacro("__HAS_FP64__");
Eli Friedmand13b41e2012-10-12 23:32:00 +00002054 }
2055
Craig Topper3164f332014-03-11 03:39:26 +00002056 BuiltinVaListKind getBuiltinVaListKind() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00002057 return TargetInfo::CharPtrBuiltinVaList;
2058 }
2059
Matt Arsenault250024f2016-06-08 01:56:42 +00002060 static GPUKind parseR600Name(StringRef Name) {
2061 return llvm::StringSwitch<GPUKind>(Name)
Tom Stellardc74b1e02013-03-04 17:40:53 +00002062 .Case("r600" , GK_R600)
2063 .Case("rv610", GK_R600)
2064 .Case("rv620", GK_R600)
2065 .Case("rv630", GK_R600)
2066 .Case("rv635", GK_R600)
2067 .Case("rs780", GK_R600)
2068 .Case("rs880", GK_R600)
2069 .Case("rv670", GK_R600_DOUBLE_OPS)
2070 .Case("rv710", GK_R700)
2071 .Case("rv730", GK_R700)
2072 .Case("rv740", GK_R700_DOUBLE_OPS)
2073 .Case("rv770", GK_R700_DOUBLE_OPS)
2074 .Case("palm", GK_EVERGREEN)
2075 .Case("cedar", GK_EVERGREEN)
2076 .Case("sumo", GK_EVERGREEN)
2077 .Case("sumo2", GK_EVERGREEN)
2078 .Case("redwood", GK_EVERGREEN)
2079 .Case("juniper", GK_EVERGREEN)
2080 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
2081 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
2082 .Case("barts", GK_NORTHERN_ISLANDS)
2083 .Case("turks", GK_NORTHERN_ISLANDS)
2084 .Case("caicos", GK_NORTHERN_ISLANDS)
2085 .Case("cayman", GK_CAYMAN)
2086 .Case("aruba", GK_CAYMAN)
Matt Arsenault250024f2016-06-08 01:56:42 +00002087 .Default(GK_NONE);
2088 }
2089
2090 static GPUKind parseAMDGCNName(StringRef Name) {
2091 return llvm::StringSwitch<GPUKind>(Name)
Tom Stellard785699322013-04-01 20:56:49 +00002092 .Case("tahiti", GK_SOUTHERN_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00002093 .Case("pitcairn", GK_SOUTHERN_ISLANDS)
2094 .Case("verde", GK_SOUTHERN_ISLANDS)
2095 .Case("oland", GK_SOUTHERN_ISLANDS)
Tom Stellard9affba42014-08-21 13:58:38 +00002096 .Case("hainan", GK_SOUTHERN_ISLANDS)
Tom Stellard08ded122013-10-29 16:38:29 +00002097 .Case("bonaire", GK_SEA_ISLANDS)
2098 .Case("kabini", GK_SEA_ISLANDS)
2099 .Case("kaveri", GK_SEA_ISLANDS)
Tom Stellard55583042013-11-14 23:45:53 +00002100 .Case("hawaii", GK_SEA_ISLANDS)
Tom Stellard14e03962014-07-26 01:05:20 +00002101 .Case("mullins", GK_SEA_ISLANDS)
Tom Stellard5c384402015-06-18 19:14:15 +00002102 .Case("tonga", GK_VOLCANIC_ISLANDS)
2103 .Case("iceland", GK_VOLCANIC_ISLANDS)
2104 .Case("carrizo", GK_VOLCANIC_ISLANDS)
Tom Stellard2c7cdd22016-02-29 15:08:56 +00002105 .Case("fiji", GK_VOLCANIC_ISLANDS)
2106 .Case("stoney", GK_VOLCANIC_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00002107 .Default(GK_NONE);
Matt Arsenault250024f2016-06-08 01:56:42 +00002108 }
Tom Stellardc74b1e02013-03-04 17:40:53 +00002109
Matt Arsenault250024f2016-06-08 01:56:42 +00002110 bool setCPU(const std::string &Name) override {
2111 if (getTriple().getArch() == llvm::Triple::amdgcn)
2112 GPU = parseAMDGCNName(Name);
2113 else
2114 GPU = parseR600Name(Name);
Tom Stellardc74b1e02013-03-04 17:40:53 +00002115
Matt Arsenault250024f2016-06-08 01:56:42 +00002116 return GPU != GK_NONE;
Tom Stellardc74b1e02013-03-04 17:40:53 +00002117 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002118
Jan Vesely211ba782016-06-17 02:25:03 +00002119 void setSupportedOpenCLOpts() override {
2120 auto &Opts = getSupportedOpenCLOpts();
2121 Opts.cl_clang_storage_class_specifiers = 1;
2122 Opts.cl_khr_icd = 1;
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002123
Jan Vesely211ba782016-06-17 02:25:03 +00002124 if (hasFP64)
2125 Opts.cl_khr_fp64 = 1;
2126 if (GPU >= GK_EVERGREEN) {
2127 Opts.cl_khr_byte_addressable_store = 1;
2128 Opts.cl_khr_global_int32_base_atomics = 1;
2129 Opts.cl_khr_global_int32_extended_atomics = 1;
2130 Opts.cl_khr_local_int32_base_atomics = 1;
2131 Opts.cl_khr_local_int32_extended_atomics = 1;
2132 }
2133 if (GPU >= GK_SOUTHERN_ISLANDS) {
2134 Opts.cl_khr_fp16 = 1;
2135 Opts.cl_khr_int64_base_atomics = 1;
2136 Opts.cl_khr_int64_extended_atomics = 1;
2137 Opts.cl_khr_3d_image_writes = 1;
2138 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002139 }
Nikolay Haustov8c6538b2016-06-30 09:06:33 +00002140
2141 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
2142 switch (CC) {
2143 default:
2144 return CCCR_Warning;
2145 case CC_C:
2146 case CC_OpenCLKernel:
2147 return CCCR_OK;
2148 }
2149 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00002150};
2151
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002152const Builtin::Info AMDGPUTargetInfo::BuiltinInfo[] = {
Matt Arsenault56f008d2014-06-24 20:45:01 +00002153#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00002154 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Matt Arsenault250024f2016-06-08 01:56:42 +00002155#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
2156 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002157#include "clang/Basic/BuiltinsAMDGPU.def"
Matt Arsenault56f008d2014-06-24 20:45:01 +00002158};
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002159const char * const AMDGPUTargetInfo::GCCRegNames[] = {
Tom Stellard7b1059b2015-04-14 14:36:56 +00002160 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
2161 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
2162 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
2163 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
2164 "v32", "v33", "v34", "v35", "v36", "v37", "v38", "v39",
2165 "v40", "v41", "v42", "v43", "v44", "v45", "v46", "v47",
2166 "v48", "v49", "v50", "v51", "v52", "v53", "v54", "v55",
2167 "v56", "v57", "v58", "v59", "v60", "v61", "v62", "v63",
2168 "v64", "v65", "v66", "v67", "v68", "v69", "v70", "v71",
2169 "v72", "v73", "v74", "v75", "v76", "v77", "v78", "v79",
2170 "v80", "v81", "v82", "v83", "v84", "v85", "v86", "v87",
2171 "v88", "v89", "v90", "v91", "v92", "v93", "v94", "v95",
2172 "v96", "v97", "v98", "v99", "v100", "v101", "v102", "v103",
2173 "v104", "v105", "v106", "v107", "v108", "v109", "v110", "v111",
2174 "v112", "v113", "v114", "v115", "v116", "v117", "v118", "v119",
2175 "v120", "v121", "v122", "v123", "v124", "v125", "v126", "v127",
2176 "v128", "v129", "v130", "v131", "v132", "v133", "v134", "v135",
2177 "v136", "v137", "v138", "v139", "v140", "v141", "v142", "v143",
2178 "v144", "v145", "v146", "v147", "v148", "v149", "v150", "v151",
2179 "v152", "v153", "v154", "v155", "v156", "v157", "v158", "v159",
2180 "v160", "v161", "v162", "v163", "v164", "v165", "v166", "v167",
2181 "v168", "v169", "v170", "v171", "v172", "v173", "v174", "v175",
2182 "v176", "v177", "v178", "v179", "v180", "v181", "v182", "v183",
2183 "v184", "v185", "v186", "v187", "v188", "v189", "v190", "v191",
2184 "v192", "v193", "v194", "v195", "v196", "v197", "v198", "v199",
2185 "v200", "v201", "v202", "v203", "v204", "v205", "v206", "v207",
2186 "v208", "v209", "v210", "v211", "v212", "v213", "v214", "v215",
2187 "v216", "v217", "v218", "v219", "v220", "v221", "v222", "v223",
2188 "v224", "v225", "v226", "v227", "v228", "v229", "v230", "v231",
2189 "v232", "v233", "v234", "v235", "v236", "v237", "v238", "v239",
2190 "v240", "v241", "v242", "v243", "v244", "v245", "v246", "v247",
2191 "v248", "v249", "v250", "v251", "v252", "v253", "v254", "v255",
2192 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
2193 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
2194 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
2195 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
2196 "s32", "s33", "s34", "s35", "s36", "s37", "s38", "s39",
2197 "s40", "s41", "s42", "s43", "s44", "s45", "s46", "s47",
2198 "s48", "s49", "s50", "s51", "s52", "s53", "s54", "s55",
2199 "s56", "s57", "s58", "s59", "s60", "s61", "s62", "s63",
2200 "s64", "s65", "s66", "s67", "s68", "s69", "s70", "s71",
2201 "s72", "s73", "s74", "s75", "s76", "s77", "s78", "s79",
2202 "s80", "s81", "s82", "s83", "s84", "s85", "s86", "s87",
2203 "s88", "s89", "s90", "s91", "s92", "s93", "s94", "s95",
2204 "s96", "s97", "s98", "s99", "s100", "s101", "s102", "s103",
2205 "s104", "s105", "s106", "s107", "s108", "s109", "s110", "s111",
2206 "s112", "s113", "s114", "s115", "s116", "s117", "s118", "s119",
Etienne Bergerone8ae26f2016-03-24 18:29:24 +00002207 "s120", "s121", "s122", "s123", "s124", "s125", "s126", "s127",
Matt Arsenaultb015d622016-02-27 09:06:22 +00002208 "exec", "vcc", "scc", "m0", "flat_scratch", "exec_lo", "exec_hi",
2209 "vcc_lo", "vcc_hi", "flat_scratch_lo", "flat_scratch_hi"
Tom Stellard7b1059b2015-04-14 14:36:56 +00002210};
2211
Craig Topperf054e3a2015-10-19 03:52:27 +00002212ArrayRef<const char *> AMDGPUTargetInfo::getGCCRegNames() const {
2213 return llvm::makeArrayRef(GCCRegNames);
Tom Stellard7b1059b2015-04-14 14:36:56 +00002214}
Matt Arsenault56f008d2014-06-24 20:45:01 +00002215
Matt Arsenault250024f2016-06-08 01:56:42 +00002216bool AMDGPUTargetInfo::initFeatureMap(
2217 llvm::StringMap<bool> &Features,
2218 DiagnosticsEngine &Diags, StringRef CPU,
2219 const std::vector<std::string> &FeatureVec) const {
2220
2221 // XXX - What does the member GPU mean if device name string passed here?
2222 if (getTriple().getArch() == llvm::Triple::amdgcn) {
2223 if (CPU.empty())
2224 CPU = "tahiti";
2225
2226 switch (parseAMDGCNName(CPU)) {
2227 case GK_SOUTHERN_ISLANDS:
2228 case GK_SEA_ISLANDS:
2229 break;
2230
2231 case GK_VOLCANIC_ISLANDS:
2232 Features["s-memrealtime"] = true;
2233 Features["16-bit-insts"] = true;
2234 break;
2235
2236 case GK_NONE:
2237 return false;
2238 default:
2239 llvm_unreachable("unhandled subtarget");
2240 }
2241 } else {
2242 if (CPU.empty())
2243 CPU = "r600";
2244
2245 switch (parseR600Name(CPU)) {
2246 case GK_R600:
2247 case GK_R700:
2248 case GK_EVERGREEN:
2249 case GK_NORTHERN_ISLANDS:
2250 break;
2251 case GK_R600_DOUBLE_OPS:
2252 case GK_R700_DOUBLE_OPS:
2253 case GK_EVERGREEN_DOUBLE_OPS:
2254 case GK_CAYMAN:
2255 Features["fp64"] = true;
2256 break;
2257 case GK_NONE:
2258 return false;
2259 default:
2260 llvm_unreachable("unhandled subtarget");
2261 }
2262 }
2263
2264 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeatureVec);
2265}
2266
Eli Friedman3fd920a2008-08-20 02:34:37 +00002267// Namespace for x86 abstract base class
2268const Builtin::Info BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00002269#define BUILTIN(ID, TYPE, ATTRS) \
2270 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002271#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
Craig Topper07d3b622015-08-07 05:14:44 +00002272 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002273#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
Craig Topper07d3b622015-08-07 05:14:44 +00002274 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Chris Lattner5abdec72009-06-14 01:05:48 +00002275#include "clang/Basic/BuiltinsX86.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00002276};
Eli Friedmanb5366062008-05-20 14:21:01 +00002277
Nuno Lopescfca1f02009-12-23 17:49:57 +00002278static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002279 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
2280 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00002281 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002282 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
2283 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
2284 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00002285 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00002286 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
2287 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Marina Yatsina41c45fa2016-02-03 11:32:08 +00002288 "xmm16", "xmm17", "xmm18", "xmm19", "xmm20", "xmm21", "xmm22", "xmm23",
2289 "xmm24", "xmm25", "xmm26", "xmm27", "xmm28", "xmm29", "xmm30", "xmm31",
2290 "ymm16", "ymm17", "ymm18", "ymm19", "ymm20", "ymm21", "ymm22", "ymm23",
2291 "ymm24", "ymm25", "ymm26", "ymm27", "ymm28", "ymm29", "ymm30", "ymm31",
2292 "zmm0", "zmm1", "zmm2", "zmm3", "zmm4", "zmm5", "zmm6", "zmm7",
2293 "zmm8", "zmm9", "zmm10", "zmm11", "zmm12", "zmm13", "zmm14", "zmm15",
2294 "zmm16", "zmm17", "zmm18", "zmm19", "zmm20", "zmm21", "zmm22", "zmm23",
2295 "zmm24", "zmm25", "zmm26", "zmm27", "zmm28", "zmm29", "zmm30", "zmm31",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002296};
2297
Eric Christophercdd36352011-06-21 00:05:20 +00002298const TargetInfo::AddlRegName AddlRegNames[] = {
2299 { { "al", "ah", "eax", "rax" }, 0 },
2300 { { "bl", "bh", "ebx", "rbx" }, 3 },
2301 { { "cl", "ch", "ecx", "rcx" }, 2 },
2302 { { "dl", "dh", "edx", "rdx" }, 1 },
2303 { { "esi", "rsi" }, 4 },
2304 { { "edi", "rdi" }, 5 },
2305 { { "esp", "rsp" }, 7 },
2306 { { "ebp", "rbp" }, 6 },
Alexey Bataeva7ab1b42015-09-04 03:42:23 +00002307 { { "r8d", "r8w", "r8b" }, 38 },
2308 { { "r9d", "r9w", "r9b" }, 39 },
2309 { { "r10d", "r10w", "r10b" }, 40 },
2310 { { "r11d", "r11w", "r11b" }, 41 },
2311 { { "r12d", "r12w", "r12b" }, 42 },
2312 { { "r13d", "r13w", "r13b" }, 43 },
2313 { { "r14d", "r14w", "r14b" }, 44 },
2314 { { "r15d", "r15w", "r15b" }, 45 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00002315};
2316
2317// X86 target abstract base class; x86-32 and x86-64 are very close, so
2318// most of the implementation can be shared.
2319class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00002320 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002321 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Craig Topper543f3bd2015-10-14 23:47:57 +00002322 } SSELevel = NoSSE;
Eli Friedman33465822011-07-08 23:31:17 +00002323 enum MMX3DNowEnum {
2324 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
Craig Topper543f3bd2015-10-14 23:47:57 +00002325 } MMX3DNowLevel = NoMMX3DNow;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002326 enum XOPEnum {
2327 NoXOP,
2328 SSE4A,
2329 FMA4,
2330 XOP
Craig Topper543f3bd2015-10-14 23:47:57 +00002331 } XOPLevel = NoXOP;
Anders Carlssone437c682010-01-27 03:47:49 +00002332
Craig Topper543f3bd2015-10-14 23:47:57 +00002333 bool HasAES = false;
2334 bool HasPCLMUL = false;
2335 bool HasLZCNT = false;
2336 bool HasRDRND = false;
2337 bool HasFSGSBASE = false;
2338 bool HasBMI = false;
2339 bool HasBMI2 = false;
2340 bool HasPOPCNT = false;
2341 bool HasRTM = false;
2342 bool HasPRFCHW = false;
2343 bool HasRDSEED = false;
2344 bool HasADX = false;
2345 bool HasTBM = false;
2346 bool HasFMA = false;
2347 bool HasF16C = false;
2348 bool HasAVX512CD = false;
2349 bool HasAVX512ER = false;
2350 bool HasAVX512PF = false;
2351 bool HasAVX512DQ = false;
2352 bool HasAVX512BW = false;
2353 bool HasAVX512VL = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002354 bool HasAVX512VBMI = false;
2355 bool HasAVX512IFMA = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002356 bool HasSHA = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002357 bool HasMPX = false;
2358 bool HasSGX = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002359 bool HasCX16 = false;
Craig Toppere33f51f2015-10-16 06:22:36 +00002360 bool HasFXSR = false;
Craig Topperda9fe562015-10-15 05:23:38 +00002361 bool HasXSAVE = false;
2362 bool HasXSAVEOPT = false;
2363 bool HasXSAVEC = false;
2364 bool HasXSAVES = false;
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00002365 bool HasMWAITX = false;
Asaf Badouha9d1e182015-12-31 14:14:07 +00002366 bool HasPKU = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002367 bool HasCLFLUSHOPT = false;
2368 bool HasPCOMMIT = false;
2369 bool HasCLWB = false;
2370 bool HasUMIP = false;
2371 bool HasMOVBE = false;
2372 bool HasPREFETCHWT1 = false;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00002373
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002374 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
2375 ///
2376 /// Each enumeration represents a particular CPU supported by Clang. These
2377 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
2378 enum CPUKind {
2379 CK_Generic,
2380
2381 /// \name i386
2382 /// i386-generation processors.
2383 //@{
2384 CK_i386,
2385 //@}
2386
2387 /// \name i486
2388 /// i486-generation processors.
2389 //@{
2390 CK_i486,
2391 CK_WinChipC6,
2392 CK_WinChip2,
2393 CK_C3,
2394 //@}
2395
2396 /// \name i586
2397 /// i586-generation processors, P5 microarchitecture based.
2398 //@{
2399 CK_i586,
2400 CK_Pentium,
2401 CK_PentiumMMX,
2402 //@}
2403
2404 /// \name i686
2405 /// i686-generation processors, P6 / Pentium M microarchitecture based.
2406 //@{
2407 CK_i686,
2408 CK_PentiumPro,
2409 CK_Pentium2,
2410 CK_Pentium3,
2411 CK_Pentium3M,
2412 CK_PentiumM,
2413 CK_C3_2,
2414
2415 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
2416 /// Clang however has some logic to suport this.
2417 // FIXME: Warn, deprecate, and potentially remove this.
2418 CK_Yonah,
2419 //@}
2420
2421 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00002422 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002423 //@{
2424 CK_Pentium4,
2425 CK_Pentium4M,
2426 CK_Prescott,
2427 CK_Nocona,
2428 //@}
2429
2430 /// \name Core
2431 /// Core microarchitecture based processors.
2432 //@{
2433 CK_Core2,
2434
2435 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
2436 /// codename which GCC no longer accepts as an option to -march, but Clang
2437 /// has some logic for recognizing it.
2438 // FIXME: Warn, deprecate, and potentially remove this.
2439 CK_Penryn,
2440 //@}
2441
2442 /// \name Atom
2443 /// Atom processors
2444 //@{
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002445 CK_Bonnell,
Preston Gurda3c58c02013-09-13 19:27:17 +00002446 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002447 //@}
2448
2449 /// \name Nehalem
2450 /// Nehalem microarchitecture based processors.
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002451 CK_Nehalem,
2452
2453 /// \name Westmere
2454 /// Westmere microarchitecture based processors.
2455 CK_Westmere,
2456
2457 /// \name Sandy Bridge
2458 /// Sandy Bridge microarchitecture based processors.
2459 CK_SandyBridge,
2460
2461 /// \name Ivy Bridge
2462 /// Ivy Bridge microarchitecture based processors.
2463 CK_IvyBridge,
2464
2465 /// \name Haswell
2466 /// Haswell microarchitecture based processors.
2467 CK_Haswell,
2468
2469 /// \name Broadwell
2470 /// Broadwell microarchitecture based processors.
Robert Khasanov50e6f582014-09-19 09:53:48 +00002471 CK_Broadwell,
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002472
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002473 /// \name Skylake Client
2474 /// Skylake client microarchitecture based processors.
2475 CK_SkylakeClient,
2476
2477 /// \name Skylake Server
2478 /// Skylake server microarchitecture based processors.
2479 CK_SkylakeServer,
2480
2481 /// \name Cannonlake Client
2482 /// Cannonlake client microarchitecture based processors.
2483 CK_Cannonlake,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002484
Craig Topper449314e2013-08-20 07:09:39 +00002485 /// \name Knights Landing
2486 /// Knights Landing processor.
2487 CK_KNL,
2488
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002489 /// \name Lakemont
2490 /// Lakemont microarchitecture based processors.
2491 CK_Lakemont,
2492
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002493 /// \name K6
2494 /// K6 architecture processors.
2495 //@{
2496 CK_K6,
2497 CK_K6_2,
2498 CK_K6_3,
2499 //@}
2500
2501 /// \name K7
2502 /// K7 architecture processors.
2503 //@{
2504 CK_Athlon,
2505 CK_AthlonThunderbird,
2506 CK_Athlon4,
2507 CK_AthlonXP,
2508 CK_AthlonMP,
2509 //@}
2510
2511 /// \name K8
2512 /// K8 architecture processors.
2513 //@{
2514 CK_Athlon64,
2515 CK_Athlon64SSE3,
2516 CK_AthlonFX,
2517 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00002518 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002519 CK_Opteron,
2520 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00002521 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002522 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002523
Benjamin Kramer569f2152012-01-10 11:50:18 +00002524 /// \name Bobcat
2525 /// Bobcat architecture processors.
2526 //@{
2527 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002528 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002529 //@}
2530
2531 /// \name Bulldozer
2532 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002533 //@{
2534 CK_BDVER1,
2535 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002536 CK_BDVER3,
Benjamin Kramer56c58222014-05-02 15:47:51 +00002537 CK_BDVER4,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002538 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002539
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002540 /// This specification is deprecated and will be removed in the future.
2541 /// Users should prefer \see CK_K8.
2542 // FIXME: Warn on this when the CPU is set to it.
Saleem Abdulrasoolcb29c1a2014-11-17 18:40:15 +00002543 //@{
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002544 CK_x86_64,
2545 //@}
2546
2547 /// \name Geode
2548 /// Geode processors.
2549 //@{
2550 CK_Geode
2551 //@}
Craig Topper543f3bd2015-10-14 23:47:57 +00002552 } CPU = CK_Generic;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002553
Eric Christopherc50738f2015-08-27 00:05:50 +00002554 CPUKind getCPUKind(StringRef CPU) const {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002555 return llvm::StringSwitch<CPUKind>(CPU)
2556 .Case("i386", CK_i386)
2557 .Case("i486", CK_i486)
2558 .Case("winchip-c6", CK_WinChipC6)
2559 .Case("winchip2", CK_WinChip2)
2560 .Case("c3", CK_C3)
2561 .Case("i586", CK_i586)
2562 .Case("pentium", CK_Pentium)
2563 .Case("pentium-mmx", CK_PentiumMMX)
2564 .Case("i686", CK_i686)
2565 .Case("pentiumpro", CK_PentiumPro)
2566 .Case("pentium2", CK_Pentium2)
2567 .Case("pentium3", CK_Pentium3)
2568 .Case("pentium3m", CK_Pentium3M)
2569 .Case("pentium-m", CK_PentiumM)
2570 .Case("c3-2", CK_C3_2)
2571 .Case("yonah", CK_Yonah)
2572 .Case("pentium4", CK_Pentium4)
2573 .Case("pentium4m", CK_Pentium4M)
2574 .Case("prescott", CK_Prescott)
2575 .Case("nocona", CK_Nocona)
2576 .Case("core2", CK_Core2)
2577 .Case("penryn", CK_Penryn)
2578 .Case("bonnell", CK_Bonnell)
2579 .Case("atom", CK_Bonnell) // Legacy name.
2580 .Case("silvermont", CK_Silvermont)
2581 .Case("slm", CK_Silvermont) // Legacy name.
2582 .Case("nehalem", CK_Nehalem)
2583 .Case("corei7", CK_Nehalem) // Legacy name.
2584 .Case("westmere", CK_Westmere)
2585 .Case("sandybridge", CK_SandyBridge)
2586 .Case("corei7-avx", CK_SandyBridge) // Legacy name.
2587 .Case("ivybridge", CK_IvyBridge)
2588 .Case("core-avx-i", CK_IvyBridge) // Legacy name.
2589 .Case("haswell", CK_Haswell)
2590 .Case("core-avx2", CK_Haswell) // Legacy name.
2591 .Case("broadwell", CK_Broadwell)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002592 .Case("skylake", CK_SkylakeClient)
2593 .Case("skylake-avx512", CK_SkylakeServer)
2594 .Case("skx", CK_SkylakeServer) // Legacy name.
2595 .Case("cannonlake", CK_Cannonlake)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002596 .Case("knl", CK_KNL)
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002597 .Case("lakemont", CK_Lakemont)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002598 .Case("k6", CK_K6)
2599 .Case("k6-2", CK_K6_2)
2600 .Case("k6-3", CK_K6_3)
2601 .Case("athlon", CK_Athlon)
2602 .Case("athlon-tbird", CK_AthlonThunderbird)
2603 .Case("athlon-4", CK_Athlon4)
2604 .Case("athlon-xp", CK_AthlonXP)
2605 .Case("athlon-mp", CK_AthlonMP)
2606 .Case("athlon64", CK_Athlon64)
2607 .Case("athlon64-sse3", CK_Athlon64SSE3)
2608 .Case("athlon-fx", CK_AthlonFX)
2609 .Case("k8", CK_K8)
2610 .Case("k8-sse3", CK_K8SSE3)
2611 .Case("opteron", CK_Opteron)
2612 .Case("opteron-sse3", CK_OpteronSSE3)
2613 .Case("barcelona", CK_AMDFAM10)
2614 .Case("amdfam10", CK_AMDFAM10)
2615 .Case("btver1", CK_BTVER1)
2616 .Case("btver2", CK_BTVER2)
2617 .Case("bdver1", CK_BDVER1)
2618 .Case("bdver2", CK_BDVER2)
2619 .Case("bdver3", CK_BDVER3)
2620 .Case("bdver4", CK_BDVER4)
2621 .Case("x86-64", CK_x86_64)
2622 .Case("geode", CK_Geode)
2623 .Default(CK_Generic);
2624 }
2625
Rafael Espindolaeb265472013-08-21 21:59:03 +00002626 enum FPMathKind {
2627 FP_Default,
2628 FP_SSE,
2629 FP_387
Craig Topper543f3bd2015-10-14 23:47:57 +00002630 } FPMath = FP_Default;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002631
Eli Friedman3fd920a2008-08-20 02:34:37 +00002632public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00002633 X86TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
2634 : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00002635 BigEndian = false;
Andrey Bokhanko94e1d582015-11-05 12:43:09 +00002636 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00002637 }
Craig Topper3164f332014-03-11 03:39:26 +00002638 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00002639 // X87 evaluates with 80 bits "long double" precision.
2640 return SSELevel == NoSSE ? 2 : 0;
2641 }
Craig Topper6c03a542015-10-19 04:51:35 +00002642 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
2643 return llvm::makeArrayRef(BuiltinInfo,
2644 clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner10a5b382007-01-29 05:24:35 +00002645 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002646 ArrayRef<const char *> getGCCRegNames() const override {
2647 return llvm::makeArrayRef(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00002648 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002649 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
2650 return None;
Eric Christophercdd36352011-06-21 00:05:20 +00002651 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002652 ArrayRef<TargetInfo::AddlRegName> getGCCAddlRegNames() const override {
2653 return llvm::makeArrayRef(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00002654 }
Eric Christopherd9832702015-06-29 21:00:05 +00002655 bool validateCpuSupports(StringRef Name) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002656 bool validateAsmConstraint(const char *&Name,
Eric Christopher917e9522014-11-18 22:36:15 +00002657 TargetInfo::ConstraintInfo &info) const override;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002658
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00002659 bool validateGlobalRegisterVariable(StringRef RegName,
2660 unsigned RegSize,
2661 bool &HasSizeMismatch) const override {
2662 // esp and ebp are the only 32-bit registers the x86 backend can currently
2663 // handle.
2664 if (RegName.equals("esp") || RegName.equals("ebp")) {
2665 // Check that the register size is 32-bit.
2666 HasSizeMismatch = RegSize != 32;
2667 return true;
2668 }
2669
2670 return false;
2671 }
2672
Akira Hatanaka974131e2014-09-18 18:17:18 +00002673 bool validateOutputSize(StringRef Constraint, unsigned Size) const override;
2674
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002675 bool validateInputSize(StringRef Constraint, unsigned Size) const override;
2676
Akira Hatanaka974131e2014-09-18 18:17:18 +00002677 virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const;
2678
Craig Topper3164f332014-03-11 03:39:26 +00002679 std::string convertConstraint(const char *&Constraint) const override;
2680 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002681 return "~{dirflag},~{fpsr},~{flags}";
2682 }
Craig Topper3164f332014-03-11 03:39:26 +00002683 void getTargetDefines(const LangOptions &Opts,
2684 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00002685 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
2686 bool Enabled);
2687 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
2688 bool Enabled);
2689 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
2690 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002691 void setFeatureEnabled(llvm::StringMap<bool> &Features,
2692 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00002693 setFeatureEnabledImpl(Features, Name, Enabled);
2694 }
2695 // This exists purely to cut down on the number of virtual calls in
Eric Christopheref1e2952015-08-28 02:13:58 +00002696 // initFeatureMap which calls this repeatedly.
Craig Topper86d79ef2013-09-17 04:51:29 +00002697 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2698 StringRef Name, bool Enabled);
Eric Christopher8c47b422015-10-09 18:39:55 +00002699 bool
2700 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
2701 StringRef CPU,
2702 const std::vector<std::string> &FeaturesVec) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002703 bool hasFeature(StringRef Feature) const override;
2704 bool handleTargetFeatures(std::vector<std::string> &Features,
2705 DiagnosticsEngine &Diags) override;
Alp Toker4925ba72014-06-07 23:30:42 +00002706 StringRef getABI() const override {
Ahmed Bougacha0b938282015-06-22 21:31:43 +00002707 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX512F)
2708 return "avx512";
Craig Topperd945d502015-10-20 00:00:17 +00002709 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002710 return "avx";
Craig Topperd945d502015-10-20 00:00:17 +00002711 if (getTriple().getArch() == llvm::Triple::x86 &&
Derek Schuffc7dd7222012-10-11 15:52:22 +00002712 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002713 return "no-mmx";
2714 return "";
Eli Friedman33465822011-07-08 23:31:17 +00002715 }
Craig Topper3164f332014-03-11 03:39:26 +00002716 bool setCPU(const std::string &Name) override {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002717 CPU = getCPUKind(Name);
Chandler Carruth212334f2011-09-28 08:55:37 +00002718
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002719 // Perform any per-CPU checks necessary to determine if this CPU is
2720 // acceptable.
2721 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
2722 // invalid without explaining *why*.
2723 switch (CPU) {
2724 case CK_Generic:
2725 // No processor selected!
2726 return false;
2727
2728 case CK_i386:
2729 case CK_i486:
2730 case CK_WinChipC6:
2731 case CK_WinChip2:
2732 case CK_C3:
2733 case CK_i586:
2734 case CK_Pentium:
2735 case CK_PentiumMMX:
2736 case CK_i686:
2737 case CK_PentiumPro:
2738 case CK_Pentium2:
2739 case CK_Pentium3:
2740 case CK_Pentium3M:
2741 case CK_PentiumM:
2742 case CK_Yonah:
2743 case CK_C3_2:
2744 case CK_Pentium4:
2745 case CK_Pentium4M:
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002746 case CK_Lakemont:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002747 case CK_Prescott:
2748 case CK_K6:
2749 case CK_K6_2:
2750 case CK_K6_3:
2751 case CK_Athlon:
2752 case CK_AthlonThunderbird:
2753 case CK_Athlon4:
2754 case CK_AthlonXP:
2755 case CK_AthlonMP:
2756 case CK_Geode:
2757 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002758 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002759 return false;
2760
2761 // Fallthrough
2762 case CK_Nocona:
2763 case CK_Core2:
2764 case CK_Penryn:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002765 case CK_Bonnell:
Preston Gurda3c58c02013-09-13 19:27:17 +00002766 case CK_Silvermont:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002767 case CK_Nehalem:
2768 case CK_Westmere:
2769 case CK_SandyBridge:
2770 case CK_IvyBridge:
2771 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002772 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002773 case CK_SkylakeClient:
2774 case CK_SkylakeServer:
2775 case CK_Cannonlake:
Craig Topper449314e2013-08-20 07:09:39 +00002776 case CK_KNL:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002777 case CK_Athlon64:
2778 case CK_Athlon64SSE3:
2779 case CK_AthlonFX:
2780 case CK_K8:
2781 case CK_K8SSE3:
2782 case CK_Opteron:
2783 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00002784 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00002785 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002786 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002787 case CK_BDVER1:
2788 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002789 case CK_BDVER3:
Benjamin Kramer56c58222014-05-02 15:47:51 +00002790 case CK_BDVER4:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002791 case CK_x86_64:
2792 return true;
2793 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00002794 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002795 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002796
Craig Topper3164f332014-03-11 03:39:26 +00002797 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002798
Craig Topper3164f332014-03-11 03:39:26 +00002799 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00002800 // Most of the non-ARM calling conventions are i386 conventions.
2801 switch (CC) {
2802 case CC_X86ThisCall:
2803 case CC_X86FastCall:
2804 case CC_X86StdCall:
2805 case CC_X86VectorCall:
2806 case CC_C:
2807 case CC_Swift:
2808 case CC_X86Pascal:
2809 case CC_IntelOclBicc:
2810 return CCCR_OK;
2811 default:
2812 return CCCR_Warning;
2813 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002814 }
2815
Craig Topper3164f332014-03-11 03:39:26 +00002816 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00002817 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002818 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00002819
2820 bool hasSjLjLowering() const override {
2821 return true;
2822 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002823
2824 void setSupportedOpenCLOpts() override {
2825 getSupportedOpenCLOpts().setAll();
2826 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00002827};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002828
Rafael Espindolaeb265472013-08-21 21:59:03 +00002829bool X86TargetInfo::setFPMath(StringRef Name) {
2830 if (Name == "387") {
2831 FPMath = FP_387;
2832 return true;
2833 }
2834 if (Name == "sse") {
2835 FPMath = FP_SSE;
2836 return true;
2837 }
2838 return false;
2839}
2840
Eric Christopher007b0a02015-08-28 22:32:01 +00002841bool X86TargetInfo::initFeatureMap(
2842 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
Eric Christopher8c47b422015-10-09 18:39:55 +00002843 const std::vector<std::string> &FeaturesVec) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002844 // FIXME: This *really* should not be here.
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002845 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002846 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00002847 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002848
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002849 const CPUKind Kind = getCPUKind(CPU);
Andrey Turetskiy5f1cf5f2016-03-23 11:15:10 +00002850
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002851 // Enable X87 for all X86 processors but Lakemont.
2852 if (Kind != CK_Lakemont)
2853 setFeatureEnabledImpl(Features, "x87", true);
2854
2855 switch (Kind) {
Chandler Carruth212334f2011-09-28 08:55:37 +00002856 case CK_Generic:
2857 case CK_i386:
2858 case CK_i486:
2859 case CK_i586:
2860 case CK_Pentium:
2861 case CK_i686:
2862 case CK_PentiumPro:
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002863 case CK_Lakemont:
Chandler Carruth212334f2011-09-28 08:55:37 +00002864 break;
2865 case CK_PentiumMMX:
2866 case CK_Pentium2:
Craig Topperdb4dc082014-11-06 05:52:19 +00002867 case CK_K6:
2868 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00002869 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002870 break;
2871 case CK_Pentium3:
2872 case CK_Pentium3M:
Craig Topperdb4dc082014-11-06 05:52:19 +00002873 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002874 setFeatureEnabledImpl(Features, "sse", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002875 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002876 break;
2877 case CK_PentiumM:
2878 case CK_Pentium4:
2879 case CK_Pentium4M:
2880 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00002881 setFeatureEnabledImpl(Features, "sse2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002882 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002883 break;
2884 case CK_Yonah:
2885 case CK_Prescott:
2886 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00002887 setFeatureEnabledImpl(Features, "sse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002888 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002889 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002890 break;
2891 case CK_Core2:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002892 case CK_Bonnell:
Craig Topper86d79ef2013-09-17 04:51:29 +00002893 setFeatureEnabledImpl(Features, "ssse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002894 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002895 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002896 break;
2897 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00002898 setFeatureEnabledImpl(Features, "sse4.1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002899 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002900 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002901 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002902 case CK_Cannonlake:
2903 setFeatureEnabledImpl(Features, "avx512ifma", true);
2904 setFeatureEnabledImpl(Features, "avx512vbmi", true);
2905 setFeatureEnabledImpl(Features, "sha", true);
2906 setFeatureEnabledImpl(Features, "umip", true);
2907 // FALLTHROUGH
2908 case CK_SkylakeServer:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002909 setFeatureEnabledImpl(Features, "avx512f", true);
2910 setFeatureEnabledImpl(Features, "avx512cd", true);
2911 setFeatureEnabledImpl(Features, "avx512dq", true);
2912 setFeatureEnabledImpl(Features, "avx512bw", true);
2913 setFeatureEnabledImpl(Features, "avx512vl", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002914 setFeatureEnabledImpl(Features, "pku", true);
2915 setFeatureEnabledImpl(Features, "pcommit", true);
2916 setFeatureEnabledImpl(Features, "clwb", true);
2917 // FALLTHROUGH
2918 case CK_SkylakeClient:
Craig Topperda9fe562015-10-15 05:23:38 +00002919 setFeatureEnabledImpl(Features, "xsavec", true);
2920 setFeatureEnabledImpl(Features, "xsaves", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002921 setFeatureEnabledImpl(Features, "mpx", true);
2922 setFeatureEnabledImpl(Features, "sgx", true);
2923 setFeatureEnabledImpl(Features, "clflushopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002924 // FALLTHROUGH
2925 case CK_Broadwell:
2926 setFeatureEnabledImpl(Features, "rdseed", true);
2927 setFeatureEnabledImpl(Features, "adx", true);
2928 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002929 case CK_Haswell:
Craig Topperdb4dc082014-11-06 05:52:19 +00002930 setFeatureEnabledImpl(Features, "avx2", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002931 setFeatureEnabledImpl(Features, "lzcnt", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002932 setFeatureEnabledImpl(Features, "bmi", true);
2933 setFeatureEnabledImpl(Features, "bmi2", true);
2934 setFeatureEnabledImpl(Features, "rtm", true);
2935 setFeatureEnabledImpl(Features, "fma", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002936 setFeatureEnabledImpl(Features, "movbe", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002937 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002938 case CK_IvyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002939 setFeatureEnabledImpl(Features, "rdrnd", true);
2940 setFeatureEnabledImpl(Features, "f16c", true);
2941 setFeatureEnabledImpl(Features, "fsgsbase", true);
2942 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002943 case CK_SandyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002944 setFeatureEnabledImpl(Features, "avx", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002945 setFeatureEnabledImpl(Features, "xsave", true);
2946 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002947 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002948 case CK_Westmere:
Craig Topperdb4dc082014-11-06 05:52:19 +00002949 case CK_Silvermont:
2950 setFeatureEnabledImpl(Features, "aes", true);
2951 setFeatureEnabledImpl(Features, "pclmul", true);
2952 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002953 case CK_Nehalem:
Craig Topperdb4dc082014-11-06 05:52:19 +00002954 setFeatureEnabledImpl(Features, "sse4.2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002955 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002956 setFeatureEnabledImpl(Features, "cx16", true);
2957 break;
2958 case CK_KNL:
2959 setFeatureEnabledImpl(Features, "avx512f", true);
2960 setFeatureEnabledImpl(Features, "avx512cd", true);
2961 setFeatureEnabledImpl(Features, "avx512er", true);
2962 setFeatureEnabledImpl(Features, "avx512pf", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002963 setFeatureEnabledImpl(Features, "prefetchwt1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002964 setFeatureEnabledImpl(Features, "fxsr", true);
Robert Khasanov50e6f582014-09-19 09:53:48 +00002965 setFeatureEnabledImpl(Features, "rdseed", true);
2966 setFeatureEnabledImpl(Features, "adx", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002967 setFeatureEnabledImpl(Features, "lzcnt", true);
2968 setFeatureEnabledImpl(Features, "bmi", true);
2969 setFeatureEnabledImpl(Features, "bmi2", true);
2970 setFeatureEnabledImpl(Features, "rtm", true);
2971 setFeatureEnabledImpl(Features, "fma", true);
2972 setFeatureEnabledImpl(Features, "rdrnd", true);
2973 setFeatureEnabledImpl(Features, "f16c", true);
2974 setFeatureEnabledImpl(Features, "fsgsbase", true);
2975 setFeatureEnabledImpl(Features, "aes", true);
2976 setFeatureEnabledImpl(Features, "pclmul", true);
2977 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002978 setFeatureEnabledImpl(Features, "xsaveopt", true);
2979 setFeatureEnabledImpl(Features, "xsave", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002980 setFeatureEnabledImpl(Features, "movbe", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002981 break;
2982 case CK_K6_2:
2983 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00002984 case CK_WinChip2:
2985 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002986 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002987 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002988 case CK_Athlon:
2989 case CK_AthlonThunderbird:
2990 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00002991 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002992 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002993 case CK_Athlon4:
2994 case CK_AthlonXP:
2995 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00002996 setFeatureEnabledImpl(Features, "sse", true);
2997 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002998 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002999 break;
3000 case CK_K8:
3001 case CK_Opteron:
3002 case CK_Athlon64:
3003 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00003004 setFeatureEnabledImpl(Features, "sse2", true);
3005 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003006 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003007 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00003008 case CK_AMDFAM10:
3009 setFeatureEnabledImpl(Features, "sse4a", true);
3010 setFeatureEnabledImpl(Features, "lzcnt", true);
3011 setFeatureEnabledImpl(Features, "popcnt", true);
3012 // FALLTHROUGH
Chandler Carruth212334f2011-09-28 08:55:37 +00003013 case CK_K8SSE3:
3014 case CK_OpteronSSE3:
3015 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00003016 setFeatureEnabledImpl(Features, "sse3", true);
3017 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003018 setFeatureEnabledImpl(Features, "fxsr", true);
Roman Divackyce253d82011-10-30 13:47:56 +00003019 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00003020 case CK_BTVER2:
3021 setFeatureEnabledImpl(Features, "avx", true);
3022 setFeatureEnabledImpl(Features, "aes", true);
3023 setFeatureEnabledImpl(Features, "pclmul", true);
3024 setFeatureEnabledImpl(Features, "bmi", true);
3025 setFeatureEnabledImpl(Features, "f16c", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003026 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00003027 // FALLTHROUGH
Benjamin Kramer569f2152012-01-10 11:50:18 +00003028 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00003029 setFeatureEnabledImpl(Features, "ssse3", true);
3030 setFeatureEnabledImpl(Features, "sse4a", true);
3031 setFeatureEnabledImpl(Features, "lzcnt", true);
3032 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00003033 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003034 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003035 setFeatureEnabledImpl(Features, "fxsr", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003036 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003037 case CK_BDVER4:
3038 setFeatureEnabledImpl(Features, "avx2", true);
3039 setFeatureEnabledImpl(Features, "bmi2", true);
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003040 setFeatureEnabledImpl(Features, "mwaitx", true);
Benjamin Kramer56c58222014-05-02 15:47:51 +00003041 // FALLTHROUGH
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003042 case CK_BDVER3:
Craig Topper8c7f2512014-11-03 06:51:41 +00003043 setFeatureEnabledImpl(Features, "fsgsbase", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003044 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topper8c7f2512014-11-03 06:51:41 +00003045 // FALLTHROUGH
3046 case CK_BDVER2:
Andrea Di Biagio9760a442014-11-06 12:08:57 +00003047 setFeatureEnabledImpl(Features, "bmi", true);
3048 setFeatureEnabledImpl(Features, "fma", true);
3049 setFeatureEnabledImpl(Features, "f16c", true);
3050 setFeatureEnabledImpl(Features, "tbm", true);
3051 // FALLTHROUGH
3052 case CK_BDVER1:
3053 // xop implies avx, sse4a and fma4.
Craig Topper86d79ef2013-09-17 04:51:29 +00003054 setFeatureEnabledImpl(Features, "xop", true);
3055 setFeatureEnabledImpl(Features, "lzcnt", true);
3056 setFeatureEnabledImpl(Features, "aes", true);
3057 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00003058 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003059 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003060 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003061 setFeatureEnabledImpl(Features, "xsave", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003062 break;
Eli Friedman33465822011-07-08 23:31:17 +00003063 }
Eric Christopherbbd746d2015-10-08 20:10:14 +00003064 if (!TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec))
3065 return false;
3066
3067 // Can't do this earlier because we need to be able to explicitly enable
3068 // or disable these features and the things that they depend upon.
3069
3070 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
3071 auto I = Features.find("sse4.2");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003072 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00003073 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-popcnt") ==
3074 FeaturesVec.end())
3075 Features["popcnt"] = true;
3076
3077 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
3078 I = Features.find("3dnow");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003079 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00003080 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-prfchw") ==
3081 FeaturesVec.end())
3082 Features["prfchw"] = true;
3083
Eric Christophera7260af2015-10-08 20:10:18 +00003084 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
3085 // then enable MMX.
3086 I = Features.find("sse");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003087 if (I != Features.end() && I->getValue() &&
Eric Christophera7260af2015-10-08 20:10:18 +00003088 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-mmx") ==
3089 FeaturesVec.end())
3090 Features["mmx"] = true;
3091
Eric Christopherbbd746d2015-10-08 20:10:14 +00003092 return true;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003093}
3094
Rafael Espindolae62e2792013-08-20 13:44:29 +00003095void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00003096 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003097 if (Enabled) {
3098 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003099 case AVX512F:
3100 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003101 case AVX2:
3102 Features["avx2"] = true;
3103 case AVX:
3104 Features["avx"] = true;
Craig Topperda9fe562015-10-15 05:23:38 +00003105 Features["xsave"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003106 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00003107 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003108 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00003109 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003110 case SSSE3:
3111 Features["ssse3"] = true;
3112 case SSE3:
3113 Features["sse3"] = true;
3114 case SSE2:
3115 Features["sse2"] = true;
3116 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00003117 Features["sse"] = true;
3118 case NoSSE:
3119 break;
3120 }
3121 return;
3122 }
3123
3124 switch (Level) {
3125 case NoSSE:
3126 case SSE1:
3127 Features["sse"] = false;
3128 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00003129 Features["sse2"] = Features["pclmul"] = Features["aes"] =
3130 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003131 case SSE3:
3132 Features["sse3"] = false;
3133 setXOPLevel(Features, NoXOP, false);
3134 case SSSE3:
3135 Features["ssse3"] = false;
3136 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00003137 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003138 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00003139 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003140 case AVX:
Craig Topperda9fe562015-10-15 05:23:38 +00003141 Features["fma"] = Features["avx"] = Features["f16c"] = Features["xsave"] =
3142 Features["xsaveopt"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00003143 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003144 case AVX2:
3145 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00003146 case AVX512F:
Eric Christopher917e9522014-11-18 22:36:15 +00003147 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
Craig Toppera31a5da2014-12-27 06:59:37 +00003148 Features["avx512pf"] = Features["avx512dq"] = Features["avx512bw"] =
Craig Topperb4f83a02016-02-29 06:51:38 +00003149 Features["avx512vl"] = Features["avx512vbmi"] =
3150 Features["avx512ifma"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003151 }
3152}
3153
3154void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00003155 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003156 if (Enabled) {
3157 switch (Level) {
3158 case AMD3DNowAthlon:
3159 Features["3dnowa"] = true;
3160 case AMD3DNow:
3161 Features["3dnow"] = true;
3162 case MMX:
3163 Features["mmx"] = true;
3164 case NoMMX3DNow:
3165 break;
3166 }
3167 return;
3168 }
3169
3170 switch (Level) {
3171 case NoMMX3DNow:
3172 case MMX:
3173 Features["mmx"] = false;
3174 case AMD3DNow:
3175 Features["3dnow"] = false;
3176 case AMD3DNowAthlon:
3177 Features["3dnowa"] = false;
3178 }
3179}
3180
3181void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00003182 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003183 if (Enabled) {
3184 switch (Level) {
3185 case XOP:
3186 Features["xop"] = true;
3187 case FMA4:
3188 Features["fma4"] = true;
3189 setSSELevel(Features, AVX, true);
3190 case SSE4A:
3191 Features["sse4a"] = true;
3192 setSSELevel(Features, SSE3, true);
3193 case NoXOP:
3194 break;
3195 }
3196 return;
3197 }
3198
3199 switch (Level) {
3200 case NoXOP:
3201 case SSE4A:
3202 Features["sse4a"] = false;
3203 case FMA4:
3204 Features["fma4"] = false;
3205 case XOP:
3206 Features["xop"] = false;
3207 }
3208}
3209
Craig Topper86d79ef2013-09-17 04:51:29 +00003210void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
3211 StringRef Name, bool Enabled) {
Eric Christopher298ac302015-07-01 00:08:32 +00003212 // This is a bit of a hack to deal with the sse4 target feature when used
3213 // as part of the target attribute. We handle sse4 correctly everywhere
3214 // else. See below for more information on how we handle the sse4 options.
3215 if (Name != "sse4")
3216 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00003217
Craig Topper29561122013-09-19 01:13:07 +00003218 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003219 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003220 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003221 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003222 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003223 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003224 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003225 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003226 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003227 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003228 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003229 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003230 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003231 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003232 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003233 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003234 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003235 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003236 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003237 if (Enabled)
3238 setSSELevel(Features, SSE2, Enabled);
3239 } else if (Name == "pclmul") {
3240 if (Enabled)
3241 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003242 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003243 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003244 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003245 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003246 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003247 setSSELevel(Features, AVX512F, Enabled);
Craig Topperb4f83a02016-02-29 06:51:38 +00003248 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf" ||
3249 Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl" ||
3250 Name == "avx512vbmi" || Name == "avx512ifma") {
Craig Topper679b53a2013-08-21 05:29:10 +00003251 if (Enabled)
3252 setSSELevel(Features, AVX512F, Enabled);
3253 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003254 if (Enabled)
3255 setSSELevel(Features, AVX, Enabled);
3256 } else if (Name == "fma4") {
3257 setXOPLevel(Features, FMA4, Enabled);
3258 } else if (Name == "xop") {
3259 setXOPLevel(Features, XOP, Enabled);
3260 } else if (Name == "sse4a") {
3261 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00003262 } else if (Name == "f16c") {
3263 if (Enabled)
3264 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00003265 } else if (Name == "sha") {
3266 if (Enabled)
3267 setSSELevel(Features, SSE2, Enabled);
Eric Christopher298ac302015-07-01 00:08:32 +00003268 } else if (Name == "sse4") {
3269 // We can get here via the __target__ attribute since that's not controlled
3270 // via the -msse4/-mno-sse4 command line alias. Handle this the same way
3271 // here - turn on the sse4.2 if enabled, turn off the sse4.1 level if
3272 // disabled.
3273 if (Enabled)
3274 setSSELevel(Features, SSE42, Enabled);
3275 else
3276 setSSELevel(Features, SSE41, Enabled);
Craig Topperda9fe562015-10-15 05:23:38 +00003277 } else if (Name == "xsave") {
Craig Topper840927e2016-02-29 06:51:34 +00003278 if (!Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003279 Features["xsaveopt"] = false;
3280 } else if (Name == "xsaveopt" || Name == "xsavec" || Name == "xsaves") {
Craig Topper840927e2016-02-29 06:51:34 +00003281 if (Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003282 Features["xsave"] = true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003283 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003284}
3285
Eric Christopher3ff21b32013-10-16 21:26:26 +00003286/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003287/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00003288bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00003289 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00003290 for (const auto &Feature : Features) {
3291 if (Feature[0] != '+')
Daniel Dunbar979586e2009-11-11 09:38:56 +00003292 continue;
3293
Eric Christopher610fe112015-08-26 08:21:55 +00003294 if (Feature == "+aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00003295 HasAES = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003296 } else if (Feature == "+pclmul") {
Craig Topper3f122a72012-05-31 05:18:48 +00003297 HasPCLMUL = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003298 } else if (Feature == "+lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00003299 HasLZCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003300 } else if (Feature == "+rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00003301 HasRDRND = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003302 } else if (Feature == "+fsgsbase") {
Craig Topper8c7f2512014-11-03 06:51:41 +00003303 HasFSGSBASE = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003304 } else if (Feature == "+bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00003305 HasBMI = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003306 } else if (Feature == "+bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00003307 HasBMI2 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003308 } else if (Feature == "+popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00003309 HasPOPCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003310 } else if (Feature == "+rtm") {
Michael Liao625a8752012-11-10 05:17:46 +00003311 HasRTM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003312 } else if (Feature == "+prfchw") {
Michael Liao74f4eaf2013-03-26 17:52:08 +00003313 HasPRFCHW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003314 } else if (Feature == "+rdseed") {
Michael Liaoffaae352013-03-29 05:17:55 +00003315 HasRDSEED = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003316 } else if (Feature == "+adx") {
Robert Khasanov50e6f582014-09-19 09:53:48 +00003317 HasADX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003318 } else if (Feature == "+tbm") {
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003319 HasTBM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003320 } else if (Feature == "+fma") {
Craig Topperbba778b2012-06-03 21:46:30 +00003321 HasFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003322 } else if (Feature == "+f16c") {
Manman Rena45358c2012-10-11 00:59:55 +00003323 HasF16C = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003324 } else if (Feature == "+avx512cd") {
Craig Topper679b53a2013-08-21 05:29:10 +00003325 HasAVX512CD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003326 } else if (Feature == "+avx512er") {
Craig Topper679b53a2013-08-21 05:29:10 +00003327 HasAVX512ER = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003328 } else if (Feature == "+avx512pf") {
Craig Topper679b53a2013-08-21 05:29:10 +00003329 HasAVX512PF = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003330 } else if (Feature == "+avx512dq") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003331 HasAVX512DQ = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003332 } else if (Feature == "+avx512bw") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003333 HasAVX512BW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003334 } else if (Feature == "+avx512vl") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003335 HasAVX512VL = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003336 } else if (Feature == "+avx512vbmi") {
3337 HasAVX512VBMI = true;
3338 } else if (Feature == "+avx512ifma") {
3339 HasAVX512IFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003340 } else if (Feature == "+sha") {
Ben Langmuir58078d02013-09-19 13:22:04 +00003341 HasSHA = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003342 } else if (Feature == "+mpx") {
3343 HasMPX = true;
3344 } else if (Feature == "+movbe") {
3345 HasMOVBE = true;
3346 } else if (Feature == "+sgx") {
3347 HasSGX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003348 } else if (Feature == "+cx16") {
Nick Lewycky50e8f482013-10-05 20:14:27 +00003349 HasCX16 = true;
Craig Toppere33f51f2015-10-16 06:22:36 +00003350 } else if (Feature == "+fxsr") {
3351 HasFXSR = true;
Craig Topperda9fe562015-10-15 05:23:38 +00003352 } else if (Feature == "+xsave") {
3353 HasXSAVE = true;
3354 } else if (Feature == "+xsaveopt") {
3355 HasXSAVEOPT = true;
3356 } else if (Feature == "+xsavec") {
3357 HasXSAVEC = true;
3358 } else if (Feature == "+xsaves") {
3359 HasXSAVES = true;
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003360 } else if (Feature == "+mwaitx") {
3361 HasMWAITX = true;
Asaf Badouha9d1e182015-12-31 14:14:07 +00003362 } else if (Feature == "+pku") {
3363 HasPKU = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003364 } else if (Feature == "+clflushopt") {
3365 HasCLFLUSHOPT = true;
3366 } else if (Feature == "+pcommit") {
3367 HasPCOMMIT = true;
3368 } else if (Feature == "+clwb") {
3369 HasCLWB = true;
3370 } else if (Feature == "+umip") {
3371 HasUMIP = true;
3372 } else if (Feature == "+prefetchwt1") {
3373 HasPREFETCHWT1 = true;
Nick Lewycky50e8f482013-10-05 20:14:27 +00003374 }
3375
Benjamin Kramer27402c62012-03-05 15:10:44 +00003376 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003377 .Case("+avx512f", AVX512F)
3378 .Case("+avx2", AVX2)
3379 .Case("+avx", AVX)
3380 .Case("+sse4.2", SSE42)
3381 .Case("+sse4.1", SSE41)
3382 .Case("+ssse3", SSSE3)
3383 .Case("+sse3", SSE3)
3384 .Case("+sse2", SSE2)
3385 .Case("+sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00003386 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003387 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003388
Eli Friedman33465822011-07-08 23:31:17 +00003389 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00003390 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003391 .Case("+3dnowa", AMD3DNowAthlon)
3392 .Case("+3dnow", AMD3DNow)
3393 .Case("+mmx", MMX)
Eli Friedman33465822011-07-08 23:31:17 +00003394 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00003395 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003396
3397 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003398 .Case("+xop", XOP)
3399 .Case("+fma4", FMA4)
3400 .Case("+sse4a", SSE4A)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003401 .Default(NoXOP);
3402 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003403 }
Eli Friedman33465822011-07-08 23:31:17 +00003404
Rafael Espindolaeb265472013-08-21 21:59:03 +00003405 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
3406 // matches the selected sse level.
Craig Topperd945d502015-10-20 00:00:17 +00003407 if ((FPMath == FP_SSE && SSELevel < SSE1) ||
3408 (FPMath == FP_387 && SSELevel >= SSE1)) {
3409 Diags.Report(diag::err_target_unsupported_fpmath) <<
3410 (FPMath == FP_SSE ? "sse" : "387");
Rafael Espindolaeb265472013-08-21 21:59:03 +00003411 return false;
3412 }
3413
Alexey Bataev00396512015-07-02 03:40:19 +00003414 SimdDefaultAlign =
Ahmed Bougacha68bf64e2015-08-27 22:24:56 +00003415 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Rafael Espindolaeb265472013-08-21 21:59:03 +00003416 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00003417}
Chris Lattnerecd49032009-03-02 22:27:17 +00003418
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003419/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
3420/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00003421void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003422 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00003423 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00003424 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003425 Builder.defineMacro("__amd64__");
3426 Builder.defineMacro("__amd64");
3427 Builder.defineMacro("__x86_64");
3428 Builder.defineMacro("__x86_64__");
Bob Wilsona2acb1e2014-08-08 23:46:28 +00003429 if (getTriple().getArchName() == "x86_64h") {
3430 Builder.defineMacro("__x86_64h");
3431 Builder.defineMacro("__x86_64h__");
3432 }
Chris Lattnerecd49032009-03-02 22:27:17 +00003433 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003434 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00003435 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003436
Chris Lattnerecd49032009-03-02 22:27:17 +00003437 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003438 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
3439 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00003440 switch (CPU) {
3441 case CK_Generic:
3442 break;
3443 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003444 // The rest are coming from the i386 define above.
3445 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003446 break;
3447 case CK_i486:
3448 case CK_WinChipC6:
3449 case CK_WinChip2:
3450 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003451 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00003452 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003453 case CK_PentiumMMX:
3454 Builder.defineMacro("__pentium_mmx__");
3455 Builder.defineMacro("__tune_pentium_mmx__");
3456 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003457 case CK_i586:
3458 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003459 defineCPUMacros(Builder, "i586");
3460 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00003461 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003462 case CK_Pentium3:
3463 case CK_Pentium3M:
3464 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003465 Builder.defineMacro("__tune_pentium3__");
3466 // Fallthrough
3467 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00003468 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003469 Builder.defineMacro("__tune_pentium2__");
3470 // Fallthrough
3471 case CK_PentiumPro:
3472 Builder.defineMacro("__tune_i686__");
3473 Builder.defineMacro("__tune_pentiumpro__");
3474 // Fallthrough
3475 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003476 Builder.defineMacro("__i686");
3477 Builder.defineMacro("__i686__");
3478 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
3479 Builder.defineMacro("__pentiumpro");
3480 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003481 break;
3482 case CK_Pentium4:
3483 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003484 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00003485 break;
3486 case CK_Yonah:
3487 case CK_Prescott:
3488 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003489 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00003490 break;
3491 case CK_Core2:
3492 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003493 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00003494 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003495 case CK_Bonnell:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003496 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00003497 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00003498 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00003499 defineCPUMacros(Builder, "slm");
3500 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003501 case CK_Nehalem:
3502 case CK_Westmere:
3503 case CK_SandyBridge:
3504 case CK_IvyBridge:
3505 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00003506 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003507 case CK_SkylakeClient:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003508 // FIXME: Historically, we defined this legacy name, it would be nice to
3509 // remove it at some point. We've never exposed fine-grained names for
3510 // recent primary x86 CPUs, and we should keep it that way.
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003511 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00003512 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003513 case CK_SkylakeServer:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003514 defineCPUMacros(Builder, "skx");
3515 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003516 case CK_Cannonlake:
3517 break;
Craig Topper449314e2013-08-20 07:09:39 +00003518 case CK_KNL:
3519 defineCPUMacros(Builder, "knl");
3520 break;
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003521 case CK_Lakemont:
3522 Builder.defineMacro("__tune_lakemont__");
3523 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003524 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003525 Builder.defineMacro("__k6_2__");
3526 Builder.defineMacro("__tune_k6_2__");
3527 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003528 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003529 if (CPU != CK_K6_2) { // In case of fallthrough
3530 // FIXME: GCC may be enabling these in cases where some other k6
3531 // architecture is specified but -m3dnow is explicitly provided. The
3532 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003533 Builder.defineMacro("__k6_3__");
3534 Builder.defineMacro("__tune_k6_3__");
3535 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003536 // Fallthrough
3537 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003538 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00003539 break;
3540 case CK_Athlon:
3541 case CK_AthlonThunderbird:
3542 case CK_Athlon4:
3543 case CK_AthlonXP:
3544 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003545 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003546 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003547 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003548 Builder.defineMacro("__tune_athlon_sse__");
3549 }
Chandler Carruth212334f2011-09-28 08:55:37 +00003550 break;
3551 case CK_K8:
3552 case CK_K8SSE3:
3553 case CK_x86_64:
3554 case CK_Opteron:
3555 case CK_OpteronSSE3:
3556 case CK_Athlon64:
3557 case CK_Athlon64SSE3:
3558 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003559 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00003560 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00003561 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003562 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00003563 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00003564 case CK_BTVER1:
3565 defineCPUMacros(Builder, "btver1");
3566 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003567 case CK_BTVER2:
3568 defineCPUMacros(Builder, "btver2");
3569 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003570 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003571 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003572 break;
3573 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003574 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003575 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003576 case CK_BDVER3:
3577 defineCPUMacros(Builder, "bdver3");
3578 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003579 case CK_BDVER4:
3580 defineCPUMacros(Builder, "bdver4");
3581 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003582 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003583 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00003584 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003585 }
Chris Lattner96e43572009-03-02 22:40:39 +00003586
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003587 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003588 Builder.defineMacro("__REGISTER_PREFIX__", "");
3589
Chris Lattner6df41af2009-04-19 17:32:33 +00003590 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
3591 // functions in glibc header files that use FP Stack inline asm which the
3592 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003593 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003594
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003595 if (HasAES)
3596 Builder.defineMacro("__AES__");
3597
Craig Topper3f122a72012-05-31 05:18:48 +00003598 if (HasPCLMUL)
3599 Builder.defineMacro("__PCLMUL__");
3600
Craig Topper22967d42011-12-25 05:06:45 +00003601 if (HasLZCNT)
3602 Builder.defineMacro("__LZCNT__");
3603
Benjamin Kramer1e250392012-07-07 09:39:18 +00003604 if (HasRDRND)
3605 Builder.defineMacro("__RDRND__");
3606
Craig Topper8c7f2512014-11-03 06:51:41 +00003607 if (HasFSGSBASE)
3608 Builder.defineMacro("__FSGSBASE__");
3609
Craig Topper22967d42011-12-25 05:06:45 +00003610 if (HasBMI)
3611 Builder.defineMacro("__BMI__");
3612
3613 if (HasBMI2)
3614 Builder.defineMacro("__BMI2__");
3615
Craig Topper1de83482011-12-29 16:10:46 +00003616 if (HasPOPCNT)
3617 Builder.defineMacro("__POPCNT__");
3618
Michael Liao625a8752012-11-10 05:17:46 +00003619 if (HasRTM)
3620 Builder.defineMacro("__RTM__");
3621
Michael Liao74f4eaf2013-03-26 17:52:08 +00003622 if (HasPRFCHW)
3623 Builder.defineMacro("__PRFCHW__");
3624
Michael Liaoffaae352013-03-29 05:17:55 +00003625 if (HasRDSEED)
3626 Builder.defineMacro("__RDSEED__");
3627
Robert Khasanov50e6f582014-09-19 09:53:48 +00003628 if (HasADX)
3629 Builder.defineMacro("__ADX__");
3630
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003631 if (HasTBM)
3632 Builder.defineMacro("__TBM__");
3633
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003634 if (HasMWAITX)
3635 Builder.defineMacro("__MWAITX__");
3636
Rafael Espindolae62e2792013-08-20 13:44:29 +00003637 switch (XOPLevel) {
3638 case XOP:
3639 Builder.defineMacro("__XOP__");
3640 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00003641 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00003642 case SSE4A:
3643 Builder.defineMacro("__SSE4A__");
3644 case NoXOP:
3645 break;
3646 }
Craig Topperffdb46c2011-12-30 07:33:42 +00003647
Craig Topperbba778b2012-06-03 21:46:30 +00003648 if (HasFMA)
3649 Builder.defineMacro("__FMA__");
3650
Manman Rena45358c2012-10-11 00:59:55 +00003651 if (HasF16C)
3652 Builder.defineMacro("__F16C__");
3653
Craig Topper679b53a2013-08-21 05:29:10 +00003654 if (HasAVX512CD)
3655 Builder.defineMacro("__AVX512CD__");
3656 if (HasAVX512ER)
3657 Builder.defineMacro("__AVX512ER__");
3658 if (HasAVX512PF)
3659 Builder.defineMacro("__AVX512PF__");
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003660 if (HasAVX512DQ)
3661 Builder.defineMacro("__AVX512DQ__");
3662 if (HasAVX512BW)
3663 Builder.defineMacro("__AVX512BW__");
3664 if (HasAVX512VL)
3665 Builder.defineMacro("__AVX512VL__");
Craig Topperb4f83a02016-02-29 06:51:38 +00003666 if (HasAVX512VBMI)
3667 Builder.defineMacro("__AVX512VBMI__");
3668 if (HasAVX512IFMA)
3669 Builder.defineMacro("__AVX512IFMA__");
Craig Topper679b53a2013-08-21 05:29:10 +00003670
Ben Langmuir58078d02013-09-19 13:22:04 +00003671 if (HasSHA)
3672 Builder.defineMacro("__SHA__");
3673
Craig Toppere33f51f2015-10-16 06:22:36 +00003674 if (HasFXSR)
3675 Builder.defineMacro("__FXSR__");
Craig Topperda9fe562015-10-15 05:23:38 +00003676 if (HasXSAVE)
3677 Builder.defineMacro("__XSAVE__");
3678 if (HasXSAVEOPT)
3679 Builder.defineMacro("__XSAVEOPT__");
3680 if (HasXSAVEC)
3681 Builder.defineMacro("__XSAVEC__");
3682 if (HasXSAVES)
3683 Builder.defineMacro("__XSAVES__");
Asaf Badouha9d1e182015-12-31 14:14:07 +00003684 if (HasPKU)
3685 Builder.defineMacro("__PKU__");
Nick Lewycky50e8f482013-10-05 20:14:27 +00003686 if (HasCX16)
3687 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
3688
Chris Lattner96e43572009-03-02 22:40:39 +00003689 // Each case falls through to the previous one here.
3690 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003691 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00003692 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00003693 case AVX2:
3694 Builder.defineMacro("__AVX2__");
3695 case AVX:
3696 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00003697 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003698 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00003699 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003700 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00003701 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003702 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003703 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003704 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003705 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003706 Builder.defineMacro("__SSE2__");
3707 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00003708 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003709 Builder.defineMacro("__SSE__");
3710 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00003711 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00003712 break;
3713 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003714
Derek Schuffc7dd7222012-10-11 15:52:22 +00003715 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003716 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003717 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00003718 case AVX2:
3719 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003720 case SSE42:
3721 case SSE41:
3722 case SSSE3:
3723 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003724 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003725 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003726 break;
3727 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003728 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003729 break;
3730 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003731 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003732 }
3733 }
3734
Anders Carlssone437c682010-01-27 03:47:49 +00003735 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00003736 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00003737 case AMD3DNowAthlon:
3738 Builder.defineMacro("__3dNOW_A__");
3739 case AMD3DNow:
3740 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00003741 case MMX:
3742 Builder.defineMacro("__MMX__");
3743 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00003744 break;
3745 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00003746
3747 if (CPU >= CK_i486) {
3748 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
3749 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
3750 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
3751 }
3752 if (CPU >= CK_i586)
3753 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00003754}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003755
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003756bool X86TargetInfo::hasFeature(StringRef Feature) const {
3757 return llvm::StringSwitch<bool>(Feature)
3758 .Case("aes", HasAES)
3759 .Case("avx", SSELevel >= AVX)
3760 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00003761 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00003762 .Case("avx512cd", HasAVX512CD)
3763 .Case("avx512er", HasAVX512ER)
3764 .Case("avx512pf", HasAVX512PF)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003765 .Case("avx512dq", HasAVX512DQ)
3766 .Case("avx512bw", HasAVX512BW)
3767 .Case("avx512vl", HasAVX512VL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003768 .Case("avx512vbmi", HasAVX512VBMI)
3769 .Case("avx512ifma", HasAVX512IFMA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003770 .Case("bmi", HasBMI)
3771 .Case("bmi2", HasBMI2)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003772 .Case("clflushopt", HasCLFLUSHOPT)
3773 .Case("clwb", HasCLWB)
Nick Lewycky50e8f482013-10-05 20:14:27 +00003774 .Case("cx16", HasCX16)
3775 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00003776 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003777 .Case("fma4", XOPLevel >= FMA4)
Craig Topper8c7f2512014-11-03 06:51:41 +00003778 .Case("fsgsbase", HasFSGSBASE)
Craig Toppere33f51f2015-10-16 06:22:36 +00003779 .Case("fxsr", HasFXSR)
Craig Topper8dbc5842014-11-03 07:05:26 +00003780 .Case("lzcnt", HasLZCNT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003781 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
3782 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
3783 .Case("mmx", MMX3DNowLevel >= MMX)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003784 .Case("movbe", HasMOVBE)
3785 .Case("mpx", HasMPX)
Craig Topper3f122a72012-05-31 05:18:48 +00003786 .Case("pclmul", HasPCLMUL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003787 .Case("pcommit", HasPCOMMIT)
3788 .Case("pku", HasPKU)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003789 .Case("popcnt", HasPOPCNT)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003790 .Case("prefetchwt1", HasPREFETCHWT1)
Michael Liao74f4eaf2013-03-26 17:52:08 +00003791 .Case("prfchw", HasPRFCHW)
Craig Topper8dbc5842014-11-03 07:05:26 +00003792 .Case("rdrnd", HasRDRND)
Michael Liaoffaae352013-03-29 05:17:55 +00003793 .Case("rdseed", HasRDSEED)
Craig Topper8dbc5842014-11-03 07:05:26 +00003794 .Case("rtm", HasRTM)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003795 .Case("sgx", HasSGX)
Ben Langmuir58078d02013-09-19 13:22:04 +00003796 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003797 .Case("sse", SSELevel >= SSE1)
3798 .Case("sse2", SSELevel >= SSE2)
3799 .Case("sse3", SSELevel >= SSE3)
3800 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00003801 .Case("sse4.1", SSELevel >= SSE41)
3802 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003803 .Case("sse4a", XOPLevel >= SSE4A)
Craig Topper8dbc5842014-11-03 07:05:26 +00003804 .Case("tbm", HasTBM)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003805 .Case("umip", HasUMIP)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003806 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00003807 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
3808 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003809 .Case("xop", XOPLevel >= XOP)
Craig Topperda9fe562015-10-15 05:23:38 +00003810 .Case("xsave", HasXSAVE)
3811 .Case("xsavec", HasXSAVEC)
3812 .Case("xsaves", HasXSAVES)
3813 .Case("xsaveopt", HasXSAVEOPT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003814 .Default(false);
3815}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003816
Eric Christopherd9832702015-06-29 21:00:05 +00003817// We can't use a generic validation scheme for the features accepted here
3818// versus subtarget features accepted in the target attribute because the
3819// bitfield structure that's initialized in the runtime only supports the
3820// below currently rather than the full range of subtarget features. (See
3821// X86TargetInfo::hasFeature for a somewhat comprehensive list).
3822bool X86TargetInfo::validateCpuSupports(StringRef FeatureStr) const {
3823 return llvm::StringSwitch<bool>(FeatureStr)
3824 .Case("cmov", true)
3825 .Case("mmx", true)
3826 .Case("popcnt", true)
3827 .Case("sse", true)
3828 .Case("sse2", true)
3829 .Case("sse3", true)
Benjamin Kramerf4c520d2016-05-20 15:21:08 +00003830 .Case("ssse3", true)
Eric Christopherd9832702015-06-29 21:00:05 +00003831 .Case("sse4.1", true)
3832 .Case("sse4.2", true)
3833 .Case("avx", true)
3834 .Case("avx2", true)
3835 .Case("sse4a", true)
3836 .Case("fma4", true)
3837 .Case("xop", true)
3838 .Case("fma", true)
3839 .Case("avx512f", true)
3840 .Case("bmi", true)
3841 .Case("bmi2", true)
Benjamin Kramerf4c520d2016-05-20 15:21:08 +00003842 .Case("aes", true)
3843 .Case("pclmul", true)
3844 .Case("avx512vl", true)
3845 .Case("avx512bw", true)
3846 .Case("avx512dq", true)
3847 .Case("avx512cd", true)
3848 .Case("avx512er", true)
3849 .Case("avx512pf", true)
3850 .Case("avx512vbmi", true)
3851 .Case("avx512ifma", true)
Eric Christopherd9832702015-06-29 21:00:05 +00003852 .Default(false);
3853}
3854
Eli Friedman3fd920a2008-08-20 02:34:37 +00003855bool
Anders Carlsson58436352009-02-28 17:11:49 +00003856X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00003857 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00003858 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003859 default: return false;
Alexey Bataev91e58602015-07-20 12:08:00 +00003860 // Constant constraints.
3861 case 'e': // 32-bit signed integer constant for use with sign-extending x86_64
3862 // instructions.
3863 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
3864 // x86_64 instructions.
3865 case 's':
3866 Info.setRequiresImmediate();
3867 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003868 case 'I':
3869 Info.setRequiresImmediate(0, 31);
3870 return true;
3871 case 'J':
3872 Info.setRequiresImmediate(0, 63);
3873 return true;
3874 case 'K':
3875 Info.setRequiresImmediate(-128, 127);
3876 return true;
3877 case 'L':
Alexey Bataev91e58602015-07-20 12:08:00 +00003878 Info.setRequiresImmediate({ int(0xff), int(0xffff), int(0xffffffff) });
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003879 return true;
3880 case 'M':
3881 Info.setRequiresImmediate(0, 3);
3882 return true;
3883 case 'N':
3884 Info.setRequiresImmediate(0, 255);
3885 return true;
3886 case 'O':
3887 Info.setRequiresImmediate(0, 127);
3888 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003889 // Register constraints.
3890 case 'Y': // 'Y' is the first character for several 2-character constraints.
3891 // Shift the pointer to the second character of the constraint.
3892 Name++;
3893 switch (*Name) {
3894 default:
3895 return false;
3896 case '0': // First SSE register.
3897 case 't': // Any SSE register, when SSE2 is enabled.
3898 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
3899 case 'm': // Any MMX register, when inter-unit moves enabled.
3900 Info.setAllowsRegister();
3901 return true;
3902 }
3903 case 'f': // Any x87 floating point stack register.
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003904 // Constraint 'f' cannot be used for output operands.
3905 if (Info.ConstraintStr[0] == '=')
3906 return false;
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003907 Info.setAllowsRegister();
3908 return true;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003909 case 'a': // eax.
3910 case 'b': // ebx.
3911 case 'c': // ecx.
3912 case 'd': // edx.
3913 case 'S': // esi.
3914 case 'D': // edi.
3915 case 'A': // edx:eax.
Alexey Bataev91e58602015-07-20 12:08:00 +00003916 case 't': // Top of floating point stack.
3917 case 'u': // Second from top of floating point stack.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003918 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00003919 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00003920 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003921 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00003922 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
3923 case 'l': // "Index" registers: any general register that can be used as an
3924 // index in a base+index memory access.
3925 Info.setAllowsRegister();
3926 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003927 // Floating point constant constraints.
Dale Johannesen46742a42010-08-24 22:33:12 +00003928 case 'C': // SSE floating point constant.
3929 case 'G': // x87 floating point constant.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003930 return true;
3931 }
3932}
3933
Akira Hatanaka974131e2014-09-18 18:17:18 +00003934bool X86TargetInfo::validateOutputSize(StringRef Constraint,
3935 unsigned Size) const {
3936 // Strip off constraint modifiers.
3937 while (Constraint[0] == '=' ||
3938 Constraint[0] == '+' ||
3939 Constraint[0] == '&')
3940 Constraint = Constraint.substr(1);
3941
3942 return validateOperandSize(Constraint, Size);
3943}
3944
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003945bool X86TargetInfo::validateInputSize(StringRef Constraint,
3946 unsigned Size) const {
Akira Hatanaka974131e2014-09-18 18:17:18 +00003947 return validateOperandSize(Constraint, Size);
3948}
3949
3950bool X86TargetInfo::validateOperandSize(StringRef Constraint,
3951 unsigned Size) const {
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003952 switch (Constraint[0]) {
3953 default: break;
3954 case 'y':
3955 return Size <= 64;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003956 case 'f':
3957 case 't':
3958 case 'u':
3959 return Size <= 128;
Hans Wennborg3c619a42014-09-18 20:24:04 +00003960 case 'x':
Alexey Bataev91e58602015-07-20 12:08:00 +00003961 if (SSELevel >= AVX512F)
3962 // 512-bit zmm registers can be used if target supports AVX512F.
3963 return Size <= 512U;
3964 else if (SSELevel >= AVX)
3965 // 256-bit ymm registers can be used if target supports AVX.
3966 return Size <= 256U;
3967 return Size <= 128U;
3968 case 'Y':
3969 // 'Y' is the first character for several 2-character constraints.
3970 switch (Constraint[1]) {
3971 default: break;
3972 case 'm':
3973 // 'Ym' is synonymous with 'y'.
3974 return Size <= 64;
3975 case 'i':
3976 case 't':
3977 // 'Yi' and 'Yt' are synonymous with 'x' when SSE2 is enabled.
3978 if (SSELevel >= AVX512F)
3979 return Size <= 512U;
3980 else if (SSELevel >= AVX)
3981 return Size <= 256U;
3982 return SSELevel >= SSE2 && Size <= 128U;
3983 }
3984
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003985 }
3986
3987 return true;
3988}
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00003989
Eli Friedman3fd920a2008-08-20 02:34:37 +00003990std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003991X86TargetInfo::convertConstraint(const char *&Constraint) const {
3992 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003993 case 'a': return std::string("{ax}");
3994 case 'b': return std::string("{bx}");
3995 case 'c': return std::string("{cx}");
3996 case 'd': return std::string("{dx}");
3997 case 'S': return std::string("{si}");
3998 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00003999 case 'p': // address
4000 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00004001 case 't': // top of floating point stack.
4002 return std::string("{st}");
4003 case 'u': // second from top of floating point stack.
4004 return std::string("{st(1)}"); // second from top of floating point stack.
4005 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004006 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00004007 }
4008}
Chris Lattner5ba61f02006-10-14 07:39:34 +00004009
Eli Friedman3fd920a2008-08-20 02:34:37 +00004010// X86-32 generic target
4011class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00004012public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004013 X86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4014 : X86TargetInfo(Triple, Opts) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004015 DoubleAlign = LongLongAlign = 32;
4016 LongDoubleWidth = 96;
4017 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00004018 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00004019 resetDataLayout("e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128");
Eli Friedman32ca82a2009-03-29 20:31:09 +00004020 SizeType = UnsignedInt;
4021 PtrDiffType = SignedInt;
4022 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00004023 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00004024
4025 // Use fpret for all types.
4026 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
4027 (1 << TargetInfo::Double) |
4028 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004029
4030 // x86-32 has atomics up to 8 bytes
4031 // FIXME: Check that we actually have cmpxchg8b before setting
4032 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
4033 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004034 }
Craig Topper3164f332014-03-11 03:39:26 +00004035 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004036 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004037 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004038
Craig Topper3164f332014-03-11 03:39:26 +00004039 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00004040 if (RegNo == 0) return 0;
4041 if (RegNo == 1) return 2;
4042 return -1;
4043 }
Akira Hatanaka974131e2014-09-18 18:17:18 +00004044 bool validateOperandSize(StringRef Constraint,
4045 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00004046 switch (Constraint[0]) {
4047 default: break;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004048 case 'R':
4049 case 'q':
4050 case 'Q':
Bill Wendling887b4852012-11-12 06:42:51 +00004051 case 'a':
4052 case 'b':
4053 case 'c':
4054 case 'd':
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004055 case 'S':
4056 case 'D':
Bill Wendling3c7fed82012-11-12 18:52:32 +00004057 return Size <= 32;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004058 case 'A':
4059 return Size <= 64;
Bill Wendling887b4852012-11-12 06:42:51 +00004060 }
4061
Akira Hatanaka974131e2014-09-18 18:17:18 +00004062 return X86TargetInfo::validateOperandSize(Constraint, Size);
Bill Wendling887b4852012-11-12 06:42:51 +00004063 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004064};
Eli Friedman3fd920a2008-08-20 02:34:37 +00004065
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004066class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
4067public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004068 NetBSDI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4069 : NetBSDTargetInfo<X86_32TargetInfo>(Triple, Opts) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004070
Craig Topper3164f332014-03-11 03:39:26 +00004071 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00004072 unsigned Major, Minor, Micro;
4073 getTriple().getOSVersion(Major, Minor, Micro);
4074 // New NetBSD uses the default rounding mode.
4075 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
4076 return X86_32TargetInfo::getFloatEvalMethod();
4077 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004078 return 1;
4079 }
4080};
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004081
Eli Friedmane3aa4542009-07-05 18:47:56 +00004082class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
4083public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004084 OpenBSDI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4085 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00004086 SizeType = UnsignedLong;
4087 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004088 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00004089 }
4090};
Eli Friedmane3aa4542009-07-05 18:47:56 +00004091
Eli Friedman9fa28852012-08-08 23:57:20 +00004092class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
4093public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004094 BitrigI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4095 : BitrigTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman9fa28852012-08-08 23:57:20 +00004096 SizeType = UnsignedLong;
4097 IntPtrType = SignedLong;
4098 PtrDiffType = SignedLong;
4099 }
4100};
Eli Friedman9fa28852012-08-08 23:57:20 +00004101
Torok Edwinb2b37c62009-06-30 17:10:35 +00004102class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004103public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004104 DarwinI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4105 : DarwinTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004106 LongDoubleWidth = 128;
4107 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004108 SuitableAlign = 128;
Tim Northover5627d392015-10-30 16:30:45 +00004109 MaxVectorAlign = 256;
4110 // The watchOS simulator uses the builtin bool type for Objective-C.
4111 llvm::Triple T = llvm::Triple(Triple);
4112 if (T.isWatchOS())
4113 UseSignedCharForObjCBool = false;
Eli Friedman32ca82a2009-03-29 20:31:09 +00004114 SizeType = UnsignedLong;
4115 IntPtrType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00004116 resetDataLayout("e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128");
Daniel Dunbarbd606522010-05-27 00:35:16 +00004117 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00004118 }
4119
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004120 bool handleTargetFeatures(std::vector<std::string> &Features,
4121 DiagnosticsEngine &Diags) override {
4122 if (!DarwinTargetInfo<X86_32TargetInfo>::handleTargetFeatures(Features,
4123 Diags))
4124 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004125 // We now know the features we have: we can decide how to align vectors.
4126 MaxVectorAlign =
4127 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004128 return true;
4129 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004130};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004131
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004132// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004133class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004134public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004135 WindowsX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4136 : WindowsTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Chris Lattner46be2e12009-06-24 17:12:15 +00004137 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00004138 DoubleAlign = LongLongAlign = 64;
Reid Kleckner7510c092015-04-01 16:45:06 +00004139 bool IsWinCOFF =
4140 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
James Y Knightb214cbc2016-03-04 19:00:41 +00004141 resetDataLayout(IsWinCOFF
4142 ? "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
4143 : "e-m:e-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32");
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004144 }
Craig Topper3164f332014-03-11 03:39:26 +00004145 void getTargetDefines(const LangOptions &Opts,
4146 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004147 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
4148 }
4149};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004150
4151// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004152class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004153public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004154 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple,
4155 const TargetOptions &Opts)
4156 : WindowsX86_32TargetInfo(Triple, Opts) {
Eli Friedman015d6282011-03-22 21:25:11 +00004157 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004158 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
4159 }
Craig Topper3164f332014-03-11 03:39:26 +00004160 void getTargetDefines(const LangOptions &Opts,
4161 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004162 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
4163 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
4164 // The value of the following reflects processor type.
4165 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
4166 // We lost the original triple, so we use the default.
4167 Builder.defineMacro("_M_IX86", "600");
4168 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004169};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004170
David Majnemerae1ed0e2015-05-28 04:36:18 +00004171static void addCygMingDefines(const LangOptions &Opts, MacroBuilder &Builder) {
Eric Christopherb093d692015-10-09 18:39:59 +00004172 // Mingw and cygwin define __declspec(a) to __attribute__((a)). Clang
4173 // supports __declspec natively under -fms-extensions, but we define a no-op
4174 // __declspec macro anyway for pre-processor compatibility.
Reid Kleckner47606832014-04-21 20:58:00 +00004175 if (Opts.MicrosoftExt)
4176 Builder.defineMacro("__declspec", "__declspec");
4177 else
4178 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
4179
4180 if (!Opts.MicrosoftExt) {
4181 // Provide macros for all the calling convention keywords. Provide both
4182 // single and double underscore prefixed variants. These are available on
4183 // x64 as well as x86, even though they have no effect.
4184 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
4185 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00004186 std::string GCCSpelling = "__attribute__((__";
4187 GCCSpelling += CC;
4188 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00004189 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
4190 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
4191 }
4192 }
4193}
4194
David Majnemerae1ed0e2015-05-28 04:36:18 +00004195static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
4196 Builder.defineMacro("__MSVCRT__");
4197 Builder.defineMacro("__MINGW32__");
4198 addCygMingDefines(Opts, Builder);
4199}
4200
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004201// x86-32 MinGW target
4202class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
4203public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004204 MinGWX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4205 : WindowsX86_32TargetInfo(Triple, Opts) {}
Craig Topper3164f332014-03-11 03:39:26 +00004206 void getTargetDefines(const LangOptions &Opts,
4207 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004208 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004209 DefineStd(Builder, "WIN32", Opts);
4210 DefineStd(Builder, "WINNT", Opts);
4211 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00004212 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004213 }
4214};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004215
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004216// x86-32 Cygwin target
4217class CygwinX86_32TargetInfo : public X86_32TargetInfo {
4218public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004219 CygwinX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4220 : X86_32TargetInfo(Triple, Opts) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004221 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004222 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00004223 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 +00004224 }
Craig Topper3164f332014-03-11 03:39:26 +00004225 void getTargetDefines(const LangOptions &Opts,
4226 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004227 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00004228 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004229 Builder.defineMacro("__CYGWIN__");
4230 Builder.defineMacro("__CYGWIN32__");
David Majnemerae1ed0e2015-05-28 04:36:18 +00004231 addCygMingDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004232 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00004233 if (Opts.CPlusPlus)
4234 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00004235 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004236};
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004237
Chris Lattnerb986aba2010-04-11 19:29:39 +00004238// x86-32 Haiku target
Reid Kleckner330fb172016-05-11 16:19:05 +00004239class HaikuX86_32TargetInfo : public HaikuTargetInfo<X86_32TargetInfo> {
Chris Lattnerb986aba2010-04-11 19:29:39 +00004240public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004241 HaikuX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Reid Kleckner330fb172016-05-11 16:19:05 +00004242 : HaikuTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman04831922010-08-22 01:00:03 +00004243 }
Craig Topper3164f332014-03-11 03:39:26 +00004244 void getTargetDefines(const LangOptions &Opts,
4245 MacroBuilder &Builder) const override {
Reid Kleckner330fb172016-05-11 16:19:05 +00004246 HaikuTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
Chris Lattnerb986aba2010-04-11 19:29:39 +00004247 Builder.defineMacro("__INTEL__");
Chris Lattnerb986aba2010-04-11 19:29:39 +00004248 }
4249};
Chris Lattnerb986aba2010-04-11 19:29:39 +00004250
Alexey Bataevc99b0492015-11-25 09:24:26 +00004251// X86-32 MCU target
4252class MCUX86_32TargetInfo : public X86_32TargetInfo {
4253public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004254 MCUX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4255 : X86_32TargetInfo(Triple, Opts) {
Alexey Bataevc99b0492015-11-25 09:24:26 +00004256 LongDoubleWidth = 64;
4257 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
James Y Knightb214cbc2016-03-04 19:00:41 +00004258 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 +00004259 WIntType = UnsignedInt;
Alexey Bataevc99b0492015-11-25 09:24:26 +00004260 }
4261
4262 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
4263 // On MCU we support only C calling convention.
4264 return CC == CC_C ? CCCR_OK : CCCR_Warning;
4265 }
4266
4267 void getTargetDefines(const LangOptions &Opts,
4268 MacroBuilder &Builder) const override {
4269 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4270 Builder.defineMacro("__iamcu");
4271 Builder.defineMacro("__iamcu__");
4272 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00004273
4274 bool allowsLargerPreferedTypeAlignment() const override {
4275 return false;
4276 }
Alexey Bataevc99b0492015-11-25 09:24:26 +00004277};
4278
Douglas Gregor9fabd852011-07-01 22:41:14 +00004279// RTEMS Target
4280template<typename Target>
4281class RTEMSTargetInfo : public OSTargetInfo<Target> {
4282protected:
Craig Topper3164f332014-03-11 03:39:26 +00004283 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4284 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004285 // RTEMS defines; list based off of gcc output
4286
Douglas Gregor9fabd852011-07-01 22:41:14 +00004287 Builder.defineMacro("__rtems__");
4288 Builder.defineMacro("__ELF__");
4289 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004290
Douglas Gregor9fabd852011-07-01 22:41:14 +00004291public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004292 RTEMSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4293 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004294 switch (Triple.getArch()) {
4295 default:
4296 case llvm::Triple::x86:
4297 // this->MCountName = ".mcount";
4298 break;
4299 case llvm::Triple::mips:
4300 case llvm::Triple::mipsel:
4301 case llvm::Triple::ppc:
4302 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00004303 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004304 // this->MCountName = "_mcount";
4305 break;
4306 case llvm::Triple::arm:
4307 // this->MCountName = "__mcount";
4308 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004309 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004310 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00004311};
4312
Douglas Gregor9fabd852011-07-01 22:41:14 +00004313// x86-32 RTEMS target
4314class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
4315public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004316 RTEMSX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4317 : X86_32TargetInfo(Triple, Opts) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004318 SizeType = UnsignedLong;
4319 IntPtrType = SignedLong;
4320 PtrDiffType = SignedLong;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004321 }
Craig Topper3164f332014-03-11 03:39:26 +00004322 void getTargetDefines(const LangOptions &Opts,
4323 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004324 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4325 Builder.defineMacro("__INTEL__");
4326 Builder.defineMacro("__rtems__");
4327 }
4328};
Douglas Gregor9fabd852011-07-01 22:41:14 +00004329
Eli Friedman3fd920a2008-08-20 02:34:37 +00004330// x86-64 generic target
4331class X86_64TargetInfo : public X86TargetInfo {
4332public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004333 X86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4334 : X86TargetInfo(Triple, Opts) {
David Blaikie40f842d2014-07-10 18:46:15 +00004335 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
David Majnemer8fa8c382015-03-17 23:55:00 +00004336 bool IsWinCOFF =
4337 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Zinovy Nis1db95732014-07-10 15:27:19 +00004338 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00004339 LongDoubleWidth = 128;
4340 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00004341 LargeArrayMinWidth = 128;
4342 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004343 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00004344 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
4345 PtrDiffType = IsX32 ? SignedInt : SignedLong;
4346 IntPtrType = IsX32 ? SignedInt : SignedLong;
4347 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00004348 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00004349 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00004350
Eric Christopher917e9522014-11-18 22:36:15 +00004351 // Pointers are 32-bit in x32.
James Y Knightb214cbc2016-03-04 19:00:41 +00004352 resetDataLayout(IsX32
4353 ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128"
4354 : IsWinCOFF ? "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
4355 : "e-m:e-i64:64-f80:128-n8:16:32:64-S128");
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00004356
4357 // Use fpret only for long double.
4358 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004359
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00004360 // Use fp2ret for _Complex long double.
4361 ComplexLongDoubleUsesFP2Ret = true;
4362
Charles Davisc7d5c942015-09-17 20:55:33 +00004363 // Make __builtin_ms_va_list available.
4364 HasBuiltinMSVaList = true;
4365
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004366 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004367 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00004368 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00004369 }
Craig Topper3164f332014-03-11 03:39:26 +00004370 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004371 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00004372 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004373
Craig Topper3164f332014-03-11 03:39:26 +00004374 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00004375 if (RegNo == 0) return 0;
4376 if (RegNo == 1) return 1;
4377 return -1;
4378 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004379
Craig Topper3164f332014-03-11 03:39:26 +00004380 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00004381 switch (CC) {
4382 case CC_C:
4383 case CC_Swift:
4384 case CC_X86VectorCall:
4385 case CC_IntelOclBicc:
4386 case CC_X86_64Win64:
Roman Levenstein35aa5ce2016-03-16 18:00:46 +00004387 case CC_PreserveMost:
4388 case CC_PreserveAll:
John McCall477f2bb2016-03-03 06:39:32 +00004389 return CCCR_OK;
4390 default:
4391 return CCCR_Warning;
4392 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004393 }
4394
Craig Topper3164f332014-03-11 03:39:26 +00004395 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00004396 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004397 }
4398
Pavel Chupinfd223e12014-08-04 12:39:43 +00004399 // for x32 we need it here explicitly
4400 bool hasInt128Type() const override { return true; }
Reid Klecknerf27e7522016-02-01 18:58:24 +00004401 unsigned getUnwindWordWidth() const override { return 64; }
4402 unsigned getRegisterWidth() const override { return 64; }
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00004403
4404 bool validateGlobalRegisterVariable(StringRef RegName,
4405 unsigned RegSize,
4406 bool &HasSizeMismatch) const override {
4407 // rsp and rbp are the only 64-bit registers the x86 backend can currently
4408 // handle.
4409 if (RegName.equals("rsp") || RegName.equals("rbp")) {
4410 // Check that the register size is 64-bit.
4411 HasSizeMismatch = RegSize != 64;
4412 return true;
4413 }
4414
4415 // Check if the register is a 32-bit register the backend can handle.
4416 return X86TargetInfo::validateGlobalRegisterVariable(RegName, RegSize,
4417 HasSizeMismatch);
4418 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004419};
Eli Friedman3fd920a2008-08-20 02:34:37 +00004420
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004421// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004422class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004423public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004424 WindowsX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4425 : WindowsTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004426 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00004427 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004428 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004429 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004430 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00004431 SizeType = UnsignedLongLong;
4432 PtrDiffType = SignedLongLong;
4433 IntPtrType = SignedLongLong;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004434 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004435
Craig Topper3164f332014-03-11 03:39:26 +00004436 void getTargetDefines(const LangOptions &Opts,
4437 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004438 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004439 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004440 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004441
Craig Topper3164f332014-03-11 03:39:26 +00004442 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004443 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00004444 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004445
Craig Topper3164f332014-03-11 03:39:26 +00004446 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004447 switch (CC) {
4448 case CC_X86StdCall:
4449 case CC_X86ThisCall:
4450 case CC_X86FastCall:
4451 return CCCR_Ignore;
4452 case CC_C:
4453 case CC_X86VectorCall:
4454 case CC_IntelOclBicc:
4455 case CC_X86_64SysV:
4456 return CCCR_OK;
4457 default:
4458 return CCCR_Warning;
4459 }
Charles Davisb5a214e2013-08-30 04:39:01 +00004460 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004461};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004462
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004463// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004464class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004465public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004466 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple,
4467 const TargetOptions &Opts)
4468 : WindowsX86_64TargetInfo(Triple, Opts) {
Eli Friedman015d6282011-03-22 21:25:11 +00004469 LongDoubleWidth = LongDoubleAlign = 64;
4470 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004471 }
Craig Topper3164f332014-03-11 03:39:26 +00004472 void getTargetDefines(const LangOptions &Opts,
4473 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004474 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
4475 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
David Majnemerb856e8f2015-07-26 23:17:29 +00004476 Builder.defineMacro("_M_X64", "100");
4477 Builder.defineMacro("_M_AMD64", "100");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004478 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004479};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004480
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004481// x86-64 MinGW target
4482class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
4483public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004484 MinGWX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4485 : WindowsX86_64TargetInfo(Triple, Opts) {
Reid Kleckner11a17192015-10-28 22:29:52 +00004486 // Mingw64 rounds long double size and alignment up to 16 bytes, but sticks
4487 // with x86 FP ops. Weird.
4488 LongDoubleWidth = LongDoubleAlign = 128;
4489 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
4490 }
4491
Craig Topper3164f332014-03-11 03:39:26 +00004492 void getTargetDefines(const LangOptions &Opts,
4493 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004494 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004495 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004496 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00004497 addMinGWDefines(Opts, Builder);
Reid Klecknere070b992014-11-14 02:01:10 +00004498
4499 // GCC defines this macro when it is using __gxx_personality_seh0.
4500 if (!Opts.SjLjExceptions)
4501 Builder.defineMacro("__SEH__");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004502 }
4503};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004504
Yaron Kerend030d112015-07-22 17:38:19 +00004505// x86-64 Cygwin target
4506class CygwinX86_64TargetInfo : public X86_64TargetInfo {
4507public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004508 CygwinX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4509 : X86_64TargetInfo(Triple, Opts) {
Yaron Kerend030d112015-07-22 17:38:19 +00004510 TLSSupported = false;
4511 WCharType = UnsignedShort;
4512 }
4513 void getTargetDefines(const LangOptions &Opts,
4514 MacroBuilder &Builder) const override {
4515 X86_64TargetInfo::getTargetDefines(Opts, Builder);
4516 Builder.defineMacro("__x86_64__");
4517 Builder.defineMacro("__CYGWIN__");
4518 Builder.defineMacro("__CYGWIN64__");
4519 addCygMingDefines(Opts, Builder);
4520 DefineStd(Builder, "unix", Opts);
4521 if (Opts.CPlusPlus)
4522 Builder.defineMacro("_GNU_SOURCE");
4523
4524 // GCC defines this macro when it is using __gxx_personality_seh0.
4525 if (!Opts.SjLjExceptions)
4526 Builder.defineMacro("__SEH__");
4527 }
4528};
4529
Eli Friedman2857ccb2009-07-01 03:36:11 +00004530class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
4531public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004532 DarwinX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4533 : DarwinTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00004534 Int64Type = SignedLongLong;
Tim Northovera2ee4332014-03-29 15:09:45 +00004535 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
4536 llvm::Triple T = llvm::Triple(Triple);
Bob Wilson946c04c2014-10-19 02:19:27 +00004537 if (T.isiOS())
Tim Northovera2ee4332014-03-29 15:09:45 +00004538 UseSignedCharForObjCBool = false;
James Y Knightb214cbc2016-03-04 19:00:41 +00004539 resetDataLayout("e-m:o-i64:64-f80:128-n8:16:32:64-S128");
Eli Friedman2857ccb2009-07-01 03:36:11 +00004540 }
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004541
4542 bool handleTargetFeatures(std::vector<std::string> &Features,
4543 DiagnosticsEngine &Diags) override {
4544 if (!DarwinTargetInfo<X86_64TargetInfo>::handleTargetFeatures(Features,
4545 Diags))
4546 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004547 // We now know the features we have: we can decide how to align vectors.
4548 MaxVectorAlign =
4549 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004550 return true;
4551 }
Eli Friedman2857ccb2009-07-01 03:36:11 +00004552};
Eli Friedman2857ccb2009-07-01 03:36:11 +00004553
Eli Friedman245f2292009-07-05 22:31:18 +00004554class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
4555public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004556 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4557 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Eli Friedman245f2292009-07-05 22:31:18 +00004558 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004559 Int64Type = SignedLongLong;
4560 }
4561};
Eli Friedman245f2292009-07-05 22:31:18 +00004562
Eli Friedman9fa28852012-08-08 23:57:20 +00004563class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
4564public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004565 BitrigX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4566 : BitrigTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004567 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004568 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00004569 }
4570};
Tim Northover9bb857a2013-01-31 12:13:10 +00004571
Eli Friedmanf05b7722008-08-20 07:44:10 +00004572class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004573 // Possible FPU choices.
4574 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004575 VFP2FPU = (1 << 0),
4576 VFP3FPU = (1 << 1),
4577 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00004578 NeonFPU = (1 << 3),
4579 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004580 };
4581
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004582 // Possible HWDiv features.
4583 enum HWDivMode {
4584 HWDivThumb = (1 << 0),
4585 HWDivARM = (1 << 1)
4586 };
4587
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004588 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004589 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004590 }
4591
4592 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4593 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004594
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004595 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004596
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004597 StringRef CPUProfile;
4598 StringRef CPUAttr;
4599
Rafael Espindolaeb265472013-08-21 21:59:03 +00004600 enum {
4601 FP_Default,
4602 FP_VFP,
4603 FP_Neon
4604 } FPMath;
4605
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004606 unsigned ArchISA;
Renato Goline84b0002015-10-08 16:43:26 +00004607 unsigned ArchKind = llvm::ARM::AK_ARMV4T;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004608 unsigned ArchProfile;
4609 unsigned ArchVersion;
4610
Bernard Ogdenda13af32013-10-24 18:32:51 +00004611 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004612
Logan Chien57086ce2012-10-10 06:56:20 +00004613 unsigned IsAAPCS : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004614 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004615
4616 // Initialized via features.
4617 unsigned SoftFloat : 1;
4618 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004619
Bernard Ogden18b57012013-10-29 09:47:51 +00004620 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00004621 unsigned Crypto : 1;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004622 unsigned DSP : 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004623 unsigned Unaligned : 1;
4624
4625 enum {
4626 LDREX_B = (1 << 0), /// byte (8-bit)
4627 LDREX_H = (1 << 1), /// half (16-bit)
4628 LDREX_W = (1 << 2), /// word (32-bit)
4629 LDREX_D = (1 << 3), /// double (64-bit)
4630 };
4631
4632 uint32_t LDREX;
Bernard Ogden18b57012013-10-29 09:47:51 +00004633
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004634 // ACLE 6.5.1 Hardware floating point
4635 enum {
4636 HW_FP_HP = (1 << 1), /// half (16-bit)
4637 HW_FP_SP = (1 << 2), /// single (32-bit)
4638 HW_FP_DP = (1 << 3), /// double (64-bit)
4639 };
4640 uint32_t HW_FP;
4641
Chris Lattner5cc15e02010-03-03 19:03:45 +00004642 static const Builtin::Info BuiltinInfo[];
4643
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004644 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004645 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004646
4647 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00004648 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004649
Renato Golin9ba39232015-02-27 16:35:48 +00004650 // size_t is unsigned long on MachO-derived environments, NetBSD and Bitrig.
4651 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD ||
4652 T.getOS() == llvm::Triple::Bitrig)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004653 SizeType = UnsignedLong;
4654 else
4655 SizeType = UnsignedInt;
4656
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004657 switch (T.getOS()) {
4658 case llvm::Triple::NetBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004659 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004660 break;
4661 case llvm::Triple::Win32:
4662 WCharType = UnsignedShort;
4663 break;
4664 case llvm::Triple::Linux:
4665 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004666 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
4667 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004668 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004669 }
4670
4671 UseBitFieldTypeAlignment = true;
4672
4673 ZeroLengthBitfieldBoundary = 0;
4674
Tim Northover147cd2f2014-10-14 22:12:21 +00004675 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
4676 // so set preferred for small types to 32.
4677 if (T.isOSBinFormatMachO()) {
James Y Knightb214cbc2016-03-04 19:00:41 +00004678 resetDataLayout(BigEndian
4679 ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4680 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Tim Northover147cd2f2014-10-14 22:12:21 +00004681 } else if (T.isOSWindows()) {
Tim Northover147cd2f2014-10-14 22:12:21 +00004682 assert(!BigEndian && "Windows on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004683 resetDataLayout("e"
4684 "-m:w"
4685 "-p:32:32"
4686 "-i64:64"
4687 "-v128:64:128"
4688 "-a:0:32"
4689 "-n32"
4690 "-S64");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00004691 } else if (T.isOSNaCl()) {
4692 assert(!BigEndian && "NaCl on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004693 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004694 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00004695 resetDataLayout(BigEndian
4696 ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4697 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004698 }
4699
4700 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004701 }
4702
Tim Northover5627d392015-10-30 16:30:45 +00004703 void setABIAPCS(bool IsAAPCS16) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00004704 const llvm::Triple &T = getTriple();
4705
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004706 IsAAPCS = false;
4707
Tim Northover5627d392015-10-30 16:30:45 +00004708 if (IsAAPCS16)
4709 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
4710 else
4711 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004712
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004713 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00004714 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004715 SizeType = UnsignedInt;
4716 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004717 SizeType = UnsignedLong;
4718
4719 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
4720 WCharType = SignedInt;
4721
4722 // Do not respect the alignment of bit-field types when laying out
4723 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
4724 UseBitFieldTypeAlignment = false;
4725
4726 /// gcc forces the alignment to 4 bytes, regardless of the type of the
4727 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
4728 /// gcc.
4729 ZeroLengthBitfieldBoundary = 32;
4730
Tim Northover5627d392015-10-30 16:30:45 +00004731 if (T.isOSBinFormatMachO() && IsAAPCS16) {
4732 assert(!BigEndian && "AAPCS16 does not support big-endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004733 resetDataLayout("e-m:o-p:32:32-i64:64-a:0:32-n32-S128");
Tim Northover5627d392015-10-30 16:30:45 +00004734 } else if (T.isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00004735 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00004736 BigEndian
4737 ? "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 +00004738 : "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 +00004739 else
James Y Knightb214cbc2016-03-04 19:00:41 +00004740 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00004741 BigEndian
4742 ? "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 +00004743 : "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 +00004744
4745 // FIXME: Override "preferred align" for double and long long.
4746 }
4747
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004748 void setArchInfo() {
4749 StringRef ArchName = getTriple().getArchName();
4750
Renato Goline84b0002015-10-08 16:43:26 +00004751 ArchISA = llvm::ARM::parseArchISA(ArchName);
4752 CPU = llvm::ARM::getDefaultCPU(ArchName);
4753 unsigned AK = llvm::ARM::parseArch(ArchName);
4754 if (AK != llvm::ARM::AK_INVALID)
4755 ArchKind = AK;
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004756 setArchInfo(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004757 }
4758
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004759 void setArchInfo(unsigned Kind) {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004760 StringRef SubArch;
4761
4762 // cache TargetParser info
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004763 ArchKind = Kind;
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00004764 SubArch = llvm::ARM::getSubArch(ArchKind);
4765 ArchProfile = llvm::ARM::parseArchProfile(SubArch);
4766 ArchVersion = llvm::ARM::parseArchVersion(SubArch);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004767
4768 // cache CPU related strings
4769 CPUAttr = getCPUAttr();
4770 CPUProfile = getCPUProfile();
4771 }
4772
4773 void setAtomic() {
Eric Christopherb093d692015-10-09 18:39:59 +00004774 // when triple does not specify a sub arch,
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004775 // then we are not using inline atomics
Renato Goline84b0002015-10-08 16:43:26 +00004776 bool ShouldUseInlineAtomic =
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004777 (ArchISA == llvm::ARM::IK_ARM && ArchVersion >= 6) ||
4778 (ArchISA == llvm::ARM::IK_THUMB && ArchVersion >= 7);
Eric Christopherb093d692015-10-09 18:39:59 +00004779 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004780 if (ArchProfile == llvm::ARM::PK_M) {
4781 MaxAtomicPromoteWidth = 32;
4782 if (ShouldUseInlineAtomic)
4783 MaxAtomicInlineWidth = 32;
4784 }
4785 else {
4786 MaxAtomicPromoteWidth = 64;
4787 if (ShouldUseInlineAtomic)
4788 MaxAtomicInlineWidth = 64;
Eric Christopherb093d692015-10-09 18:39:59 +00004789 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004790 }
4791
4792 bool isThumb() const {
4793 return (ArchISA == llvm::ARM::IK_THUMB);
4794 }
4795
4796 bool supportsThumb() const {
4797 return CPUAttr.count('T') || ArchVersion >= 6;
4798 }
4799
4800 bool supportsThumb2() const {
Bradley Smithf4affc12016-03-03 13:52:22 +00004801 return CPUAttr.equals("6T2") ||
4802 (ArchVersion >= 7 && !CPUAttr.equals("8M_BASE"));
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004803 }
4804
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004805 StringRef getCPUAttr() const {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004806 // For most sub-arches, the build attribute CPU name is enough.
4807 // For Cortex variants, it's slightly different.
4808 switch(ArchKind) {
4809 default:
Chandler Carruthd96f37a2015-08-30 07:51:18 +00004810 return llvm::ARM::getCPUAttr(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004811 case llvm::ARM::AK_ARMV6M:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004812 return "6M";
Tim Northover525c73c2015-07-21 21:47:33 +00004813 case llvm::ARM::AK_ARMV7S:
4814 return "7S";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004815 case llvm::ARM::AK_ARMV7A:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004816 return "7A";
4817 case llvm::ARM::AK_ARMV7R:
4818 return "7R";
4819 case llvm::ARM::AK_ARMV7M:
4820 return "7M";
4821 case llvm::ARM::AK_ARMV7EM:
4822 return "7EM";
4823 case llvm::ARM::AK_ARMV8A:
4824 return "8A";
4825 case llvm::ARM::AK_ARMV8_1A:
4826 return "8_1A";
Oliver Stannard3086c042016-02-11 16:05:52 +00004827 case llvm::ARM::AK_ARMV8_2A:
4828 return "8_2A";
Bradley Smithf4affc12016-03-03 13:52:22 +00004829 case llvm::ARM::AK_ARMV8MBaseline:
4830 return "8M_BASE";
4831 case llvm::ARM::AK_ARMV8MMainline:
4832 return "8M_MAIN";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004833 }
4834 }
4835
4836 StringRef getCPUProfile() const {
4837 switch(ArchProfile) {
4838 case llvm::ARM::PK_A:
4839 return "A";
4840 case llvm::ARM::PK_R:
4841 return "R";
4842 case llvm::ARM::PK_M:
4843 return "M";
4844 default:
4845 return "";
4846 }
4847 }
4848
Chris Lattner17df24e2008-04-21 18:56:49 +00004849public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004850 ARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts,
4851 bool IsBigEndian)
4852 : TargetInfo(Triple), FPMath(FP_Default), IsAAPCS(true), LDREX(0),
4853 HW_FP(0) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004854 BigEndian = IsBigEndian;
4855
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004856 switch (getTriple().getOS()) {
4857 case llvm::Triple::NetBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004858 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004859 break;
4860 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004861 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004862 break;
4863 }
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004864
Renato Goline84b0002015-10-08 16:43:26 +00004865 // Cache arch related info.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004866 setArchInfo();
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004867
Chris Lattner1a8f3942010-04-23 16:29:58 +00004868 // {} in inline assembly are neon specifiers, not assembly variant
4869 // specifiers.
4870 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004871
Eric Christopher0e261882014-12-05 01:06:59 +00004872 // FIXME: This duplicates code from the driver that sets the -target-abi
4873 // option - this code is used if -target-abi isn't passed and should
4874 // be unified in some way.
4875 if (Triple.isOSBinFormatMachO()) {
4876 // The backend is hardwired to assume AAPCS for M-class processors, ensure
4877 // the frontend matches that.
4878 if (Triple.getEnvironment() == llvm::Triple::EABI ||
4879 Triple.getOS() == llvm::Triple::UnknownOS ||
4880 StringRef(CPU).startswith("cortex-m")) {
4881 setABI("aapcs");
Tim Northoverd88ecb32016-01-27 19:32:40 +00004882 } else if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00004883 setABI("aapcs16");
Eric Christopher0e261882014-12-05 01:06:59 +00004884 } else {
4885 setABI("apcs-gnu");
4886 }
4887 } else if (Triple.isOSWindows()) {
4888 // FIXME: this is invalid for WindowsCE
4889 setABI("aapcs");
4890 } else {
4891 // Select the default based on the platform.
4892 switch (Triple.getEnvironment()) {
4893 case llvm::Triple::Android:
4894 case llvm::Triple::GNUEABI:
4895 case llvm::Triple::GNUEABIHF:
Rafael Espindola0fa66802016-06-24 21:35:06 +00004896 case llvm::Triple::MuslEABI:
4897 case llvm::Triple::MuslEABIHF:
Eric Christopher0e261882014-12-05 01:06:59 +00004898 setABI("aapcs-linux");
4899 break;
4900 case llvm::Triple::EABIHF:
4901 case llvm::Triple::EABI:
4902 setABI("aapcs");
4903 break;
Eric Christopher560cc4f2014-12-18 02:08:55 +00004904 case llvm::Triple::GNU:
Renato Goline84b0002015-10-08 16:43:26 +00004905 setABI("apcs-gnu");
4906 break;
Eric Christopher0e261882014-12-05 01:06:59 +00004907 default:
4908 if (Triple.getOS() == llvm::Triple::NetBSD)
4909 setABI("apcs-gnu");
4910 else
4911 setABI("aapcs");
4912 break;
4913 }
4914 }
John McCall86353412010-08-21 22:46:04 +00004915
4916 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00004917 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004918
Renato Golin15b86152015-07-03 16:41:13 +00004919 // ARM has atomics up to 8 bytes
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004920 setAtomic();
Rafael Espindola5ab8e2e2015-07-02 15:14:10 +00004921
James Molloya7139222012-03-12 09:14:10 +00004922 // Do force alignment of members that follow zero length bitfields. If
Eric Christopher917e9522014-11-18 22:36:15 +00004923 // the alignment of the zero-length bitfield is greater than the member
4924 // that follows it, `bar', `bar' will be aligned as the type of the
James Molloya7139222012-03-12 09:14:10 +00004925 // zero length bitfield.
4926 UseZeroLengthBitfieldAlignment = true;
Saleem Abdulrasool9b5ba542016-04-10 03:19:47 +00004927
4928 if (Triple.getOS() == llvm::Triple::Linux ||
4929 Triple.getOS() == llvm::Triple::UnknownOS)
4930 this->MCountName =
4931 Opts.EABIVersion == "gnu" ? "\01__gnu_mcount_nc" : "\01mcount";
Eli Friedmanb5366062008-05-20 14:21:01 +00004932 }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00004933
Alp Toker4925ba72014-06-07 23:30:42 +00004934 StringRef getABI() const override { return ABI; }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00004935
Craig Topper3164f332014-03-11 03:39:26 +00004936 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004937 ABI = Name;
4938
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004939 // The defaults (above) are for AAPCS, check if we need to change them.
4940 //
4941 // FIXME: We need support for -meabi... we could just mangle it into the
4942 // name.
Tim Northover756447a2015-10-30 16:30:36 +00004943 if (Name == "apcs-gnu" || Name == "aapcs16") {
Tim Northover5627d392015-10-30 16:30:45 +00004944 setABIAPCS(Name == "aapcs16");
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004945 return true;
4946 }
4947 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
4948 setABIAAPCS();
4949 return true;
4950 }
4951 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004952 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004953
Renato Golinf5c4dec2015-05-27 13:33:00 +00004954 // FIXME: This should be based on Arch attributes, not CPU names.
Eric Christopher8c47b422015-10-09 18:39:55 +00004955 bool
4956 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
4957 StringRef CPU,
4958 const std::vector<std::string> &FeaturesVec) const override {
4959
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004960 std::vector<const char*> TargetFeatures;
Bradley Smithb3501962015-11-16 11:16:36 +00004961 unsigned Arch = llvm::ARM::parseArch(getTriple().getArchName());
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004962
4963 // get default FPU features
Bradley Smithb3501962015-11-16 11:16:36 +00004964 unsigned FPUKind = llvm::ARM::getDefaultFPU(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004965 llvm::ARM::getFPUFeatures(FPUKind, TargetFeatures);
4966
4967 // get default Extension features
Bradley Smithb3501962015-11-16 11:16:36 +00004968 unsigned Extensions = llvm::ARM::getDefaultExtensions(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004969 llvm::ARM::getExtensionFeatures(Extensions, TargetFeatures);
4970
4971 for (const char *Feature : TargetFeatures)
4972 if (Feature[0] == '+')
Eric Christopherb093d692015-10-09 18:39:59 +00004973 Features[Feature+1] = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004974
Eric Christopher007b0a02015-08-28 22:32:01 +00004975 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004976 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004977
Craig Topper3164f332014-03-11 03:39:26 +00004978 bool handleTargetFeatures(std::vector<std::string> &Features,
4979 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004980 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00004981 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00004982 Crypto = 0;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004983 DSP = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004984 Unaligned = 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004985 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004986 HWDiv = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004987
Ranjeet Singhac08e532015-06-24 23:39:25 +00004988 // This does not diagnose illegal cases like having both
4989 // "+vfpv2" and "+vfpv3" or having "+neon" and "+fp-only-sp".
4990 uint32_t HW_FP_remove = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004991 for (const auto &Feature : Features) {
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004992 if (Feature == "+soft-float") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004993 SoftFloat = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004994 } else if (Feature == "+soft-float-abi") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004995 SoftFloatABI = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004996 } else if (Feature == "+vfp2") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004997 FPU |= VFP2FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004998 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004999 } else if (Feature == "+vfp3") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005000 FPU |= VFP3FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005001 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005002 } else if (Feature == "+vfp4") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005003 FPU |= VFP4FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005004 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005005 } else if (Feature == "+fp-armv8") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00005006 FPU |= FPARMV8;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005007 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005008 } else if (Feature == "+neon") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005009 FPU |= NeonFPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005010 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005011 } else if (Feature == "+hwdiv") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005012 HWDiv |= HWDivThumb;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005013 } else if (Feature == "+hwdiv-arm") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005014 HWDiv |= HWDivARM;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005015 } else if (Feature == "+crc") {
Bernard Ogden18b57012013-10-29 09:47:51 +00005016 CRC = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005017 } else if (Feature == "+crypto") {
Tim Northover02e38602014-02-03 17:28:04 +00005018 Crypto = 1;
Artyom Skrobov05d85ae2015-10-23 17:19:02 +00005019 } else if (Feature == "+dsp") {
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005020 DSP = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005021 } else if (Feature == "+fp-only-sp") {
Matt Arsenault250024f2016-06-08 01:56:42 +00005022 HW_FP_remove |= HW_FP_DP;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005023 } else if (Feature == "+strict-align") {
5024 Unaligned = 0;
5025 } else if (Feature == "+fp16") {
5026 HW_FP |= HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005027 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00005028 }
Ranjeet Singhac08e532015-06-24 23:39:25 +00005029 HW_FP &= ~HW_FP_remove;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005030
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005031 switch (ArchVersion) {
5032 case 6:
5033 if (ArchProfile == llvm::ARM::PK_M)
5034 LDREX = 0;
5035 else if (ArchKind == llvm::ARM::AK_ARMV6K)
5036 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5037 else
5038 LDREX = LDREX_W;
5039 break;
5040 case 7:
5041 if (ArchProfile == llvm::ARM::PK_M)
5042 LDREX = LDREX_W | LDREX_H | LDREX_B ;
5043 else
5044 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5045 break;
5046 case 8:
5047 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5048 }
5049
Rafael Espindolaeb265472013-08-21 21:59:03 +00005050 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
5051 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
5052 return false;
5053 }
5054
5055 if (FPMath == FP_Neon)
5056 Features.push_back("+neonfp");
5057 else if (FPMath == FP_VFP)
5058 Features.push_back("-neonfp");
5059
Daniel Dunbar893d4752009-12-19 04:15:38 +00005060 // Remove front-end specific options which the backend handles differently.
Eric Christopher9e172d22015-05-12 01:26:21 +00005061 auto Feature =
5062 std::find(Features.begin(), Features.end(), "+soft-float-abi");
5063 if (Feature != Features.end())
5064 Features.erase(Feature);
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005065
Rafael Espindolaeb265472013-08-21 21:59:03 +00005066 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005067 }
5068
Craig Topper3164f332014-03-11 03:39:26 +00005069 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005070 return llvm::StringSwitch<bool>(Feature)
5071 .Case("arm", true)
Ben Langmuir587aeaf2015-08-07 01:59:56 +00005072 .Case("aarch32", true)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005073 .Case("softfloat", SoftFloat)
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005074 .Case("thumb", isThumb())
Amara Emerson8c3de542013-09-16 18:07:35 +00005075 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005076 .Case("hwdiv", HWDiv & HWDivThumb)
5077 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005078 .Default(false);
5079 }
Renato Golin15b86152015-07-03 16:41:13 +00005080
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005081 bool setCPU(const std::string &Name) override {
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005082 if (Name != "generic")
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00005083 setArchInfo(llvm::ARM::parseCPUArch(Name));
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005084
Renato Golin15b86152015-07-03 16:41:13 +00005085 if (ArchKind == llvm::ARM::AK_INVALID)
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005086 return false;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005087 setAtomic();
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005088 CPU = Name;
5089 return true;
5090 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005091
Craig Topper3164f332014-03-11 03:39:26 +00005092 bool setFPMath(StringRef Name) override;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005093
Craig Topper3164f332014-03-11 03:39:26 +00005094 void getTargetDefines(const LangOptions &Opts,
5095 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00005096 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005097 Builder.defineMacro("__arm");
5098 Builder.defineMacro("__arm__");
Weiming Zhaob0613132016-04-18 16:25:46 +00005099 // For bare-metal none-eabi.
5100 if (getTriple().getOS() == llvm::Triple::UnknownOS &&
5101 getTriple().getEnvironment() == llvm::Triple::EABI)
5102 Builder.defineMacro("__ELF__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00005103
Chris Lattnerecd49032009-03-02 22:27:17 +00005104 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005105 Builder.defineMacro("__REGISTER_PREFIX__", "");
Tim Northover5627d392015-10-30 16:30:45 +00005106
5107 // Unfortunately, __ARM_ARCH_7K__ is now more of an ABI descriptor. The CPU
5108 // happens to be Cortex-A7 though, so it should still get __ARM_ARCH_7A__.
Tim Northoverd88ecb32016-01-27 19:32:40 +00005109 if (getTriple().isWatchABI())
Tim Northover5627d392015-10-30 16:30:45 +00005110 Builder.defineMacro("__ARM_ARCH_7K__", "2");
5111
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005112 if (!CPUAttr.empty())
5113 Builder.defineMacro("__ARM_ARCH_" + CPUAttr + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005114
5115 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005116 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
Benjamin Kramerb42d9a52015-12-24 10:07:37 +00005117 Builder.defineMacro("__ARM_ARCH", Twine(ArchVersion));
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005118
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005119 if (ArchVersion >= 8) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005120 // ACLE 6.5.7 Crypto Extension
5121 if (Crypto)
5122 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
5123 // ACLE 6.5.8 CRC32 Extension
5124 if (CRC)
5125 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
5126 // ACLE 6.5.10 Numeric Maximum and Minimum
5127 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
5128 // ACLE 6.5.9 Directed Rounding
5129 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
James Molloy0ffb0932014-09-15 11:25:38 +00005130 }
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005131
5132 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
5133 // is not defined for the M-profile.
Bradley Smithf4affc12016-03-03 13:52:22 +00005134 // NOTE that the default profile is assumed to be 'A'
5135 if (CPUProfile.empty() || ArchProfile != llvm::ARM::PK_M)
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005136 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
5137
Bradley Smithf4affc12016-03-03 13:52:22 +00005138 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supports the original
5139 // Thumb ISA (including v6-M and v8-M Baseline). It is set to 2 if the
5140 // core supports the Thumb-2 ISA as found in the v6T2 architecture and all
5141 // v7 and v8 architectures excluding v8-M Baseline.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005142 if (supportsThumb2())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005143 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005144 else if (supportsThumb())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005145 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
5146
5147 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
5148 // instruction set such as ARM or Thumb.
5149 Builder.defineMacro("__ARM_32BIT_STATE", "1");
5150
5151 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
5152
5153 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005154 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005155 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00005156
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005157 // ACLE 6.4.3 Unaligned access supported in hardware
Eric Christopherb093d692015-10-09 18:39:59 +00005158 if (Unaligned)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005159 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Eric Christopherb093d692015-10-09 18:39:59 +00005160
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005161 // ACLE 6.4.4 LDREX/STREX
5162 if (LDREX)
5163 Builder.defineMacro("__ARM_FEATURE_LDREX", "0x" + llvm::utohexstr(LDREX));
5164
5165 // ACLE 6.4.5 CLZ
Eric Christopherb093d692015-10-09 18:39:59 +00005166 if (ArchVersion == 5 ||
5167 (ArchVersion == 6 && CPUProfile != "M") ||
5168 ArchVersion > 6)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005169 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
5170
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005171 // ACLE 6.5.1 Hardware Floating Point
5172 if (HW_FP)
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +00005173 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005174
Yi Konga44c4d72014-06-27 21:25:42 +00005175 // ACLE predefines.
5176 Builder.defineMacro("__ARM_ACLE", "200");
5177
Oliver Stannarddc2854c2015-09-03 12:40:58 +00005178 // FP16 support (we currently only support IEEE format).
5179 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
5180 Builder.defineMacro("__ARM_FP16_ARGS", "1");
5181
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005182 // ACLE 6.5.3 Fused multiply-accumulate (FMA)
Silviu Baranga632fdc52016-04-28 11:29:08 +00005183 if (ArchVersion >= 7 && (FPU & VFP4FPU))
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005184 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
5185
Mike Stump9d54bd72009-04-08 02:07:04 +00005186 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005187
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005188 // FIXME: It's more complicated than this and we don't really support
5189 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005190 // Windows on ARM does not "support" interworking
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005191 if (5 <= ArchVersion && ArchVersion <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005192 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005193
David Tweed8f676532012-10-25 13:33:01 +00005194 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00005195 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005196 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
Tim Northover862eaf82016-05-13 21:26:45 +00005197 if (!getTriple().isOSBinFormatMachO() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00005198 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005199 Builder.defineMacro("__ARM_PCS", "1");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005200 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005201
Tim Northover28fc0e12016-04-28 13:59:55 +00005202 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp" ||
5203 ABI == "aapcs16")
5204 Builder.defineMacro("__ARM_PCS_VFP", "1");
5205
Daniel Dunbar893d4752009-12-19 04:15:38 +00005206 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005207 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005208
5209 if (CPU == "xscale")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005210 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005211
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005212 if (isThumb()) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005213 Builder.defineMacro("__THUMBEL__");
5214 Builder.defineMacro("__thumb__");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005215 if (supportsThumb2())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005216 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005217 }
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005218
5219 // ACLE 6.4.9 32-bit SIMD instructions
5220 if (ArchVersion >= 6 && (CPUProfile != "M" || CPUAttr == "7EM"))
5221 Builder.defineMacro("__ARM_FEATURE_SIMD32", "1");
5222
5223 // ACLE 6.4.10 Hardware Integer Divide
Eric Christopherb093d692015-10-09 18:39:59 +00005224 if (((HWDiv & HWDivThumb) && isThumb()) ||
5225 ((HWDiv & HWDivARM) && !isThumb())) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005226 Builder.defineMacro("__ARM_FEATURE_IDIV", "1");
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005227 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005228 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005229
5230 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005231 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005232
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005233 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005234 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005235 if (FPU & VFP2FPU)
5236 Builder.defineMacro("__ARM_VFPV2__");
5237 if (FPU & VFP3FPU)
5238 Builder.defineMacro("__ARM_VFPV3__");
5239 if (FPU & VFP4FPU)
5240 Builder.defineMacro("__ARM_VFPV4__");
5241 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00005242
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005243 // This only gets set when Neon instructions are actually available, unlike
5244 // the VFP define, hence the soft float and arch check. This is subtly
5245 // different from gcc, we follow the intent which was that it should be set
5246 // when Neon instructions are actually available.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005247 if ((FPU & NeonFPU) && !SoftFloat && ArchVersion >= 7) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005248 Builder.defineMacro("__ARM_NEON", "1");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005249 Builder.defineMacro("__ARM_NEON__");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005250 // current AArch32 NEON implementations do not support double-precision
5251 // floating-point even when it is present in VFP.
Eric Christopherb093d692015-10-09 18:39:59 +00005252 Builder.defineMacro("__ARM_NEON_FP",
5253 "0x" + llvm::utohexstr(HW_FP & ~HW_FP_DP));
Tim Northover5bb34ca2013-11-21 12:36:34 +00005254 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00005255
Bradley Smith0f28f0c2014-01-20 10:52:00 +00005256 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
5257 Opts.ShortWChar ? "2" : "4");
5258
5259 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5260 Opts.ShortEnums ? "1" : "4");
5261
Bradley Smithf4affc12016-03-03 13:52:22 +00005262 if (ArchVersion >= 6 && CPUAttr != "6M" && CPUAttr != "8M_BASE") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00005263 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5264 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5265 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5266 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
5267 }
Sergey Dmitrouk745f5302014-11-25 08:57:36 +00005268
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005269 // ACLE 6.4.7 DSP instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005270 if (DSP) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005271 Builder.defineMacro("__ARM_FEATURE_DSP", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005272 }
5273
5274 // ACLE 6.4.8 Saturation instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005275 bool SAT = false;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005276 if ((ArchVersion == 6 && CPUProfile != "M") || ArchVersion > 6 ) {
5277 Builder.defineMacro("__ARM_FEATURE_SAT", "1");
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005278 SAT = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005279 }
5280
5281 // ACLE 6.4.6 Q (saturation) flag
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005282 if (DSP || SAT)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005283 Builder.defineMacro("__ARM_FEATURE_QBIT", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005284
5285 if (Opts.UnsafeFPMath)
5286 Builder.defineMacro("__ARM_FP_FAST", "1");
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005287
5288 if (ArchKind == llvm::ARM::AK_ARMV8_1A)
5289 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
Chris Lattner17df24e2008-04-21 18:56:49 +00005290 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005291
Craig Topper6c03a542015-10-19 04:51:35 +00005292 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5293 return llvm::makeArrayRef(BuiltinInfo,
5294 clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner17df24e2008-04-21 18:56:49 +00005295 }
Craig Topper3164f332014-03-11 03:39:26 +00005296 bool isCLZForZeroUndef() const override { return false; }
5297 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northover5627d392015-10-30 16:30:45 +00005298 return IsAAPCS
5299 ? AAPCSABIBuiltinVaList
Tim Northoverd88ecb32016-01-27 19:32:40 +00005300 : (getTriple().isWatchABI() ? TargetInfo::CharPtrBuiltinVaList
5301 : TargetInfo::VoidPtrBuiltinVaList);
Chris Lattner17df24e2008-04-21 18:56:49 +00005302 }
Craig Topperf054e3a2015-10-19 03:52:27 +00005303 ArrayRef<const char *> getGCCRegNames() const override;
5304 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00005305 bool validateAsmConstraint(const char *&Name,
5306 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00005307 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00005308 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00005309 case 'l': // r0-r7
5310 case 'h': // r8-r15
JF Bastien750caef2016-02-19 06:54:45 +00005311 case 't': // VFP Floating point register single precision
5312 case 'w': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00005313 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00005314 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005315 case 'I':
5316 case 'J':
5317 case 'K':
5318 case 'L':
5319 case 'M':
5320 // FIXME
5321 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00005322 case 'Q': // A memory address that is a single base register.
5323 Info.setAllowsMemory();
5324 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005325 case 'U': // a memory reference...
5326 switch (Name[1]) {
5327 case 'q': // ...ARMV4 ldrsb
5328 case 'v': // ...VFP load/store (reg+constant offset)
5329 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00005330 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00005331 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00005332 case 'n': // valid address for Neon doubleword vector load/store
5333 case 'm': // valid address for Neon element and structure load/store
5334 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00005335 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005336 Info.setAllowsMemory();
5337 Name++;
5338 return true;
5339 }
Nate Begeman2908fa02008-04-22 05:03:19 +00005340 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005341 return false;
5342 }
Craig Topper3164f332014-03-11 03:39:26 +00005343 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005344 std::string R;
5345 switch (*Constraint) {
5346 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00005347 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005348 Constraint++;
5349 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00005350 case 'p': // 'p' should be translated to 'r' by default.
5351 R = std::string("r");
5352 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005353 default:
5354 return std::string(1, *Constraint);
5355 }
5356 return R;
5357 }
Akira Hatanaka987f1862014-08-22 06:05:21 +00005358 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005359 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005360 std::string &SuggestedModifier) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00005361 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00005362 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00005363
Bill Wendling9d1ee112012-10-25 23:28:48 +00005364 // Strip off constraint modifiers.
5365 while (Constraint[0] == '=' ||
5366 Constraint[0] == '+' ||
5367 Constraint[0] == '&')
5368 Constraint = Constraint.substr(1);
5369
5370 switch (Constraint[0]) {
5371 default: break;
5372 case 'r': {
5373 switch (Modifier) {
5374 default:
Tim Northover8f24b172013-12-08 15:24:55 +00005375 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00005376 case 'q':
5377 // A register of size 32 cannot fit a vector type.
5378 return false;
5379 }
5380 }
5381 }
5382
5383 return true;
5384 }
Craig Topper3164f332014-03-11 03:39:26 +00005385 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00005386 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00005387 return "";
5388 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005389
Craig Topper3164f332014-03-11 03:39:26 +00005390 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00005391 switch (CC) {
5392 case CC_AAPCS:
5393 case CC_AAPCS_VFP:
5394 case CC_Swift:
5395 return CCCR_OK;
5396 default:
5397 return CCCR_Warning;
5398 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005399 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00005400
Craig Topper3164f332014-03-11 03:39:26 +00005401 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00005402 if (RegNo == 0) return 0;
5403 if (RegNo == 1) return 1;
5404 return -1;
5405 }
Matthias Braund1e2fad2015-07-17 00:15:22 +00005406
5407 bool hasSjLjLowering() const override {
5408 return true;
5409 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005410};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005411
Rafael Espindolaeb265472013-08-21 21:59:03 +00005412bool ARMTargetInfo::setFPMath(StringRef Name) {
5413 if (Name == "neon") {
5414 FPMath = FP_Neon;
5415 return true;
5416 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
5417 Name == "vfp4") {
5418 FPMath = FP_VFP;
5419 return true;
5420 }
5421 return false;
5422}
5423
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005424const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005425 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005426 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005427 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
5428
5429 // Float registers
5430 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
5431 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
5432 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005433 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005434
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005435 // Double registers
5436 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
5437 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005438 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
5439 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005440
5441 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005442 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
5443 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005444};
5445
Craig Topperf054e3a2015-10-19 03:52:27 +00005446ArrayRef<const char *> ARMTargetInfo::getGCCRegNames() const {
5447 return llvm::makeArrayRef(GCCRegNames);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005448}
5449
5450const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005451 { { "a1" }, "r0" },
5452 { { "a2" }, "r1" },
5453 { { "a3" }, "r2" },
5454 { { "a4" }, "r3" },
5455 { { "v1" }, "r4" },
5456 { { "v2" }, "r5" },
5457 { { "v3" }, "r6" },
5458 { { "v4" }, "r7" },
5459 { { "v5" }, "r8" },
5460 { { "v6", "rfp" }, "r9" },
5461 { { "sl" }, "r10" },
5462 { { "fp" }, "r11" },
5463 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00005464 { { "r13" }, "sp" },
5465 { { "r14" }, "lr" },
5466 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005467 // The S, D and Q registers overlap, but aren't really aliases; we
5468 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005469};
5470
Craig Topperf054e3a2015-10-19 03:52:27 +00005471ArrayRef<TargetInfo::GCCRegAlias> ARMTargetInfo::getGCCRegAliases() const {
5472 return llvm::makeArrayRef(GCCRegAliases);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005473}
Chris Lattner5cc15e02010-03-03 19:03:45 +00005474
5475const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00005476#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005477 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005478#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5479 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00005480#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00005481
Craig Topper07d3b622015-08-07 05:14:44 +00005482#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005483 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005484#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005485 { #ID, TYPE, ATTRS, nullptr, LANG, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005486#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5487 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5cc15e02010-03-03 19:03:45 +00005488#include "clang/Basic/BuiltinsARM.def"
5489};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005490
5491class ARMleTargetInfo : public ARMTargetInfo {
5492public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005493 ARMleTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5494 : ARMTargetInfo(Triple, Opts, /*BigEndian=*/false) {}
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005495 void getTargetDefines(const LangOptions &Opts,
5496 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005497 Builder.defineMacro("__ARMEL__");
5498 ARMTargetInfo::getTargetDefines(Opts, Builder);
5499 }
5500};
5501
5502class ARMbeTargetInfo : public ARMTargetInfo {
5503public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005504 ARMbeTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5505 : ARMTargetInfo(Triple, Opts, /*BigEndian=*/true) {}
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005506 void getTargetDefines(const LangOptions &Opts,
5507 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005508 Builder.defineMacro("__ARMEB__");
5509 Builder.defineMacro("__ARM_BIG_ENDIAN");
5510 ARMTargetInfo::getTargetDefines(Opts, Builder);
5511 }
5512};
Chris Lattner17df24e2008-04-21 18:56:49 +00005513
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005514class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
5515 const llvm::Triple Triple;
5516public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005517 WindowsARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5518 : WindowsTargetInfo<ARMleTargetInfo>(Triple, Opts), Triple(Triple) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005519 WCharType = UnsignedShort;
5520 SizeType = UnsignedInt;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005521 }
5522 void getVisualStudioDefines(const LangOptions &Opts,
5523 MacroBuilder &Builder) const {
5524 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
5525
5526 // FIXME: this is invalid for WindowsCE
5527 Builder.defineMacro("_M_ARM_NT", "1");
5528 Builder.defineMacro("_M_ARMT", "_M_ARM");
5529 Builder.defineMacro("_M_THUMB", "_M_ARM");
5530
5531 assert((Triple.getArch() == llvm::Triple::arm ||
5532 Triple.getArch() == llvm::Triple::thumb) &&
5533 "invalid architecture for Windows ARM target info");
5534 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
5535 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
5536
5537 // TODO map the complete set of values
5538 // 31: VFPv3 40: VFPv4
5539 Builder.defineMacro("_M_ARM_FP", "31");
5540 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00005541 BuiltinVaListKind getBuiltinVaListKind() const override {
5542 return TargetInfo::CharPtrBuiltinVaList;
5543 }
Martell Malone7ccda3c2015-08-14 18:00:09 +00005544 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5545 switch (CC) {
5546 case CC_X86StdCall:
5547 case CC_X86ThisCall:
5548 case CC_X86FastCall:
5549 case CC_X86VectorCall:
5550 return CCCR_Ignore;
5551 case CC_C:
5552 return CCCR_OK;
5553 default:
5554 return CCCR_Warning;
5555 }
5556 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005557};
5558
5559// Windows ARM + Itanium C++ ABI Target
5560class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
5561public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005562 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple,
5563 const TargetOptions &Opts)
5564 : WindowsARMTargetInfo(Triple, Opts) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005565 TheCXXABI.set(TargetCXXABI::GenericARM);
5566 }
5567
5568 void getTargetDefines(const LangOptions &Opts,
5569 MacroBuilder &Builder) const override {
5570 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5571
5572 if (Opts.MSVCCompat)
5573 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5574 }
5575};
5576
5577// Windows ARM, MS (C++) ABI
5578class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
5579public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005580 MicrosoftARMleTargetInfo(const llvm::Triple &Triple,
5581 const TargetOptions &Opts)
5582 : WindowsARMTargetInfo(Triple, Opts) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005583 TheCXXABI.set(TargetCXXABI::Microsoft);
5584 }
5585
5586 void getTargetDefines(const LangOptions &Opts,
5587 MacroBuilder &Builder) const override {
5588 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5589 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5590 }
5591};
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005592
Yaron Keren321249c2015-07-15 13:32:23 +00005593// ARM MinGW target
5594class MinGWARMTargetInfo : public WindowsARMTargetInfo {
5595public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005596 MinGWARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5597 : WindowsARMTargetInfo(Triple, Opts) {
Yaron Keren321249c2015-07-15 13:32:23 +00005598 TheCXXABI.set(TargetCXXABI::GenericARM);
5599 }
5600
5601 void getTargetDefines(const LangOptions &Opts,
5602 MacroBuilder &Builder) const override {
5603 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5604 DefineStd(Builder, "WIN32", Opts);
5605 DefineStd(Builder, "WINNT", Opts);
5606 Builder.defineMacro("_ARM_");
5607 addMinGWDefines(Opts, Builder);
5608 }
5609};
5610
5611// ARM Cygwin target
5612class CygwinARMTargetInfo : public ARMleTargetInfo {
5613public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005614 CygwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5615 : ARMleTargetInfo(Triple, Opts) {
Yaron Keren321249c2015-07-15 13:32:23 +00005616 TLSSupported = false;
5617 WCharType = UnsignedShort;
5618 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00005619 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Yaron Keren321249c2015-07-15 13:32:23 +00005620 }
5621 void getTargetDefines(const LangOptions &Opts,
5622 MacroBuilder &Builder) const override {
5623 ARMleTargetInfo::getTargetDefines(Opts, Builder);
5624 Builder.defineMacro("_ARM_");
5625 Builder.defineMacro("__CYGWIN__");
5626 Builder.defineMacro("__CYGWIN32__");
5627 DefineStd(Builder, "unix", Opts);
5628 if (Opts.CPlusPlus)
5629 Builder.defineMacro("_GNU_SOURCE");
5630 }
5631};
5632
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005633class DarwinARMTargetInfo : public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00005634protected:
Craig Topper3164f332014-03-11 03:39:26 +00005635 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5636 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00005637 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00005638 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005639
Torok Edwinb2b37c62009-06-30 17:10:35 +00005640public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005641 DarwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5642 : DarwinTargetInfo<ARMleTargetInfo>(Triple, Opts) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005643 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005644 // iOS always has 64-bit atomic instructions.
Eric Christopher917e9522014-11-18 22:36:15 +00005645 // FIXME: This should be based off of the target features in
5646 // ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005647 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00005648
Tim Northoverd88ecb32016-01-27 19:32:40 +00005649 if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00005650 // Darwin on iOS uses a variant of the ARM C++ ABI.
5651 TheCXXABI.set(TargetCXXABI::WatchOS);
5652
5653 // The 32-bit ABI is silent on what ptrdiff_t should be, but given that
5654 // size_t is long, it's a bit weird for it to be int.
5655 PtrDiffType = SignedLong;
5656
5657 // BOOL should be a real boolean on the new ABI
5658 UseSignedCharForObjCBool = false;
5659 } else
5660 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005661 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005662};
Eli Friedmanf05b7722008-08-20 07:44:10 +00005663
Tim Northover573cbee2014-05-24 12:52:07 +00005664class AArch64TargetInfo : public TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00005665 virtual void setDataLayout() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00005666 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5667 static const char *const GCCRegNames[];
5668
James Molloy75f5f9e2014-04-16 15:33:48 +00005669 enum FPUModeEnum {
5670 FPUMode,
5671 NeonMode
5672 };
5673
5674 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00005675 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00005676 unsigned Crypto;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005677 unsigned Unaligned;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005678 unsigned V8_1A;
James Molloy75f5f9e2014-04-16 15:33:48 +00005679
Tim Northovera2ee4332014-03-29 15:09:45 +00005680 static const Builtin::Info BuiltinInfo[];
5681
5682 std::string ABI;
5683
5684public:
Saleem Abdulrasool9b5ba542016-04-10 03:19:47 +00005685 AArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Tim Northovera2ee4332014-03-29 15:09:45 +00005686 : TargetInfo(Triple), ABI("aapcs") {
Tim Northover25e8a672014-05-24 12:51:25 +00005687 if (getTriple().getOS() == llvm::Triple::NetBSD) {
5688 WCharType = SignedInt;
5689
5690 // NetBSD apparently prefers consistency across ARM targets to consistency
5691 // across 64-bit targets.
5692 Int64Type = SignedLongLong;
5693 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005694 } else {
5695 WCharType = UnsignedInt;
5696 Int64Type = SignedLong;
5697 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005698 }
5699
Tim Northovera2ee4332014-03-29 15:09:45 +00005700 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005701 MaxVectorAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005702 MaxAtomicInlineWidth = 128;
5703 MaxAtomicPromoteWidth = 128;
5704
Tim Northovera6a19f12015-02-06 01:25:07 +00005705 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005706 LongDoubleFormat = &llvm::APFloat::IEEEquad;
5707
Tim Northovera2ee4332014-03-29 15:09:45 +00005708 // {} in inline assembly are neon specifiers, not assembly variant
5709 // specifiers.
5710 NoAsmVariants = true;
5711
Tim Northover7ad87af2015-01-16 18:44:04 +00005712 // AAPCS gives rules for bitfields. 7.1.7 says: "The container type
5713 // contributes to the alignment of the containing aggregate in the same way
5714 // a plain (non bit-field) member of that type would, without exception for
5715 // zero-sized or anonymous bit-fields."
Tim Northover5627d392015-10-30 16:30:45 +00005716 assert(UseBitFieldTypeAlignment && "bitfields affect type alignment");
Tim Northover7ad87af2015-01-16 18:44:04 +00005717 UseZeroLengthBitfieldAlignment = true;
5718
Tim Northover573cbee2014-05-24 12:52:07 +00005719 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00005720 TheCXXABI.set(TargetCXXABI::GenericAArch64);
Saleem Abdulrasoolc066d9c2016-04-12 03:05:03 +00005721
5722 if (Triple.getOS() == llvm::Triple::Linux ||
5723 Triple.getOS() == llvm::Triple::UnknownOS)
5724 this->MCountName = Opts.EABIVersion == "gnu" ? "\01_mcount" : "mcount";
Tim Northovera2ee4332014-03-29 15:09:45 +00005725 }
5726
Alp Toker4925ba72014-06-07 23:30:42 +00005727 StringRef getABI() const override { return ABI; }
David Blaikie1cbb9712014-11-14 19:09:44 +00005728 bool setABI(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005729 if (Name != "aapcs" && Name != "darwinpcs")
5730 return false;
5731
5732 ABI = Name;
5733 return true;
5734 }
5735
David Blaikie1cbb9712014-11-14 19:09:44 +00005736 bool setCPU(const std::string &Name) override {
Renato Golin3b8709c2016-05-25 12:36:31 +00005737 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5738 .Case("generic", true)
5739 .Cases("cortex-a53", "cortex-a57", "cortex-a72",
5740 "cortex-a35", "exynos-m1", true)
Sjoerd Meijer90df4a72016-06-02 10:48:37 +00005741 .Case("cortex-a73", true)
Renato Golin3b8709c2016-05-25 12:36:31 +00005742 .Case("cyclone", true)
5743 .Case("kryo", true)
Pankaj Gode3267e842016-06-29 10:00:31 +00005744 .Case("vulcan", true)
Renato Golin3b8709c2016-05-25 12:36:31 +00005745 .Default(false);
5746 return CPUKnown;
Tim Northovera2ee4332014-03-29 15:09:45 +00005747 }
5748
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005749 void getTargetDefines(const LangOptions &Opts,
5750 MacroBuilder &Builder) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005751 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00005752 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005753
5754 // Target properties.
5755 Builder.defineMacro("_LP64");
5756 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005757
5758 // ACLE predefines. Many can only have one possible value on v8 AArch64.
5759 Builder.defineMacro("__ARM_ACLE", "200");
5760 Builder.defineMacro("__ARM_ARCH", "8");
5761 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
5762
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005763 Builder.defineMacro("__ARM_64BIT_STATE", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005764 Builder.defineMacro("__ARM_PCS_AAPCS64", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005765 Builder.defineMacro("__ARM_ARCH_ISA_A64", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005766
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005767 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
5768 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
5769 Builder.defineMacro("__ARM_FEATURE_LDREX", "0xF");
5770 Builder.defineMacro("__ARM_FEATURE_IDIV", "1"); // As specified in ACLE
James Molloy0ffb0932014-09-15 11:25:38 +00005771 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005772 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
5773 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005774
5775 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
5776
5777 // 0xe implies support for half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005778 Builder.defineMacro("__ARM_FP", "0xE");
Tim Northovera2ee4332014-03-29 15:09:45 +00005779
5780 // PCS specifies this for SysV variants, which is all we support. Other ABIs
5781 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005782 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
5783 Builder.defineMacro("__ARM_FP16_ARGS", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005784
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005785 if (Opts.UnsafeFPMath)
5786 Builder.defineMacro("__ARM_FP_FAST", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005787
5788 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
5789
5790 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5791 Opts.ShortEnums ? "1" : "4");
5792
James Molloy75f5f9e2014-04-16 15:33:48 +00005793 if (FPU == NeonMode) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005794 Builder.defineMacro("__ARM_NEON", "1");
James Molloy75f5f9e2014-04-16 15:33:48 +00005795 // 64-bit NEON supports half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005796 Builder.defineMacro("__ARM_NEON_FP", "0xE");
James Molloy75f5f9e2014-04-16 15:33:48 +00005797 }
Tim Northovera2ee4332014-03-29 15:09:45 +00005798
Bradley Smith418c5932014-05-02 15:17:51 +00005799 if (CRC)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005800 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
Bradley Smith418c5932014-05-02 15:17:51 +00005801
James Molloy75f5f9e2014-04-16 15:33:48 +00005802 if (Crypto)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005803 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
5804
5805 if (Unaligned)
5806 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Reid Klecknerd167d422015-05-06 15:31:46 +00005807
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005808 if (V8_1A)
5809 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
5810
Reid Klecknerd167d422015-05-06 15:31:46 +00005811 // All of the __sync_(bool|val)_compare_and_swap_(1|2|4|8) builtins work.
5812 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5813 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5814 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5815 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Tim Northovera2ee4332014-03-29 15:09:45 +00005816 }
5817
Craig Topper6c03a542015-10-19 04:51:35 +00005818 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5819 return llvm::makeArrayRef(BuiltinInfo,
5820 clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin);
Tim Northovera2ee4332014-03-29 15:09:45 +00005821 }
5822
David Blaikie1cbb9712014-11-14 19:09:44 +00005823 bool hasFeature(StringRef Feature) const override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005824 return Feature == "aarch64" ||
5825 Feature == "arm64" ||
Ben Langmuir587aeaf2015-08-07 01:59:56 +00005826 Feature == "arm" ||
James Molloy75f5f9e2014-04-16 15:33:48 +00005827 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00005828 }
5829
James Molloy5e73df52014-04-16 15:06:20 +00005830 bool handleTargetFeatures(std::vector<std::string> &Features,
5831 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005832 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00005833 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00005834 Crypto = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005835 Unaligned = 1;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005836 V8_1A = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005837
Eric Christopher610fe112015-08-26 08:21:55 +00005838 for (const auto &Feature : Features) {
5839 if (Feature == "+neon")
James Molloy75f5f9e2014-04-16 15:33:48 +00005840 FPU = NeonMode;
Eric Christopher610fe112015-08-26 08:21:55 +00005841 if (Feature == "+crc")
Bradley Smith418c5932014-05-02 15:17:51 +00005842 CRC = 1;
Eric Christopher610fe112015-08-26 08:21:55 +00005843 if (Feature == "+crypto")
James Molloy75f5f9e2014-04-16 15:33:48 +00005844 Crypto = 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005845 if (Feature == "+strict-align")
5846 Unaligned = 0;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005847 if (Feature == "+v8.1a")
5848 V8_1A = 1;
James Molloy75f5f9e2014-04-16 15:33:48 +00005849 }
5850
James Y Knightb214cbc2016-03-04 19:00:41 +00005851 setDataLayout();
James Molloy5e73df52014-04-16 15:06:20 +00005852
5853 return true;
5854 }
5855
John McCall477f2bb2016-03-03 06:39:32 +00005856 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5857 switch (CC) {
5858 case CC_C:
5859 case CC_Swift:
Roman Levenstein35aa5ce2016-03-16 18:00:46 +00005860 case CC_PreserveMost:
5861 case CC_PreserveAll:
John McCall477f2bb2016-03-03 06:39:32 +00005862 return CCCR_OK;
5863 default:
5864 return CCCR_Warning;
5865 }
5866 }
5867
David Blaikie1cbb9712014-11-14 19:09:44 +00005868 bool isCLZForZeroUndef() const override { return false; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005869
David Blaikie1cbb9712014-11-14 19:09:44 +00005870 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005871 return TargetInfo::AArch64ABIBuiltinVaList;
5872 }
5873
Craig Topperf054e3a2015-10-19 03:52:27 +00005874 ArrayRef<const char *> getGCCRegNames() const override;
5875 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00005876
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005877 bool validateAsmConstraint(const char *&Name,
5878 TargetInfo::ConstraintInfo &Info) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005879 switch (*Name) {
5880 default:
5881 return false;
5882 case 'w': // Floating point and SIMD registers (V0-V31)
5883 Info.setAllowsRegister();
5884 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00005885 case 'I': // Constant that can be used with an ADD instruction
5886 case 'J': // Constant that can be used with a SUB instruction
5887 case 'K': // Constant that can be used with a 32-bit logical instruction
5888 case 'L': // Constant that can be used with a 64-bit logical instruction
5889 case 'M': // Constant that can be used as a 32-bit MOV immediate
5890 case 'N': // Constant that can be used as a 64-bit MOV immediate
5891 case 'Y': // Floating point constant zero
5892 case 'Z': // Integer constant zero
5893 return true;
5894 case 'Q': // A memory reference with base register and no offset
5895 Info.setAllowsMemory();
5896 return true;
5897 case 'S': // A symbolic address
5898 Info.setAllowsRegister();
5899 return true;
5900 case 'U':
Eric Christopher917e9522014-11-18 22:36:15 +00005901 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
5902 // Utf: A memory address suitable for ldp/stp in TF mode.
5903 // Usa: An absolute symbolic address.
5904 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
5905 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
Tim Northovera2ee4332014-03-29 15:09:45 +00005906 case 'z': // Zero register, wzr or xzr
5907 Info.setAllowsRegister();
5908 return true;
5909 case 'x': // Floating point and SIMD registers (V0-V15)
5910 Info.setAllowsRegister();
5911 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00005912 }
5913 return false;
5914 }
5915
Akira Hatanaka987f1862014-08-22 06:05:21 +00005916 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005917 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005918 std::string &SuggestedModifier) const override {
James Molloy8a157bf2014-07-25 10:19:47 +00005919 // Strip off constraint modifiers.
5920 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
5921 Constraint = Constraint.substr(1);
5922
5923 switch (Constraint[0]) {
5924 default:
5925 return true;
5926 case 'z':
5927 case 'r': {
5928 switch (Modifier) {
5929 case 'x':
5930 case 'w':
5931 // For now assume that the person knows what they're
5932 // doing with the modifier.
5933 return true;
5934 default:
5935 // By default an 'r' constraint will be in the 'x'
5936 // registers.
Akira Hatanaka987f1862014-08-22 06:05:21 +00005937 if (Size == 64)
5938 return true;
5939
5940 SuggestedModifier = "w";
5941 return false;
James Molloy8a157bf2014-07-25 10:19:47 +00005942 }
5943 }
5944 }
5945 }
5946
David Blaikie1cbb9712014-11-14 19:09:44 +00005947 const char *getClobbers() const override { return ""; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005948
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00005949 int getEHDataRegisterNumber(unsigned RegNo) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005950 if (RegNo == 0)
5951 return 0;
5952 if (RegNo == 1)
5953 return 1;
5954 return -1;
5955 }
5956};
5957
Tim Northover573cbee2014-05-24 12:52:07 +00005958const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005959 // 32-bit Integer registers
5960 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
5961 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
5962 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
5963
5964 // 64-bit Integer registers
5965 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
5966 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
5967 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
5968
5969 // 32-bit floating point regsisters
5970 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
5971 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
5972 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
5973
5974 // 64-bit floating point regsisters
5975 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
5976 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
5977 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
5978
5979 // Vector registers
5980 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
5981 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
5982 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
5983};
5984
Craig Topperf054e3a2015-10-19 03:52:27 +00005985ArrayRef<const char *> AArch64TargetInfo::getGCCRegNames() const {
5986 return llvm::makeArrayRef(GCCRegNames);
Tim Northovera2ee4332014-03-29 15:09:45 +00005987}
5988
Tim Northover573cbee2014-05-24 12:52:07 +00005989const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005990 { { "w31" }, "wsp" },
5991 { { "x29" }, "fp" },
5992 { { "x30" }, "lr" },
5993 { { "x31" }, "sp" },
5994 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
5995 // don't want to substitute one of these for a different-sized one.
5996};
5997
Craig Topperf054e3a2015-10-19 03:52:27 +00005998ArrayRef<TargetInfo::GCCRegAlias> AArch64TargetInfo::getGCCRegAliases() const {
5999 return llvm::makeArrayRef(GCCRegAliases);
Tim Northovera2ee4332014-03-29 15:09:45 +00006000}
6001
Tim Northover573cbee2014-05-24 12:52:07 +00006002const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00006003#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006004 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00006005#include "clang/Basic/BuiltinsNEON.def"
6006
6007#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006008 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northover573cbee2014-05-24 12:52:07 +00006009#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00006010};
James Molloy5e73df52014-04-16 15:06:20 +00006011
Tim Northover573cbee2014-05-24 12:52:07 +00006012class AArch64leTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00006013 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00006014 if (getTriple().isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00006015 resetDataLayout("e-m:o-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006016 else
Evandro Menezes04abc142016-06-21 15:55:29 +00006017 resetDataLayout("e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006018 }
6019
6020public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006021 AArch64leTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6022 : AArch64TargetInfo(Triple, Opts) {
James Molloy5e73df52014-04-16 15:06:20 +00006023 BigEndian = false;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006024 }
James Molloy5e73df52014-04-16 15:06:20 +00006025 void getTargetDefines(const LangOptions &Opts,
6026 MacroBuilder &Builder) const override {
6027 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00006028 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00006029 }
6030};
6031
Tim Northover573cbee2014-05-24 12:52:07 +00006032class AArch64beTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00006033 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00006034 assert(!getTriple().isOSBinFormatMachO());
Evandro Menezes04abc142016-06-21 15:55:29 +00006035 resetDataLayout("E-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006036 }
6037
6038public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006039 AArch64beTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6040 : AArch64TargetInfo(Triple, Opts) {}
James Molloy5e73df52014-04-16 15:06:20 +00006041 void getTargetDefines(const LangOptions &Opts,
6042 MacroBuilder &Builder) const override {
6043 Builder.defineMacro("__AARCH64EB__");
6044 Builder.defineMacro("__AARCH_BIG_ENDIAN");
6045 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00006046 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00006047 }
6048};
Tim Northovera2ee4332014-03-29 15:09:45 +00006049
Tim Northover573cbee2014-05-24 12:52:07 +00006050class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00006051protected:
6052 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
6053 MacroBuilder &Builder) const override {
6054 Builder.defineMacro("__AARCH64_SIMD__");
6055 Builder.defineMacro("__ARM64_ARCH_8__");
6056 Builder.defineMacro("__ARM_NEON__");
6057 Builder.defineMacro("__LITTLE_ENDIAN__");
6058 Builder.defineMacro("__REGISTER_PREFIX__", "");
6059 Builder.defineMacro("__arm64", "1");
6060 Builder.defineMacro("__arm64__", "1");
6061
6062 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
6063 }
6064
Tim Northovera2ee4332014-03-29 15:09:45 +00006065public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006066 DarwinAArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6067 : DarwinTargetInfo<AArch64leTargetInfo>(Triple, Opts) {
Tim Northovera2ee4332014-03-29 15:09:45 +00006068 Int64Type = SignedLongLong;
6069 WCharType = SignedInt;
6070 UseSignedCharForObjCBool = false;
6071
Tim Northovera6a19f12015-02-06 01:25:07 +00006072 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00006073 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
6074
6075 TheCXXABI.set(TargetCXXABI::iOS64);
6076 }
6077
David Blaikie1cbb9712014-11-14 19:09:44 +00006078 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006079 return TargetInfo::CharPtrBuiltinVaList;
6080 }
6081};
Tim Northovera2ee4332014-03-29 15:09:45 +00006082
Tony Linthicum76329bf2011-12-12 21:14:55 +00006083// Hexagon abstract base class
6084class HexagonTargetInfo : public TargetInfo {
6085 static const Builtin::Info BuiltinInfo[];
6086 static const char * const GCCRegNames[];
6087 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6088 std::string CPU;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006089 bool HasHVX, HasHVXDouble;
6090
Tony Linthicum76329bf2011-12-12 21:14:55 +00006091public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006092 HexagonTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6093 : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006094 BigEndian = false;
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00006095 // Specify the vector alignment explicitly. For v512x1, the calculated
6096 // alignment would be 512*alignment(i1), which is 512 bytes, instead of
6097 // the required minimum of 64 bytes.
James Y Knightb214cbc2016-03-04 19:00:41 +00006098 resetDataLayout("e-m:e-p:32:32:32-a:0-n16:32-"
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00006099 "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 +00006100 "v32:32:32-v64:64:64-v512:512:512-v1024:1024:1024-v2048:2048:2048");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006101 SizeType = UnsignedInt;
6102 PtrDiffType = SignedInt;
6103 IntPtrType = SignedInt;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006104
6105 // {} in inline assembly are packet specifiers, not assembly variant
6106 // specifiers.
6107 NoAsmVariants = true;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006108
6109 LargeArrayMinWidth = 64;
6110 LargeArrayAlign = 64;
6111 UseBitFieldTypeAlignment = true;
6112 ZeroLengthBitfieldBoundary = 32;
6113 HasHVX = HasHVXDouble = false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006114 }
6115
Craig Topper6c03a542015-10-19 04:51:35 +00006116 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6117 return llvm::makeArrayRef(BuiltinInfo,
6118 clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006119 }
6120
Craig Topper3164f332014-03-11 03:39:26 +00006121 bool validateAsmConstraint(const char *&Name,
6122 TargetInfo::ConstraintInfo &Info) const override {
Krzysztof Parzyszeke0026e42016-05-18 14:56:14 +00006123 switch (*Name) {
6124 case 'v':
6125 case 'q':
6126 if (HasHVX) {
6127 Info.setAllowsRegister();
6128 return true;
6129 }
6130 break;
Krzysztof Parzyszek89fb4412016-05-20 13:50:32 +00006131 case 's':
6132 // Relocatable constant.
6133 return true;
Krzysztof Parzyszeke0026e42016-05-18 14:56:14 +00006134 }
6135 return false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006136 }
6137
Craig Topper3164f332014-03-11 03:39:26 +00006138 void getTargetDefines(const LangOptions &Opts,
6139 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006140
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006141 bool isCLZForZeroUndef() const override { return false; }
6142
Craig Topper3164f332014-03-11 03:39:26 +00006143 bool hasFeature(StringRef Feature) const override {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006144 return llvm::StringSwitch<bool>(Feature)
6145 .Case("hexagon", true)
6146 .Case("hvx", HasHVX)
6147 .Case("hvx-double", HasHVXDouble)
6148 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006149 }
Craig Topper3164f332014-03-11 03:39:26 +00006150
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006151 bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6152 StringRef CPU, const std::vector<std::string> &FeaturesVec)
6153 const override;
6154
6155 bool handleTargetFeatures(std::vector<std::string> &Features,
6156 DiagnosticsEngine &Diags) override;
6157
Craig Topper3164f332014-03-11 03:39:26 +00006158 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006159 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006160 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006161 ArrayRef<const char *> getGCCRegNames() const override;
6162 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00006163 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006164 return "";
6165 }
Sebastian Pop86500282012-01-13 20:37:10 +00006166
6167 static const char *getHexagonCPUSuffix(StringRef Name) {
6168 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00006169 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006170 .Case("hexagonv5", "5")
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006171 .Case("hexagonv55", "55")
6172 .Case("hexagonv60", "60")
Craig Topperf1186c52014-05-08 06:41:40 +00006173 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00006174 }
6175
Craig Topper3164f332014-03-11 03:39:26 +00006176 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00006177 if (!getHexagonCPUSuffix(Name))
6178 return false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006179 CPU = Name;
6180 return true;
6181 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006182
6183 int getEHDataRegisterNumber(unsigned RegNo) const override {
6184 return RegNo < 2 ? RegNo : -1;
6185 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006186};
6187
6188void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006189 MacroBuilder &Builder) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006190 Builder.defineMacro("__qdsp6__", "1");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006191 Builder.defineMacro("__hexagon__", "1");
6192
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006193 if (CPU == "hexagonv4") {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006194 Builder.defineMacro("__HEXAGON_V4__");
6195 Builder.defineMacro("__HEXAGON_ARCH__", "4");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006196 if (Opts.HexagonQdsp6Compat) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006197 Builder.defineMacro("__QDSP6_V4__");
6198 Builder.defineMacro("__QDSP6_ARCH__", "4");
6199 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006200 } else if (CPU == "hexagonv5") {
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006201 Builder.defineMacro("__HEXAGON_V5__");
6202 Builder.defineMacro("__HEXAGON_ARCH__", "5");
6203 if(Opts.HexagonQdsp6Compat) {
6204 Builder.defineMacro("__QDSP6_V5__");
6205 Builder.defineMacro("__QDSP6_ARCH__", "5");
6206 }
Krzysztof Parzyszeka58ff512016-04-21 14:30:04 +00006207 } else if (CPU == "hexagonv55") {
6208 Builder.defineMacro("__HEXAGON_V55__");
6209 Builder.defineMacro("__HEXAGON_ARCH__", "55");
6210 Builder.defineMacro("__QDSP6_V55__");
6211 Builder.defineMacro("__QDSP6_ARCH__", "55");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006212 } else if (CPU == "hexagonv60") {
6213 Builder.defineMacro("__HEXAGON_V60__");
6214 Builder.defineMacro("__HEXAGON_ARCH__", "60");
6215 Builder.defineMacro("__QDSP6_V60__");
6216 Builder.defineMacro("__QDSP6_ARCH__", "60");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006217 }
Krzysztof Parzyszek7f0756c2016-04-18 18:38:11 +00006218
6219 if (hasFeature("hvx")) {
6220 Builder.defineMacro("__HVX__");
6221 if (hasFeature("hvx-double"))
6222 Builder.defineMacro("__HVXDBL__");
6223 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006224}
6225
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006226bool HexagonTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
6227 DiagnosticsEngine &Diags) {
6228 for (auto &F : Features) {
6229 if (F == "+hvx")
6230 HasHVX = true;
6231 else if (F == "-hvx")
6232 HasHVX = HasHVXDouble = false;
6233 else if (F == "+hvx-double")
6234 HasHVX = HasHVXDouble = true;
6235 else if (F == "-hvx-double")
6236 HasHVXDouble = false;
6237 }
6238 return true;
6239}
6240
6241bool HexagonTargetInfo::initFeatureMap(llvm::StringMap<bool> &Features,
6242 DiagnosticsEngine &Diags, StringRef CPU,
6243 const std::vector<std::string> &FeaturesVec) const {
6244 // Default for v60: -hvx, -hvx-double.
6245 Features["hvx"] = false;
6246 Features["hvx-double"] = false;
6247
6248 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
6249}
6250
6251
6252const char *const HexagonTargetInfo::GCCRegNames[] = {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006253 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6254 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6255 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6256 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
6257 "p0", "p1", "p2", "p3",
6258 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
6259};
6260
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006261ArrayRef<const char*> HexagonTargetInfo::getGCCRegNames() const {
Craig Topperf054e3a2015-10-19 03:52:27 +00006262 return llvm::makeArrayRef(GCCRegNames);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006263}
6264
Tony Linthicum76329bf2011-12-12 21:14:55 +00006265const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
6266 { { "sp" }, "r29" },
6267 { { "fp" }, "r30" },
6268 { { "lr" }, "r31" },
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006269};
Tony Linthicum76329bf2011-12-12 21:14:55 +00006270
Craig Topperf054e3a2015-10-19 03:52:27 +00006271ArrayRef<TargetInfo::GCCRegAlias> HexagonTargetInfo::getGCCRegAliases() const {
6272 return llvm::makeArrayRef(GCCRegAliases);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006273}
6274
6275
6276const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00006277#define BUILTIN(ID, TYPE, ATTRS) \
6278 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
6279#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
6280 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tony Linthicum76329bf2011-12-12 21:14:55 +00006281#include "clang/Basic/BuiltinsHexagon.def"
6282};
Tony Linthicum76329bf2011-12-12 21:14:55 +00006283
Jacques Pienaard964cc22016-03-28 21:02:54 +00006284class LanaiTargetInfo : public TargetInfo {
6285 // Class for Lanai (32-bit).
6286 // The CPU profiles supported by the Lanai backend
6287 enum CPUKind {
6288 CK_NONE,
6289 CK_V11,
6290 } CPU;
6291
6292 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6293 static const char *const GCCRegNames[];
6294
6295public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006296 LanaiTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6297 : TargetInfo(Triple) {
Jacques Pienaard964cc22016-03-28 21:02:54 +00006298 // Description string has to be kept in sync with backend.
6299 resetDataLayout("E" // Big endian
6300 "-m:e" // ELF name manging
6301 "-p:32:32" // 32 bit pointers, 32 bit aligned
6302 "-i64:64" // 64 bit integers, 64 bit aligned
6303 "-a:0:32" // 32 bit alignment of objects of aggregate type
6304 "-n32" // 32 bit native integer width
6305 "-S64" // 64 bit natural stack alignment
6306 );
6307
6308 // Setting RegParmMax equal to what mregparm was set to in the old
6309 // toolchain
6310 RegParmMax = 4;
6311
6312 // Set the default CPU to V11
6313 CPU = CK_V11;
6314
6315 // Temporary approach to make everything at least word-aligned and allow for
6316 // safely casting between pointers with different alignment requirements.
6317 // TODO: Remove this when there are no more cast align warnings on the
6318 // firmware.
6319 MinGlobalAlign = 32;
6320 }
6321
6322 void getTargetDefines(const LangOptions &Opts,
6323 MacroBuilder &Builder) const override {
6324 // Define __lanai__ when building for target lanai.
6325 Builder.defineMacro("__lanai__");
6326
6327 // Set define for the CPU specified.
6328 switch (CPU) {
6329 case CK_V11:
6330 Builder.defineMacro("__LANAI_V11__");
6331 break;
6332 case CK_NONE:
6333 llvm_unreachable("Unhandled target CPU");
6334 }
6335 }
6336
6337 bool setCPU(const std::string &Name) override {
6338 CPU = llvm::StringSwitch<CPUKind>(Name)
6339 .Case("v11", CK_V11)
6340 .Default(CK_NONE);
6341
6342 return CPU != CK_NONE;
6343 }
6344
6345 bool hasFeature(StringRef Feature) const override {
6346 return llvm::StringSwitch<bool>(Feature).Case("lanai", true).Default(false);
6347 }
6348
6349 ArrayRef<const char *> getGCCRegNames() const override;
6350
6351 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
6352
6353 BuiltinVaListKind getBuiltinVaListKind() const override {
6354 return TargetInfo::VoidPtrBuiltinVaList;
6355 }
6356
6357 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
6358
6359 bool validateAsmConstraint(const char *&Name,
6360 TargetInfo::ConstraintInfo &info) const override {
6361 return false;
6362 }
6363
6364 const char *getClobbers() const override { return ""; }
6365};
6366
6367const char *const LanaiTargetInfo::GCCRegNames[] = {
6368 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10",
6369 "r11", "r12", "r13", "r14", "r15", "r16", "r17", "r18", "r19", "r20", "r21",
6370 "r22", "r23", "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"};
6371
6372ArrayRef<const char *> LanaiTargetInfo::getGCCRegNames() const {
6373 return llvm::makeArrayRef(GCCRegNames);
6374}
6375
6376const TargetInfo::GCCRegAlias LanaiTargetInfo::GCCRegAliases[] = {
6377 {{"pc"}, "r2"},
6378 {{"sp"}, "r4"},
6379 {{"fp"}, "r5"},
6380 {{"rv"}, "r8"},
6381 {{"rr1"}, "r10"},
6382 {{"rr2"}, "r11"},
6383 {{"rca"}, "r15"},
6384};
6385
6386ArrayRef<TargetInfo::GCCRegAlias> LanaiTargetInfo::getGCCRegAliases() const {
6387 return llvm::makeArrayRef(GCCRegAliases);
6388}
6389
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006390// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
6391class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00006392 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6393 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006394 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00006395public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006396 SparcTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
James Y Knighta3518ad2016-01-27 01:04:51 +00006397 : TargetInfo(Triple), SoftFloat(false) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006398
Joerg Sonnenbergerd0be8dc2016-03-07 17:19:15 +00006399 int getEHDataRegisterNumber(unsigned RegNo) const override {
6400 if (RegNo == 0) return 24;
6401 if (RegNo == 1) return 25;
6402 return -1;
6403 }
6404
Craig Topper3164f332014-03-11 03:39:26 +00006405 bool handleTargetFeatures(std::vector<std::string> &Features,
6406 DiagnosticsEngine &Diags) override {
Jacob Baungard Hansen13a49372016-05-24 08:30:08 +00006407 // Check if software floating point is enabled
Eric Christopherfb481a42015-04-29 23:32:17 +00006408 auto Feature = std::find(Features.begin(), Features.end(), "+soft-float");
6409 if (Feature != Features.end()) {
6410 SoftFloat = true;
Eric Christopherfb481a42015-04-29 23:32:17 +00006411 }
Rafael Espindolaeb265472013-08-21 21:59:03 +00006412 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006413 }
Craig Topper3164f332014-03-11 03:39:26 +00006414 void getTargetDefines(const LangOptions &Opts,
6415 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006416 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006417 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006418
6419 if (SoftFloat)
6420 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00006421 }
Craig Topper3164f332014-03-11 03:39:26 +00006422
6423 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006424 return llvm::StringSwitch<bool>(Feature)
6425 .Case("softfloat", SoftFloat)
6426 .Case("sparc", true)
6427 .Default(false);
6428 }
Craig Topper3164f332014-03-11 03:39:26 +00006429
Chris Dewhurst0381cd72016-06-15 12:44:47 +00006430 bool hasSjLjLowering() const override {
6431 return true;
6432 }
6433
Craig Topper6c03a542015-10-19 04:51:35 +00006434 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006435 // FIXME: Implement!
Craig Topper6c03a542015-10-19 04:51:35 +00006436 return None;
Gabor Greif49991682008-02-21 16:29:08 +00006437 }
Craig Topper3164f332014-03-11 03:39:26 +00006438 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006439 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00006440 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006441 ArrayRef<const char *> getGCCRegNames() const override;
6442 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00006443 bool validateAsmConstraint(const char *&Name,
6444 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006445 // FIXME: Implement!
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00006446 switch (*Name) {
6447 case 'I': // Signed 13-bit constant
6448 case 'J': // Zero
6449 case 'K': // 32-bit constant with the low 12 bits clear
6450 case 'L': // A constant in the range supported by movcc (11-bit signed imm)
6451 case 'M': // A constant in the range supported by movrcc (19-bit signed imm)
6452 case 'N': // Same as 'K' but zext (required for SIMode)
6453 case 'O': // The constant 4096
6454 return true;
6455 }
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006456 return false;
Gabor Greif49991682008-02-21 16:29:08 +00006457 }
Craig Topper3164f332014-03-11 03:39:26 +00006458 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006459 // FIXME: Implement!
6460 return "";
Gabor Greif49991682008-02-21 16:29:08 +00006461 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006462
6463 // No Sparc V7 for now, the backend doesn't support it anyway.
6464 enum CPUKind {
6465 CK_GENERIC,
6466 CK_V8,
6467 CK_SUPERSPARC,
6468 CK_SPARCLITE,
6469 CK_F934,
6470 CK_HYPERSPARC,
6471 CK_SPARCLITE86X,
6472 CK_SPARCLET,
6473 CK_TSC701,
6474 CK_V9,
6475 CK_ULTRASPARC,
6476 CK_ULTRASPARC3,
6477 CK_NIAGARA,
6478 CK_NIAGARA2,
6479 CK_NIAGARA3,
Douglas Katzman6871afc2016-03-15 22:34:02 +00006480 CK_NIAGARA4,
6481 CK_MYRIAD2_1,
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006482 CK_MYRIAD2_2,
6483 CK_LEON2,
6484 CK_LEON2_AT697E,
6485 CK_LEON2_AT697F,
6486 CK_LEON3,
6487 CK_LEON3_UT699,
6488 CK_LEON3_GR712RC,
6489 CK_LEON4,
6490 CK_LEON4_GR740
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006491 } CPU = CK_GENERIC;
6492
6493 enum CPUGeneration {
6494 CG_V8,
6495 CG_V9,
6496 };
6497
6498 CPUGeneration getCPUGeneration(CPUKind Kind) const {
6499 switch (Kind) {
6500 case CK_GENERIC:
6501 case CK_V8:
6502 case CK_SUPERSPARC:
6503 case CK_SPARCLITE:
6504 case CK_F934:
6505 case CK_HYPERSPARC:
6506 case CK_SPARCLITE86X:
6507 case CK_SPARCLET:
6508 case CK_TSC701:
Douglas Katzman6871afc2016-03-15 22:34:02 +00006509 case CK_MYRIAD2_1:
6510 case CK_MYRIAD2_2:
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006511 case CK_LEON2:
6512 case CK_LEON2_AT697E:
6513 case CK_LEON2_AT697F:
6514 case CK_LEON3:
6515 case CK_LEON3_UT699:
6516 case CK_LEON3_GR712RC:
6517 case CK_LEON4:
6518 case CK_LEON4_GR740:
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006519 return CG_V8;
6520 case CK_V9:
6521 case CK_ULTRASPARC:
6522 case CK_ULTRASPARC3:
6523 case CK_NIAGARA:
6524 case CK_NIAGARA2:
6525 case CK_NIAGARA3:
6526 case CK_NIAGARA4:
6527 return CG_V9;
6528 }
Aaron Ballmana9a72852015-11-11 13:42:02 +00006529 llvm_unreachable("Unexpected CPU kind");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006530 }
6531
6532 CPUKind getCPUKind(StringRef Name) const {
6533 return llvm::StringSwitch<CPUKind>(Name)
6534 .Case("v8", CK_V8)
6535 .Case("supersparc", CK_SUPERSPARC)
6536 .Case("sparclite", CK_SPARCLITE)
6537 .Case("f934", CK_F934)
6538 .Case("hypersparc", CK_HYPERSPARC)
6539 .Case("sparclite86x", CK_SPARCLITE86X)
6540 .Case("sparclet", CK_SPARCLET)
6541 .Case("tsc701", CK_TSC701)
6542 .Case("v9", CK_V9)
6543 .Case("ultrasparc", CK_ULTRASPARC)
6544 .Case("ultrasparc3", CK_ULTRASPARC3)
6545 .Case("niagara", CK_NIAGARA)
6546 .Case("niagara2", CK_NIAGARA2)
6547 .Case("niagara3", CK_NIAGARA3)
6548 .Case("niagara4", CK_NIAGARA4)
Douglas Katzman6871afc2016-03-15 22:34:02 +00006549 .Case("myriad2", CK_MYRIAD2_1)
6550 .Case("myriad2.1", CK_MYRIAD2_1)
6551 .Case("myriad2.2", CK_MYRIAD2_2)
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006552 .Case("leon2", CK_LEON2)
6553 .Case("at697e", CK_LEON2_AT697E)
6554 .Case("at697f", CK_LEON2_AT697F)
6555 .Case("leon3", CK_LEON3)
6556 .Case("ut699", CK_LEON3_UT699)
6557 .Case("gr712rc", CK_LEON3_GR712RC)
6558 .Case("leon4", CK_LEON4)
6559 .Case("gr740", CK_LEON4_GR740)
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006560 .Default(CK_GENERIC);
6561 }
6562
6563 bool setCPU(const std::string &Name) override {
6564 CPU = getCPUKind(Name);
6565 return CPU != CK_GENERIC;
6566 }
Gabor Greif49991682008-02-21 16:29:08 +00006567};
6568
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006569const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00006570 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6571 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6572 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6573 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
6574};
6575
Craig Topperf054e3a2015-10-19 03:52:27 +00006576ArrayRef<const char *> SparcTargetInfo::getGCCRegNames() const {
6577 return llvm::makeArrayRef(GCCRegNames);
Chris Lattner9b415d62009-01-27 01:58:38 +00006578}
6579
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006580const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00006581 { { "g0" }, "r0" },
6582 { { "g1" }, "r1" },
6583 { { "g2" }, "r2" },
6584 { { "g3" }, "r3" },
6585 { { "g4" }, "r4" },
6586 { { "g5" }, "r5" },
6587 { { "g6" }, "r6" },
6588 { { "g7" }, "r7" },
6589 { { "o0" }, "r8" },
6590 { { "o1" }, "r9" },
6591 { { "o2" }, "r10" },
6592 { { "o3" }, "r11" },
6593 { { "o4" }, "r12" },
6594 { { "o5" }, "r13" },
6595 { { "o6", "sp" }, "r14" },
6596 { { "o7" }, "r15" },
6597 { { "l0" }, "r16" },
6598 { { "l1" }, "r17" },
6599 { { "l2" }, "r18" },
6600 { { "l3" }, "r19" },
6601 { { "l4" }, "r20" },
6602 { { "l5" }, "r21" },
6603 { { "l6" }, "r22" },
6604 { { "l7" }, "r23" },
6605 { { "i0" }, "r24" },
6606 { { "i1" }, "r25" },
6607 { { "i2" }, "r26" },
6608 { { "i3" }, "r27" },
6609 { { "i4" }, "r28" },
6610 { { "i5" }, "r29" },
6611 { { "i6", "fp" }, "r30" },
6612 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00006613};
6614
Craig Topperf054e3a2015-10-19 03:52:27 +00006615ArrayRef<TargetInfo::GCCRegAlias> SparcTargetInfo::getGCCRegAliases() const {
6616 return llvm::makeArrayRef(GCCRegAliases);
Chris Lattner9b415d62009-01-27 01:58:38 +00006617}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006618
6619// SPARC v8 is the 32-bit mode selected by Triple::sparc.
6620class SparcV8TargetInfo : public SparcTargetInfo {
6621public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006622 SparcV8TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6623 : SparcTargetInfo(Triple, Opts) {
James Y Knightb214cbc2016-03-04 19:00:41 +00006624 resetDataLayout("E-m:e-p:32:32-i64:64-f128:64-n32-S64");
Brad Smith73859112015-08-13 21:45:57 +00006625 // NetBSD / OpenBSD use long (same as llvm default); everyone else uses int.
6626 switch (getTriple().getOS()) {
6627 default:
James Y Knight4b4d19e2015-06-04 15:36:29 +00006628 SizeType = UnsignedInt;
6629 IntPtrType = SignedInt;
6630 PtrDiffType = SignedInt;
Brad Smith73859112015-08-13 21:45:57 +00006631 break;
6632 case llvm::Triple::NetBSD:
6633 case llvm::Triple::OpenBSD:
6634 SizeType = UnsignedLong;
6635 IntPtrType = SignedLong;
6636 PtrDiffType = SignedLong;
6637 break;
Brad Smith56495d52015-08-13 22:00:53 +00006638 }
Chris Dewhurst7cc4cfe2016-06-28 12:55:55 +00006639 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006640 }
6641
Craig Topper3164f332014-03-11 03:39:26 +00006642 void getTargetDefines(const LangOptions &Opts,
6643 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006644 SparcTargetInfo::getTargetDefines(Opts, Builder);
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006645 switch (getCPUGeneration(CPU)) {
6646 case CG_V8:
6647 Builder.defineMacro("__sparcv8");
6648 if (getTriple().getOS() != llvm::Triple::Solaris)
6649 Builder.defineMacro("__sparcv8__");
6650 break;
6651 case CG_V9:
6652 Builder.defineMacro("__sparcv9");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00006653 if (getTriple().getOS() != llvm::Triple::Solaris) {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006654 Builder.defineMacro("__sparcv9__");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00006655 Builder.defineMacro("__sparc_v9__");
6656 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006657 break;
6658 }
Douglas Katzman6871afc2016-03-15 22:34:02 +00006659 if (getTriple().getVendor() == llvm::Triple::Myriad) {
6660 switch (CPU) {
6661 case CK_MYRIAD2_1:
6662 Builder.defineMacro("__myriad2", "1");
6663 Builder.defineMacro("__myriad2__", "1");
6664 break;
6665 case CK_MYRIAD2_2:
6666 Builder.defineMacro("__myriad2", "2");
6667 Builder.defineMacro("__myriad2__", "2");
6668 break;
6669 default:
6670 break;
6671 }
6672 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006673 }
Chris Dewhurst69fa1922016-05-04 09:33:30 +00006674
6675 bool hasSjLjLowering() const override {
6676 return true;
6677 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006678};
6679
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006680// SPARCV8el is the 32-bit little-endian mode selected by Triple::sparcel.
6681class SparcV8elTargetInfo : public SparcV8TargetInfo {
6682 public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006683 SparcV8elTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6684 : SparcV8TargetInfo(Triple, Opts) {
6685 resetDataLayout("e-m:e-p:32:32-i64:64-f128:64-n32-S64");
6686 BigEndian = false;
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006687 }
6688};
6689
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006690// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
6691class SparcV9TargetInfo : public SparcTargetInfo {
6692public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006693 SparcV9TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6694 : SparcTargetInfo(Triple, Opts) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006695 // FIXME: Support Sparc quad-precision long double?
James Y Knightb214cbc2016-03-04 19:00:41 +00006696 resetDataLayout("E-m:e-i64:64-n32:64-S128");
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00006697 // This is an LP64 platform.
6698 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006699
6700 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00006701 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006702 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00006703 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006704 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006705 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00006706
6707 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
6708 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
6709 LongDoubleWidth = 128;
6710 LongDoubleAlign = 128;
6711 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00006712 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006713 }
6714
Craig Topper3164f332014-03-11 03:39:26 +00006715 void getTargetDefines(const LangOptions &Opts,
6716 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006717 SparcTargetInfo::getTargetDefines(Opts, Builder);
6718 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00006719 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00006720 // Solaris doesn't need these variants, but the BSDs do.
6721 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00006722 Builder.defineMacro("__sparc64__");
6723 Builder.defineMacro("__sparc_v9__");
6724 Builder.defineMacro("__sparcv9__");
6725 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006726 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00006727
Craig Topper3164f332014-03-11 03:39:26 +00006728 bool setCPU(const std::string &Name) override {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006729 if (!SparcTargetInfo::setCPU(Name))
6730 return false;
6731 return getCPUGeneration(CPU) == CG_V9;
Roman Divackyb1ae3d42014-02-25 18:35:30 +00006732 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006733};
6734
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006735class SystemZTargetInfo : public TargetInfo {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006736 static const Builtin::Info BuiltinInfo[];
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006737 static const char *const GCCRegNames[];
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006738 std::string CPU;
6739 bool HasTransactionalExecution;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006740 bool HasVector;
Ulrich Weigand47445072013-05-06 16:26:41 +00006741
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006742public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006743 SystemZTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Eric Christopherb093d692015-10-09 18:39:59 +00006744 : TargetInfo(Triple), CPU("z10"), HasTransactionalExecution(false),
6745 HasVector(false) {
Ulrich Weigand881497a2015-03-30 13:50:21 +00006746 IntMaxType = SignedLong;
6747 Int64Type = SignedLong;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006748 TLSSupported = true;
6749 IntWidth = IntAlign = 32;
6750 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
6751 PointerWidth = PointerAlign = 64;
6752 LongDoubleWidth = 128;
6753 LongDoubleAlign = 64;
6754 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Ulrich Weigandca3cb7f2015-04-21 17:29:35 +00006755 DefaultAlignForAttributeAligned = 64;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006756 MinGlobalAlign = 16;
James Y Knightb214cbc2016-03-04 19:00:41 +00006757 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 +00006758 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
6759 }
6760 void getTargetDefines(const LangOptions &Opts,
6761 MacroBuilder &Builder) const override {
6762 Builder.defineMacro("__s390__");
6763 Builder.defineMacro("__s390x__");
6764 Builder.defineMacro("__zarch__");
6765 Builder.defineMacro("__LONG_DOUBLE_128__");
Ulrich Weigandb038a522016-02-05 21:34:28 +00006766
6767 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
6768 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
6769 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
6770 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
6771
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006772 if (HasTransactionalExecution)
6773 Builder.defineMacro("__HTM__");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00006774 if (Opts.ZVector)
6775 Builder.defineMacro("__VEC__", "10301");
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006776 }
Craig Topper6c03a542015-10-19 04:51:35 +00006777 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6778 return llvm::makeArrayRef(BuiltinInfo,
6779 clang::SystemZ::LastTSBuiltin-Builtin::FirstTSBuiltin);
Ulrich Weigand47445072013-05-06 16:26:41 +00006780 }
6781
Craig Topperf054e3a2015-10-19 03:52:27 +00006782 ArrayRef<const char *> getGCCRegNames() const override;
6783 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006784 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00006785 return None;
Ulrich Weigand47445072013-05-06 16:26:41 +00006786 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006787 bool validateAsmConstraint(const char *&Name,
6788 TargetInfo::ConstraintInfo &info) const override;
6789 const char *getClobbers() const override {
6790 // FIXME: Is this really right?
6791 return "";
6792 }
6793 BuiltinVaListKind getBuiltinVaListKind() const override {
6794 return TargetInfo::SystemZBuiltinVaList;
6795 }
6796 bool setCPU(const std::string &Name) override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006797 CPU = Name;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006798 bool CPUKnown = llvm::StringSwitch<bool>(Name)
6799 .Case("z10", true)
6800 .Case("z196", true)
6801 .Case("zEC12", true)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006802 .Case("z13", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006803 .Default(false);
6804
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006805 return CPUKnown;
6806 }
Eric Christopher8c47b422015-10-09 18:39:55 +00006807 bool
6808 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6809 StringRef CPU,
6810 const std::vector<std::string> &FeaturesVec) const override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006811 if (CPU == "zEC12")
6812 Features["transactional-execution"] = true;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006813 if (CPU == "z13") {
6814 Features["transactional-execution"] = true;
6815 Features["vector"] = true;
6816 }
Eric Christopher007b0a02015-08-28 22:32:01 +00006817 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006818 }
6819
6820 bool handleTargetFeatures(std::vector<std::string> &Features,
6821 DiagnosticsEngine &Diags) override {
6822 HasTransactionalExecution = false;
Eric Christopher610fe112015-08-26 08:21:55 +00006823 for (const auto &Feature : Features) {
6824 if (Feature == "+transactional-execution")
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006825 HasTransactionalExecution = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006826 else if (Feature == "+vector")
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006827 HasVector = true;
6828 }
6829 // If we use the vector ABI, vector types are 64-bit aligned.
6830 if (HasVector) {
6831 MaxVectorAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00006832 resetDataLayout("E-m:e-i1:8:16-i8:8:16-i64:64-f128:64"
6833 "-v128:64-a:8:16-n32:64");
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006834 }
6835 return true;
6836 }
6837
6838 bool hasFeature(StringRef Feature) const override {
6839 return llvm::StringSwitch<bool>(Feature)
Ulrich Weigandcc673442015-04-01 14:15:35 +00006840 .Case("systemz", true)
6841 .Case("htm", HasTransactionalExecution)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006842 .Case("vx", HasVector)
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006843 .Default(false);
6844 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006845
Bryan Chane3f1ed52016-04-28 13:56:43 +00006846 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
6847 switch (CC) {
6848 case CC_C:
6849 case CC_Swift:
6850 return CCCR_OK;
6851 default:
6852 return CCCR_Warning;
6853 }
6854 }
6855
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006856 StringRef getABI() const override {
6857 if (HasVector)
6858 return "vector";
6859 return "";
6860 }
Ulrich Weigand47fd2532015-06-16 15:21:47 +00006861
6862 bool useFloat128ManglingForLongDouble() const override {
6863 return true;
6864 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006865};
6866
6867const Builtin::Info SystemZTargetInfo::BuiltinInfo[] = {
6868#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006869 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Jonas Paulsson3ace74a2016-03-30 15:51:24 +00006870#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
6871 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006872#include "clang/Basic/BuiltinsSystemZ.def"
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006873};
6874
6875const char *const SystemZTargetInfo::GCCRegNames[] = {
6876 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6877 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6878 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
6879 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
6880};
6881
Craig Topperf054e3a2015-10-19 03:52:27 +00006882ArrayRef<const char *> SystemZTargetInfo::getGCCRegNames() const {
6883 return llvm::makeArrayRef(GCCRegNames);
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006884}
6885
6886bool SystemZTargetInfo::
6887validateAsmConstraint(const char *&Name,
6888 TargetInfo::ConstraintInfo &Info) const {
6889 switch (*Name) {
6890 default:
6891 return false;
6892
6893 case 'a': // Address register
6894 case 'd': // Data register (equivalent to 'r')
6895 case 'f': // Floating-point register
6896 Info.setAllowsRegister();
6897 return true;
6898
6899 case 'I': // Unsigned 8-bit constant
6900 case 'J': // Unsigned 12-bit constant
6901 case 'K': // Signed 16-bit constant
6902 case 'L': // Signed 20-bit displacement (on all targets we support)
6903 case 'M': // 0x7fffffff
6904 return true;
6905
6906 case 'Q': // Memory with base and unsigned 12-bit displacement
6907 case 'R': // Likewise, plus an index
6908 case 'S': // Memory with base and signed 20-bit displacement
6909 case 'T': // Likewise, plus an index
6910 Info.setAllowsMemory();
6911 return true;
6912 }
6913}
Ulrich Weigand47445072013-05-06 16:26:41 +00006914
Eric Christopherc48497a2015-09-18 21:26:24 +00006915class MSP430TargetInfo : public TargetInfo {
6916 static const char *const GCCRegNames[];
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006917
Eric Christopherc48497a2015-09-18 21:26:24 +00006918public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006919 MSP430TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6920 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00006921 BigEndian = false;
6922 TLSSupported = false;
6923 IntWidth = 16;
6924 IntAlign = 16;
6925 LongWidth = 32;
6926 LongLongWidth = 64;
6927 LongAlign = LongLongAlign = 16;
6928 PointerWidth = 16;
6929 PointerAlign = 16;
6930 SuitableAlign = 16;
6931 SizeType = UnsignedInt;
6932 IntMaxType = SignedLongLong;
6933 IntPtrType = SignedInt;
6934 PtrDiffType = SignedInt;
6935 SigAtomicType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00006936 resetDataLayout("e-m:e-p:16:16-i32:16:32-a:16-n8:16");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006937 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006938 void getTargetDefines(const LangOptions &Opts,
6939 MacroBuilder &Builder) const override {
6940 Builder.defineMacro("MSP430");
6941 Builder.defineMacro("__MSP430__");
6942 // FIXME: defines for different 'flavours' of MCU
6943 }
Craig Topper6c03a542015-10-19 04:51:35 +00006944 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00006945 // FIXME: Implement.
Craig Topper6c03a542015-10-19 04:51:35 +00006946 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00006947 }
6948 bool hasFeature(StringRef Feature) const override {
6949 return Feature == "msp430";
6950 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006951 ArrayRef<const char *> getGCCRegNames() const override;
6952 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00006953 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00006954 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00006955 }
6956 bool validateAsmConstraint(const char *&Name,
6957 TargetInfo::ConstraintInfo &info) const override {
6958 // FIXME: implement
6959 switch (*Name) {
6960 case 'K': // the constant 1
6961 case 'L': // constant -1^20 .. 1^19
6962 case 'M': // constant 1-4:
Eli Friedmana9c3d712009-08-19 20:47:07 +00006963 return true;
6964 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006965 // No target constraints for now.
6966 return false;
6967 }
6968 const char *getClobbers() const override {
6969 // FIXME: Is this really right?
6970 return "";
6971 }
6972 BuiltinVaListKind getBuiltinVaListKind() const override {
6973 // FIXME: implement
6974 return TargetInfo::CharPtrBuiltinVaList;
6975 }
6976};
6977
6978const char *const MSP430TargetInfo::GCCRegNames[] = {
6979 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6980 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"};
6981
Craig Topperf054e3a2015-10-19 03:52:27 +00006982ArrayRef<const char *> MSP430TargetInfo::getGCCRegNames() const {
6983 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00006984}
6985
6986// LLVM and Clang cannot be used directly to output native binaries for
6987// target, but is used to compile C code to llvm bitcode with correct
6988// type and alignment information.
6989//
6990// TCE uses the llvm bitcode as input and uses it for generating customized
6991// target processor and program binary. TCE co-design environment is
6992// publicly available in http://tce.cs.tut.fi
6993
6994static const unsigned TCEOpenCLAddrSpaceMap[] = {
6995 3, // opencl_global
6996 4, // opencl_local
6997 5, // opencl_constant
6998 // FIXME: generic has to be added to the target
6999 0, // opencl_generic
7000 0, // cuda_device
7001 0, // cuda_constant
7002 0 // cuda_shared
7003};
7004
7005class TCETargetInfo : public TargetInfo {
7006public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007007 TCETargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7008 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007009 TLSSupported = false;
7010 IntWidth = 32;
7011 LongWidth = LongLongWidth = 32;
7012 PointerWidth = 32;
7013 IntAlign = 32;
7014 LongAlign = LongLongAlign = 32;
7015 PointerAlign = 32;
7016 SuitableAlign = 32;
7017 SizeType = UnsignedInt;
7018 IntMaxType = SignedLong;
7019 IntPtrType = SignedInt;
7020 PtrDiffType = SignedInt;
7021 FloatWidth = 32;
7022 FloatAlign = 32;
7023 DoubleWidth = 32;
7024 DoubleAlign = 32;
7025 LongDoubleWidth = 32;
7026 LongDoubleAlign = 32;
7027 FloatFormat = &llvm::APFloat::IEEEsingle;
7028 DoubleFormat = &llvm::APFloat::IEEEsingle;
7029 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
James Y Knightb214cbc2016-03-04 19:00:41 +00007030 resetDataLayout("E-p:32:32-i8:8:32-i16:16:32-i64:32"
7031 "-f64:32-v64:32-v128:32-a:0:32-n32");
Eric Christopherc48497a2015-09-18 21:26:24 +00007032 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
7033 UseAddrSpaceMapMangling = true;
7034 }
7035
7036 void getTargetDefines(const LangOptions &Opts,
7037 MacroBuilder &Builder) const override {
7038 DefineStd(Builder, "tce", Opts);
7039 Builder.defineMacro("__TCE__");
7040 Builder.defineMacro("__TCE_V1__");
7041 }
7042 bool hasFeature(StringRef Feature) const override { return Feature == "tce"; }
7043
Craig Topper6c03a542015-10-19 04:51:35 +00007044 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007045 const char *getClobbers() const override { return ""; }
7046 BuiltinVaListKind getBuiltinVaListKind() const override {
7047 return TargetInfo::VoidPtrBuiltinVaList;
7048 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007049 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007050 bool validateAsmConstraint(const char *&Name,
7051 TargetInfo::ConstraintInfo &info) const override {
7052 return true;
7053 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007054 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7055 return None;
7056 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007057};
Eli Friedmana9c3d712009-08-19 20:47:07 +00007058
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007059class BPFTargetInfo : public TargetInfo {
7060public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007061 BPFTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7062 : TargetInfo(Triple) {
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007063 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
7064 SizeType = UnsignedLong;
7065 PtrDiffType = SignedLong;
7066 IntPtrType = SignedLong;
7067 IntMaxType = SignedLong;
7068 Int64Type = SignedLong;
7069 RegParmMax = 5;
7070 if (Triple.getArch() == llvm::Triple::bpfeb) {
7071 BigEndian = true;
James Y Knightb214cbc2016-03-04 19:00:41 +00007072 resetDataLayout("E-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007073 } else {
7074 BigEndian = false;
James Y Knightb214cbc2016-03-04 19:00:41 +00007075 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007076 }
7077 MaxAtomicPromoteWidth = 64;
7078 MaxAtomicInlineWidth = 64;
7079 TLSSupported = false;
7080 }
7081 void getTargetDefines(const LangOptions &Opts,
7082 MacroBuilder &Builder) const override {
7083 DefineStd(Builder, "bpf", Opts);
7084 Builder.defineMacro("__BPF__");
7085 }
7086 bool hasFeature(StringRef Feature) const override {
7087 return Feature == "bpf";
7088 }
7089
Craig Topper6c03a542015-10-19 04:51:35 +00007090 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007091 const char *getClobbers() const override {
7092 return "";
7093 }
7094 BuiltinVaListKind getBuiltinVaListKind() const override {
7095 return TargetInfo::VoidPtrBuiltinVaList;
7096 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007097 ArrayRef<const char *> getGCCRegNames() const override {
7098 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007099 }
7100 bool validateAsmConstraint(const char *&Name,
7101 TargetInfo::ConstraintInfo &info) const override {
7102 return true;
7103 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007104 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7105 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007106 }
7107};
7108
Daniel Sanders4672af62016-05-27 11:51:02 +00007109class MipsTargetInfo : public TargetInfo {
7110 void setDataLayout() {
Daniel Sanders55e40692016-06-03 10:11:01 +00007111 StringRef Layout;
7112
7113 if (ABI == "o32")
7114 Layout = "m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
7115 else if (ABI == "n32")
7116 Layout = "m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32:64-S128";
7117 else if (ABI == "n64")
7118 Layout = "m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
7119 else
7120 llvm_unreachable("Invalid ABI");
7121
7122 if (BigEndian)
7123 resetDataLayout(("E-" + Layout).str());
7124 else
7125 resetDataLayout(("e-" + Layout).str());
Daniel Sanders4672af62016-05-27 11:51:02 +00007126 }
7127
Akira Hatanaka9064e362013-10-29 18:30:33 +00007128
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00007129 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007130 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00007131 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00007132 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007133 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00007134 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007135 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00007136 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007137 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007138 enum DspRevEnum {
7139 NoDSP, DSP1, DSP2
7140 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00007141 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007142
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007143protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00007144 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007145 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007146
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007147public:
Daniel Sanders4672af62016-05-27 11:51:02 +00007148 MipsTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007149 : TargetInfo(Triple), IsMips16(false), IsMicromips(false),
7150 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
7151 DspRev(NoDSP), HasMSA(false), HasFP64(false) {
Zoran Jovanovic26a12162015-02-18 15:21:35 +00007152 TheCXXABI.set(TargetCXXABI::GenericMIPS);
Daniel Sanders4672af62016-05-27 11:51:02 +00007153 BigEndian = getTriple().getArch() == llvm::Triple::mips ||
7154 getTriple().getArch() == llvm::Triple::mips64;
7155
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007156 setABI((getTriple().getArch() == llvm::Triple::mips ||
7157 getTriple().getArch() == llvm::Triple::mipsel)
7158 ? "o32"
7159 : "n64");
7160
7161 CPU = ABI == "o32" ? "mips32r2" : "mips64r2";
Zoran Jovanovic26a12162015-02-18 15:21:35 +00007162 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007163
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007164 bool isNaN2008Default() const {
7165 return CPU == "mips32r6" || CPU == "mips64r6";
7166 }
7167
7168 bool isFP64Default() const {
7169 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
7170 }
7171
Petar Jovanovicd55ae6b2015-02-26 18:19:22 +00007172 bool isNan2008() const override {
7173 return IsNan2008;
7174 }
7175
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007176 bool processorSupportsGPR64() const {
7177 return llvm::StringSwitch<bool>(CPU)
7178 .Case("mips3", true)
7179 .Case("mips4", true)
7180 .Case("mips5", true)
7181 .Case("mips64", true)
7182 .Case("mips64r2", true)
7183 .Case("mips64r3", true)
7184 .Case("mips64r5", true)
7185 .Case("mips64r6", true)
7186 .Case("octeon", true)
7187 .Default(false);
7188 return false;
7189 }
7190
Alp Toker4925ba72014-06-07 23:30:42 +00007191 StringRef getABI() const override { return ABI; }
Daniel Sanders4672af62016-05-27 11:51:02 +00007192 bool setABI(const std::string &Name) override {
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007193 if (Name == "o32") {
7194 setO32ABITypes();
7195 ABI = Name;
7196 return true;
Daniel Sanders4672af62016-05-27 11:51:02 +00007197 }
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007198
7199 if (Name == "n32") {
7200 setN32ABITypes();
7201 ABI = Name;
7202 return true;
7203 }
7204 if (Name == "n64") {
7205 setN64ABITypes();
7206 ABI = Name;
7207 return true;
Daniel Sanders4672af62016-05-27 11:51:02 +00007208 }
7209 return false;
7210 }
7211
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007212 void setO32ABITypes() {
7213 Int64Type = SignedLongLong;
7214 IntMaxType = Int64Type;
7215 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
7216 LongDoubleWidth = LongDoubleAlign = 64;
7217 LongWidth = LongAlign = 32;
7218 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
7219 PointerWidth = PointerAlign = 32;
7220 PtrDiffType = SignedInt;
7221 SizeType = UnsignedInt;
7222 SuitableAlign = 64;
7223 }
7224
7225 void setN32N64ABITypes() {
7226 LongDoubleWidth = LongDoubleAlign = 128;
7227 LongDoubleFormat = &llvm::APFloat::IEEEquad;
7228 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
7229 LongDoubleWidth = LongDoubleAlign = 64;
7230 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
7231 }
7232 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
7233 SuitableAlign = 128;
7234 }
7235
Daniel Sanders4672af62016-05-27 11:51:02 +00007236 void setN64ABITypes() {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007237 setN32N64ABITypes();
Daniel Sanders4672af62016-05-27 11:51:02 +00007238 Int64Type = SignedLong;
7239 IntMaxType = Int64Type;
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007240 LongWidth = LongAlign = 64;
7241 PointerWidth = PointerAlign = 64;
7242 PtrDiffType = SignedLong;
7243 SizeType = UnsignedLong;
Daniel Sanders4672af62016-05-27 11:51:02 +00007244 }
7245
7246 void setN32ABITypes() {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007247 setN32N64ABITypes();
Daniel Sanders4672af62016-05-27 11:51:02 +00007248 Int64Type = SignedLongLong;
7249 IntMaxType = Int64Type;
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007250 LongWidth = LongAlign = 32;
7251 PointerWidth = PointerAlign = 32;
7252 PtrDiffType = SignedInt;
7253 SizeType = UnsignedInt;
Daniel Sanders4672af62016-05-27 11:51:02 +00007254 }
7255
Craig Topper3164f332014-03-11 03:39:26 +00007256 bool setCPU(const std::string &Name) override {
Eric Christopher0b26a612010-03-02 02:41:08 +00007257 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007258 return llvm::StringSwitch<bool>(Name)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007259 .Case("mips1", true)
7260 .Case("mips2", true)
Simon Atanasyan26610c52014-07-04 12:36:56 +00007261 .Case("mips3", true)
7262 .Case("mips4", true)
7263 .Case("mips5", true)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007264 .Case("mips32", true)
7265 .Case("mips32r2", true)
7266 .Case("mips32r3", true)
7267 .Case("mips32r5", true)
7268 .Case("mips32r6", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007269 .Case("mips64", true)
7270 .Case("mips64r2", true)
Simon Atanasyan162feb52015-02-20 23:37:40 +00007271 .Case("mips64r3", true)
7272 .Case("mips64r5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007273 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00007274 .Case("octeon", true)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007275 .Case("p5600", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007276 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00007277 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00007278 const std::string& getCPU() const { return CPU; }
Eric Christopher8c47b422015-10-09 18:39:55 +00007279 bool
7280 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7281 StringRef CPU,
7282 const std::vector<std::string> &FeaturesVec) const override {
Bhushan D. Attardebacb988732016-03-04 06:56:29 +00007283 if (CPU.empty())
7284 CPU = getCPU();
Simon Atanasyan4e16a422014-07-04 12:37:04 +00007285 if (CPU == "octeon")
7286 Features["mips64r2"] = Features["cnmips"] = true;
7287 else
7288 Features[CPU] = true;
Eric Christopher007b0a02015-08-28 22:32:01 +00007289 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Eric Christopher0b26a612010-03-02 02:41:08 +00007290 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007291
Craig Topper3164f332014-03-11 03:39:26 +00007292 void getTargetDefines(const LangOptions &Opts,
7293 MacroBuilder &Builder) const override {
Daniel Sanders4672af62016-05-27 11:51:02 +00007294 if (BigEndian) {
7295 DefineStd(Builder, "MIPSEB", Opts);
7296 Builder.defineMacro("_MIPSEB");
7297 } else {
7298 DefineStd(Builder, "MIPSEL", Opts);
7299 Builder.defineMacro("_MIPSEL");
7300 }
7301
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007302 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00007303 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007304 if (Opts.GNUMode)
7305 Builder.defineMacro("mips");
7306
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007307 if (ABI == "o32") {
Daniel Sanders4672af62016-05-27 11:51:02 +00007308 Builder.defineMacro("__mips", "32");
7309 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
7310 } else {
7311 Builder.defineMacro("__mips", "64");
7312 Builder.defineMacro("__mips64");
7313 Builder.defineMacro("__mips64__");
7314 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
7315 }
7316
7317 const std::string ISARev = llvm::StringSwitch<std::string>(getCPU())
7318 .Cases("mips32", "mips64", "1")
7319 .Cases("mips32r2", "mips64r2", "2")
7320 .Cases("mips32r3", "mips64r3", "3")
7321 .Cases("mips32r5", "mips64r5", "5")
7322 .Cases("mips32r6", "mips64r6", "6")
7323 .Default("");
7324 if (!ISARev.empty())
7325 Builder.defineMacro("__mips_isa_rev", ISARev);
7326
7327 if (ABI == "o32") {
7328 Builder.defineMacro("__mips_o32");
7329 Builder.defineMacro("_ABIO32", "1");
7330 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
Daniel Sanders07c86542016-05-27 14:30:23 +00007331 } else if (ABI == "n32") {
Daniel Sanders4672af62016-05-27 11:51:02 +00007332 Builder.defineMacro("__mips_n32");
7333 Builder.defineMacro("_ABIN32", "2");
7334 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
7335 } else if (ABI == "n64") {
7336 Builder.defineMacro("__mips_n64");
7337 Builder.defineMacro("_ABI64", "3");
7338 Builder.defineMacro("_MIPS_SIM", "_ABI64");
7339 } else
7340 llvm_unreachable("Invalid ABI.");
7341
Simon Atanasyan683535b2012-08-29 19:14:58 +00007342 Builder.defineMacro("__REGISTER_PREFIX__", "");
7343
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007344 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007345 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00007346 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007347 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007348 case SoftFloat:
7349 Builder.defineMacro("__mips_soft_float", Twine(1));
7350 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00007351 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00007352
Simon Atanasyan16071912013-04-14 14:07:30 +00007353 if (IsSingleFloat)
7354 Builder.defineMacro("__mips_single_float", Twine(1));
7355
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007356 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
7357 Builder.defineMacro("_MIPS_FPSET",
7358 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
7359
Simon Atanasyan72244b62012-07-05 16:06:06 +00007360 if (IsMips16)
7361 Builder.defineMacro("__mips16", Twine(1));
7362
Simon Atanasyan60777612013-04-14 14:07:51 +00007363 if (IsMicromips)
7364 Builder.defineMacro("__mips_micromips", Twine(1));
7365
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007366 if (IsNan2008)
7367 Builder.defineMacro("__mips_nan2008", Twine(1));
7368
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007369 switch (DspRev) {
7370 default:
7371 break;
7372 case DSP1:
7373 Builder.defineMacro("__mips_dsp_rev", Twine(1));
7374 Builder.defineMacro("__mips_dsp", Twine(1));
7375 break;
7376 case DSP2:
7377 Builder.defineMacro("__mips_dsp_rev", Twine(2));
7378 Builder.defineMacro("__mips_dspr2", Twine(1));
7379 Builder.defineMacro("__mips_dsp", Twine(1));
7380 break;
7381 }
7382
Jack Carter44ff1e52013-08-12 17:20:29 +00007383 if (HasMSA)
7384 Builder.defineMacro("__mips_msa", Twine(1));
7385
Simon Atanasyan26f19672012-04-05 19:28:31 +00007386 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
7387 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
7388 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00007389
7390 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
7391 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Daniel Sanders5176f7e2015-12-22 12:59:30 +00007392
7393 // These shouldn't be defined for MIPS-I but there's no need to check
7394 // for that since MIPS-I isn't supported.
7395 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
7396 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
7397 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007398
7399 // 32-bit MIPS processors don't have the necessary lld/scd instructions
7400 // found in 64-bit processors. In the case of O32 on a 64-bit processor,
7401 // the instructions exist but using them violates the ABI since they
7402 // require 64-bit GPRs and O32 only supports 32-bit GPRs.
7403 if (ABI == "n32" || ABI == "n64")
Daniel Sanders4672af62016-05-27 11:51:02 +00007404 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007405 }
7406
Craig Topper6c03a542015-10-19 04:51:35 +00007407 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7408 return llvm::makeArrayRef(BuiltinInfo,
7409 clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin);
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007410 }
Craig Topper3164f332014-03-11 03:39:26 +00007411 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00007412 return llvm::StringSwitch<bool>(Feature)
7413 .Case("mips", true)
7414 .Case("fp64", HasFP64)
7415 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00007416 }
Craig Topper3164f332014-03-11 03:39:26 +00007417 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00007418 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007419 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007420 ArrayRef<const char *> getGCCRegNames() const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00007421 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00007422 // CPU register names
7423 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007424 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
7425 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
7426 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00007427 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
7428 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007429 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
7430 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
7431 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
7432 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00007433 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007434 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Hrvoje Varga14c42ee2016-03-29 12:46:16 +00007435 "$fcc5","$fcc6","$fcc7","$ac1hi","$ac1lo","$ac2hi","$ac2lo",
7436 "$ac3hi","$ac3lo",
Daniel Sanders8b59af12013-11-12 12:56:01 +00007437 // MSA register names
7438 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
7439 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
7440 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
7441 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
7442 // MSA control register names
7443 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
7444 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007445 };
Craig Topperf054e3a2015-10-19 03:52:27 +00007446 return llvm::makeArrayRef(GCCRegNames);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007447 }
Craig Topper3164f332014-03-11 03:39:26 +00007448 bool validateAsmConstraint(const char *&Name,
7449 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007450 switch (*Name) {
7451 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00007452 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007453 case 'r': // CPU registers.
7454 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00007455 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007456 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00007457 case 'c': // $25 for indirect jumps
7458 case 'l': // lo register
7459 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007460 Info.setAllowsRegister();
7461 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00007462 case 'I': // Signed 16-bit constant
7463 case 'J': // Integer 0
7464 case 'K': // Unsigned 16-bit constant
7465 case 'L': // Signed 32-bit constant, lower 16-bit zeros (for lui)
7466 case 'M': // Constants not loadable via lui, addiu, or ori
7467 case 'N': // Constant -1 to -65535
7468 case 'O': // A signed 15-bit constant
7469 case 'P': // A constant between 1 go 65535
7470 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00007471 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00007472 Info.setAllowsMemory();
7473 return true;
Daniel Sanders48fa39e2015-03-30 13:47:23 +00007474 case 'Z':
7475 if (Name[1] == 'C') { // An address usable by ll, and sc.
7476 Info.setAllowsMemory();
7477 Name++; // Skip over 'Z'.
7478 return true;
7479 }
7480 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007481 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007482 }
7483
Daniel Sanders48fa39e2015-03-30 13:47:23 +00007484 std::string convertConstraint(const char *&Constraint) const override {
7485 std::string R;
7486 switch (*Constraint) {
7487 case 'Z': // Two-character constraint; add "^" hint for later parsing.
7488 if (Constraint[1] == 'C') {
7489 R = std::string("^") + std::string(Constraint, 2);
7490 Constraint++;
7491 return R;
7492 }
7493 break;
7494 }
7495 return TargetInfo::convertConstraint(Constraint);
7496 }
7497
Craig Topper3164f332014-03-11 03:39:26 +00007498 const char *getClobbers() const override {
Toma Tabacucfab40f2015-01-12 14:41:30 +00007499 // In GCC, $1 is not widely used in generated code (it's used only in a few
7500 // specific situations), so there is no real need for users to add it to
7501 // the clobbers list if they want to use it in their inline assembly code.
7502 //
7503 // In LLVM, $1 is treated as a normal GPR and is always allocatable during
7504 // code generation, so using it in inline assembly without adding it to the
7505 // clobbers list can cause conflicts between the inline assembly code and
7506 // the surrounding generated code.
7507 //
7508 // Another problem is that LLVM is allowed to choose $1 for inline assembly
7509 // operands, which will conflict with the ".set at" assembler option (which
7510 // we use only for inline assembly, in order to maintain compatibility with
7511 // GCC) and will also conflict with the user's usage of $1.
7512 //
7513 // The easiest way to avoid these conflicts and keep $1 as an allocatable
7514 // register for generated code is to automatically clobber $1 for all inline
7515 // assembly code.
7516 //
7517 // FIXME: We should automatically clobber $1 only for inline assembly code
7518 // which actually uses it. This would allow LLVM to use $1 for inline
7519 // assembly operands if the user's assembly code doesn't use it.
Toma Tabacu99411952014-12-17 12:02:58 +00007520 return "~{$1}";
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007521 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007522
Craig Topper3164f332014-03-11 03:39:26 +00007523 bool handleTargetFeatures(std::vector<std::string> &Features,
7524 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00007525 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00007526 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007527 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00007528 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007529 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007530 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007531 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007532
Eric Christopher610fe112015-08-26 08:21:55 +00007533 for (const auto &Feature : Features) {
7534 if (Feature == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00007535 IsSingleFloat = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007536 else if (Feature == "+soft-float")
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007537 FloatABI = SoftFloat;
Eric Christopher610fe112015-08-26 08:21:55 +00007538 else if (Feature == "+mips16")
Simon Atanasyan72244b62012-07-05 16:06:06 +00007539 IsMips16 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007540 else if (Feature == "+micromips")
Simon Atanasyan60777612013-04-14 14:07:51 +00007541 IsMicromips = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007542 else if (Feature == "+dsp")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007543 DspRev = std::max(DspRev, DSP1);
Eric Christopher610fe112015-08-26 08:21:55 +00007544 else if (Feature == "+dspr2")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007545 DspRev = std::max(DspRev, DSP2);
Eric Christopher610fe112015-08-26 08:21:55 +00007546 else if (Feature == "+msa")
Jack Carter44ff1e52013-08-12 17:20:29 +00007547 HasMSA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007548 else if (Feature == "+fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007549 HasFP64 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007550 else if (Feature == "-fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007551 HasFP64 = false;
Eric Christopher610fe112015-08-26 08:21:55 +00007552 else if (Feature == "+nan2008")
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007553 IsNan2008 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007554 else if (Feature == "-nan2008")
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007555 IsNan2008 = false;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007556 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007557
James Y Knightb214cbc2016-03-04 19:00:41 +00007558 setDataLayout();
Akira Hatanaka9064e362013-10-29 18:30:33 +00007559
Rafael Espindolaeb265472013-08-21 21:59:03 +00007560 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007561 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00007562
Craig Topper3164f332014-03-11 03:39:26 +00007563 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00007564 if (RegNo == 0) return 4;
7565 if (RegNo == 1) return 5;
7566 return -1;
7567 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00007568
7569 bool isCLZForZeroUndef() const override { return false; }
Daniel Sanders4672af62016-05-27 11:51:02 +00007570
7571 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7572 static const TargetInfo::GCCRegAlias O32RegAliases[] = {
7573 {{"at"}, "$1"}, {{"v0"}, "$2"}, {{"v1"}, "$3"},
7574 {{"a0"}, "$4"}, {{"a1"}, "$5"}, {{"a2"}, "$6"},
7575 {{"a3"}, "$7"}, {{"t0"}, "$8"}, {{"t1"}, "$9"},
7576 {{"t2"}, "$10"}, {{"t3"}, "$11"}, {{"t4"}, "$12"},
7577 {{"t5"}, "$13"}, {{"t6"}, "$14"}, {{"t7"}, "$15"},
7578 {{"s0"}, "$16"}, {{"s1"}, "$17"}, {{"s2"}, "$18"},
7579 {{"s3"}, "$19"}, {{"s4"}, "$20"}, {{"s5"}, "$21"},
7580 {{"s6"}, "$22"}, {{"s7"}, "$23"}, {{"t8"}, "$24"},
7581 {{"t9"}, "$25"}, {{"k0"}, "$26"}, {{"k1"}, "$27"},
7582 {{"gp"}, "$28"}, {{"sp", "$sp"}, "$29"}, {{"fp", "$fp"}, "$30"},
7583 {{"ra"}, "$31"}};
7584 static const TargetInfo::GCCRegAlias NewABIRegAliases[] = {
7585 {{"at"}, "$1"}, {{"v0"}, "$2"}, {{"v1"}, "$3"},
7586 {{"a0"}, "$4"}, {{"a1"}, "$5"}, {{"a2"}, "$6"},
7587 {{"a3"}, "$7"}, {{"a4"}, "$8"}, {{"a5"}, "$9"},
7588 {{"a6"}, "$10"}, {{"a7"}, "$11"}, {{"t0"}, "$12"},
7589 {{"t1"}, "$13"}, {{"t2"}, "$14"}, {{"t3"}, "$15"},
7590 {{"s0"}, "$16"}, {{"s1"}, "$17"}, {{"s2"}, "$18"},
7591 {{"s3"}, "$19"}, {{"s4"}, "$20"}, {{"s5"}, "$21"},
7592 {{"s6"}, "$22"}, {{"s7"}, "$23"}, {{"t8"}, "$24"},
7593 {{"t9"}, "$25"}, {{"k0"}, "$26"}, {{"k1"}, "$27"},
7594 {{"gp"}, "$28"}, {{"sp", "$sp"}, "$29"}, {{"fp", "$fp"}, "$30"},
7595 {{"ra"}, "$31"}};
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007596 if (ABI == "o32")
Daniel Sanders4672af62016-05-27 11:51:02 +00007597 return llvm::makeArrayRef(O32RegAliases);
7598 return llvm::makeArrayRef(NewABIRegAliases);
7599 }
7600
7601 bool hasInt128Type() const override {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007602 return ABI == "n32" || ABI == "n64";
Daniel Sanders4672af62016-05-27 11:51:02 +00007603 }
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007604
7605 bool validateTarget(DiagnosticsEngine &Diags) const override {
7606 // FIXME: It's valid to use O32 on a 64-bit CPU but the backend can't handle
7607 // this yet. It's better to fail here than on the backend assertion.
7608 if (processorSupportsGPR64() && ABI == "o32") {
7609 Diags.Report(diag::err_target_unsupported_abi) << ABI << CPU;
7610 return false;
7611 }
7612
7613 // 64-bit ABI's require 64-bit CPU's.
7614 if (!processorSupportsGPR64() && (ABI == "n32" || ABI == "n64")) {
7615 Diags.Report(diag::err_target_unsupported_abi) << ABI << CPU;
7616 return false;
7617 }
7618
7619 // FIXME: It's valid to use O32 on a mips64/mips64el triple but the backend
7620 // can't handle this yet. It's better to fail here than on the
7621 // backend assertion.
7622 if ((getTriple().getArch() == llvm::Triple::mips64 ||
7623 getTriple().getArch() == llvm::Triple::mips64el) &&
7624 ABI == "o32") {
7625 Diags.Report(diag::err_target_unsupported_abi_for_triple)
7626 << ABI << getTriple().str();
7627 return false;
7628 }
7629
7630 // FIXME: It's valid to use N32/N64 on a mips/mipsel triple but the backend
7631 // can't handle this yet. It's better to fail here than on the
7632 // backend assertion.
7633 if ((getTriple().getArch() == llvm::Triple::mips ||
7634 getTriple().getArch() == llvm::Triple::mipsel) &&
7635 (ABI == "n32" || ABI == "n64")) {
7636 Diags.Report(diag::err_target_unsupported_abi_for_triple)
7637 << ABI << getTriple().str();
7638 return false;
7639 }
7640
7641 return true;
7642 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007643};
7644
Daniel Sanders4672af62016-05-27 11:51:02 +00007645const Builtin::Info MipsTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00007646#define BUILTIN(ID, TYPE, ATTRS) \
7647 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7648#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7649 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00007650#include "clang/Basic/BuiltinsMips.def"
7651};
7652
Ivan Krasindd7403e2011-08-24 20:22:22 +00007653class PNaClTargetInfo : public TargetInfo {
7654public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007655 PNaClTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7656 : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00007657 BigEndian = false;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007658 this->LongAlign = 32;
7659 this->LongWidth = 32;
7660 this->PointerAlign = 32;
7661 this->PointerWidth = 32;
7662 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007663 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00007664 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00007665 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00007666 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00007667 this->SizeType = TargetInfo::UnsignedInt;
7668 this->PtrDiffType = TargetInfo::SignedInt;
7669 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00007670 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00007671 }
7672
Craig Toppere6f17d02014-03-11 04:07:52 +00007673 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007674 Builder.defineMacro("__le32__");
7675 Builder.defineMacro("__pnacl__");
7676 }
Craig Topper3164f332014-03-11 03:39:26 +00007677 void getTargetDefines(const LangOptions &Opts,
7678 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007679 getArchDefines(Opts, Builder);
7680 }
Craig Topper3164f332014-03-11 03:39:26 +00007681 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00007682 return Feature == "pnacl";
7683 }
Craig Topper6c03a542015-10-19 04:51:35 +00007684 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Craig Topper3164f332014-03-11 03:39:26 +00007685 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00007686 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007687 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007688 ArrayRef<const char *> getGCCRegNames() const override;
7689 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00007690 bool validateAsmConstraint(const char *&Name,
7691 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007692 return false;
7693 }
7694
Craig Topper3164f332014-03-11 03:39:26 +00007695 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007696 return "";
7697 }
7698};
7699
Craig Topperf054e3a2015-10-19 03:52:27 +00007700ArrayRef<const char *> PNaClTargetInfo::getGCCRegNames() const {
7701 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007702}
7703
Craig Topperf054e3a2015-10-19 03:52:27 +00007704ArrayRef<TargetInfo::GCCRegAlias> PNaClTargetInfo::getGCCRegAliases() const {
7705 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007706}
Ivan Krasindd7403e2011-08-24 20:22:22 +00007707
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007708// We attempt to use PNaCl (le32) frontend and Mips32EL backend.
Daniel Sanders4672af62016-05-27 11:51:02 +00007709class NaClMips32TargetInfo : public MipsTargetInfo {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007710public:
Daniel Sanders4672af62016-05-27 11:51:02 +00007711 NaClMips32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7712 : MipsTargetInfo(Triple, Opts) {}
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007713
7714 BuiltinVaListKind getBuiltinVaListKind() const override {
7715 return TargetInfo::PNaClABIBuiltinVaList;
7716 }
7717};
7718
JF Bastien643817d2014-09-12 17:52:47 +00007719class Le64TargetInfo : public TargetInfo {
7720 static const Builtin::Info BuiltinInfo[];
7721
7722public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007723 Le64TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7724 : TargetInfo(Triple) {
JF Bastien643817d2014-09-12 17:52:47 +00007725 BigEndian = false;
7726 NoAsmVariants = true;
7727 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
7728 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00007729 resetDataLayout("e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128");
JF Bastien643817d2014-09-12 17:52:47 +00007730 }
7731
7732 void getTargetDefines(const LangOptions &Opts,
7733 MacroBuilder &Builder) const override {
7734 DefineStd(Builder, "unix", Opts);
7735 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
7736 Builder.defineMacro("__ELF__");
7737 }
Craig Topper6c03a542015-10-19 04:51:35 +00007738 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7739 return llvm::makeArrayRef(BuiltinInfo,
7740 clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin);
JF Bastien643817d2014-09-12 17:52:47 +00007741 }
7742 BuiltinVaListKind getBuiltinVaListKind() const override {
7743 return TargetInfo::PNaClABIBuiltinVaList;
7744 }
7745 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00007746 ArrayRef<const char *> getGCCRegNames() const override {
7747 return None;
JF Bastien643817d2014-09-12 17:52:47 +00007748 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007749 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7750 return None;
JF Bastien643817d2014-09-12 17:52:47 +00007751 }
7752 bool validateAsmConstraint(const char *&Name,
7753 TargetInfo::ConstraintInfo &Info) const override {
7754 return false;
7755 }
7756
7757 bool hasProtectedVisibility() const override { return false; }
JF Bastien643817d2014-09-12 17:52:47 +00007758};
Dan Gohmanc2853072015-09-03 22:51:53 +00007759
7760class WebAssemblyTargetInfo : public TargetInfo {
7761 static const Builtin::Info BuiltinInfo[];
7762
7763 enum SIMDEnum {
7764 NoSIMD,
7765 SIMD128,
7766 } SIMDLevel;
7767
7768public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007769 explicit WebAssemblyTargetInfo(const llvm::Triple &T, const TargetOptions &)
Dan Gohmanc2853072015-09-03 22:51:53 +00007770 : TargetInfo(T), SIMDLevel(NoSIMD) {
7771 BigEndian = false;
7772 NoAsmVariants = true;
7773 SuitableAlign = 128;
7774 LargeArrayMinWidth = 128;
7775 LargeArrayAlign = 128;
7776 SimdDefaultAlign = 128;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007777 SigAtomicType = SignedLong;
Dan Gohman6db46402015-11-10 21:01:46 +00007778 LongDoubleWidth = LongDoubleAlign = 128;
7779 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Dan Gohmanc2853072015-09-03 22:51:53 +00007780 }
7781
7782protected:
7783 void getTargetDefines(const LangOptions &Opts,
7784 MacroBuilder &Builder) const override {
7785 defineCPUMacros(Builder, "wasm", /*Tuning=*/false);
7786 if (SIMDLevel >= SIMD128)
7787 Builder.defineMacro("__wasm_simd128__");
7788 }
7789
7790private:
Eric Christopher8c47b422015-10-09 18:39:55 +00007791 bool
7792 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7793 StringRef CPU,
7794 const std::vector<std::string> &FeaturesVec) const override {
Dan Gohmanc2853072015-09-03 22:51:53 +00007795 if (CPU == "bleeding-edge")
7796 Features["simd128"] = true;
7797 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
7798 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007799 bool hasFeature(StringRef Feature) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007800 return llvm::StringSwitch<bool>(Feature)
7801 .Case("simd128", SIMDLevel >= SIMD128)
7802 .Default(false);
7803 }
7804 bool handleTargetFeatures(std::vector<std::string> &Features,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007805 DiagnosticsEngine &Diags) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007806 for (const auto &Feature : Features) {
7807 if (Feature == "+simd128") {
7808 SIMDLevel = std::max(SIMDLevel, SIMD128);
7809 continue;
7810 }
7811 if (Feature == "-simd128") {
7812 SIMDLevel = std::min(SIMDLevel, SIMDEnum(SIMD128 - 1));
7813 continue;
7814 }
7815
7816 Diags.Report(diag::err_opt_not_valid_with_opt) << Feature
7817 << "-target-feature";
7818 return false;
7819 }
7820 return true;
7821 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007822 bool setCPU(const std::string &Name) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007823 return llvm::StringSwitch<bool>(Name)
7824 .Case("mvp", true)
7825 .Case("bleeding-edge", true)
7826 .Case("generic", true)
7827 .Default(false);
7828 }
Craig Topper6c03a542015-10-19 04:51:35 +00007829 ArrayRef<Builtin::Info> getTargetBuiltins() const final {
7830 return llvm::makeArrayRef(BuiltinInfo,
7831 clang::WebAssembly::LastTSBuiltin - Builtin::FirstTSBuiltin);
Dan Gohmanc2853072015-09-03 22:51:53 +00007832 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007833 BuiltinVaListKind getBuiltinVaListKind() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007834 return VoidPtrBuiltinVaList;
7835 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007836 ArrayRef<const char *> getGCCRegNames() const final {
7837 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00007838 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007839 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const final {
7840 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00007841 }
7842 bool
7843 validateAsmConstraint(const char *&Name,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007844 TargetInfo::ConstraintInfo &Info) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007845 return false;
7846 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007847 const char *getClobbers() const final { return ""; }
7848 bool isCLZForZeroUndef() const final { return false; }
7849 bool hasInt128Type() const final { return true; }
Dan Gohmanab0e31f2015-09-14 21:49:41 +00007850 IntType getIntTypeByWidth(unsigned BitWidth,
7851 bool IsSigned) const final {
7852 // WebAssembly prefers long long for explicitly 64-bit integers.
7853 return BitWidth == 64 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
7854 : TargetInfo::getIntTypeByWidth(BitWidth, IsSigned);
7855 }
7856 IntType getLeastIntTypeByWidth(unsigned BitWidth,
7857 bool IsSigned) const final {
7858 // WebAssembly uses long long for int_least64_t and int_fast64_t.
7859 return BitWidth == 64
7860 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
7861 : TargetInfo::getLeastIntTypeByWidth(BitWidth, IsSigned);
7862 }
Dan Gohmanc2853072015-09-03 22:51:53 +00007863};
7864
7865const Builtin::Info WebAssemblyTargetInfo::BuiltinInfo[] = {
7866#define BUILTIN(ID, TYPE, ATTRS) \
7867 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7868#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7869 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
7870#include "clang/Basic/BuiltinsWebAssembly.def"
7871};
7872
7873class WebAssembly32TargetInfo : public WebAssemblyTargetInfo {
7874public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007875 explicit WebAssembly32TargetInfo(const llvm::Triple &T,
7876 const TargetOptions &Opts)
7877 : WebAssemblyTargetInfo(T, Opts) {
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007878 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
James Y Knightb214cbc2016-03-04 19:00:41 +00007879 resetDataLayout("e-m:e-p:32:32-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00007880 }
7881
7882protected:
7883 void getTargetDefines(const LangOptions &Opts,
7884 MacroBuilder &Builder) const override {
7885 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
7886 defineCPUMacros(Builder, "wasm32", /*Tuning=*/false);
7887 }
7888};
7889
7890class WebAssembly64TargetInfo : public WebAssemblyTargetInfo {
7891public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007892 explicit WebAssembly64TargetInfo(const llvm::Triple &T,
7893 const TargetOptions &Opts)
7894 : WebAssemblyTargetInfo(T, Opts) {
Dan Gohmanc2853072015-09-03 22:51:53 +00007895 LongAlign = LongWidth = 64;
7896 PointerAlign = PointerWidth = 64;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007897 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00007898 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00007899 }
7900
7901protected:
7902 void getTargetDefines(const LangOptions &Opts,
7903 MacroBuilder &Builder) const override {
7904 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
7905 defineCPUMacros(Builder, "wasm64", /*Tuning=*/false);
7906 }
7907};
7908
JF Bastien643817d2014-09-12 17:52:47 +00007909const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
7910#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00007911 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
JF Bastien643817d2014-09-12 17:52:47 +00007912#include "clang/Basic/BuiltinsLe64.def"
7913};
7914
Eric Christopherc48497a2015-09-18 21:26:24 +00007915static const unsigned SPIRAddrSpaceMap[] = {
7916 1, // opencl_global
7917 3, // opencl_local
7918 2, // opencl_constant
7919 4, // opencl_generic
7920 0, // cuda_device
7921 0, // cuda_constant
7922 0 // cuda_shared
7923};
7924class SPIRTargetInfo : public TargetInfo {
7925public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007926 SPIRTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7927 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007928 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
7929 "SPIR target must use unknown OS");
7930 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
7931 "SPIR target must use unknown environment type");
7932 BigEndian = false;
7933 TLSSupported = false;
7934 LongWidth = LongAlign = 64;
7935 AddrSpaceMap = &SPIRAddrSpaceMap;
7936 UseAddrSpaceMapMangling = true;
7937 // Define available target features
7938 // These must be defined in sorted order!
7939 NoAsmVariants = true;
7940 }
7941 void getTargetDefines(const LangOptions &Opts,
7942 MacroBuilder &Builder) const override {
7943 DefineStd(Builder, "SPIR", Opts);
7944 }
7945 bool hasFeature(StringRef Feature) const override {
7946 return Feature == "spir";
7947 }
Craig Topper3164f332014-03-11 03:39:26 +00007948
Craig Topper6c03a542015-10-19 04:51:35 +00007949 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007950 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00007951 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007952 bool validateAsmConstraint(const char *&Name,
7953 TargetInfo::ConstraintInfo &info) const override {
7954 return true;
7955 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007956 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7957 return None;
7958 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007959 BuiltinVaListKind getBuiltinVaListKind() const override {
7960 return TargetInfo::VoidPtrBuiltinVaList;
7961 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00007962
Eric Christopherc48497a2015-09-18 21:26:24 +00007963 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Nikolay Haustov8c6538b2016-06-30 09:06:33 +00007964 return (CC == CC_SpirFunction || CC == CC_OpenCLKernel) ? CCCR_OK
7965 : CCCR_Warning;
Eric Christopherc48497a2015-09-18 21:26:24 +00007966 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00007967
Eric Christopherc48497a2015-09-18 21:26:24 +00007968 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
7969 return CC_SpirFunction;
7970 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00007971
7972 void setSupportedOpenCLOpts() override {
7973 // Assume all OpenCL extensions and optional core features are supported
7974 // for SPIR since it is a generic target.
7975 getSupportedOpenCLOpts().setAll();
7976 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007977};
Guy Benyeib798fc92012-12-11 21:38:14 +00007978
Eric Christopherc48497a2015-09-18 21:26:24 +00007979class SPIR32TargetInfo : public SPIRTargetInfo {
7980public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007981 SPIR32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7982 : SPIRTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007983 PointerWidth = PointerAlign = 32;
7984 SizeType = TargetInfo::UnsignedInt;
7985 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +00007986 resetDataLayout("e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
7987 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00007988 }
7989 void getTargetDefines(const LangOptions &Opts,
7990 MacroBuilder &Builder) const override {
7991 DefineStd(Builder, "SPIR32", Opts);
7992 }
7993};
Guy Benyeib798fc92012-12-11 21:38:14 +00007994
Eric Christopherc48497a2015-09-18 21:26:24 +00007995class SPIR64TargetInfo : public SPIRTargetInfo {
7996public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007997 SPIR64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7998 : SPIRTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007999 PointerWidth = PointerAlign = 64;
8000 SizeType = TargetInfo::UnsignedLong;
8001 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00008002 resetDataLayout("e-i64:64-v16:16-v24:32-v32:32-v48:64-"
8003 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00008004 }
8005 void getTargetDefines(const LangOptions &Opts,
8006 MacroBuilder &Builder) const override {
8007 DefineStd(Builder, "SPIR64", Opts);
8008 }
8009};
Guy Benyeib798fc92012-12-11 21:38:14 +00008010
Robert Lytton0e076492013-08-13 09:43:10 +00008011class XCoreTargetInfo : public TargetInfo {
8012 static const Builtin::Info BuiltinInfo[];
8013public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008014 XCoreTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
8015 : TargetInfo(Triple) {
Robert Lytton0e076492013-08-13 09:43:10 +00008016 BigEndian = false;
8017 NoAsmVariants = true;
8018 LongLongAlign = 32;
8019 SuitableAlign = 32;
8020 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00008021 SizeType = UnsignedInt;
8022 PtrDiffType = SignedInt;
8023 IntPtrType = SignedInt;
8024 WCharType = UnsignedChar;
8025 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00008026 UseZeroLengthBitfieldAlignment = true;
James Y Knightb214cbc2016-03-04 19:00:41 +00008027 resetDataLayout("e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32"
8028 "-f64:32-a:0:32-n32");
Robert Lytton0e076492013-08-13 09:43:10 +00008029 }
Craig Topper3164f332014-03-11 03:39:26 +00008030 void getTargetDefines(const LangOptions &Opts,
8031 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008032 Builder.defineMacro("__XS1B__");
8033 }
Craig Topper6c03a542015-10-19 04:51:35 +00008034 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
8035 return llvm::makeArrayRef(BuiltinInfo,
8036 clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin);
Robert Lytton0e076492013-08-13 09:43:10 +00008037 }
Craig Topper3164f332014-03-11 03:39:26 +00008038 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008039 return TargetInfo::VoidPtrBuiltinVaList;
8040 }
Craig Topper3164f332014-03-11 03:39:26 +00008041 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008042 return "";
8043 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008044 ArrayRef<const char *> getGCCRegNames() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008045 static const char * const GCCRegNames[] = {
8046 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
8047 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
8048 };
Craig Topperf054e3a2015-10-19 03:52:27 +00008049 return llvm::makeArrayRef(GCCRegNames);
Robert Lytton0e076492013-08-13 09:43:10 +00008050 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008051 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8052 return None;
Robert Lytton0e076492013-08-13 09:43:10 +00008053 }
Craig Topper3164f332014-03-11 03:39:26 +00008054 bool validateAsmConstraint(const char *&Name,
8055 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008056 return false;
8057 }
Craig Topper3164f332014-03-11 03:39:26 +00008058 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00008059 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
8060 return (RegNo < 2)? RegNo : -1;
8061 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00008062 bool allowsLargerPreferedTypeAlignment() const override {
8063 return false;
8064 }
Robert Lytton0e076492013-08-13 09:43:10 +00008065};
8066
8067const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00008068#define BUILTIN(ID, TYPE, ATTRS) \
8069 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
8070#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
8071 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Robert Lytton0e076492013-08-13 09:43:10 +00008072#include "clang/Basic/BuiltinsXCore.def"
8073};
Robert Lytton0e076492013-08-13 09:43:10 +00008074
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008075// x86_32 Android target
8076class AndroidX86_32TargetInfo : public LinuxTargetInfo<X86_32TargetInfo> {
8077public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008078 AndroidX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8079 : LinuxTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008080 SuitableAlign = 32;
8081 LongDoubleWidth = 64;
8082 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
8083 }
8084};
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008085
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008086// x86_64 Android target
8087class AndroidX86_64TargetInfo : public LinuxTargetInfo<X86_64TargetInfo> {
8088public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008089 AndroidX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8090 : LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008091 LongDoubleFormat = &llvm::APFloat::IEEEquad;
8092 }
Chih-Hung Hsieh0b0eeaa2015-07-24 18:12:54 +00008093
8094 bool useFloat128ManglingForLongDouble() const override {
8095 return true;
8096 }
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008097};
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008098
8099// 32-bit RenderScript is armv7 with width and align of 'long' set to 8-bytes
8100class RenderScript32TargetInfo : public ARMleTargetInfo {
8101public:
8102 RenderScript32TargetInfo(const llvm::Triple &Triple,
8103 const TargetOptions &Opts)
8104 : ARMleTargetInfo(llvm::Triple("armv7", Triple.getVendorName(),
8105 Triple.getOSName(),
8106 Triple.getEnvironmentName()),
8107 Opts) {
8108 LongWidth = LongAlign = 64;
8109 }
8110 void getTargetDefines(const LangOptions &Opts,
8111 MacroBuilder &Builder) const override {
8112 Builder.defineMacro("__RENDERSCRIPT__");
8113 ARMleTargetInfo::getTargetDefines(Opts, Builder);
8114 }
8115};
8116
8117// 64-bit RenderScript is aarch64
8118class RenderScript64TargetInfo : public AArch64leTargetInfo {
8119public:
8120 RenderScript64TargetInfo(const llvm::Triple &Triple,
8121 const TargetOptions &Opts)
8122 : AArch64leTargetInfo(llvm::Triple("aarch64", Triple.getVendorName(),
8123 Triple.getOSName(),
8124 Triple.getEnvironmentName()),
8125 Opts) {}
8126
8127 void getTargetDefines(const LangOptions &Opts,
8128 MacroBuilder &Builder) const override {
8129 Builder.defineMacro("__RENDERSCRIPT__");
8130 AArch64leTargetInfo::getTargetDefines(Opts, Builder);
8131 }
8132};
8133
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008134} // end anonymous namespace
8135
Chris Lattner5ba61f02006-10-14 07:39:34 +00008136//===----------------------------------------------------------------------===//
8137// Driver code
8138//===----------------------------------------------------------------------===//
8139
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008140static TargetInfo *AllocateTarget(const llvm::Triple &Triple,
8141 const TargetOptions &Opts) {
Daniel Dunbar52322032009-08-18 05:47:58 +00008142 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00008143
Daniel Dunbar52322032009-08-18 05:47:58 +00008144 switch (Triple.getArch()) {
8145 default:
Craig Topperf1186c52014-05-08 06:41:40 +00008146 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00008147
Tim Northover2a0783d2014-05-30 14:14:07 +00008148 case llvm::Triple::xcore:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008149 return new XCoreTargetInfo(Triple, Opts);
Tim Northover2a0783d2014-05-30 14:14:07 +00008150
8151 case llvm::Triple::hexagon:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008152 return new HexagonTargetInfo(Triple, Opts);
Tim Northover2a0783d2014-05-30 14:14:07 +00008153
Jacques Pienaard964cc22016-03-28 21:02:54 +00008154 case llvm::Triple::lanai:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008155 return new LanaiTargetInfo(Triple, Opts);
Jacques Pienaard964cc22016-03-28 21:02:54 +00008156
Tim Northover2a0783d2014-05-30 14:14:07 +00008157 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00008158 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008159 return new DarwinAArch64TargetInfo(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00008160
8161 switch (os) {
Ed Schoutenea9448e2015-10-15 15:07:07 +00008162 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008163 return new CloudABITargetInfo<AArch64leTargetInfo>(Triple, Opts);
Ed Maste6a9eda52014-11-13 16:55:42 +00008164 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008165 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00008166 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008167 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple, Opts);
James Molloy5e73df52014-04-16 15:06:20 +00008168 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008169 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00008170 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008171 return new AArch64leTargetInfo(Triple, Opts);
James Molloy5e73df52014-04-16 15:06:20 +00008172 }
8173
Christian Pirker9b019ae2014-02-25 13:51:00 +00008174 case llvm::Triple::aarch64_be:
8175 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00008176 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008177 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00008178 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008179 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00008180 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008181 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00008182 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008183 return new AArch64beTargetInfo(Triple, Opts);
Tim Northover9bb857a2013-01-31 12:13:10 +00008184 }
8185
Daniel Dunbar52322032009-08-18 05:47:58 +00008186 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00008187 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00008188 if (Triple.isOSBinFormatMachO())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008189 return new DarwinARMTargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008190
Daniel Dunbar52322032009-08-18 05:47:58 +00008191 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00008192 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008193 return new LinuxTargetInfo<ARMleTargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008194 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008195 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008196 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008197 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008198 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008199 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00008200 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008201 return new BitrigTargetInfo<ARMleTargetInfo>(Triple, Opts);
Douglas Gregor9fabd852011-07-01 22:41:14 +00008202 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008203 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00008204 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008205 return new NaClTargetInfo<ARMleTargetInfo>(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008206 case llvm::Triple::Win32:
8207 switch (Triple.getEnvironment()) {
Yaron Keren321249c2015-07-15 13:32:23 +00008208 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008209 return new CygwinARMTargetInfo(Triple, Opts);
Yaron Keren321249c2015-07-15 13:32:23 +00008210 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008211 return new MinGWARMTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008212 case llvm::Triple::Itanium:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008213 return new ItaniumWindowsARMleTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008214 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008215 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008216 return new MicrosoftARMleTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008217 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008218 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008219 return new ARMleTargetInfo(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008220 }
8221
8222 case llvm::Triple::armeb:
8223 case llvm::Triple::thumbeb:
8224 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008225 return new DarwinARMTargetInfo(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008226
8227 switch (os) {
8228 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008229 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008230 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008231 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008232 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008233 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008234 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008235 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008236 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008237 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008238 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008239 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008240 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008241 return new NaClTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008242 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008243 return new ARMbeTargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008244 }
Eli Friedmanb5366062008-05-20 14:21:01 +00008245
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00008246 case llvm::Triple::bpfeb:
8247 case llvm::Triple::bpfel:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008248 return new BPFTargetInfo(Triple, Opts);
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00008249
Daniel Dunbar52322032009-08-18 05:47:58 +00008250 case llvm::Triple::msp430:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008251 return new MSP430TargetInfo(Triple, Opts);
Eli Friedmanb5366062008-05-20 14:21:01 +00008252
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008253 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008254 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008255 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00008256 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008257 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00008258 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008259 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008260 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008261 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008262 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008263 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00008264 return new MipsTargetInfo(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008265 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008266
8267 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008268 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008269 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00008270 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008271 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00008272 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008273 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008274 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008275 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008276 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00008277 case llvm::Triple::NaCl:
Daniel Sanders4672af62016-05-27 11:51:02 +00008278 return new NaClTargetInfo<NaClMips32TargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008279 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00008280 return new MipsTargetInfo(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008281 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008282
Akira Hatanakabef17452011-09-20 19:21:49 +00008283 case llvm::Triple::mips64:
8284 switch (os) {
8285 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00008286 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008287 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00008288 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008289 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008290 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008291 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008292 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008293 case llvm::Triple::OpenBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008294 return new OpenBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008295 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00008296 return new MipsTargetInfo(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008297 }
8298
8299 case llvm::Triple::mips64el:
8300 switch (os) {
8301 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00008302 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008303 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00008304 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008305 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008306 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008307 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008308 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008309 case llvm::Triple::OpenBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008310 return new OpenBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008311 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00008312 return new MipsTargetInfo(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008313 }
8314
Ivan Krasindd7403e2011-08-24 20:22:22 +00008315 case llvm::Triple::le32:
8316 switch (os) {
Douglas Katzman78d7c542015-05-12 21:18:10 +00008317 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008318 return new NaClTargetInfo<PNaClTargetInfo>(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00008319 default:
8320 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00008321 }
8322
JF Bastien643817d2014-09-12 17:52:47 +00008323 case llvm::Triple::le64:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008324 return new Le64TargetInfo(Triple, Opts);
JF Bastien643817d2014-09-12 17:52:47 +00008325
Daniel Dunbar52322032009-08-18 05:47:58 +00008326 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008327 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008328 return new DarwinPPC32TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008329 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00008330 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008331 return new LinuxTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008332 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008333 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008334 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008335 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008336 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008337 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008338 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008339 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008340 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008341 return new PPC32TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008342 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008343
8344 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008345 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008346 return new DarwinPPC64TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008347 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00008348 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008349 return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008350 case llvm::Triple::Lv2:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008351 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008352 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008353 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008354 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008355 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008356 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008357 return new PPC64TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008358 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008359
Bill Schmidt778d3872013-07-26 01:36:11 +00008360 case llvm::Triple::ppc64le:
8361 switch (os) {
8362 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008363 return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger22a2d992015-04-10 20:53:48 +00008364 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008365 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Bill Schmidt778d3872013-07-26 01:36:11 +00008366 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008367 return new PPC64TargetInfo(Triple, Opts);
Bill Schmidt778d3872013-07-26 01:36:11 +00008368 }
8369
Peter Collingbournec947aae2012-05-20 23:28:41 +00008370 case llvm::Triple::nvptx:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008371 return new NVPTX32TargetInfo(Triple, Opts);
Peter Collingbournec947aae2012-05-20 23:28:41 +00008372 case llvm::Triple::nvptx64:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008373 return new NVPTX64TargetInfo(Triple, Opts);
Peter Collingbournec947aae2012-05-20 23:28:41 +00008374
Tom Stellardd8e38a32015-01-06 20:34:47 +00008375 case llvm::Triple::amdgcn:
Eli Friedmand13b41e2012-10-12 23:32:00 +00008376 case llvm::Triple::r600:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008377 return new AMDGPUTargetInfo(Triple, Opts);
Eli Friedmand13b41e2012-10-12 23:32:00 +00008378
Daniel Dunbar52322032009-08-18 05:47:58 +00008379 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008380 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00008381 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008382 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008383 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008384 return new SolarisTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008385 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008386 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008387 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008388 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008389 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008390 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008391 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008392 return new SparcV8TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008393 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008394
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008395 // The 'sparcel' architecture copies all the above cases except for Solaris.
8396 case llvm::Triple::sparcel:
8397 switch (os) {
8398 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008399 return new LinuxTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008400 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008401 return new NetBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008402 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008403 return new OpenBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008404 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008405 return new RTEMSTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008406 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008407 return new SparcV8elTargetInfo(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008408 }
8409
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008410 case llvm::Triple::sparcv9:
8411 switch (os) {
8412 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008413 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008414 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008415 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008416 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008417 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008418 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008419 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008420 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008421 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008422 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008423 return new SparcV9TargetInfo(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008424 }
8425
Ulrich Weigand47445072013-05-06 16:26:41 +00008426 case llvm::Triple::systemz:
8427 switch (os) {
8428 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008429 return new LinuxTargetInfo<SystemZTargetInfo>(Triple, Opts);
Ulrich Weigand47445072013-05-06 16:26:41 +00008430 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008431 return new SystemZTargetInfo(Triple, Opts);
Ulrich Weigand47445072013-05-06 16:26:41 +00008432 }
8433
Eli Friedmana9c3d712009-08-19 20:47:07 +00008434 case llvm::Triple::tce:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008435 return new TCETargetInfo(Triple, Opts);
Eli Friedmana9c3d712009-08-19 20:47:07 +00008436
Daniel Dunbar52322032009-08-18 05:47:58 +00008437 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008438 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008439 return new DarwinI386TargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008440
Daniel Dunbar52322032009-08-18 05:47:58 +00008441 switch (os) {
Ed Schouten7893e682015-06-13 21:33:49 +00008442 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008443 return new CloudABITargetInfo<X86_32TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008444 case llvm::Triple::Linux: {
8445 switch (Triple.getEnvironment()) {
8446 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008447 return new LinuxTargetInfo<X86_32TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008448 case llvm::Triple::Android:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008449 return new AndroidX86_32TargetInfo(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008450 }
8451 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008452 case llvm::Triple::DragonFly:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008453 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008454 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008455 return new NetBSDI386TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008456 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008457 return new OpenBSDI386TargetInfo(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00008458 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008459 return new BitrigI386TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008460 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008461 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00008462 case llvm::Triple::KFreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008463 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008464 case llvm::Triple::Minix:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008465 return new MinixTargetInfo<X86_32TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008466 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008467 return new SolarisTargetInfo<X86_32TargetInfo>(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008468 case llvm::Triple::Win32: {
8469 switch (Triple.getEnvironment()) {
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008470 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008471 return new CygwinX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008472 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008473 return new MinGWX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00008474 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008475 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008476 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008477 return new MicrosoftX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008478 }
8479 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00008480 case llvm::Triple::Haiku:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008481 return new HaikuX86_32TargetInfo(Triple, Opts);
Douglas Gregor9fabd852011-07-01 22:41:14 +00008482 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008483 return new RTEMSX86_32TargetInfo(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00008484 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008485 return new NaClTargetInfo<X86_32TargetInfo>(Triple, Opts);
Alexey Bataevc99b0492015-11-25 09:24:26 +00008486 case llvm::Triple::ELFIAMCU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008487 return new MCUX86_32TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008488 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008489 return new X86_32TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008490 }
8491
8492 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008493 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008494 return new DarwinX86_64TargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008495
Daniel Dunbar52322032009-08-18 05:47:58 +00008496 switch (os) {
Ed Schoutenf33c6072015-03-11 08:42:46 +00008497 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008498 return new CloudABITargetInfo<X86_64TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008499 case llvm::Triple::Linux: {
8500 switch (Triple.getEnvironment()) {
8501 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008502 return new LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008503 case llvm::Triple::Android:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008504 return new AndroidX86_64TargetInfo(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008505 }
8506 }
Chris Lattner002ba6b2010-01-09 05:41:14 +00008507 case llvm::Triple::DragonFly:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008508 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008509 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008510 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008511 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008512 return new OpenBSDX86_64TargetInfo(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00008513 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008514 return new BitrigX86_64TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008515 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008516 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00008517 case llvm::Triple::KFreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008518 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008519 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008520 return new SolarisTargetInfo<X86_64TargetInfo>(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008521 case llvm::Triple::Win32: {
8522 switch (Triple.getEnvironment()) {
Yaron Kerend030d112015-07-22 17:38:19 +00008523 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008524 return new CygwinX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008525 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008526 return new MinGWX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008527 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008528 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008529 return new MicrosoftX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008530 }
8531 }
Reid Kleckner330fb172016-05-11 16:19:05 +00008532 case llvm::Triple::Haiku:
8533 return new HaikuTargetInfo<X86_64TargetInfo>(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00008534 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008535 return new NaClTargetInfo<X86_64TargetInfo>(Triple, Opts);
Alex Rosenberg12207fa2015-01-27 14:47:44 +00008536 case llvm::Triple::PS4:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008537 return new PS4OSTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008538 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008539 return new X86_64TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008540 }
Guy Benyeib798fc92012-12-11 21:38:14 +00008541
Douglas Katzman78d7c542015-05-12 21:18:10 +00008542 case llvm::Triple::spir: {
8543 if (Triple.getOS() != llvm::Triple::UnknownOS ||
8544 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
8545 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008546 return new SPIR32TargetInfo(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00008547 }
8548 case llvm::Triple::spir64: {
8549 if (Triple.getOS() != llvm::Triple::UnknownOS ||
8550 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
8551 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008552 return new SPIR64TargetInfo(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00008553 }
Dan Gohmanc2853072015-09-03 22:51:53 +00008554 case llvm::Triple::wasm32:
8555 if (!(Triple == llvm::Triple("wasm32-unknown-unknown")))
8556 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008557 return new WebAssemblyOSTargetInfo<WebAssembly32TargetInfo>(Triple, Opts);
Dan Gohmanc2853072015-09-03 22:51:53 +00008558 case llvm::Triple::wasm64:
8559 if (!(Triple == llvm::Triple("wasm64-unknown-unknown")))
8560 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008561 return new WebAssemblyOSTargetInfo<WebAssembly64TargetInfo>(Triple, Opts);
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008562
8563 case llvm::Triple::renderscript32:
8564 return new LinuxTargetInfo<RenderScript32TargetInfo>(Triple, Opts);
8565 case llvm::Triple::renderscript64:
8566 return new LinuxTargetInfo<RenderScript64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008567 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00008568}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008569
8570/// CreateTargetInfo - Return the target info object for the specified target
Eric Christophere4f73b32015-08-07 19:07:08 +00008571/// options.
Alp Toker80758082014-07-06 05:26:44 +00008572TargetInfo *
8573TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
Saleem Abdulrasool10a49722016-04-08 16:52:00 +00008574 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00008575 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008576
8577 // Construct the target
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008578 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple, *Opts));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008579 if (!Target) {
8580 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00008581 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008582 }
Alp Toker80758082014-07-06 05:26:44 +00008583 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008584
Daniel Dunbaracde99e2009-12-18 18:42:37 +00008585 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008586 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
8587 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00008588 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00008589 }
8590
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008591 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008592 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
8593 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00008594 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008595 }
8596
Rafael Espindolaeb265472013-08-21 21:59:03 +00008597 // Set the fp math unit.
8598 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
8599 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00008600 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00008601 }
8602
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008603 // Compute the default target features, we need the target to handle this
8604 // because features may have dependencies on one another.
8605 llvm::StringMap<bool> Features;
Eric Christopher007b0a02015-08-28 22:32:01 +00008606 if (!Target->initFeatureMap(Features, Diags, Opts->CPU,
8607 Opts->FeaturesAsWritten))
Eric Christopher6b454372015-08-25 13:45:24 +00008608 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008609
8610 // Add the features to the compile options.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008611 Opts->Features.clear();
Aaron Ballmanb226d3d2015-08-12 13:38:59 +00008612 for (const auto &F : Features)
8613 Opts->Features.push_back((F.getValue() ? "+" : "-") + F.getKey().str());
8614
Eric Christopher3ff21b32013-10-16 21:26:26 +00008615 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00008616 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008617
Yaxun Liu39cf40f2016-05-16 17:06:34 +00008618 Target->setSupportedOpenCLOpts();
8619
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00008620 if (!Target->validateTarget(Diags))
8621 return nullptr;
8622
Ahmed Charles9a16beb2014-03-07 19:33:25 +00008623 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008624}