blob: afd25280f3260ccc4a5a5f968adb4b734e097492 [file] [log] [blame]
Eric Christopherb39156d2015-08-26 04:23:11 +00001//===--- Targets.cpp - Implement target feature support -------------------===//
Chris Lattner5ba61f02006-10-14 07:39:34 +00002//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner5b12ab82007-12-29 19:59:25 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Chris Lattner5ba61f02006-10-14 07:39:34 +00007//
8//===----------------------------------------------------------------------===//
9//
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000010// This file implements construction of a TargetInfo object from a
Ted Kremenek6f6ff372007-12-12 18:05:32 +000011// target triple.
Chris Lattner5ba61f02006-10-14 07:39:34 +000012//
13//===----------------------------------------------------------------------===//
14
Saleem Abdulrasool10a49722016-04-08 16:52:00 +000015#include "clang/Basic/TargetInfo.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000016#include "clang/Basic/Builtins.h"
17#include "clang/Basic/Diagnostic.h"
Chris Lattnerc7c6dd42008-12-04 22:54:33 +000018#include "clang/Basic/LangOptions.h"
Chandler Carruth26b29a02010-01-20 06:13:02 +000019#include "clang/Basic/MacroBuilder.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000020#include "clang/Basic/TargetBuiltins.h"
21#include "clang/Basic/TargetOptions.h"
Tim Northover756447a2015-10-30 16:30:36 +000022#include "clang/Basic/Version.h"
Eli Friedman7cef49e2008-05-20 14:27:34 +000023#include "llvm/ADT/APFloat.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000024#include "llvm/ADT/STLExtras.h"
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +000025#include "llvm/ADT/StringExtras.h"
Daniel Dunbar58bc48c2009-08-19 20:04:03 +000026#include "llvm/ADT/StringRef.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000027#include "llvm/ADT/StringSwitch.h"
Chris Lattner859c37a2009-08-12 06:24:27 +000028#include "llvm/ADT/Triple.h"
Chris Lattner30ba6742009-08-10 19:03:04 +000029#include "llvm/MC/MCSectionMachO.h"
David Blaikie76bd3c82011-09-23 05:35:21 +000030#include "llvm/Support/ErrorHandling.h"
Renato Golinf5c4dec2015-05-27 13:33:00 +000031#include "llvm/Support/TargetParser.h"
Benjamin Kramerdc2f0062010-01-09 18:20:57 +000032#include <algorithm>
Ahmed Charlesdfca6f92014-03-09 11:36:40 +000033#include <memory>
Hans Wennborg7eb54642015-09-10 17:07:54 +000034
Chris Lattner5ba61f02006-10-14 07:39:34 +000035using namespace clang;
36
Chris Lattner5ba61f02006-10-14 07:39:34 +000037//===----------------------------------------------------------------------===//
Chris Lattner1f5ad112006-10-14 18:32:12 +000038// Common code shared among targets.
Chris Lattner5ba61f02006-10-14 07:39:34 +000039//===----------------------------------------------------------------------===//
40
Chris Lattner1e1c0b92009-03-20 16:06:38 +000041/// DefineStd - Define a macro name and standard variants. For example if
42/// MacroName is "unix", then this will define "__unix", "__unix__", and "unix"
43/// when in GNU mode.
Chris Lattner0e62c1c2011-07-23 10:55:15 +000044static void DefineStd(MacroBuilder &Builder, StringRef MacroName,
Chris Lattner1e1c0b92009-03-20 16:06:38 +000045 const LangOptions &Opts) {
46 assert(MacroName[0] != '_' && "Identifier should be in the user's namespace");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000047
Chris Lattner1e1c0b92009-03-20 16:06:38 +000048 // If in GNU mode (e.g. -std=gnu99 but not -std=c99) define the raw identifier
49 // in the user's namespace.
50 if (Opts.GNUMode)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000051 Builder.defineMacro(MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000052
Chris Lattner1e1c0b92009-03-20 16:06:38 +000053 // Define __unix.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000054 Builder.defineMacro("__" + MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000055
Chris Lattner1e1c0b92009-03-20 16:06:38 +000056 // Define __unix__.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000057 Builder.defineMacro("__" + MacroName + "__");
Chris Lattner1e1c0b92009-03-20 16:06:38 +000058}
59
Benjamin Kramere3b442d2012-01-10 11:50:09 +000060static void defineCPUMacros(MacroBuilder &Builder, StringRef CPUName,
61 bool Tuning = true) {
62 Builder.defineMacro("__" + CPUName);
63 Builder.defineMacro("__" + CPUName + "__");
64 if (Tuning)
65 Builder.defineMacro("__tune_" + CPUName + "__");
66}
67
Justin Lebar76945b22016-04-29 23:05:19 +000068static TargetInfo *AllocateTarget(const llvm::Triple &Triple,
69 const TargetOptions &Opts);
70
Chris Lattner09d98f52008-10-05 21:50:58 +000071//===----------------------------------------------------------------------===//
72// Defines specific to certain operating systems.
73//===----------------------------------------------------------------------===//
Chris Lattner30ba6742009-08-10 19:03:04 +000074
Torok Edwinb2b37c62009-06-30 17:10:35 +000075namespace {
Douglas Gregorc05d2a12009-07-01 15:12:53 +000076template<typename TgtInfo>
77class OSTargetInfo : public TgtInfo {
Torok Edwinb2b37c62009-06-30 17:10:35 +000078protected:
Daniel Dunbar40165182009-08-24 09:10:05 +000079 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000080 MacroBuilder &Builder) const=0;
Torok Edwinb2b37c62009-06-30 17:10:35 +000081public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +000082 OSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
83 : TgtInfo(Triple, Opts) {}
Craig Topper3164f332014-03-11 03:39:26 +000084 void getTargetDefines(const LangOptions &Opts,
85 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000086 TgtInfo::getTargetDefines(Opts, Builder);
87 getOSDefines(Opts, TgtInfo::getTriple(), Builder);
Torok Edwin4e054162009-06-30 17:00:25 +000088 }
Torok Edwinb2b37c62009-06-30 17:10:35 +000089
90};
Chris Lattner30ba6742009-08-10 19:03:04 +000091
Eric Christopher7d0c7252015-09-24 21:17:04 +000092// CloudABI Target
93template <typename Target>
94class CloudABITargetInfo : public OSTargetInfo<Target> {
95protected:
96 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
97 MacroBuilder &Builder) const override {
98 Builder.defineMacro("__CloudABI__");
99 Builder.defineMacro("__ELF__");
100
101 // CloudABI uses ISO/IEC 10646:2012 for wchar_t, char16_t and char32_t.
102 Builder.defineMacro("__STDC_ISO_10646__", "201206L");
103 Builder.defineMacro("__STDC_UTF_16__");
104 Builder.defineMacro("__STDC_UTF_32__");
105 }
106
107public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000108 CloudABITargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
109 : OSTargetInfo<Target>(Triple, Opts) {}
Eric Christopher7d0c7252015-09-24 21:17:04 +0000110};
111
Daniel Dunbard86666f2010-01-26 01:44:04 +0000112static void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000113 const llvm::Triple &Triple,
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000114 StringRef &PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000115 VersionTuple &PlatformMinVersion) {
Bob Wilson834400b2013-08-19 20:23:37 +0000116 Builder.defineMacro("__APPLE_CC__", "6000");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000117 Builder.defineMacro("__APPLE__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000118 Builder.defineMacro("OBJC_NEW_PROPERTIES");
Alexander Potapenkob4f81902012-09-20 10:10:01 +0000119 // AddressSanitizer doesn't play well with source fortification, which is on
120 // by default on Darwin.
Alexey Samsonovedf99a92014-11-07 22:29:38 +0000121 if (Opts.Sanitize.has(SanitizerKind::Address))
122 Builder.defineMacro("_FORTIFY_SOURCE", "0");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000123
John McCall460ce582015-10-22 18:38:17 +0000124 // Darwin defines __weak, __strong, and __unsafe_unretained even in C mode.
125 if (!Opts.ObjC1) {
John McCall31168b02011-06-15 23:02:42 +0000126 // __weak is always defined, for use in blocks and with objc pointers.
127 Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))");
John McCall460ce582015-10-22 18:38:17 +0000128 Builder.defineMacro("__strong", "");
John McCall31168b02011-06-15 23:02:42 +0000129 Builder.defineMacro("__unsafe_unretained", "");
John McCall31168b02011-06-15 23:02:42 +0000130 }
Eric Christopher0c912c52011-07-07 22:55:26 +0000131
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000132 if (Opts.Static)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000133 Builder.defineMacro("__STATIC__");
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000134 else
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000135 Builder.defineMacro("__DYNAMIC__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000136
137 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000138 Builder.defineMacro("_REENTRANT");
Daniel Dunbar497ff132009-04-10 19:52:24 +0000139
Daniel Dunbarecf13562011-04-19 21:40:34 +0000140 // Get the platform type and version number from the triple.
Daniel Dunbar497ff132009-04-10 19:52:24 +0000141 unsigned Maj, Min, Rev;
Bob Wilson8e5acc52012-01-31 23:52:58 +0000142 if (Triple.isMacOSX()) {
143 Triple.getMacOSXVersion(Maj, Min, Rev);
Daniel Dunbarecf13562011-04-19 21:40:34 +0000144 PlatformName = "macosx";
Daniel Dunbarecf13562011-04-19 21:40:34 +0000145 } else {
Bob Wilson8e5acc52012-01-31 23:52:58 +0000146 Triple.getOSVersion(Maj, Min, Rev);
147 PlatformName = llvm::Triple::getOSTypeName(Triple.getOS());
Daniel Dunbarecf13562011-04-19 21:40:34 +0000148 }
Daniel Dunbard86666f2010-01-26 01:44:04 +0000149
Sebastian Pop422377c2012-01-20 22:01:23 +0000150 // If -target arch-pc-win32-macho option specified, we're
Eric Christopherb081ba62011-07-29 21:20:35 +0000151 // generating code for Win32 ABI. No need to emit
Chad Rosierb90e4022011-07-19 20:00:06 +0000152 // __ENVIRONMENT_XX_OS_VERSION_MIN_REQUIRED__.
153 if (PlatformName == "win32") {
154 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
155 return;
156 }
157
Evan Cheng31dd9a62014-01-26 23:12:43 +0000158 // Set the appropriate OS version define.
159 if (Triple.isiOS()) {
160 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
161 char Str[6];
162 Str[0] = '0' + Maj;
163 Str[1] = '0' + (Min / 10);
164 Str[2] = '0' + (Min % 10);
165 Str[3] = '0' + (Rev / 10);
166 Str[4] = '0' + (Rev % 10);
167 Str[5] = '\0';
Tim Northover67465f82015-10-30 16:30:30 +0000168 if (Triple.isTvOS())
169 Builder.defineMacro("__ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__", Str);
170 else
171 Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__",
172 Str);
173
174 } else if (Triple.isWatchOS()) {
175 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
176 char Str[6];
177 Str[0] = '0' + Maj;
178 Str[1] = '0' + (Min / 10);
179 Str[2] = '0' + (Min % 10);
180 Str[3] = '0' + (Rev / 10);
181 Str[4] = '0' + (Rev % 10);
182 Str[5] = '\0';
183 Builder.defineMacro("__ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__", Str);
Evan Cheng31dd9a62014-01-26 23:12:43 +0000184 } else if (Triple.isMacOSX()) {
185 // Note that the Driver allows versions which aren't representable in the
186 // define (because we only get a single digit for the minor and micro
187 // revision numbers). So, we limit them to the maximum representable
188 // version.
189 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
Bob Wilson2a3710e2014-08-08 21:45:53 +0000190 char Str[7];
191 if (Maj < 10 || (Maj == 10 && Min < 10)) {
192 Str[0] = '0' + (Maj / 10);
193 Str[1] = '0' + (Maj % 10);
194 Str[2] = '0' + std::min(Min, 9U);
195 Str[3] = '0' + std::min(Rev, 9U);
196 Str[4] = '\0';
197 } else {
198 // Handle versions > 10.9.
199 Str[0] = '0' + (Maj / 10);
200 Str[1] = '0' + (Maj % 10);
201 Str[2] = '0' + (Min / 10);
202 Str[3] = '0' + (Min % 10);
203 Str[4] = '0' + (Rev / 10);
204 Str[5] = '0' + (Rev % 10);
205 Str[6] = '\0';
206 }
Evan Cheng31dd9a62014-01-26 23:12:43 +0000207 Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
Daniel Dunbar497ff132009-04-10 19:52:24 +0000208 }
Daniel Dunbarecf13562011-04-19 21:40:34 +0000209
Tim Northover157d9112014-01-16 08:48:16 +0000210 // Tell users about the kernel if there is one.
211 if (Triple.isOSDarwin())
212 Builder.defineMacro("__MACH__");
213
Chris Bieneman46977b62016-04-29 17:53:00 +0000214 // The Watch ABI uses Dwarf EH.
215 if(Triple.isWatchABI())
216 Builder.defineMacro("__ARM_DWARF_EH__");
217
Daniel Dunbarecf13562011-04-19 21:40:34 +0000218 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
Eli Friedman3fd920a2008-08-20 02:34:37 +0000219}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000220
Torok Edwinb2b37c62009-06-30 17:10:35 +0000221template<typename Target>
222class DarwinTargetInfo : public OSTargetInfo<Target> {
223protected:
Craig Topper3164f332014-03-11 03:39:26 +0000224 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
225 MacroBuilder &Builder) const override {
Eric Christopher0c912c52011-07-07 22:55:26 +0000226 getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000227 this->PlatformMinVersion);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000228 }
Mike Stump11289f42009-09-09 15:08:12 +0000229
Torok Edwinb2b37c62009-06-30 17:10:35 +0000230public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000231 DarwinTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
232 : OSTargetInfo<Target>(Triple, Opts) {
Tim Northovera12d0a92016-01-07 09:04:46 +0000233 // By default, no TLS, and we whitelist permitted architecture/OS
234 // combinations.
235 this->TLSSupported = false;
236
237 if (Triple.isMacOSX())
238 this->TLSSupported = !Triple.isMacOSXVersionLT(10, 7);
239 else if (Triple.isiOS()) {
240 // 64-bit iOS supported it from 8 onwards, 32-bit from 9 onwards.
241 if (Triple.getArch() == llvm::Triple::x86_64 ||
242 Triple.getArch() == llvm::Triple::aarch64)
243 this->TLSSupported = !Triple.isOSVersionLT(8);
244 else if (Triple.getArch() == llvm::Triple::x86 ||
245 Triple.getArch() == llvm::Triple::arm ||
246 Triple.getArch() == llvm::Triple::thumb)
247 this->TLSSupported = !Triple.isOSVersionLT(9);
248 } else if (Triple.isWatchOS())
249 this->TLSSupported = !Triple.isOSVersionLT(2);
250
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000251 this->MCountName = "\01mcount";
252 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000253
Craig Topper3164f332014-03-11 03:39:26 +0000254 std::string isValidSectionSpecifier(StringRef SR) const override {
Chris Lattner30ba6742009-08-10 19:03:04 +0000255 // Let MCSectionMachO validate this.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000256 StringRef Segment, Section;
Chris Lattner30ba6742009-08-10 19:03:04 +0000257 unsigned TAA, StubSize;
Daniel Dunbar75942372011-03-19 02:06:21 +0000258 bool HasTAA;
Chris Lattner30ba6742009-08-10 19:03:04 +0000259 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
Daniel Dunbar75942372011-03-19 02:06:21 +0000260 TAA, HasTAA, StubSize);
Chris Lattner30ba6742009-08-10 19:03:04 +0000261 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000262
Craig Topper3164f332014-03-11 03:39:26 +0000263 const char *getStaticInitSectionSpecifier() const override {
Anders Carlsson851318a2010-06-08 22:47:50 +0000264 // FIXME: We should return 0 when building kexts.
265 return "__TEXT,__StaticInit,regular,pure_instructions";
266 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000267
John McCalleed64c72012-01-29 01:20:30 +0000268 /// Darwin does not support protected visibility. Darwin's "default"
269 /// is very similar to ELF's "protected"; Darwin requires a "weak"
270 /// attribute on declarations that can be dynamically replaced.
Craig Topper3164f332014-03-11 03:39:26 +0000271 bool hasProtectedVisibility() const override {
John McCalleed64c72012-01-29 01:20:30 +0000272 return false;
273 }
Akira Hatanaka68ab7fe2016-03-31 06:36:07 +0000274
275 unsigned getExnObjectAlignment() const override {
276 // The alignment of an exception object is 8-bytes for darwin since
277 // libc++abi doesn't declare _Unwind_Exception with __attribute__((aligned))
278 // and therefore doesn't guarantee 16-byte alignment.
279 return 64;
280 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000281};
282
Chris Lattner30ba6742009-08-10 19:03:04 +0000283
Torok Edwinb2b37c62009-06-30 17:10:35 +0000284// DragonFlyBSD Target
285template<typename Target>
286class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
287protected:
Craig Topper3164f332014-03-11 03:39:26 +0000288 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
289 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000290 // DragonFly defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000291 Builder.defineMacro("__DragonFly__");
292 Builder.defineMacro("__DragonFly_cc_version", "100001");
293 Builder.defineMacro("__ELF__");
294 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
295 Builder.defineMacro("__tune_i386__");
296 DefineStd(Builder, "unix", Opts);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000297 }
298public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000299 DragonFlyBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
300 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000301 switch (Triple.getArch()) {
302 default:
303 case llvm::Triple::x86:
304 case llvm::Triple::x86_64:
305 this->MCountName = ".mcount";
306 break;
307 }
Eli Friedman4286fba2012-02-10 23:02:29 +0000308 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000309};
310
Dimitry Andricc6d924c2016-05-20 17:27:22 +0000311#ifndef FREEBSD_CC_VERSION
312#define FREEBSD_CC_VERSION 0U
313#endif
314
Torok Edwinb2b37c62009-06-30 17:10:35 +0000315// FreeBSD Target
316template<typename Target>
317class FreeBSDTargetInfo : public OSTargetInfo<Target> {
318protected:
Craig Topper3164f332014-03-11 03:39:26 +0000319 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
320 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000321 // FreeBSD defines; list based off of gcc output
322
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000323 unsigned Release = Triple.getOSMajorVersion();
324 if (Release == 0U)
Dimitry Andricc6d924c2016-05-20 17:27:22 +0000325 Release = 8U;
326 unsigned CCVersion = FREEBSD_CC_VERSION;
327 if (CCVersion == 0U)
328 CCVersion = Release * 100000U + 1U;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000329
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000330 Builder.defineMacro("__FreeBSD__", Twine(Release));
Dimitry Andricc6d924c2016-05-20 17:27:22 +0000331 Builder.defineMacro("__FreeBSD_cc_version", Twine(CCVersion));
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000332 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
333 DefineStd(Builder, "unix", Opts);
334 Builder.defineMacro("__ELF__");
Ed Schoutend0621462013-09-29 07:54:52 +0000335
336 // On FreeBSD, wchar_t contains the number of the code point as
337 // used by the character set of the locale. These character sets are
338 // not necessarily a superset of ASCII.
Richard Smith00a4a852015-01-13 01:47:45 +0000339 //
340 // FIXME: This is wrong; the macro refers to the numerical values
341 // of wchar_t *literals*, which are not locale-dependent. However,
342 // FreeBSD systems apparently depend on us getting this wrong, and
343 // setting this to 1 is conforming even if all the basic source
344 // character literals have the same encoding as char and wchar_t.
Ed Schoutend0621462013-09-29 07:54:52 +0000345 Builder.defineMacro("__STDC_MB_MIGHT_NEQ_WC__", "1");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000346 }
347public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000348 FreeBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
349 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000350 switch (Triple.getArch()) {
351 default:
352 case llvm::Triple::x86:
353 case llvm::Triple::x86_64:
354 this->MCountName = ".mcount";
355 break;
356 case llvm::Triple::mips:
357 case llvm::Triple::mipsel:
358 case llvm::Triple::ppc:
359 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +0000360 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000361 this->MCountName = "_mcount";
362 break;
363 case llvm::Triple::arm:
364 this->MCountName = "__mcount";
365 break;
Duncan Sands9cb27e92009-07-08 13:55:08 +0000366 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000367 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000368};
369
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000370// GNU/kFreeBSD Target
371template<typename Target>
372class KFreeBSDTargetInfo : public OSTargetInfo<Target> {
373protected:
Craig Topper3164f332014-03-11 03:39:26 +0000374 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
375 MacroBuilder &Builder) const override {
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000376 // GNU/kFreeBSD defines; list based off of gcc output
377
378 DefineStd(Builder, "unix", Opts);
379 Builder.defineMacro("__FreeBSD_kernel__");
380 Builder.defineMacro("__GLIBC__");
381 Builder.defineMacro("__ELF__");
382 if (Opts.POSIXThreads)
383 Builder.defineMacro("_REENTRANT");
384 if (Opts.CPlusPlus)
385 Builder.defineMacro("_GNU_SOURCE");
386 }
387public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000388 KFreeBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
389 : OSTargetInfo<Target>(Triple, Opts) {}
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000390};
391
Reid Kleckner330fb172016-05-11 16:19:05 +0000392// Haiku Target
393template<typename Target>
394class HaikuTargetInfo : public OSTargetInfo<Target> {
395protected:
396 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
397 MacroBuilder &Builder) const override {
398 // Haiku defines; list based off of gcc output
399 Builder.defineMacro("__HAIKU__");
400 Builder.defineMacro("__ELF__");
401 DefineStd(Builder, "unix", Opts);
402 }
403public:
404 HaikuTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
405 : OSTargetInfo<Target>(Triple, Opts) {
406 this->SizeType = TargetInfo::UnsignedLong;
407 this->IntPtrType = TargetInfo::SignedLong;
408 this->PtrDiffType = TargetInfo::SignedLong;
409 this->ProcessIDType = TargetInfo::SignedLong;
410 this->TLSSupported = false;
411
412 }
413};
414
Chris Lattner3e2ee142010-07-07 16:01:42 +0000415// Minix Target
416template<typename Target>
417class MinixTargetInfo : public OSTargetInfo<Target> {
418protected:
Craig Topper3164f332014-03-11 03:39:26 +0000419 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
420 MacroBuilder &Builder) const override {
Chris Lattner3e2ee142010-07-07 16:01:42 +0000421 // Minix defines
422
423 Builder.defineMacro("__minix", "3");
424 Builder.defineMacro("_EM_WSIZE", "4");
425 Builder.defineMacro("_EM_PSIZE", "4");
426 Builder.defineMacro("_EM_SSIZE", "2");
427 Builder.defineMacro("_EM_LSIZE", "4");
428 Builder.defineMacro("_EM_FSIZE", "4");
429 Builder.defineMacro("_EM_DSIZE", "8");
Eli Friedman83de5132011-12-08 23:54:21 +0000430 Builder.defineMacro("__ELF__");
Chris Lattner3e2ee142010-07-07 16:01:42 +0000431 DefineStd(Builder, "unix", Opts);
432 }
433public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000434 MinixTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
435 : OSTargetInfo<Target>(Triple, Opts) {}
Chris Lattner3e2ee142010-07-07 16:01:42 +0000436};
437
Torok Edwinb2b37c62009-06-30 17:10:35 +0000438// Linux target
439template<typename Target>
440class LinuxTargetInfo : public OSTargetInfo<Target> {
441protected:
Craig Topper3164f332014-03-11 03:39:26 +0000442 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
443 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000444 // Linux defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000445 DefineStd(Builder, "unix", Opts);
446 DefineStd(Builder, "linux", Opts);
447 Builder.defineMacro("__gnu_linux__");
448 Builder.defineMacro("__ELF__");
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +0000449 if (Triple.isAndroid()) {
Evgeniy Stepanov94dc4c92012-04-26 12:08:09 +0000450 Builder.defineMacro("__ANDROID__", "1");
Dan Albert84aee012015-03-03 18:28:38 +0000451 unsigned Maj, Min, Rev;
David Majnemer5c2589a2015-06-01 23:38:25 +0000452 Triple.getEnvironmentVersion(Maj, Min, Rev);
Dan Albert84aee012015-03-03 18:28:38 +0000453 this->PlatformName = "android";
454 this->PlatformMinVersion = VersionTuple(Maj, Min, Rev);
455 }
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000456 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000457 Builder.defineMacro("_REENTRANT");
Douglas Gregor3ecc6652010-04-21 05:52:38 +0000458 if (Opts.CPlusPlus)
459 Builder.defineMacro("_GNU_SOURCE");
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +0000460 if (this->HasFloat128)
461 Builder.defineMacro("__FLOAT128__");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000462 }
463public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000464 LinuxTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
465 : OSTargetInfo<Target>(Triple, Opts) {
Douglas Gregore6d6e512011-01-12 21:19:25 +0000466 this->WIntType = TargetInfo::UnsignedInt;
Hal Finkelecdb4542014-03-30 13:00:06 +0000467
468 switch (Triple.getArch()) {
469 default:
470 break;
471 case llvm::Triple::ppc:
472 case llvm::Triple::ppc64:
473 case llvm::Triple::ppc64le:
474 this->MCountName = "_mcount";
475 break;
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +0000476 case llvm::Triple::x86:
477 case llvm::Triple::x86_64:
478 case llvm::Triple::systemz:
479 this->HasFloat128 = true;
480 break;
Hal Finkelecdb4542014-03-30 13:00:06 +0000481 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000482 }
Benjamin Kramera518b222011-10-15 17:53:33 +0000483
Craig Topper3164f332014-03-11 03:39:26 +0000484 const char *getStaticInitSectionSpecifier() const override {
Benjamin Kramera518b222011-10-15 17:53:33 +0000485 return ".text.startup";
486 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000487};
488
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000489// NetBSD Target
490template<typename Target>
491class NetBSDTargetInfo : public OSTargetInfo<Target> {
492protected:
Craig Topper3164f332014-03-11 03:39:26 +0000493 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
494 MacroBuilder &Builder) const override {
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000495 // NetBSD defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000496 Builder.defineMacro("__NetBSD__");
497 Builder.defineMacro("__unix__");
498 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000499 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000500 Builder.defineMacro("_POSIX_THREADS");
Joerg Sonnenbergercc1edb52014-05-13 18:58:36 +0000501
502 switch (Triple.getArch()) {
503 default:
504 break;
505 case llvm::Triple::arm:
506 case llvm::Triple::armeb:
507 case llvm::Triple::thumb:
508 case llvm::Triple::thumbeb:
509 Builder.defineMacro("__ARM_DWARF_EH__");
510 break;
511 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000512 }
513public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000514 NetBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
515 : OSTargetInfo<Target>(Triple, Opts) {
Joerg Sonnenberger740f3f42015-04-10 21:02:53 +0000516 this->MCountName = "_mcount";
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000517 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000518};
519
Torok Edwinb2b37c62009-06-30 17:10:35 +0000520// OpenBSD Target
521template<typename Target>
522class OpenBSDTargetInfo : public OSTargetInfo<Target> {
523protected:
Craig Topper3164f332014-03-11 03:39:26 +0000524 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
525 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000526 // OpenBSD defines; list based off of gcc output
527
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000528 Builder.defineMacro("__OpenBSD__");
529 DefineStd(Builder, "unix", Opts);
530 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000531 if (Opts.POSIXThreads)
Chris Lattner024e12d2012-04-25 06:12:24 +0000532 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000533 }
534public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000535 OpenBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
536 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000537 this->TLSSupported = false;
Eli Friedman3715d1f2011-12-15 02:15:56 +0000538
Eli Friedman3715d1f2011-12-15 02:15:56 +0000539 switch (Triple.getArch()) {
540 default:
541 case llvm::Triple::x86:
542 case llvm::Triple::x86_64:
543 case llvm::Triple::arm:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000544 case llvm::Triple::sparc:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000545 this->MCountName = "__mcount";
546 break;
547 case llvm::Triple::mips64:
548 case llvm::Triple::mips64el:
549 case llvm::Triple::ppc:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000550 case llvm::Triple::sparcv9:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000551 this->MCountName = "_mcount";
552 break;
553 }
554 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000555};
556
Eli Friedman9fa28852012-08-08 23:57:20 +0000557// Bitrig Target
558template<typename Target>
559class BitrigTargetInfo : public OSTargetInfo<Target> {
560protected:
Craig Topper3164f332014-03-11 03:39:26 +0000561 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
562 MacroBuilder &Builder) const override {
Eli Friedman9fa28852012-08-08 23:57:20 +0000563 // Bitrig defines; list based off of gcc output
564
565 Builder.defineMacro("__Bitrig__");
566 DefineStd(Builder, "unix", Opts);
567 Builder.defineMacro("__ELF__");
568 if (Opts.POSIXThreads)
569 Builder.defineMacro("_REENTRANT");
Renato Golin9ba39232015-02-27 16:35:48 +0000570
571 switch (Triple.getArch()) {
572 default:
573 break;
574 case llvm::Triple::arm:
575 case llvm::Triple::armeb:
576 case llvm::Triple::thumb:
577 case llvm::Triple::thumbeb:
578 Builder.defineMacro("__ARM_DWARF_EH__");
579 break;
580 }
Eli Friedman9fa28852012-08-08 23:57:20 +0000581 }
582public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000583 BitrigTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
584 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000585 this->MCountName = "__mcount";
Eli Friedman9fa28852012-08-08 23:57:20 +0000586 }
587};
588
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000589// PSP Target
590template<typename Target>
591class PSPTargetInfo : public OSTargetInfo<Target> {
592protected:
Craig Topper3164f332014-03-11 03:39:26 +0000593 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
594 MacroBuilder &Builder) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000595 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000596 Builder.defineMacro("PSP");
597 Builder.defineMacro("_PSP");
598 Builder.defineMacro("__psp__");
599 Builder.defineMacro("__ELF__");
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000600 }
601public:
James Y Knightb214cbc2016-03-04 19:00:41 +0000602 PSPTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {}
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000603};
604
John Thompsone467e192009-11-19 17:18:50 +0000605// PS3 PPU Target
606template<typename Target>
607class PS3PPUTargetInfo : public OSTargetInfo<Target> {
608protected:
Craig Topper3164f332014-03-11 03:39:26 +0000609 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
610 MacroBuilder &Builder) const override {
John Thompsone467e192009-11-19 17:18:50 +0000611 // PS3 PPU defines.
John Thompson957816f2010-03-25 16:18:32 +0000612 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000613 Builder.defineMacro("__PPU__");
614 Builder.defineMacro("__CELLOS_LV2__");
615 Builder.defineMacro("__ELF__");
616 Builder.defineMacro("__LP32__");
John Thompson07a61a42010-06-24 22:44:13 +0000617 Builder.defineMacro("_ARCH_PPC64");
618 Builder.defineMacro("__powerpc64__");
John Thompsone467e192009-11-19 17:18:50 +0000619 }
620public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000621 PS3PPUTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
622 : OSTargetInfo<Target>(Triple, Opts) {
Nick Lewyckyc0a61732011-12-16 22:32:39 +0000623 this->LongWidth = this->LongAlign = 32;
624 this->PointerWidth = this->PointerAlign = 32;
John Thompson07a61a42010-06-24 22:44:13 +0000625 this->IntMaxType = TargetInfo::SignedLongLong;
John Thompson07a61a42010-06-24 22:44:13 +0000626 this->Int64Type = TargetInfo::SignedLongLong;
John Thompson6f8dba72009-12-18 14:21:08 +0000627 this->SizeType = TargetInfo::UnsignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +0000628 this->resetDataLayout("E-m:e-p:32:32-i64:64-n32:64");
John Thompsone467e192009-11-19 17:18:50 +0000629 }
630};
631
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000632template <typename Target>
633class PS4OSTargetInfo : public OSTargetInfo<Target> {
634protected:
635 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
636 MacroBuilder &Builder) const override {
637 Builder.defineMacro("__FreeBSD__", "9");
638 Builder.defineMacro("__FreeBSD_cc_version", "900001");
639 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
640 DefineStd(Builder, "unix", Opts);
641 Builder.defineMacro("__ELF__");
Paul Robinson9d613612016-05-16 17:22:25 +0000642 Builder.defineMacro("__ORBIS__");
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000643 }
644public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000645 PS4OSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
646 : OSTargetInfo<Target>(Triple, Opts) {
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000647 this->WCharType = this->UnsignedShort;
648
Paul Robinsond30e2ee2015-07-14 20:52:32 +0000649 // On PS4, TLS variable cannot be aligned to more than 32 bytes (256 bits).
650 this->MaxTLSAlign = 256;
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000651
Sunil Srivastava0ce2f222016-02-05 20:50:02 +0000652 // On PS4, do not honor explicit bit field alignment,
653 // as in "__attribute__((aligned(2))) int b : 1;".
654 this->UseExplicitBitFieldAlignment = false;
655
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000656 switch (Triple.getArch()) {
657 default:
658 case llvm::Triple::x86_64:
659 this->MCountName = ".mcount";
660 break;
661 }
662 }
663};
664
Torok Edwinb2b37c62009-06-30 17:10:35 +0000665// Solaris target
666template<typename Target>
667class SolarisTargetInfo : public OSTargetInfo<Target> {
668protected:
Craig Topper3164f332014-03-11 03:39:26 +0000669 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
670 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000671 DefineStd(Builder, "sun", Opts);
672 DefineStd(Builder, "unix", Opts);
673 Builder.defineMacro("__ELF__");
674 Builder.defineMacro("__svr4__");
675 Builder.defineMacro("__SVR4");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000676 // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and
677 // newer, but to 500 for everything else. feature_test.h has a check to
678 // ensure that you are not using C99 with an old version of X/Open or C89
Richard Smithab506ad2014-10-20 23:26:58 +0000679 // with a new version.
680 if (Opts.C99)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000681 Builder.defineMacro("_XOPEN_SOURCE", "600");
682 else
683 Builder.defineMacro("_XOPEN_SOURCE", "500");
David Chisnalle04307e2012-03-02 10:49:52 +0000684 if (Opts.CPlusPlus)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000685 Builder.defineMacro("__C99FEATURES__");
David Chisnall0c1941cb2012-02-17 18:35:11 +0000686 Builder.defineMacro("_LARGEFILE_SOURCE");
687 Builder.defineMacro("_LARGEFILE64_SOURCE");
688 Builder.defineMacro("__EXTENSIONS__");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000689 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000690 }
691public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000692 SolarisTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
693 : OSTargetInfo<Target>(Triple, Opts) {
David Chisnallb526e932012-03-28 18:04:14 +0000694 this->WCharType = this->SignedInt;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000695 // FIXME: WIntType should be SignedLong
696 }
697};
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000698
699// Windows target
700template<typename Target>
701class WindowsTargetInfo : public OSTargetInfo<Target> {
702protected:
Craig Topper3164f332014-03-11 03:39:26 +0000703 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
704 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000705 Builder.defineMacro("_WIN32");
706 }
707 void getVisualStudioDefines(const LangOptions &Opts,
708 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000709 if (Opts.CPlusPlus) {
David Majnemerf6072342014-07-01 22:24:56 +0000710 if (Opts.RTTIData)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000711 Builder.defineMacro("_CPPRTTI");
712
Reid Kleckner16514352015-01-30 21:42:55 +0000713 if (Opts.CXXExceptions)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000714 Builder.defineMacro("_CPPUNWIND");
715 }
716
David Majnemer6a658902015-07-22 22:36:26 +0000717 if (Opts.Bool)
718 Builder.defineMacro("__BOOL_DEFINED");
719
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000720 if (!Opts.CharIsSigned)
721 Builder.defineMacro("_CHAR_UNSIGNED");
722
723 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
724 // but it works for now.
725 if (Opts.POSIXThreads)
726 Builder.defineMacro("_MT");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000727
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +0000728 if (Opts.MSCompatibilityVersion) {
729 Builder.defineMacro("_MSC_VER",
730 Twine(Opts.MSCompatibilityVersion / 100000));
731 Builder.defineMacro("_MSC_FULL_VER", Twine(Opts.MSCompatibilityVersion));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000732 // FIXME We cannot encode the revision information into 32-bits
733 Builder.defineMacro("_MSC_BUILD", Twine(1));
David Majnemeraaf2b842015-03-18 07:53:18 +0000734
David Majnemerb710a932015-05-11 03:57:49 +0000735 if (Opts.CPlusPlus11 && Opts.isCompatibleWithMSVC(LangOptions::MSVC2015))
David Majnemeraaf2b842015-03-18 07:53:18 +0000736 Builder.defineMacro("_HAS_CHAR16_T_LANGUAGE_SUPPORT", Twine(1));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000737 }
Reid Kleckner6f6e76d2014-04-16 20:10:16 +0000738
739 if (Opts.MicrosoftExt) {
740 Builder.defineMacro("_MSC_EXTENSIONS");
741
742 if (Opts.CPlusPlus11) {
743 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
744 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
745 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
746 }
747 }
748
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000749 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000750 }
751
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000752public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000753 WindowsTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
754 : OSTargetInfo<Target>(Triple, Opts) {}
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000755};
756
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000757template <typename Target>
758class NaClTargetInfo : public OSTargetInfo<Target> {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000759protected:
Craig Topper3164f332014-03-11 03:39:26 +0000760 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
761 MacroBuilder &Builder) const override {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000762 if (Opts.POSIXThreads)
763 Builder.defineMacro("_REENTRANT");
764 if (Opts.CPlusPlus)
765 Builder.defineMacro("_GNU_SOURCE");
766
767 DefineStd(Builder, "unix", Opts);
768 Builder.defineMacro("__ELF__");
769 Builder.defineMacro("__native_client__");
770 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000771
772public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000773 NaClTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
774 : OSTargetInfo<Target>(Triple, Opts) {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000775 this->LongAlign = 32;
776 this->LongWidth = 32;
777 this->PointerAlign = 32;
778 this->PointerWidth = 32;
779 this->IntMaxType = TargetInfo::SignedLongLong;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000780 this->Int64Type = TargetInfo::SignedLongLong;
781 this->DoubleAlign = 64;
782 this->LongDoubleWidth = 64;
783 this->LongDoubleAlign = 64;
Jan Wen Voung1f9c4ee2014-01-15 21:42:41 +0000784 this->LongLongWidth = 64;
785 this->LongLongAlign = 64;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000786 this->SizeType = TargetInfo::UnsignedInt;
787 this->PtrDiffType = TargetInfo::SignedInt;
788 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +0000789 // RegParmMax is inherited from the underlying architecture
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000790 this->LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Rafael Espindola1c09b262013-12-18 23:41:04 +0000791 if (Triple.getArch() == llvm::Triple::arm) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +0000792 // Handled in ARM's setABI().
Rafael Espindola1c09b262013-12-18 23:41:04 +0000793 } else if (Triple.getArch() == llvm::Triple::x86) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000794 this->resetDataLayout("e-m:e-p:32:32-i64:64-n8:16:32-S128");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000795 } else if (Triple.getArch() == llvm::Triple::x86_64) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000796 this->resetDataLayout("e-m:e-p:32:32-i64:64-n8:16:32:64-S128");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000797 } else if (Triple.getArch() == llvm::Triple::mipsel) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000798 // Handled on mips' setDataLayout.
Rafael Espindola1c09b262013-12-18 23:41:04 +0000799 } else {
800 assert(Triple.getArch() == llvm::Triple::le32);
James Y Knightb214cbc2016-03-04 19:00:41 +0000801 this->resetDataLayout("e-p:32:32-i64:64");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000802 }
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000803 }
804};
Torok Edwinb2b37c62009-06-30 17:10:35 +0000805
Dan Gohmanc2853072015-09-03 22:51:53 +0000806// WebAssembly target
807template <typename Target>
808class WebAssemblyOSTargetInfo : public OSTargetInfo<Target> {
809 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Hans Wennborg7eb54642015-09-10 17:07:54 +0000810 MacroBuilder &Builder) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +0000811 // A common platform macro.
812 if (Opts.POSIXThreads)
813 Builder.defineMacro("_REENTRANT");
814 // Follow g++ convention and predefine _GNU_SOURCE for C++.
815 if (Opts.CPlusPlus)
816 Builder.defineMacro("_GNU_SOURCE");
817 }
818
819 // As an optimization, group static init code together in a section.
Hans Wennborg7eb54642015-09-10 17:07:54 +0000820 const char *getStaticInitSectionSpecifier() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +0000821 return ".text.__startup";
822 }
823
824public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000825 explicit WebAssemblyOSTargetInfo(const llvm::Triple &Triple,
826 const TargetOptions &Opts)
827 : OSTargetInfo<Target>(Triple, Opts) {
Dan Gohmanc2853072015-09-03 22:51:53 +0000828 this->MCountName = "__mcount";
Dan Gohmanc2853072015-09-03 22:51:53 +0000829 this->TheCXXABI.set(TargetCXXABI::WebAssembly);
830 }
831};
Dan Gohmanc2853072015-09-03 22:51:53 +0000832
Chris Lattner09d98f52008-10-05 21:50:58 +0000833//===----------------------------------------------------------------------===//
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000834// Specific target implementations.
835//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000836
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000837// PPC abstract base class
838class PPCTargetInfo : public TargetInfo {
839 static const Builtin::Info BuiltinInfo[];
840 static const char * const GCCRegNames[];
841 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Hal Finkel8eb59282012-06-11 22:35:19 +0000842 std::string CPU;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000843
844 // Target cpu features.
845 bool HasVSX;
Bill Schmidt8c184e32014-10-10 17:21:23 +0000846 bool HasP8Vector;
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +0000847 bool HasP8Crypto;
Nemanja Ivanovic35458c22015-04-11 10:43:36 +0000848 bool HasDirectMove;
Hal Finkel0d0a1a52015-03-11 19:14:15 +0000849 bool HasQPX;
Kit Barton8246f282015-03-25 19:41:41 +0000850 bool HasHTM;
Nemanja Ivanovic239eec72015-04-09 23:58:16 +0000851 bool HasBPERMD;
852 bool HasExtDiv;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000853
Ulrich Weigand8afad612014-07-28 13:17:52 +0000854protected:
855 std::string ABI;
856
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000857public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000858 PPCTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Saleem Abdulrasool10a49722016-04-08 16:52:00 +0000859 : TargetInfo(Triple), HasVSX(false), HasP8Vector(false),
860 HasP8Crypto(false), HasDirectMove(false), HasQPX(false), HasHTM(false),
Nemanja Ivanovicd7d45bf2016-04-15 18:04:13 +0000861 HasBPERMD(false), HasExtDiv(false) {
Bill Schmidt778d3872013-07-26 01:36:11 +0000862 BigEndian = (Triple.getArch() != llvm::Triple::ppc64le);
Alexey Bataev00396512015-07-02 03:40:19 +0000863 SimdDefaultAlign = 128;
Nico Weber3435ede2012-01-31 02:07:33 +0000864 LongDoubleWidth = LongDoubleAlign = 128;
865 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble;
866 }
Eli Friedman9ffd4a92009-06-05 07:05:05 +0000867
Hal Finkel6b984f02012-07-03 16:51:04 +0000868 /// \brief Flags for architecture specific defines.
869 typedef enum {
870 ArchDefineNone = 0,
871 ArchDefineName = 1 << 0, // <name> is substituted for arch name.
872 ArchDefinePpcgr = 1 << 1,
873 ArchDefinePpcsq = 1 << 2,
874 ArchDefine440 = 1 << 3,
875 ArchDefine603 = 1 << 4,
876 ArchDefine604 = 1 << 5,
877 ArchDefinePwr4 = 1 << 6,
Bill Schmidt38378a02013-02-01 20:23:10 +0000878 ArchDefinePwr5 = 1 << 7,
879 ArchDefinePwr5x = 1 << 8,
880 ArchDefinePwr6 = 1 << 9,
881 ArchDefinePwr6x = 1 << 10,
882 ArchDefinePwr7 = 1 << 11,
Will Schmidtf0487512014-06-26 13:34:10 +0000883 ArchDefinePwr8 = 1 << 12,
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +0000884 ArchDefinePwr9 = 1 << 13,
885 ArchDefineA2 = 1 << 14,
886 ArchDefineA2q = 1 << 15
Hal Finkel6b984f02012-07-03 16:51:04 +0000887 } ArchDefineTypes;
888
Bill Schmidt38378a02013-02-01 20:23:10 +0000889 // Note: GCC recognizes the following additional cpus:
890 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
891 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
892 // titan, rs64.
Craig Topper3164f332014-03-11 03:39:26 +0000893 bool setCPU(const std::string &Name) override {
Hal Finkel8eb59282012-06-11 22:35:19 +0000894 bool CPUKnown = llvm::StringSwitch<bool>(Name)
895 .Case("generic", true)
896 .Case("440", true)
897 .Case("450", true)
898 .Case("601", true)
899 .Case("602", true)
900 .Case("603", true)
901 .Case("603e", true)
902 .Case("603ev", true)
903 .Case("604", true)
904 .Case("604e", true)
905 .Case("620", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000906 .Case("630", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000907 .Case("g3", true)
908 .Case("7400", true)
909 .Case("g4", true)
910 .Case("7450", true)
911 .Case("g4+", true)
912 .Case("750", true)
913 .Case("970", true)
914 .Case("g5", true)
915 .Case("a2", true)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +0000916 .Case("a2q", true)
Hal Finkelf6d6cb02012-09-18 22:25:03 +0000917 .Case("e500mc", true)
918 .Case("e5500", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000919 .Case("power3", true)
920 .Case("pwr3", true)
921 .Case("power4", true)
922 .Case("pwr4", true)
923 .Case("power5", true)
924 .Case("pwr5", true)
925 .Case("power5x", true)
926 .Case("pwr5x", true)
927 .Case("power6", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000928 .Case("pwr6", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000929 .Case("power6x", true)
930 .Case("pwr6x", true)
931 .Case("power7", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000932 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +0000933 .Case("power8", true)
934 .Case("pwr8", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +0000935 .Case("power9", true)
936 .Case("pwr9", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000937 .Case("powerpc", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000938 .Case("ppc", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000939 .Case("powerpc64", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000940 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +0000941 .Case("powerpc64le", true)
942 .Case("ppc64le", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000943 .Default(false);
944
945 if (CPUKnown)
946 CPU = Name;
947
948 return CPUKnown;
949 }
950
Ulrich Weigand8afad612014-07-28 13:17:52 +0000951
952 StringRef getABI() const override { return ABI; }
953
Craig Topper6c03a542015-10-19 04:51:35 +0000954 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
955 return llvm::makeArrayRef(BuiltinInfo,
956 clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner10a5b382007-01-29 05:24:35 +0000957 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000958
Craig Topper3164f332014-03-11 03:39:26 +0000959 bool isCLZForZeroUndef() const override { return false; }
Bob Wilson19a2f2b2012-01-28 18:02:29 +0000960
Craig Topper3164f332014-03-11 03:39:26 +0000961 void getTargetDefines(const LangOptions &Opts,
962 MacroBuilder &Builder) const override;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000963
Eric Christopher8c47b422015-10-09 18:39:55 +0000964 bool
965 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
966 StringRef CPU,
967 const std::vector<std::string> &FeaturesVec) const override;
Bill Schmidt2fe4c672013-02-01 02:14:03 +0000968
Craig Topper3164f332014-03-11 03:39:26 +0000969 bool handleTargetFeatures(std::vector<std::string> &Features,
970 DiagnosticsEngine &Diags) override;
971 bool hasFeature(StringRef Feature) const override;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +0000972 void setFeatureEnabled(llvm::StringMap<bool> &Features, StringRef Name,
973 bool Enabled) const override;
Craig Topper3164f332014-03-11 03:39:26 +0000974
Craig Topperf054e3a2015-10-19 03:52:27 +0000975 ArrayRef<const char *> getGCCRegNames() const override;
976 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +0000977 bool validateAsmConstraint(const char *&Name,
978 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +0000979 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +0000980 default: return false;
981 case 'O': // Zero
John Thompson07a61a42010-06-24 22:44:13 +0000982 break;
Anders Carlssonf511f642007-11-27 04:11:28 +0000983 case 'b': // Base register
984 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +0000985 Info.setAllowsRegister();
John Thompson07a61a42010-06-24 22:44:13 +0000986 break;
987 // FIXME: The following are added to allow parsing.
988 // I just took a guess at what the actions should be.
989 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000990 case 'd': // Floating point register (containing 64-bit value)
John Thompson07a61a42010-06-24 22:44:13 +0000991 case 'v': // Altivec vector register
992 Info.setAllowsRegister();
993 break;
994 case 'w':
995 switch (Name[1]) {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000996 case 'd':// VSX vector register to hold vector double data
997 case 'f':// VSX vector register to hold vector float data
998 case 's':// VSX vector register to hold scalar float data
999 case 'a':// Any VSX register
Hal Finkelf7a07a52014-03-02 18:24:18 +00001000 case 'c':// An individual CR bit
John Thompson07a61a42010-06-24 22:44:13 +00001001 break;
1002 default:
1003 return false;
1004 }
1005 Info.setAllowsRegister();
1006 Name++; // Skip over 'w'.
1007 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001008 case 'h': // `MQ', `CTR', or `LINK' register
1009 case 'q': // `MQ' register
1010 case 'c': // `CTR' register
1011 case 'l': // `LINK' register
1012 case 'x': // `CR' register (condition register) number 0
1013 case 'y': // `CR' register (condition register)
1014 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson07a61a42010-06-24 22:44:13 +00001015 Info.setAllowsRegister();
1016 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001017 case 'I': // Signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +00001018 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001019 // (use `L' instead for SImode constants)
1020 case 'K': // Unsigned 16-bit constant
1021 case 'L': // Signed 16-bit constant shifted left 16 bits
1022 case 'M': // Constant larger than 31
1023 case 'N': // Exact power of 2
1024 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +00001025 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001026 // register with one instruction per word
John Thompson07a61a42010-06-24 22:44:13 +00001027 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001028 // into a register using three instructions
John Thompson07a61a42010-06-24 22:44:13 +00001029 break;
1030 case 'm': // Memory operand. Note that on PowerPC targets, m can
1031 // include addresses that update the base register. It
1032 // is therefore only safe to use `m' in an asm statement
1033 // if that asm statement accesses the operand exactly once.
1034 // The asm statement must also use `%U<opno>' as a
Sebastian Redldd008712010-08-17 22:42:34 +00001035 // placeholder for the "update" flag in the corresponding
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001036 // load or store instruction. For example:
John Thompson07a61a42010-06-24 22:44:13 +00001037 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001038 // is correct but:
John Thompson07a61a42010-06-24 22:44:13 +00001039 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
1040 // is not. Use es rather than m if you don't want the base
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001041 // register to be updated.
1042 case 'e':
John Thompsonceebdf12010-06-25 00:02:05 +00001043 if (Name[1] != 's')
1044 return false;
Sebastian Redldd008712010-08-17 22:42:34 +00001045 // es: A "stable" memory operand; that is, one which does not
John Thompson07a61a42010-06-24 22:44:13 +00001046 // include any automodification of the base register. Unlike
1047 // `m', this constraint can be used in asm statements that
1048 // might access the operand several times, or that might not
John Thompsonceebdf12010-06-25 00:02:05 +00001049 // access it at all.
John Thompson07a61a42010-06-24 22:44:13 +00001050 Info.setAllowsMemory();
John Thompsonceebdf12010-06-25 00:02:05 +00001051 Name++; // Skip over 'e'.
John Thompson07a61a42010-06-24 22:44:13 +00001052 break;
1053 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001054 // usually better to use `m' or `es' in asm statements)
John Thompson07a61a42010-06-24 22:44:13 +00001055 case 'Z': // Memory operand that is an indexed or indirect from a
1056 // register (it is usually better to use `m' or `es' in
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001057 // asm statements)
John Thompson07a61a42010-06-24 22:44:13 +00001058 Info.setAllowsMemory();
1059 Info.setAllowsRegister();
1060 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001061 case 'R': // AIX TOC entry
John Thompson07a61a42010-06-24 22:44:13 +00001062 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001063 // register (`p' is preferable for asm statements)
1064 case 'S': // Constant suitable as a 64-bit mask operand
1065 case 'T': // Constant suitable as a 32-bit mask operand
1066 case 'U': // System V Release 4 small data area reference
John Thompson07a61a42010-06-24 22:44:13 +00001067 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001068 // instructions
1069 case 'W': // Vector constant that does not require memory
1070 case 'j': // Vector constant that is all zeros.
John Thompson07a61a42010-06-24 22:44:13 +00001071 break;
1072 // End FIXME.
Anders Carlssonf511f642007-11-27 04:11:28 +00001073 }
John Thompson07a61a42010-06-24 22:44:13 +00001074 return true;
Anders Carlssonf511f642007-11-27 04:11:28 +00001075 }
Craig Topper3164f332014-03-11 03:39:26 +00001076 std::string convertConstraint(const char *&Constraint) const override {
Hal Finkelf7a07a52014-03-02 18:24:18 +00001077 std::string R;
1078 switch (*Constraint) {
1079 case 'e':
1080 case 'w':
1081 // Two-character constraint; add "^" hint for later parsing.
1082 R = std::string("^") + std::string(Constraint, 2);
1083 Constraint++;
1084 break;
1085 default:
1086 return TargetInfo::convertConstraint(Constraint);
1087 }
1088 return R;
1089 }
Craig Topper3164f332014-03-11 03:39:26 +00001090 const char *getClobbers() const override {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001091 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +00001092 }
Craig Topper3164f332014-03-11 03:39:26 +00001093 int getEHDataRegisterNumber(unsigned RegNo) const override {
Adhemerval Zanella5d874ae2013-01-22 20:02:45 +00001094 if (RegNo == 0) return 3;
1095 if (RegNo == 1) return 4;
1096 return -1;
1097 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00001098
1099 bool hasSjLjLowering() const override {
1100 return true;
1101 }
David Majnemer2617ea62015-06-09 18:05:33 +00001102
1103 bool useFloat128ManglingForLongDouble() const override {
1104 return LongDoubleWidth == 128 &&
1105 LongDoubleFormat == &llvm::APFloat::PPCDoubleDouble &&
1106 getTriple().isOSBinFormatELF();
1107 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001108};
Anders Carlssonf511f642007-11-27 04:11:28 +00001109
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001110const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00001111#define BUILTIN(ID, TYPE, ATTRS) \
1112 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1113#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1114 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5abdec72009-06-14 01:05:48 +00001115#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001116};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001117
Eric Christopher917e9522014-11-18 22:36:15 +00001118/// handleTargetFeatures - Perform initialization based on the user
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001119/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00001120bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001121 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00001122 for (const auto &Feature : Features) {
1123 if (Feature == "+vsx") {
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001124 HasVSX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001125 } else if (Feature == "+bpermd") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001126 HasBPERMD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001127 } else if (Feature == "+extdiv") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001128 HasExtDiv = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001129 } else if (Feature == "+power8-vector") {
Bill Schmidt8c184e32014-10-10 17:21:23 +00001130 HasP8Vector = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001131 } else if (Feature == "+crypto") {
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001132 HasP8Crypto = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001133 } else if (Feature == "+direct-move") {
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001134 HasDirectMove = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001135 } else if (Feature == "+qpx") {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001136 HasQPX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001137 } else if (Feature == "+htm") {
Kit Barton8246f282015-03-25 19:41:41 +00001138 HasHTM = true;
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001139 } else if (Feature == "+float128") {
1140 HasFloat128 = true;
Kit Barton8246f282015-03-25 19:41:41 +00001141 }
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001142 // TODO: Finish this list and add an assert that we've handled them
1143 // all.
1144 }
Eric Christopher02c33352015-08-25 00:59:11 +00001145
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001146 return true;
1147}
1148
Chris Lattnerecd49032009-03-02 22:27:17 +00001149/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
1150/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001151void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001152 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00001153 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001154 Builder.defineMacro("__ppc__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001155 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001156 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001157 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001158 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001159 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001160 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001161 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001162 Builder.defineMacro("__ppc64__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001163 Builder.defineMacro("__PPC64__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001164 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001165
Chris Lattnerecd49032009-03-02 22:27:17 +00001166 // Target properties.
Bill Schmidt778d3872013-07-26 01:36:11 +00001167 if (getTriple().getArch() == llvm::Triple::ppc64le) {
1168 Builder.defineMacro("_LITTLE_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001169 } else {
1170 if (getTriple().getOS() != llvm::Triple::NetBSD &&
1171 getTriple().getOS() != llvm::Triple::OpenBSD)
1172 Builder.defineMacro("_BIG_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001173 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001174
Ulrich Weigand8afad612014-07-28 13:17:52 +00001175 // ABI options.
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001176 if (ABI == "elfv1" || ABI == "elfv1-qpx")
Ulrich Weigand8afad612014-07-28 13:17:52 +00001177 Builder.defineMacro("_CALL_ELF", "1");
1178 if (ABI == "elfv2")
1179 Builder.defineMacro("_CALL_ELF", "2");
1180
Chris Lattnerecd49032009-03-02 22:27:17 +00001181 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001182 Builder.defineMacro("__NATURAL_ALIGNMENT__");
1183 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001184
Chris Lattnerecd49032009-03-02 22:27:17 +00001185 // FIXME: Should be controlled by command line option.
Roman Divacky13b586f2013-07-03 19:45:54 +00001186 if (LongDoubleWidth == 128)
1187 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001188
John Thompsone467e192009-11-19 17:18:50 +00001189 if (Opts.AltiVec) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001190 Builder.defineMacro("__VEC__", "10206");
1191 Builder.defineMacro("__ALTIVEC__");
John Thompsone467e192009-11-19 17:18:50 +00001192 }
Hal Finkel8eb59282012-06-11 22:35:19 +00001193
1194 // CPU identification.
Hal Finkel6b984f02012-07-03 16:51:04 +00001195 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
1196 .Case("440", ArchDefineName)
1197 .Case("450", ArchDefineName | ArchDefine440)
1198 .Case("601", ArchDefineName)
1199 .Case("602", ArchDefineName | ArchDefinePpcgr)
1200 .Case("603", ArchDefineName | ArchDefinePpcgr)
1201 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1202 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1203 .Case("604", ArchDefineName | ArchDefinePpcgr)
1204 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
1205 .Case("620", ArchDefineName | ArchDefinePpcgr)
Bill Schmidt38378a02013-02-01 20:23:10 +00001206 .Case("630", ArchDefineName | ArchDefinePpcgr)
Hal Finkel6b984f02012-07-03 16:51:04 +00001207 .Case("7400", ArchDefineName | ArchDefinePpcgr)
1208 .Case("7450", ArchDefineName | ArchDefinePpcgr)
1209 .Case("750", ArchDefineName | ArchDefinePpcgr)
1210 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1211 | ArchDefinePpcsq)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001212 .Case("a2", ArchDefineA2)
1213 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
Bill Schmidt38378a02013-02-01 20:23:10 +00001214 .Case("pwr3", ArchDefinePpcgr)
1215 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
1216 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1217 | ArchDefinePpcsq)
1218 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4
1219 | ArchDefinePpcgr | ArchDefinePpcsq)
1220 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5
1221 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1222 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x
1223 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1224 | ArchDefinePpcsq)
1225 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6
1226 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001227 | ArchDefinePpcgr | ArchDefinePpcsq)
1228 .Case("pwr8", ArchDefineName | ArchDefinePwr7 | ArchDefinePwr6x
1229 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1230 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001231 .Case("pwr9", ArchDefineName | ArchDefinePwr8 | ArchDefinePwr7
1232 | ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1233 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1234 | ArchDefinePpcsq)
Bill Schmidt38378a02013-02-01 20:23:10 +00001235 .Case("power3", ArchDefinePpcgr)
1236 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1237 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1238 | ArchDefinePpcsq)
1239 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1240 | ArchDefinePpcgr | ArchDefinePpcsq)
1241 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1242 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1243 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1244 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1245 | ArchDefinePpcsq)
1246 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6
1247 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001248 | ArchDefinePpcgr | ArchDefinePpcsq)
1249 .Case("power8", ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr6x
1250 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1251 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001252 .Case("power9", ArchDefinePwr9 | ArchDefinePwr8 | ArchDefinePwr7
1253 | ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1254 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1255 | ArchDefinePpcsq)
Hal Finkel6b984f02012-07-03 16:51:04 +00001256 .Default(ArchDefineNone);
1257
1258 if (defs & ArchDefineName)
1259 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
1260 if (defs & ArchDefinePpcgr)
1261 Builder.defineMacro("_ARCH_PPCGR");
1262 if (defs & ArchDefinePpcsq)
1263 Builder.defineMacro("_ARCH_PPCSQ");
1264 if (defs & ArchDefine440)
Hal Finkel8eb59282012-06-11 22:35:19 +00001265 Builder.defineMacro("_ARCH_440");
Hal Finkel6b984f02012-07-03 16:51:04 +00001266 if (defs & ArchDefine603)
1267 Builder.defineMacro("_ARCH_603");
1268 if (defs & ArchDefine604)
1269 Builder.defineMacro("_ARCH_604");
Bill Schmidt38378a02013-02-01 20:23:10 +00001270 if (defs & ArchDefinePwr4)
Hal Finkel6b984f02012-07-03 16:51:04 +00001271 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt38378a02013-02-01 20:23:10 +00001272 if (defs & ArchDefinePwr5)
Hal Finkel6b984f02012-07-03 16:51:04 +00001273 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt38378a02013-02-01 20:23:10 +00001274 if (defs & ArchDefinePwr5x)
1275 Builder.defineMacro("_ARCH_PWR5X");
1276 if (defs & ArchDefinePwr6)
Hal Finkel8eb59282012-06-11 22:35:19 +00001277 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt38378a02013-02-01 20:23:10 +00001278 if (defs & ArchDefinePwr6x)
1279 Builder.defineMacro("_ARCH_PWR6X");
1280 if (defs & ArchDefinePwr7)
1281 Builder.defineMacro("_ARCH_PWR7");
Will Schmidtf0487512014-06-26 13:34:10 +00001282 if (defs & ArchDefinePwr8)
1283 Builder.defineMacro("_ARCH_PWR8");
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001284 if (defs & ArchDefinePwr9)
1285 Builder.defineMacro("_ARCH_PWR9");
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001286 if (defs & ArchDefineA2)
1287 Builder.defineMacro("_ARCH_A2");
1288 if (defs & ArchDefineA2q) {
1289 Builder.defineMacro("_ARCH_A2Q");
1290 Builder.defineMacro("_ARCH_QP");
1291 }
1292
1293 if (getTriple().getVendor() == llvm::Triple::BGQ) {
1294 Builder.defineMacro("__bg__");
1295 Builder.defineMacro("__THW_BLUEGENE__");
1296 Builder.defineMacro("__bgq__");
1297 Builder.defineMacro("__TOS_BGQ__");
1298 }
Bill Schmidt38378a02013-02-01 20:23:10 +00001299
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001300 if (HasVSX)
1301 Builder.defineMacro("__VSX__");
Bill Schmidt8c184e32014-10-10 17:21:23 +00001302 if (HasP8Vector)
Bill Schmidt59eb7672014-10-10 15:09:43 +00001303 Builder.defineMacro("__POWER8_VECTOR__");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001304 if (HasP8Crypto)
1305 Builder.defineMacro("__CRYPTO__");
Kit Barton8246f282015-03-25 19:41:41 +00001306 if (HasHTM)
1307 Builder.defineMacro("__HTM__");
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001308 if (HasFloat128)
1309 Builder.defineMacro("__FLOAT128__");
Hal Finkela57b8902015-10-01 13:39:49 +00001310
1311 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
1312 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
1313 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
1314 if (PointerWidth == 64)
1315 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001316
Bill Schmidt38378a02013-02-01 20:23:10 +00001317 // FIXME: The following are not yet generated here by Clang, but are
1318 // generated by GCC:
1319 //
1320 // _SOFT_FLOAT_
1321 // __RECIP_PRECISION__
1322 // __APPLE_ALTIVEC__
Bill Schmidt38378a02013-02-01 20:23:10 +00001323 // __RECIP__
1324 // __RECIPF__
1325 // __RSQRTE__
1326 // __RSQRTEF__
1327 // _SOFT_DOUBLE_
1328 // __NO_LWSYNC__
1329 // __HAVE_BSWAP__
1330 // __LONGDOUBLE128
1331 // __CMODEL_MEDIUM__
1332 // __CMODEL_LARGE__
1333 // _CALL_SYSV
1334 // _CALL_DARWIN
1335 // __NO_FPRS__
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001336}
1337
Eric Christophera8a14c32015-08-31 18:39:16 +00001338// Handle explicit options being passed to the compiler here: if we've
1339// explicitly turned off vsx and turned on power8-vector or direct-move then
1340// go ahead and error since the customer has expressed a somewhat incompatible
1341// set of options.
1342static bool ppcUserFeaturesCheck(DiagnosticsEngine &Diags,
Eric Christopher8c47b422015-10-09 18:39:55 +00001343 const std::vector<std::string> &FeaturesVec) {
Eric Christophera8a14c32015-08-31 18:39:16 +00001344
1345 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "-vsx") !=
1346 FeaturesVec.end()) {
1347 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+power8-vector") !=
1348 FeaturesVec.end()) {
1349 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mpower8-vector"
1350 << "-mno-vsx";
1351 return false;
1352 }
1353
1354 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+direct-move") !=
1355 FeaturesVec.end()) {
1356 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mdirect-move"
1357 << "-mno-vsx";
1358 return false;
1359 }
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001360
1361 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+float128") !=
1362 FeaturesVec.end()) {
1363 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mfloat128"
1364 << "-mno-vsx";
1365 return false;
1366 }
Eric Christophera8a14c32015-08-31 18:39:16 +00001367 }
1368
1369 return true;
1370}
1371
Eric Christopher8c47b422015-10-09 18:39:55 +00001372bool PPCTargetInfo::initFeatureMap(
1373 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
1374 const std::vector<std::string> &FeaturesVec) const {
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001375 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1376 .Case("7400", true)
1377 .Case("g4", true)
1378 .Case("7450", true)
1379 .Case("g4+", true)
1380 .Case("970", true)
1381 .Case("g5", true)
1382 .Case("pwr6", true)
1383 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +00001384 .Case("pwr8", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001385 .Case("pwr9", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001386 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +00001387 .Case("ppc64le", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001388 .Default(false);
Hal Finkelb58ce852013-02-01 18:44:19 +00001389
1390 Features["qpx"] = (CPU == "a2q");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001391 Features["crypto"] = llvm::StringSwitch<bool>(CPU)
1392 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001393 .Case("pwr9", true)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001394 .Case("pwr8", true)
1395 .Default(false);
1396 Features["power8-vector"] = llvm::StringSwitch<bool>(CPU)
1397 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001398 .Case("pwr9", true)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001399 .Case("pwr8", true)
1400 .Default(false);
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001401 Features["bpermd"] = llvm::StringSwitch<bool>(CPU)
1402 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001403 .Case("pwr9", true)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001404 .Case("pwr8", true)
1405 .Case("pwr7", true)
1406 .Default(false);
1407 Features["extdiv"] = llvm::StringSwitch<bool>(CPU)
1408 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001409 .Case("pwr9", true)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001410 .Case("pwr8", true)
1411 .Case("pwr7", true)
1412 .Default(false);
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001413 Features["direct-move"] = llvm::StringSwitch<bool>(CPU)
1414 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001415 .Case("pwr9", true)
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001416 .Case("pwr8", true)
1417 .Default(false);
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001418 Features["vsx"] = llvm::StringSwitch<bool>(CPU)
1419 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001420 .Case("pwr9", true)
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001421 .Case("pwr8", true)
1422 .Case("pwr7", true)
1423 .Default(false);
Eric Christopheref1e2952015-08-28 02:13:58 +00001424
Eric Christophera8a14c32015-08-31 18:39:16 +00001425 if (!ppcUserFeaturesCheck(Diags, FeaturesVec))
1426 return false;
Eric Christopher007b0a02015-08-28 22:32:01 +00001427
Eric Christopher007b0a02015-08-28 22:32:01 +00001428 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001429}
1430
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001431bool PPCTargetInfo::hasFeature(StringRef Feature) const {
Bill Schmidte6e9d152014-11-02 14:56:41 +00001432 return llvm::StringSwitch<bool>(Feature)
1433 .Case("powerpc", true)
1434 .Case("vsx", HasVSX)
1435 .Case("power8-vector", HasP8Vector)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001436 .Case("crypto", HasP8Crypto)
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001437 .Case("direct-move", HasDirectMove)
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001438 .Case("qpx", HasQPX)
Kit Barton8246f282015-03-25 19:41:41 +00001439 .Case("htm", HasHTM)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001440 .Case("bpermd", HasBPERMD)
1441 .Case("extdiv", HasExtDiv)
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001442 .Case("float128", HasFloat128)
Bill Schmidte6e9d152014-11-02 14:56:41 +00001443 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001444}
Chris Lattner17df24e2008-04-21 18:56:49 +00001445
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001446void PPCTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
1447 StringRef Name, bool Enabled) const {
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001448 // If we're enabling direct-move or power8-vector go ahead and enable vsx
1449 // as well. Do the inverse if we're disabling vsx. We'll diagnose any user
1450 // incompatible options.
1451 if (Enabled) {
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001452 if (Name == "direct-move") {
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001453 Features[Name] = Features["vsx"] = true;
1454 } else if (Name == "power8-vector") {
1455 Features[Name] = Features["vsx"] = true;
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001456 } else if (Name == "float128") {
1457 Features[Name] = Features["vsx"] = true;
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001458 } else {
1459 Features[Name] = true;
1460 }
1461 } else {
1462 if (Name == "vsx") {
1463 Features[Name] = Features["direct-move"] = Features["power8-vector"] =
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001464 Features["float128"] = false;
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001465 } else {
1466 Features[Name] = false;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001467 }
1468 }
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001469}
1470
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001471const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001472 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1473 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1474 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1475 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1476 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1477 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1478 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1479 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001480 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001481 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001482 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001483 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1484 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1485 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1486 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001487 "vrsave", "vscr",
1488 "spe_acc", "spefscr",
1489 "sfp"
1490};
Chris Lattner10a5b382007-01-29 05:24:35 +00001491
Craig Topperf054e3a2015-10-19 03:52:27 +00001492ArrayRef<const char*> PPCTargetInfo::getGCCRegNames() const {
1493 return llvm::makeArrayRef(GCCRegNames);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001494}
Chris Lattner5ba61f02006-10-14 07:39:34 +00001495
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001496const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1497 // While some of these aliases do map to different registers
1498 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001499 { { "0" }, "r0" },
1500 { { "1"}, "r1" },
1501 { { "2" }, "r2" },
1502 { { "3" }, "r3" },
1503 { { "4" }, "r4" },
1504 { { "5" }, "r5" },
1505 { { "6" }, "r6" },
1506 { { "7" }, "r7" },
1507 { { "8" }, "r8" },
1508 { { "9" }, "r9" },
1509 { { "10" }, "r10" },
1510 { { "11" }, "r11" },
1511 { { "12" }, "r12" },
1512 { { "13" }, "r13" },
1513 { { "14" }, "r14" },
1514 { { "15" }, "r15" },
1515 { { "16" }, "r16" },
1516 { { "17" }, "r17" },
1517 { { "18" }, "r18" },
1518 { { "19" }, "r19" },
1519 { { "20" }, "r20" },
1520 { { "21" }, "r21" },
1521 { { "22" }, "r22" },
1522 { { "23" }, "r23" },
1523 { { "24" }, "r24" },
1524 { { "25" }, "r25" },
1525 { { "26" }, "r26" },
1526 { { "27" }, "r27" },
1527 { { "28" }, "r28" },
1528 { { "29" }, "r29" },
1529 { { "30" }, "r30" },
1530 { { "31" }, "r31" },
1531 { { "fr0" }, "f0" },
1532 { { "fr1" }, "f1" },
1533 { { "fr2" }, "f2" },
1534 { { "fr3" }, "f3" },
1535 { { "fr4" }, "f4" },
1536 { { "fr5" }, "f5" },
1537 { { "fr6" }, "f6" },
1538 { { "fr7" }, "f7" },
1539 { { "fr8" }, "f8" },
1540 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +00001541 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001542 { { "fr11" }, "f11" },
1543 { { "fr12" }, "f12" },
1544 { { "fr13" }, "f13" },
1545 { { "fr14" }, "f14" },
1546 { { "fr15" }, "f15" },
1547 { { "fr16" }, "f16" },
1548 { { "fr17" }, "f17" },
1549 { { "fr18" }, "f18" },
1550 { { "fr19" }, "f19" },
1551 { { "fr20" }, "f20" },
1552 { { "fr21" }, "f21" },
1553 { { "fr22" }, "f22" },
1554 { { "fr23" }, "f23" },
1555 { { "fr24" }, "f24" },
1556 { { "fr25" }, "f25" },
1557 { { "fr26" }, "f26" },
1558 { { "fr27" }, "f27" },
1559 { { "fr28" }, "f28" },
1560 { { "fr29" }, "f29" },
1561 { { "fr30" }, "f30" },
1562 { { "fr31" }, "f31" },
1563 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001564};
1565
Craig Topperf054e3a2015-10-19 03:52:27 +00001566ArrayRef<TargetInfo::GCCRegAlias> PPCTargetInfo::getGCCRegAliases() const {
1567 return llvm::makeArrayRef(GCCRegAliases);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001568}
Chris Lattner02dffbd2006-10-14 07:50:21 +00001569
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001570class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001571public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001572 PPC32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1573 : PPCTargetInfo(Triple, Opts) {
James Y Knightb214cbc2016-03-04 19:00:41 +00001574 resetDataLayout("E-m:e-p:32:32-i64:64-n32");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001575
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001576 switch (getTriple().getOS()) {
Nico Weber3435ede2012-01-31 02:07:33 +00001577 case llvm::Triple::Linux:
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001578 case llvm::Triple::FreeBSD:
1579 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001580 SizeType = UnsignedInt;
Hal Finkel26908382012-03-02 20:54:36 +00001581 PtrDiffType = SignedInt;
1582 IntPtrType = SignedInt;
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001583 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +00001584 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001585 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001586 }
Roman Divacky816dcd12012-03-13 16:53:54 +00001587
Roman Divacky3ffe7462012-03-13 19:20:17 +00001588 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1589 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001590 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Roman Divacky3ffe7462012-03-13 19:20:17 +00001591 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001592
1593 // PPC32 supports atomics up to 4 bytes.
1594 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divacky965b0b72011-01-06 08:27:10 +00001595 }
1596
Craig Topper3164f332014-03-11 03:39:26 +00001597 BuiltinVaListKind getBuiltinVaListKind() const override {
Roman Divacky965b0b72011-01-06 08:27:10 +00001598 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Inge5d3fb222012-06-16 03:34:49 +00001599 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman873f65a2008-08-21 00:13:15 +00001600 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001601};
Chris Lattner5ba61f02006-10-14 07:39:34 +00001602
Bill Schmidt778d3872013-07-26 01:36:11 +00001603// Note: ABI differences may eventually require us to have a separate
1604// TargetInfo for little endian.
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001605class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001606public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001607 PPC64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1608 : PPCTargetInfo(Triple, Opts) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001609 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001610 IntMaxType = SignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001611 Int64Type = SignedLong;
Roman Divacky816dcd12012-03-13 16:53:54 +00001612
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001613 if ((Triple.getArch() == llvm::Triple::ppc64le)) {
James Y Knightb214cbc2016-03-04 19:00:41 +00001614 resetDataLayout("e-m:e-i64:64-n32:64");
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001615 ABI = "elfv2";
1616 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00001617 resetDataLayout("E-m:e-i64:64-n32:64");
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001618 ABI = "elfv1";
1619 }
1620
1621 switch (getTriple().getOS()) {
1622 case llvm::Triple::FreeBSD:
Roman Divacky3ffe7462012-03-13 19:20:17 +00001623 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001624 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001625 break;
Joerg Sonnenbergeraac82c42014-10-15 19:52:03 +00001626 case llvm::Triple::NetBSD:
1627 IntMaxType = SignedLongLong;
1628 Int64Type = SignedLongLong;
1629 break;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001630 default:
1631 break;
Ulrich Weigand8afad612014-07-28 13:17:52 +00001632 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001633
1634 // PPC64 supports atomics up to 8 bytes.
1635 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001636 }
Craig Topper3164f332014-03-11 03:39:26 +00001637 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001638 return TargetInfo::CharPtrBuiltinVaList;
Roman Divacky965b0b72011-01-06 08:27:10 +00001639 }
Eric Christophere6b7cf42015-07-10 18:25:52 +00001640 // PPC64 Linux-specific ABI options.
Ulrich Weigand8afad612014-07-28 13:17:52 +00001641 bool setABI(const std::string &Name) override {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001642 if (Name == "elfv1" || Name == "elfv1-qpx" || Name == "elfv2") {
Ulrich Weigand8afad612014-07-28 13:17:52 +00001643 ABI = Name;
1644 return true;
1645 }
1646 return false;
1647 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001648};
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001649
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001650class DarwinPPC32TargetInfo : public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001651public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001652 DarwinPPC32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1653 : DarwinTargetInfo<PPC32TargetInfo>(Triple, Opts) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001654 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +00001655 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Eric Christopher917e9522014-11-18 22:36:15 +00001656 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev68d773c2012-01-17 22:40:00 +00001657 LongLongAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001658 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00001659 resetDataLayout("E-m:o-p:32:32-f64:32:64-n32");
Roman Divacky965b0b72011-01-06 08:27:10 +00001660 }
Craig Topper3164f332014-03-11 03:39:26 +00001661 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001662 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001663 }
1664};
1665
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001666class DarwinPPC64TargetInfo : public DarwinTargetInfo<PPC64TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001667public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001668 DarwinPPC64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1669 : DarwinTargetInfo<PPC64TargetInfo>(Triple, Opts) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001670 HasAlignMac68kSupport = true;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001671 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00001672 resetDataLayout("E-m:o-i64:64-n32:64");
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001673 }
1674};
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001675
Eric Christopherc48497a2015-09-18 21:26:24 +00001676static const unsigned NVPTXAddrSpaceMap[] = {
1677 1, // opencl_global
1678 3, // opencl_local
1679 4, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00001680 // FIXME: generic has to be added to the target
Eric Christopherc48497a2015-09-18 21:26:24 +00001681 0, // opencl_generic
1682 1, // cuda_device
1683 4, // cuda_constant
1684 3, // cuda_shared
1685};
1686
1687class NVPTXTargetInfo : public TargetInfo {
1688 static const char *const GCCRegNames[];
1689 static const Builtin::Info BuiltinInfo[];
Reid Klecknerbbc01782014-12-03 21:53:36 +00001690
1691 // The GPU profiles supported by the NVPTX backend
1692 enum GPUKind {
1693 GK_NONE,
1694 GK_SM20,
1695 GK_SM21,
1696 GK_SM30,
1697 GK_SM35,
Eli Bendersky7a0d8912015-03-31 17:03:16 +00001698 GK_SM37,
Artem Belevichffa5fc52016-05-19 17:47:47 +00001699 GK_SM50,
1700 GK_SM52,
1701 GK_SM53,
Reid Klecknerbbc01782014-12-03 21:53:36 +00001702 } GPU;
1703
Eric Christopherc48497a2015-09-18 21:26:24 +00001704public:
Justin Lebar76945b22016-04-29 23:05:19 +00001705 NVPTXTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001706 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00001707 BigEndian = false;
1708 TLSSupported = false;
1709 LongWidth = LongAlign = 64;
1710 AddrSpaceMap = &NVPTXAddrSpaceMap;
1711 UseAddrSpaceMapMangling = true;
1712 // Define available target features
1713 // These must be defined in sorted order!
1714 NoAsmVariants = true;
1715 // Set the default GPU to sm20
1716 GPU = GK_SM20;
Justin Lebar76945b22016-04-29 23:05:19 +00001717
1718 // If possible, get a TargetInfo for our host triple, so we can match its
1719 // types.
1720 llvm::Triple HostTriple(Opts.HostTriple);
1721 if (HostTriple.isNVPTX())
1722 return;
1723 std::unique_ptr<TargetInfo> HostTarget(
1724 AllocateTarget(llvm::Triple(Opts.HostTriple), Opts));
1725 if (!HostTarget) {
1726 return;
1727 }
1728
1729 PointerWidth = HostTarget->getPointerWidth(/* AddrSpace = */ 0);
1730 PointerAlign = HostTarget->getPointerAlign(/* AddrSpace = */ 0);
1731 BoolWidth = HostTarget->getBoolWidth();
1732 BoolAlign = HostTarget->getBoolAlign();
1733 IntWidth = HostTarget->getIntWidth();
1734 IntAlign = HostTarget->getIntAlign();
1735 HalfWidth = HostTarget->getHalfWidth();
1736 HalfAlign = HostTarget->getHalfAlign();
1737 FloatWidth = HostTarget->getFloatWidth();
1738 FloatAlign = HostTarget->getFloatAlign();
1739 DoubleWidth = HostTarget->getDoubleWidth();
1740 DoubleAlign = HostTarget->getDoubleAlign();
1741 LongWidth = HostTarget->getLongWidth();
1742 LongAlign = HostTarget->getLongAlign();
1743 LongLongWidth = HostTarget->getLongLongWidth();
1744 LongLongAlign = HostTarget->getLongLongAlign();
1745 MinGlobalAlign = HostTarget->getMinGlobalAlign();
1746 DefaultAlignForAttributeAligned =
1747 HostTarget->getDefaultAlignForAttributeAligned();
1748 SizeType = HostTarget->getSizeType();
1749 IntMaxType = HostTarget->getIntMaxType();
1750 PtrDiffType = HostTarget->getPtrDiffType(/* AddrSpace = */ 0);
1751 IntPtrType = HostTarget->getIntPtrType();
1752 WCharType = HostTarget->getWCharType();
1753 WIntType = HostTarget->getWIntType();
1754 Char16Type = HostTarget->getChar16Type();
1755 Char32Type = HostTarget->getChar32Type();
1756 Int64Type = HostTarget->getInt64Type();
1757 SigAtomicType = HostTarget->getSigAtomicType();
1758 ProcessIDType = HostTarget->getProcessIDType();
1759
1760 UseBitFieldTypeAlignment = HostTarget->useBitFieldTypeAlignment();
1761 UseZeroLengthBitfieldAlignment =
1762 HostTarget->useZeroLengthBitfieldAlignment();
1763 UseExplicitBitFieldAlignment = HostTarget->useExplicitBitFieldAlignment();
1764 ZeroLengthBitfieldBoundary = HostTarget->getZeroLengthBitfieldBoundary();
1765
1766 // Properties intentionally not copied from host:
1767 // - LargeArrayMinWidth, LargeArrayAlign: Not visible across the
1768 // host/device boundary.
1769 // - SuitableAlign: Not visible across the host/device boundary, and may
1770 // correctly be different on host/device, e.g. if host has wider vector
1771 // types than device.
1772 // - LongDoubleWidth, LongDoubleAlign: nvptx's long double type is the same
1773 // as its double type, but that's not necessarily true on the host.
1774 // TODO: nvcc emits a warning when using long double on device; we should
1775 // do the same.
Eric Christopherc48497a2015-09-18 21:26:24 +00001776 }
1777 void getTargetDefines(const LangOptions &Opts,
1778 MacroBuilder &Builder) const override {
1779 Builder.defineMacro("__PTX__");
1780 Builder.defineMacro("__NVPTX__");
1781 if (Opts.CUDAIsDevice) {
1782 // Set __CUDA_ARCH__ for the GPU specified.
1783 std::string CUDAArchCode;
1784 switch (GPU) {
1785 case GK_SM20:
1786 CUDAArchCode = "200";
1787 break;
1788 case GK_SM21:
1789 CUDAArchCode = "210";
1790 break;
1791 case GK_SM30:
1792 CUDAArchCode = "300";
1793 break;
1794 case GK_SM35:
1795 CUDAArchCode = "350";
1796 break;
1797 case GK_SM37:
1798 CUDAArchCode = "370";
1799 break;
Artem Belevichffa5fc52016-05-19 17:47:47 +00001800 case GK_SM50:
1801 CUDAArchCode = "500";
1802 break;
1803 case GK_SM52:
1804 CUDAArchCode = "520";
1805 break;
1806 case GK_SM53:
1807 CUDAArchCode = "530";
1808 break;
Eric Christopherc48497a2015-09-18 21:26:24 +00001809 default:
1810 llvm_unreachable("Unhandled target CPU");
Reid Klecknerbbc01782014-12-03 21:53:36 +00001811 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001812 Builder.defineMacro("__CUDA_ARCH__", CUDAArchCode);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001813 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001814 }
Craig Topper6c03a542015-10-19 04:51:35 +00001815 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
1816 return llvm::makeArrayRef(BuiltinInfo,
1817 clang::NVPTX::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eric Christopherc48497a2015-09-18 21:26:24 +00001818 }
1819 bool hasFeature(StringRef Feature) const override {
1820 return Feature == "ptx" || Feature == "nvptx";
Peter Collingbournec947aae2012-05-20 23:28:41 +00001821 }
1822
Craig Topperf054e3a2015-10-19 03:52:27 +00001823 ArrayRef<const char *> getGCCRegNames() const override;
1824 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00001825 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00001826 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00001827 }
1828 bool validateAsmConstraint(const char *&Name,
1829 TargetInfo::ConstraintInfo &Info) const override {
1830 switch (*Name) {
1831 default:
1832 return false;
1833 case 'c':
1834 case 'h':
1835 case 'r':
1836 case 'l':
1837 case 'f':
1838 case 'd':
1839 Info.setAllowsRegister();
1840 return true;
Eli Bendersky13467172015-04-01 20:29:18 +00001841 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001842 }
1843 const char *getClobbers() const override {
1844 // FIXME: Is this really right?
1845 return "";
1846 }
1847 BuiltinVaListKind getBuiltinVaListKind() const override {
1848 // FIXME: implement
1849 return TargetInfo::CharPtrBuiltinVaList;
1850 }
1851 bool setCPU(const std::string &Name) override {
1852 GPU = llvm::StringSwitch<GPUKind>(Name)
1853 .Case("sm_20", GK_SM20)
1854 .Case("sm_21", GK_SM21)
1855 .Case("sm_30", GK_SM30)
1856 .Case("sm_35", GK_SM35)
1857 .Case("sm_37", GK_SM37)
Artem Belevichffa5fc52016-05-19 17:47:47 +00001858 .Case("sm_50", GK_SM50)
1859 .Case("sm_52", GK_SM52)
1860 .Case("sm_53", GK_SM53)
Eric Christopherc48497a2015-09-18 21:26:24 +00001861 .Default(GK_NONE);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001862
Eric Christopherc48497a2015-09-18 21:26:24 +00001863 return GPU != GK_NONE;
1864 }
Jan Vesely9674bd42016-06-17 19:02:14 +00001865 void setSupportedOpenCLOpts() override {
1866 auto &Opts = getSupportedOpenCLOpts();
1867 Opts.cl_clang_storage_class_specifiers = 1;
1868 Opts.cl_khr_gl_sharing = 1;
1869 Opts.cl_khr_icd = 1;
1870
1871 Opts.cl_khr_fp64 = 1;
1872 Opts.cl_khr_byte_addressable_store = 1;
1873 Opts.cl_khr_global_int32_base_atomics = 1;
1874 Opts.cl_khr_global_int32_extended_atomics = 1;
1875 Opts.cl_khr_local_int32_base_atomics = 1;
1876 Opts.cl_khr_local_int32_extended_atomics = 1;
1877 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001878};
1879
1880const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1881#define BUILTIN(ID, TYPE, ATTRS) \
1882 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1883#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1884 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
1885#include "clang/Basic/BuiltinsNVPTX.def"
1886};
1887
1888const char *const NVPTXTargetInfo::GCCRegNames[] = {"r0"};
1889
Craig Topperf054e3a2015-10-19 03:52:27 +00001890ArrayRef<const char *> NVPTXTargetInfo::getGCCRegNames() const {
1891 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00001892}
1893
1894class NVPTX32TargetInfo : public NVPTXTargetInfo {
1895public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001896 NVPTX32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1897 : NVPTXTargetInfo(Triple, Opts) {
Artem Belevich236cfdc2015-09-28 22:54:08 +00001898 LongWidth = LongAlign = 32;
Eric Christopherc48497a2015-09-18 21:26:24 +00001899 PointerWidth = PointerAlign = 32;
1900 SizeType = TargetInfo::UnsignedInt;
1901 PtrDiffType = TargetInfo::SignedInt;
1902 IntPtrType = TargetInfo::SignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +00001903 resetDataLayout("e-p:32:32-i64:64-v16:16-v32:32-n16:32:64");
Eric Christopherc48497a2015-09-18 21:26:24 +00001904 }
1905};
1906
1907class NVPTX64TargetInfo : public NVPTXTargetInfo {
1908public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001909 NVPTX64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1910 : NVPTXTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00001911 PointerWidth = PointerAlign = 64;
1912 SizeType = TargetInfo::UnsignedLong;
1913 PtrDiffType = TargetInfo::SignedLong;
1914 IntPtrType = TargetInfo::SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00001915 resetDataLayout("e-i64:64-v16:16-v32:32-n16:32:64");
Eric Christopherc48497a2015-09-18 21:26:24 +00001916 }
1917};
Eli Friedmand13b41e2012-10-12 23:32:00 +00001918
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001919static const unsigned AMDGPUAddrSpaceMap[] = {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001920 1, // opencl_global
1921 3, // opencl_local
1922 2, // opencl_constant
Matt Arsenaultbfe25b22014-12-01 16:46:03 +00001923 4, // opencl_generic
Eli Friedmand13b41e2012-10-12 23:32:00 +00001924 1, // cuda_device
1925 2, // cuda_constant
1926 3 // cuda_shared
1927};
1928
Tom Stellarda96344b2014-08-21 13:58:40 +00001929// If you edit the description strings, make sure you update
1930// getPointerWidthV().
1931
Craig Topper273dbc62015-10-18 05:29:26 +00001932static const char *const DataLayoutStringR600 =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001933 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1934 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001935
Craig Topper273dbc62015-10-18 05:29:26 +00001936static const char *const DataLayoutStringSI =
Matt Arsenault6dc455f2016-05-31 16:58:18 +00001937 "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 +00001938 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1939 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001940
Matt Arsenault250024f2016-06-08 01:56:42 +00001941class AMDGPUTargetInfo final : public TargetInfo {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001942 static const Builtin::Info BuiltinInfo[];
Tom Stellard7b1059b2015-04-14 14:36:56 +00001943 static const char * const GCCRegNames[];
Matt Arsenault56f008d2014-06-24 20:45:01 +00001944
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001945 /// \brief The GPU profiles supported by the AMDGPU target.
Tom Stellardc74b1e02013-03-04 17:40:53 +00001946 enum GPUKind {
1947 GK_NONE,
1948 GK_R600,
1949 GK_R600_DOUBLE_OPS,
1950 GK_R700,
1951 GK_R700_DOUBLE_OPS,
1952 GK_EVERGREEN,
1953 GK_EVERGREEN_DOUBLE_OPS,
1954 GK_NORTHERN_ISLANDS,
1955 GK_CAYMAN,
Tom Stellard08ded122013-10-29 16:38:29 +00001956 GK_SOUTHERN_ISLANDS,
Tom Stellard5c384402015-06-18 19:14:15 +00001957 GK_SEA_ISLANDS,
1958 GK_VOLCANIC_ISLANDS
Tom Stellardc74b1e02013-03-04 17:40:53 +00001959 } GPU;
1960
Jan Veselyeebeaea2015-05-04 19:53:36 +00001961 bool hasFP64:1;
1962 bool hasFMAF:1;
1963 bool hasLDEXPF:1;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001964
Matt Arsenault250024f2016-06-08 01:56:42 +00001965 static bool isAMDGCN(const llvm::Triple &TT) {
1966 return TT.getArch() == llvm::Triple::amdgcn;
1967 }
1968
Eli Friedmand13b41e2012-10-12 23:32:00 +00001969public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001970 AMDGPUTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Matt Arsenault250024f2016-06-08 01:56:42 +00001971 : TargetInfo(Triple) ,
1972 GPU(isAMDGCN(Triple) ? GK_SOUTHERN_ISLANDS : GK_R600),
1973 hasFP64(false),
1974 hasFMAF(false),
1975 hasLDEXPF(false) {
1976 if (getTriple().getArch() == llvm::Triple::amdgcn) {
Jan Veselya3abd6d2015-05-01 17:38:13 +00001977 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001978 hasFMAF = true;
1979 hasLDEXPF = true;
Tom Stellardd99fb952015-01-28 15:38:44 +00001980 }
Matt Arsenault250024f2016-06-08 01:56:42 +00001981
1982 resetDataLayout(getTriple().getArch() == llvm::Triple::amdgcn ?
1983 DataLayoutStringSI : DataLayoutStringR600);
1984
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001985 AddrSpaceMap = &AMDGPUAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001986 UseAddrSpaceMapMangling = true;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001987 }
1988
Tom Stellarda96344b2014-08-21 13:58:40 +00001989 uint64_t getPointerWidthV(unsigned AddrSpace) const override {
1990 if (GPU <= GK_CAYMAN)
1991 return 32;
1992
1993 switch(AddrSpace) {
1994 default:
1995 return 64;
1996 case 0:
1997 case 3:
1998 case 5:
1999 return 32;
2000 }
2001 }
2002
Craig Topper3164f332014-03-11 03:39:26 +00002003 const char * getClobbers() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00002004 return "";
2005 }
2006
Craig Topperf054e3a2015-10-19 03:52:27 +00002007 ArrayRef<const char *> getGCCRegNames() const override;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002008
Craig Topperf054e3a2015-10-19 03:52:27 +00002009 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
2010 return None;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002011 }
2012
Craig Topper3164f332014-03-11 03:39:26 +00002013 bool validateAsmConstraint(const char *&Name,
Tom Stellardd097e942015-11-19 22:11:58 +00002014 TargetInfo::ConstraintInfo &Info) const override {
2015 switch (*Name) {
2016 default: break;
2017 case 'v': // vgpr
2018 case 's': // sgpr
2019 Info.setAllowsRegister();
2020 return true;
2021 }
2022 return false;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002023 }
2024
Matt Arsenault250024f2016-06-08 01:56:42 +00002025 bool initFeatureMap(llvm::StringMap<bool> &Features,
2026 DiagnosticsEngine &Diags, StringRef CPU,
2027 const std::vector<std::string> &FeatureVec) const override;
2028
Craig Topper6c03a542015-10-19 04:51:35 +00002029 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
2030 return llvm::makeArrayRef(BuiltinInfo,
2031 clang::AMDGPU::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eli Friedmand13b41e2012-10-12 23:32:00 +00002032 }
2033
Craig Topper3164f332014-03-11 03:39:26 +00002034 void getTargetDefines(const LangOptions &Opts,
2035 MacroBuilder &Builder) const override {
Matt Arsenault5e020b22016-02-27 09:06:26 +00002036 if (getTriple().getArch() == llvm::Triple::amdgcn)
2037 Builder.defineMacro("__AMDGCN__");
2038 else
2039 Builder.defineMacro("__R600__");
2040
Jan Veselyeebeaea2015-05-04 19:53:36 +00002041 if (hasFMAF)
2042 Builder.defineMacro("__HAS_FMAF__");
2043 if (hasLDEXPF)
2044 Builder.defineMacro("__HAS_LDEXPF__");
Jan Vesely211ba782016-06-17 02:25:03 +00002045 if (hasFP64)
2046 Builder.defineMacro("__HAS_FP64__");
Eli Friedmand13b41e2012-10-12 23:32:00 +00002047 }
2048
Craig Topper3164f332014-03-11 03:39:26 +00002049 BuiltinVaListKind getBuiltinVaListKind() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00002050 return TargetInfo::CharPtrBuiltinVaList;
2051 }
2052
Matt Arsenault250024f2016-06-08 01:56:42 +00002053 static GPUKind parseR600Name(StringRef Name) {
2054 return llvm::StringSwitch<GPUKind>(Name)
Tom Stellardc74b1e02013-03-04 17:40:53 +00002055 .Case("r600" , GK_R600)
2056 .Case("rv610", GK_R600)
2057 .Case("rv620", GK_R600)
2058 .Case("rv630", GK_R600)
2059 .Case("rv635", GK_R600)
2060 .Case("rs780", GK_R600)
2061 .Case("rs880", GK_R600)
2062 .Case("rv670", GK_R600_DOUBLE_OPS)
2063 .Case("rv710", GK_R700)
2064 .Case("rv730", GK_R700)
2065 .Case("rv740", GK_R700_DOUBLE_OPS)
2066 .Case("rv770", GK_R700_DOUBLE_OPS)
2067 .Case("palm", GK_EVERGREEN)
2068 .Case("cedar", GK_EVERGREEN)
2069 .Case("sumo", GK_EVERGREEN)
2070 .Case("sumo2", GK_EVERGREEN)
2071 .Case("redwood", GK_EVERGREEN)
2072 .Case("juniper", GK_EVERGREEN)
2073 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
2074 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
2075 .Case("barts", GK_NORTHERN_ISLANDS)
2076 .Case("turks", GK_NORTHERN_ISLANDS)
2077 .Case("caicos", GK_NORTHERN_ISLANDS)
2078 .Case("cayman", GK_CAYMAN)
2079 .Case("aruba", GK_CAYMAN)
Matt Arsenault250024f2016-06-08 01:56:42 +00002080 .Default(GK_NONE);
2081 }
2082
2083 static GPUKind parseAMDGCNName(StringRef Name) {
2084 return llvm::StringSwitch<GPUKind>(Name)
Tom Stellard785699322013-04-01 20:56:49 +00002085 .Case("tahiti", GK_SOUTHERN_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00002086 .Case("pitcairn", GK_SOUTHERN_ISLANDS)
2087 .Case("verde", GK_SOUTHERN_ISLANDS)
2088 .Case("oland", GK_SOUTHERN_ISLANDS)
Tom Stellard9affba42014-08-21 13:58:38 +00002089 .Case("hainan", GK_SOUTHERN_ISLANDS)
Tom Stellard08ded122013-10-29 16:38:29 +00002090 .Case("bonaire", GK_SEA_ISLANDS)
2091 .Case("kabini", GK_SEA_ISLANDS)
2092 .Case("kaveri", GK_SEA_ISLANDS)
Tom Stellard55583042013-11-14 23:45:53 +00002093 .Case("hawaii", GK_SEA_ISLANDS)
Tom Stellard14e03962014-07-26 01:05:20 +00002094 .Case("mullins", GK_SEA_ISLANDS)
Tom Stellard5c384402015-06-18 19:14:15 +00002095 .Case("tonga", GK_VOLCANIC_ISLANDS)
2096 .Case("iceland", GK_VOLCANIC_ISLANDS)
2097 .Case("carrizo", GK_VOLCANIC_ISLANDS)
Tom Stellard2c7cdd22016-02-29 15:08:56 +00002098 .Case("fiji", GK_VOLCANIC_ISLANDS)
2099 .Case("stoney", GK_VOLCANIC_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00002100 .Default(GK_NONE);
Matt Arsenault250024f2016-06-08 01:56:42 +00002101 }
Tom Stellardc74b1e02013-03-04 17:40:53 +00002102
Matt Arsenault250024f2016-06-08 01:56:42 +00002103 bool setCPU(const std::string &Name) override {
2104 if (getTriple().getArch() == llvm::Triple::amdgcn)
2105 GPU = parseAMDGCNName(Name);
2106 else
2107 GPU = parseR600Name(Name);
Tom Stellardc74b1e02013-03-04 17:40:53 +00002108
Matt Arsenault250024f2016-06-08 01:56:42 +00002109 return GPU != GK_NONE;
Tom Stellardc74b1e02013-03-04 17:40:53 +00002110 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002111
Jan Vesely211ba782016-06-17 02:25:03 +00002112 void setSupportedOpenCLOpts() override {
2113 auto &Opts = getSupportedOpenCLOpts();
2114 Opts.cl_clang_storage_class_specifiers = 1;
2115 Opts.cl_khr_icd = 1;
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002116
Jan Vesely211ba782016-06-17 02:25:03 +00002117 if (hasFP64)
2118 Opts.cl_khr_fp64 = 1;
2119 if (GPU >= GK_EVERGREEN) {
2120 Opts.cl_khr_byte_addressable_store = 1;
2121 Opts.cl_khr_global_int32_base_atomics = 1;
2122 Opts.cl_khr_global_int32_extended_atomics = 1;
2123 Opts.cl_khr_local_int32_base_atomics = 1;
2124 Opts.cl_khr_local_int32_extended_atomics = 1;
2125 }
2126 if (GPU >= GK_SOUTHERN_ISLANDS) {
2127 Opts.cl_khr_fp16 = 1;
2128 Opts.cl_khr_int64_base_atomics = 1;
2129 Opts.cl_khr_int64_extended_atomics = 1;
2130 Opts.cl_khr_3d_image_writes = 1;
2131 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002132 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00002133};
2134
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002135const Builtin::Info AMDGPUTargetInfo::BuiltinInfo[] = {
Matt Arsenault56f008d2014-06-24 20:45:01 +00002136#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00002137 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Matt Arsenault250024f2016-06-08 01:56:42 +00002138#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
2139 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002140#include "clang/Basic/BuiltinsAMDGPU.def"
Matt Arsenault56f008d2014-06-24 20:45:01 +00002141};
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002142const char * const AMDGPUTargetInfo::GCCRegNames[] = {
Tom Stellard7b1059b2015-04-14 14:36:56 +00002143 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
2144 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
2145 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
2146 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
2147 "v32", "v33", "v34", "v35", "v36", "v37", "v38", "v39",
2148 "v40", "v41", "v42", "v43", "v44", "v45", "v46", "v47",
2149 "v48", "v49", "v50", "v51", "v52", "v53", "v54", "v55",
2150 "v56", "v57", "v58", "v59", "v60", "v61", "v62", "v63",
2151 "v64", "v65", "v66", "v67", "v68", "v69", "v70", "v71",
2152 "v72", "v73", "v74", "v75", "v76", "v77", "v78", "v79",
2153 "v80", "v81", "v82", "v83", "v84", "v85", "v86", "v87",
2154 "v88", "v89", "v90", "v91", "v92", "v93", "v94", "v95",
2155 "v96", "v97", "v98", "v99", "v100", "v101", "v102", "v103",
2156 "v104", "v105", "v106", "v107", "v108", "v109", "v110", "v111",
2157 "v112", "v113", "v114", "v115", "v116", "v117", "v118", "v119",
2158 "v120", "v121", "v122", "v123", "v124", "v125", "v126", "v127",
2159 "v128", "v129", "v130", "v131", "v132", "v133", "v134", "v135",
2160 "v136", "v137", "v138", "v139", "v140", "v141", "v142", "v143",
2161 "v144", "v145", "v146", "v147", "v148", "v149", "v150", "v151",
2162 "v152", "v153", "v154", "v155", "v156", "v157", "v158", "v159",
2163 "v160", "v161", "v162", "v163", "v164", "v165", "v166", "v167",
2164 "v168", "v169", "v170", "v171", "v172", "v173", "v174", "v175",
2165 "v176", "v177", "v178", "v179", "v180", "v181", "v182", "v183",
2166 "v184", "v185", "v186", "v187", "v188", "v189", "v190", "v191",
2167 "v192", "v193", "v194", "v195", "v196", "v197", "v198", "v199",
2168 "v200", "v201", "v202", "v203", "v204", "v205", "v206", "v207",
2169 "v208", "v209", "v210", "v211", "v212", "v213", "v214", "v215",
2170 "v216", "v217", "v218", "v219", "v220", "v221", "v222", "v223",
2171 "v224", "v225", "v226", "v227", "v228", "v229", "v230", "v231",
2172 "v232", "v233", "v234", "v235", "v236", "v237", "v238", "v239",
2173 "v240", "v241", "v242", "v243", "v244", "v245", "v246", "v247",
2174 "v248", "v249", "v250", "v251", "v252", "v253", "v254", "v255",
2175 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
2176 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
2177 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
2178 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
2179 "s32", "s33", "s34", "s35", "s36", "s37", "s38", "s39",
2180 "s40", "s41", "s42", "s43", "s44", "s45", "s46", "s47",
2181 "s48", "s49", "s50", "s51", "s52", "s53", "s54", "s55",
2182 "s56", "s57", "s58", "s59", "s60", "s61", "s62", "s63",
2183 "s64", "s65", "s66", "s67", "s68", "s69", "s70", "s71",
2184 "s72", "s73", "s74", "s75", "s76", "s77", "s78", "s79",
2185 "s80", "s81", "s82", "s83", "s84", "s85", "s86", "s87",
2186 "s88", "s89", "s90", "s91", "s92", "s93", "s94", "s95",
2187 "s96", "s97", "s98", "s99", "s100", "s101", "s102", "s103",
2188 "s104", "s105", "s106", "s107", "s108", "s109", "s110", "s111",
2189 "s112", "s113", "s114", "s115", "s116", "s117", "s118", "s119",
Etienne Bergerone8ae26f2016-03-24 18:29:24 +00002190 "s120", "s121", "s122", "s123", "s124", "s125", "s126", "s127",
Matt Arsenaultb015d622016-02-27 09:06:22 +00002191 "exec", "vcc", "scc", "m0", "flat_scratch", "exec_lo", "exec_hi",
2192 "vcc_lo", "vcc_hi", "flat_scratch_lo", "flat_scratch_hi"
Tom Stellard7b1059b2015-04-14 14:36:56 +00002193};
2194
Craig Topperf054e3a2015-10-19 03:52:27 +00002195ArrayRef<const char *> AMDGPUTargetInfo::getGCCRegNames() const {
2196 return llvm::makeArrayRef(GCCRegNames);
Tom Stellard7b1059b2015-04-14 14:36:56 +00002197}
Matt Arsenault56f008d2014-06-24 20:45:01 +00002198
Matt Arsenault250024f2016-06-08 01:56:42 +00002199bool AMDGPUTargetInfo::initFeatureMap(
2200 llvm::StringMap<bool> &Features,
2201 DiagnosticsEngine &Diags, StringRef CPU,
2202 const std::vector<std::string> &FeatureVec) const {
2203
2204 // XXX - What does the member GPU mean if device name string passed here?
2205 if (getTriple().getArch() == llvm::Triple::amdgcn) {
2206 if (CPU.empty())
2207 CPU = "tahiti";
2208
2209 switch (parseAMDGCNName(CPU)) {
2210 case GK_SOUTHERN_ISLANDS:
2211 case GK_SEA_ISLANDS:
2212 break;
2213
2214 case GK_VOLCANIC_ISLANDS:
2215 Features["s-memrealtime"] = true;
2216 Features["16-bit-insts"] = true;
2217 break;
2218
2219 case GK_NONE:
2220 return false;
2221 default:
2222 llvm_unreachable("unhandled subtarget");
2223 }
2224 } else {
2225 if (CPU.empty())
2226 CPU = "r600";
2227
2228 switch (parseR600Name(CPU)) {
2229 case GK_R600:
2230 case GK_R700:
2231 case GK_EVERGREEN:
2232 case GK_NORTHERN_ISLANDS:
2233 break;
2234 case GK_R600_DOUBLE_OPS:
2235 case GK_R700_DOUBLE_OPS:
2236 case GK_EVERGREEN_DOUBLE_OPS:
2237 case GK_CAYMAN:
2238 Features["fp64"] = true;
2239 break;
2240 case GK_NONE:
2241 return false;
2242 default:
2243 llvm_unreachable("unhandled subtarget");
2244 }
2245 }
2246
2247 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeatureVec);
2248}
2249
Eli Friedman3fd920a2008-08-20 02:34:37 +00002250// Namespace for x86 abstract base class
2251const Builtin::Info BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00002252#define BUILTIN(ID, TYPE, ATTRS) \
2253 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002254#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
Craig Topper07d3b622015-08-07 05:14:44 +00002255 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002256#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
Craig Topper07d3b622015-08-07 05:14:44 +00002257 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Chris Lattner5abdec72009-06-14 01:05:48 +00002258#include "clang/Basic/BuiltinsX86.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00002259};
Eli Friedmanb5366062008-05-20 14:21:01 +00002260
Nuno Lopescfca1f02009-12-23 17:49:57 +00002261static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002262 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
2263 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00002264 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002265 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
2266 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
2267 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00002268 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00002269 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
2270 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Marina Yatsina41c45fa2016-02-03 11:32:08 +00002271 "xmm16", "xmm17", "xmm18", "xmm19", "xmm20", "xmm21", "xmm22", "xmm23",
2272 "xmm24", "xmm25", "xmm26", "xmm27", "xmm28", "xmm29", "xmm30", "xmm31",
2273 "ymm16", "ymm17", "ymm18", "ymm19", "ymm20", "ymm21", "ymm22", "ymm23",
2274 "ymm24", "ymm25", "ymm26", "ymm27", "ymm28", "ymm29", "ymm30", "ymm31",
2275 "zmm0", "zmm1", "zmm2", "zmm3", "zmm4", "zmm5", "zmm6", "zmm7",
2276 "zmm8", "zmm9", "zmm10", "zmm11", "zmm12", "zmm13", "zmm14", "zmm15",
2277 "zmm16", "zmm17", "zmm18", "zmm19", "zmm20", "zmm21", "zmm22", "zmm23",
2278 "zmm24", "zmm25", "zmm26", "zmm27", "zmm28", "zmm29", "zmm30", "zmm31",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002279};
2280
Eric Christophercdd36352011-06-21 00:05:20 +00002281const TargetInfo::AddlRegName AddlRegNames[] = {
2282 { { "al", "ah", "eax", "rax" }, 0 },
2283 { { "bl", "bh", "ebx", "rbx" }, 3 },
2284 { { "cl", "ch", "ecx", "rcx" }, 2 },
2285 { { "dl", "dh", "edx", "rdx" }, 1 },
2286 { { "esi", "rsi" }, 4 },
2287 { { "edi", "rdi" }, 5 },
2288 { { "esp", "rsp" }, 7 },
2289 { { "ebp", "rbp" }, 6 },
Alexey Bataeva7ab1b42015-09-04 03:42:23 +00002290 { { "r8d", "r8w", "r8b" }, 38 },
2291 { { "r9d", "r9w", "r9b" }, 39 },
2292 { { "r10d", "r10w", "r10b" }, 40 },
2293 { { "r11d", "r11w", "r11b" }, 41 },
2294 { { "r12d", "r12w", "r12b" }, 42 },
2295 { { "r13d", "r13w", "r13b" }, 43 },
2296 { { "r14d", "r14w", "r14b" }, 44 },
2297 { { "r15d", "r15w", "r15b" }, 45 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00002298};
2299
2300// X86 target abstract base class; x86-32 and x86-64 are very close, so
2301// most of the implementation can be shared.
2302class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00002303 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002304 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Craig Topper543f3bd2015-10-14 23:47:57 +00002305 } SSELevel = NoSSE;
Eli Friedman33465822011-07-08 23:31:17 +00002306 enum MMX3DNowEnum {
2307 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
Craig Topper543f3bd2015-10-14 23:47:57 +00002308 } MMX3DNowLevel = NoMMX3DNow;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002309 enum XOPEnum {
2310 NoXOP,
2311 SSE4A,
2312 FMA4,
2313 XOP
Craig Topper543f3bd2015-10-14 23:47:57 +00002314 } XOPLevel = NoXOP;
Anders Carlssone437c682010-01-27 03:47:49 +00002315
Craig Topper543f3bd2015-10-14 23:47:57 +00002316 bool HasAES = false;
2317 bool HasPCLMUL = false;
2318 bool HasLZCNT = false;
2319 bool HasRDRND = false;
2320 bool HasFSGSBASE = false;
2321 bool HasBMI = false;
2322 bool HasBMI2 = false;
2323 bool HasPOPCNT = false;
2324 bool HasRTM = false;
2325 bool HasPRFCHW = false;
2326 bool HasRDSEED = false;
2327 bool HasADX = false;
2328 bool HasTBM = false;
2329 bool HasFMA = false;
2330 bool HasF16C = false;
2331 bool HasAVX512CD = false;
2332 bool HasAVX512ER = false;
2333 bool HasAVX512PF = false;
2334 bool HasAVX512DQ = false;
2335 bool HasAVX512BW = false;
2336 bool HasAVX512VL = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002337 bool HasAVX512VBMI = false;
2338 bool HasAVX512IFMA = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002339 bool HasSHA = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002340 bool HasMPX = false;
2341 bool HasSGX = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002342 bool HasCX16 = false;
Craig Toppere33f51f2015-10-16 06:22:36 +00002343 bool HasFXSR = false;
Craig Topperda9fe562015-10-15 05:23:38 +00002344 bool HasXSAVE = false;
2345 bool HasXSAVEOPT = false;
2346 bool HasXSAVEC = false;
2347 bool HasXSAVES = false;
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00002348 bool HasMWAITX = false;
Asaf Badouha9d1e182015-12-31 14:14:07 +00002349 bool HasPKU = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002350 bool HasCLFLUSHOPT = false;
2351 bool HasPCOMMIT = false;
2352 bool HasCLWB = false;
2353 bool HasUMIP = false;
2354 bool HasMOVBE = false;
2355 bool HasPREFETCHWT1 = false;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00002356
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002357 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
2358 ///
2359 /// Each enumeration represents a particular CPU supported by Clang. These
2360 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
2361 enum CPUKind {
2362 CK_Generic,
2363
2364 /// \name i386
2365 /// i386-generation processors.
2366 //@{
2367 CK_i386,
2368 //@}
2369
2370 /// \name i486
2371 /// i486-generation processors.
2372 //@{
2373 CK_i486,
2374 CK_WinChipC6,
2375 CK_WinChip2,
2376 CK_C3,
2377 //@}
2378
2379 /// \name i586
2380 /// i586-generation processors, P5 microarchitecture based.
2381 //@{
2382 CK_i586,
2383 CK_Pentium,
2384 CK_PentiumMMX,
2385 //@}
2386
2387 /// \name i686
2388 /// i686-generation processors, P6 / Pentium M microarchitecture based.
2389 //@{
2390 CK_i686,
2391 CK_PentiumPro,
2392 CK_Pentium2,
2393 CK_Pentium3,
2394 CK_Pentium3M,
2395 CK_PentiumM,
2396 CK_C3_2,
2397
2398 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
2399 /// Clang however has some logic to suport this.
2400 // FIXME: Warn, deprecate, and potentially remove this.
2401 CK_Yonah,
2402 //@}
2403
2404 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00002405 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002406 //@{
2407 CK_Pentium4,
2408 CK_Pentium4M,
2409 CK_Prescott,
2410 CK_Nocona,
2411 //@}
2412
2413 /// \name Core
2414 /// Core microarchitecture based processors.
2415 //@{
2416 CK_Core2,
2417
2418 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
2419 /// codename which GCC no longer accepts as an option to -march, but Clang
2420 /// has some logic for recognizing it.
2421 // FIXME: Warn, deprecate, and potentially remove this.
2422 CK_Penryn,
2423 //@}
2424
2425 /// \name Atom
2426 /// Atom processors
2427 //@{
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002428 CK_Bonnell,
Preston Gurda3c58c02013-09-13 19:27:17 +00002429 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002430 //@}
2431
2432 /// \name Nehalem
2433 /// Nehalem microarchitecture based processors.
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002434 CK_Nehalem,
2435
2436 /// \name Westmere
2437 /// Westmere microarchitecture based processors.
2438 CK_Westmere,
2439
2440 /// \name Sandy Bridge
2441 /// Sandy Bridge microarchitecture based processors.
2442 CK_SandyBridge,
2443
2444 /// \name Ivy Bridge
2445 /// Ivy Bridge microarchitecture based processors.
2446 CK_IvyBridge,
2447
2448 /// \name Haswell
2449 /// Haswell microarchitecture based processors.
2450 CK_Haswell,
2451
2452 /// \name Broadwell
2453 /// Broadwell microarchitecture based processors.
Robert Khasanov50e6f582014-09-19 09:53:48 +00002454 CK_Broadwell,
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002455
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002456 /// \name Skylake Client
2457 /// Skylake client microarchitecture based processors.
2458 CK_SkylakeClient,
2459
2460 /// \name Skylake Server
2461 /// Skylake server microarchitecture based processors.
2462 CK_SkylakeServer,
2463
2464 /// \name Cannonlake Client
2465 /// Cannonlake client microarchitecture based processors.
2466 CK_Cannonlake,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002467
Craig Topper449314e2013-08-20 07:09:39 +00002468 /// \name Knights Landing
2469 /// Knights Landing processor.
2470 CK_KNL,
2471
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002472 /// \name Lakemont
2473 /// Lakemont microarchitecture based processors.
2474 CK_Lakemont,
2475
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002476 /// \name K6
2477 /// K6 architecture processors.
2478 //@{
2479 CK_K6,
2480 CK_K6_2,
2481 CK_K6_3,
2482 //@}
2483
2484 /// \name K7
2485 /// K7 architecture processors.
2486 //@{
2487 CK_Athlon,
2488 CK_AthlonThunderbird,
2489 CK_Athlon4,
2490 CK_AthlonXP,
2491 CK_AthlonMP,
2492 //@}
2493
2494 /// \name K8
2495 /// K8 architecture processors.
2496 //@{
2497 CK_Athlon64,
2498 CK_Athlon64SSE3,
2499 CK_AthlonFX,
2500 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00002501 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002502 CK_Opteron,
2503 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00002504 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002505 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002506
Benjamin Kramer569f2152012-01-10 11:50:18 +00002507 /// \name Bobcat
2508 /// Bobcat architecture processors.
2509 //@{
2510 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002511 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002512 //@}
2513
2514 /// \name Bulldozer
2515 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002516 //@{
2517 CK_BDVER1,
2518 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002519 CK_BDVER3,
Benjamin Kramer56c58222014-05-02 15:47:51 +00002520 CK_BDVER4,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002521 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002522
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002523 /// This specification is deprecated and will be removed in the future.
2524 /// Users should prefer \see CK_K8.
2525 // FIXME: Warn on this when the CPU is set to it.
Saleem Abdulrasoolcb29c1a2014-11-17 18:40:15 +00002526 //@{
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002527 CK_x86_64,
2528 //@}
2529
2530 /// \name Geode
2531 /// Geode processors.
2532 //@{
2533 CK_Geode
2534 //@}
Craig Topper543f3bd2015-10-14 23:47:57 +00002535 } CPU = CK_Generic;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002536
Eric Christopherc50738f2015-08-27 00:05:50 +00002537 CPUKind getCPUKind(StringRef CPU) const {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002538 return llvm::StringSwitch<CPUKind>(CPU)
2539 .Case("i386", CK_i386)
2540 .Case("i486", CK_i486)
2541 .Case("winchip-c6", CK_WinChipC6)
2542 .Case("winchip2", CK_WinChip2)
2543 .Case("c3", CK_C3)
2544 .Case("i586", CK_i586)
2545 .Case("pentium", CK_Pentium)
2546 .Case("pentium-mmx", CK_PentiumMMX)
2547 .Case("i686", CK_i686)
2548 .Case("pentiumpro", CK_PentiumPro)
2549 .Case("pentium2", CK_Pentium2)
2550 .Case("pentium3", CK_Pentium3)
2551 .Case("pentium3m", CK_Pentium3M)
2552 .Case("pentium-m", CK_PentiumM)
2553 .Case("c3-2", CK_C3_2)
2554 .Case("yonah", CK_Yonah)
2555 .Case("pentium4", CK_Pentium4)
2556 .Case("pentium4m", CK_Pentium4M)
2557 .Case("prescott", CK_Prescott)
2558 .Case("nocona", CK_Nocona)
2559 .Case("core2", CK_Core2)
2560 .Case("penryn", CK_Penryn)
2561 .Case("bonnell", CK_Bonnell)
2562 .Case("atom", CK_Bonnell) // Legacy name.
2563 .Case("silvermont", CK_Silvermont)
2564 .Case("slm", CK_Silvermont) // Legacy name.
2565 .Case("nehalem", CK_Nehalem)
2566 .Case("corei7", CK_Nehalem) // Legacy name.
2567 .Case("westmere", CK_Westmere)
2568 .Case("sandybridge", CK_SandyBridge)
2569 .Case("corei7-avx", CK_SandyBridge) // Legacy name.
2570 .Case("ivybridge", CK_IvyBridge)
2571 .Case("core-avx-i", CK_IvyBridge) // Legacy name.
2572 .Case("haswell", CK_Haswell)
2573 .Case("core-avx2", CK_Haswell) // Legacy name.
2574 .Case("broadwell", CK_Broadwell)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002575 .Case("skylake", CK_SkylakeClient)
2576 .Case("skylake-avx512", CK_SkylakeServer)
2577 .Case("skx", CK_SkylakeServer) // Legacy name.
2578 .Case("cannonlake", CK_Cannonlake)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002579 .Case("knl", CK_KNL)
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002580 .Case("lakemont", CK_Lakemont)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002581 .Case("k6", CK_K6)
2582 .Case("k6-2", CK_K6_2)
2583 .Case("k6-3", CK_K6_3)
2584 .Case("athlon", CK_Athlon)
2585 .Case("athlon-tbird", CK_AthlonThunderbird)
2586 .Case("athlon-4", CK_Athlon4)
2587 .Case("athlon-xp", CK_AthlonXP)
2588 .Case("athlon-mp", CK_AthlonMP)
2589 .Case("athlon64", CK_Athlon64)
2590 .Case("athlon64-sse3", CK_Athlon64SSE3)
2591 .Case("athlon-fx", CK_AthlonFX)
2592 .Case("k8", CK_K8)
2593 .Case("k8-sse3", CK_K8SSE3)
2594 .Case("opteron", CK_Opteron)
2595 .Case("opteron-sse3", CK_OpteronSSE3)
2596 .Case("barcelona", CK_AMDFAM10)
2597 .Case("amdfam10", CK_AMDFAM10)
2598 .Case("btver1", CK_BTVER1)
2599 .Case("btver2", CK_BTVER2)
2600 .Case("bdver1", CK_BDVER1)
2601 .Case("bdver2", CK_BDVER2)
2602 .Case("bdver3", CK_BDVER3)
2603 .Case("bdver4", CK_BDVER4)
2604 .Case("x86-64", CK_x86_64)
2605 .Case("geode", CK_Geode)
2606 .Default(CK_Generic);
2607 }
2608
Rafael Espindolaeb265472013-08-21 21:59:03 +00002609 enum FPMathKind {
2610 FP_Default,
2611 FP_SSE,
2612 FP_387
Craig Topper543f3bd2015-10-14 23:47:57 +00002613 } FPMath = FP_Default;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002614
Eli Friedman3fd920a2008-08-20 02:34:37 +00002615public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00002616 X86TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
2617 : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00002618 BigEndian = false;
Andrey Bokhanko94e1d582015-11-05 12:43:09 +00002619 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00002620 }
Craig Topper3164f332014-03-11 03:39:26 +00002621 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00002622 // X87 evaluates with 80 bits "long double" precision.
2623 return SSELevel == NoSSE ? 2 : 0;
2624 }
Craig Topper6c03a542015-10-19 04:51:35 +00002625 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
2626 return llvm::makeArrayRef(BuiltinInfo,
2627 clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner10a5b382007-01-29 05:24:35 +00002628 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002629 ArrayRef<const char *> getGCCRegNames() const override {
2630 return llvm::makeArrayRef(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00002631 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002632 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
2633 return None;
Eric Christophercdd36352011-06-21 00:05:20 +00002634 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002635 ArrayRef<TargetInfo::AddlRegName> getGCCAddlRegNames() const override {
2636 return llvm::makeArrayRef(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00002637 }
Eric Christopherd9832702015-06-29 21:00:05 +00002638 bool validateCpuSupports(StringRef Name) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002639 bool validateAsmConstraint(const char *&Name,
Eric Christopher917e9522014-11-18 22:36:15 +00002640 TargetInfo::ConstraintInfo &info) const override;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002641
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00002642 bool validateGlobalRegisterVariable(StringRef RegName,
2643 unsigned RegSize,
2644 bool &HasSizeMismatch) const override {
2645 // esp and ebp are the only 32-bit registers the x86 backend can currently
2646 // handle.
2647 if (RegName.equals("esp") || RegName.equals("ebp")) {
2648 // Check that the register size is 32-bit.
2649 HasSizeMismatch = RegSize != 32;
2650 return true;
2651 }
2652
2653 return false;
2654 }
2655
Akira Hatanaka974131e2014-09-18 18:17:18 +00002656 bool validateOutputSize(StringRef Constraint, unsigned Size) const override;
2657
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002658 bool validateInputSize(StringRef Constraint, unsigned Size) const override;
2659
Akira Hatanaka974131e2014-09-18 18:17:18 +00002660 virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const;
2661
Craig Topper3164f332014-03-11 03:39:26 +00002662 std::string convertConstraint(const char *&Constraint) const override;
2663 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002664 return "~{dirflag},~{fpsr},~{flags}";
2665 }
Craig Topper3164f332014-03-11 03:39:26 +00002666 void getTargetDefines(const LangOptions &Opts,
2667 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00002668 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
2669 bool Enabled);
2670 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
2671 bool Enabled);
2672 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
2673 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002674 void setFeatureEnabled(llvm::StringMap<bool> &Features,
2675 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00002676 setFeatureEnabledImpl(Features, Name, Enabled);
2677 }
2678 // This exists purely to cut down on the number of virtual calls in
Eric Christopheref1e2952015-08-28 02:13:58 +00002679 // initFeatureMap which calls this repeatedly.
Craig Topper86d79ef2013-09-17 04:51:29 +00002680 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2681 StringRef Name, bool Enabled);
Eric Christopher8c47b422015-10-09 18:39:55 +00002682 bool
2683 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
2684 StringRef CPU,
2685 const std::vector<std::string> &FeaturesVec) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002686 bool hasFeature(StringRef Feature) const override;
2687 bool handleTargetFeatures(std::vector<std::string> &Features,
2688 DiagnosticsEngine &Diags) override;
Alp Toker4925ba72014-06-07 23:30:42 +00002689 StringRef getABI() const override {
Ahmed Bougacha0b938282015-06-22 21:31:43 +00002690 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX512F)
2691 return "avx512";
Craig Topperd945d502015-10-20 00:00:17 +00002692 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002693 return "avx";
Craig Topperd945d502015-10-20 00:00:17 +00002694 if (getTriple().getArch() == llvm::Triple::x86 &&
Derek Schuffc7dd7222012-10-11 15:52:22 +00002695 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002696 return "no-mmx";
2697 return "";
Eli Friedman33465822011-07-08 23:31:17 +00002698 }
Craig Topper3164f332014-03-11 03:39:26 +00002699 bool setCPU(const std::string &Name) override {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002700 CPU = getCPUKind(Name);
Chandler Carruth212334f2011-09-28 08:55:37 +00002701
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002702 // Perform any per-CPU checks necessary to determine if this CPU is
2703 // acceptable.
2704 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
2705 // invalid without explaining *why*.
2706 switch (CPU) {
2707 case CK_Generic:
2708 // No processor selected!
2709 return false;
2710
2711 case CK_i386:
2712 case CK_i486:
2713 case CK_WinChipC6:
2714 case CK_WinChip2:
2715 case CK_C3:
2716 case CK_i586:
2717 case CK_Pentium:
2718 case CK_PentiumMMX:
2719 case CK_i686:
2720 case CK_PentiumPro:
2721 case CK_Pentium2:
2722 case CK_Pentium3:
2723 case CK_Pentium3M:
2724 case CK_PentiumM:
2725 case CK_Yonah:
2726 case CK_C3_2:
2727 case CK_Pentium4:
2728 case CK_Pentium4M:
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002729 case CK_Lakemont:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002730 case CK_Prescott:
2731 case CK_K6:
2732 case CK_K6_2:
2733 case CK_K6_3:
2734 case CK_Athlon:
2735 case CK_AthlonThunderbird:
2736 case CK_Athlon4:
2737 case CK_AthlonXP:
2738 case CK_AthlonMP:
2739 case CK_Geode:
2740 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002741 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002742 return false;
2743
2744 // Fallthrough
2745 case CK_Nocona:
2746 case CK_Core2:
2747 case CK_Penryn:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002748 case CK_Bonnell:
Preston Gurda3c58c02013-09-13 19:27:17 +00002749 case CK_Silvermont:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002750 case CK_Nehalem:
2751 case CK_Westmere:
2752 case CK_SandyBridge:
2753 case CK_IvyBridge:
2754 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002755 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002756 case CK_SkylakeClient:
2757 case CK_SkylakeServer:
2758 case CK_Cannonlake:
Craig Topper449314e2013-08-20 07:09:39 +00002759 case CK_KNL:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002760 case CK_Athlon64:
2761 case CK_Athlon64SSE3:
2762 case CK_AthlonFX:
2763 case CK_K8:
2764 case CK_K8SSE3:
2765 case CK_Opteron:
2766 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00002767 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00002768 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002769 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002770 case CK_BDVER1:
2771 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002772 case CK_BDVER3:
Benjamin Kramer56c58222014-05-02 15:47:51 +00002773 case CK_BDVER4:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002774 case CK_x86_64:
2775 return true;
2776 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00002777 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002778 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002779
Craig Topper3164f332014-03-11 03:39:26 +00002780 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002781
Craig Topper3164f332014-03-11 03:39:26 +00002782 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00002783 // Most of the non-ARM calling conventions are i386 conventions.
2784 switch (CC) {
2785 case CC_X86ThisCall:
2786 case CC_X86FastCall:
2787 case CC_X86StdCall:
2788 case CC_X86VectorCall:
2789 case CC_C:
2790 case CC_Swift:
2791 case CC_X86Pascal:
2792 case CC_IntelOclBicc:
2793 return CCCR_OK;
2794 default:
2795 return CCCR_Warning;
2796 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002797 }
2798
Craig Topper3164f332014-03-11 03:39:26 +00002799 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00002800 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002801 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00002802
2803 bool hasSjLjLowering() const override {
2804 return true;
2805 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002806
2807 void setSupportedOpenCLOpts() override {
2808 getSupportedOpenCLOpts().setAll();
2809 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00002810};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002811
Rafael Espindolaeb265472013-08-21 21:59:03 +00002812bool X86TargetInfo::setFPMath(StringRef Name) {
2813 if (Name == "387") {
2814 FPMath = FP_387;
2815 return true;
2816 }
2817 if (Name == "sse") {
2818 FPMath = FP_SSE;
2819 return true;
2820 }
2821 return false;
2822}
2823
Eric Christopher007b0a02015-08-28 22:32:01 +00002824bool X86TargetInfo::initFeatureMap(
2825 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
Eric Christopher8c47b422015-10-09 18:39:55 +00002826 const std::vector<std::string> &FeaturesVec) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002827 // FIXME: This *really* should not be here.
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002828 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002829 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00002830 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002831
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002832 const CPUKind Kind = getCPUKind(CPU);
Andrey Turetskiy5f1cf5f2016-03-23 11:15:10 +00002833
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002834 // Enable X87 for all X86 processors but Lakemont.
2835 if (Kind != CK_Lakemont)
2836 setFeatureEnabledImpl(Features, "x87", true);
2837
2838 switch (Kind) {
Chandler Carruth212334f2011-09-28 08:55:37 +00002839 case CK_Generic:
2840 case CK_i386:
2841 case CK_i486:
2842 case CK_i586:
2843 case CK_Pentium:
2844 case CK_i686:
2845 case CK_PentiumPro:
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002846 case CK_Lakemont:
Chandler Carruth212334f2011-09-28 08:55:37 +00002847 break;
2848 case CK_PentiumMMX:
2849 case CK_Pentium2:
Craig Topperdb4dc082014-11-06 05:52:19 +00002850 case CK_K6:
2851 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00002852 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002853 break;
2854 case CK_Pentium3:
2855 case CK_Pentium3M:
Craig Topperdb4dc082014-11-06 05:52:19 +00002856 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002857 setFeatureEnabledImpl(Features, "sse", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002858 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002859 break;
2860 case CK_PentiumM:
2861 case CK_Pentium4:
2862 case CK_Pentium4M:
2863 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00002864 setFeatureEnabledImpl(Features, "sse2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002865 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002866 break;
2867 case CK_Yonah:
2868 case CK_Prescott:
2869 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00002870 setFeatureEnabledImpl(Features, "sse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002871 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002872 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002873 break;
2874 case CK_Core2:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002875 case CK_Bonnell:
Craig Topper86d79ef2013-09-17 04:51:29 +00002876 setFeatureEnabledImpl(Features, "ssse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002877 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002878 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002879 break;
2880 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00002881 setFeatureEnabledImpl(Features, "sse4.1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002882 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002883 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002884 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002885 case CK_Cannonlake:
2886 setFeatureEnabledImpl(Features, "avx512ifma", true);
2887 setFeatureEnabledImpl(Features, "avx512vbmi", true);
2888 setFeatureEnabledImpl(Features, "sha", true);
2889 setFeatureEnabledImpl(Features, "umip", true);
2890 // FALLTHROUGH
2891 case CK_SkylakeServer:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002892 setFeatureEnabledImpl(Features, "avx512f", true);
2893 setFeatureEnabledImpl(Features, "avx512cd", true);
2894 setFeatureEnabledImpl(Features, "avx512dq", true);
2895 setFeatureEnabledImpl(Features, "avx512bw", true);
2896 setFeatureEnabledImpl(Features, "avx512vl", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002897 setFeatureEnabledImpl(Features, "pku", true);
2898 setFeatureEnabledImpl(Features, "pcommit", true);
2899 setFeatureEnabledImpl(Features, "clwb", true);
2900 // FALLTHROUGH
2901 case CK_SkylakeClient:
Craig Topperda9fe562015-10-15 05:23:38 +00002902 setFeatureEnabledImpl(Features, "xsavec", true);
2903 setFeatureEnabledImpl(Features, "xsaves", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002904 setFeatureEnabledImpl(Features, "mpx", true);
2905 setFeatureEnabledImpl(Features, "sgx", true);
2906 setFeatureEnabledImpl(Features, "clflushopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002907 // FALLTHROUGH
2908 case CK_Broadwell:
2909 setFeatureEnabledImpl(Features, "rdseed", true);
2910 setFeatureEnabledImpl(Features, "adx", true);
2911 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002912 case CK_Haswell:
Craig Topperdb4dc082014-11-06 05:52:19 +00002913 setFeatureEnabledImpl(Features, "avx2", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002914 setFeatureEnabledImpl(Features, "lzcnt", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002915 setFeatureEnabledImpl(Features, "bmi", true);
2916 setFeatureEnabledImpl(Features, "bmi2", true);
2917 setFeatureEnabledImpl(Features, "rtm", true);
2918 setFeatureEnabledImpl(Features, "fma", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002919 setFeatureEnabledImpl(Features, "movbe", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002920 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002921 case CK_IvyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002922 setFeatureEnabledImpl(Features, "rdrnd", true);
2923 setFeatureEnabledImpl(Features, "f16c", true);
2924 setFeatureEnabledImpl(Features, "fsgsbase", true);
2925 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002926 case CK_SandyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002927 setFeatureEnabledImpl(Features, "avx", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002928 setFeatureEnabledImpl(Features, "xsave", true);
2929 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002930 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002931 case CK_Westmere:
Craig Topperdb4dc082014-11-06 05:52:19 +00002932 case CK_Silvermont:
2933 setFeatureEnabledImpl(Features, "aes", true);
2934 setFeatureEnabledImpl(Features, "pclmul", true);
2935 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002936 case CK_Nehalem:
Craig Topperdb4dc082014-11-06 05:52:19 +00002937 setFeatureEnabledImpl(Features, "sse4.2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002938 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002939 setFeatureEnabledImpl(Features, "cx16", true);
2940 break;
2941 case CK_KNL:
2942 setFeatureEnabledImpl(Features, "avx512f", true);
2943 setFeatureEnabledImpl(Features, "avx512cd", true);
2944 setFeatureEnabledImpl(Features, "avx512er", true);
2945 setFeatureEnabledImpl(Features, "avx512pf", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002946 setFeatureEnabledImpl(Features, "prefetchwt1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002947 setFeatureEnabledImpl(Features, "fxsr", true);
Robert Khasanov50e6f582014-09-19 09:53:48 +00002948 setFeatureEnabledImpl(Features, "rdseed", true);
2949 setFeatureEnabledImpl(Features, "adx", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002950 setFeatureEnabledImpl(Features, "lzcnt", true);
2951 setFeatureEnabledImpl(Features, "bmi", true);
2952 setFeatureEnabledImpl(Features, "bmi2", true);
2953 setFeatureEnabledImpl(Features, "rtm", true);
2954 setFeatureEnabledImpl(Features, "fma", true);
2955 setFeatureEnabledImpl(Features, "rdrnd", true);
2956 setFeatureEnabledImpl(Features, "f16c", true);
2957 setFeatureEnabledImpl(Features, "fsgsbase", true);
2958 setFeatureEnabledImpl(Features, "aes", true);
2959 setFeatureEnabledImpl(Features, "pclmul", true);
2960 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002961 setFeatureEnabledImpl(Features, "xsaveopt", true);
2962 setFeatureEnabledImpl(Features, "xsave", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002963 setFeatureEnabledImpl(Features, "movbe", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002964 break;
2965 case CK_K6_2:
2966 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00002967 case CK_WinChip2:
2968 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002969 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002970 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002971 case CK_Athlon:
2972 case CK_AthlonThunderbird:
2973 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00002974 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002975 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002976 case CK_Athlon4:
2977 case CK_AthlonXP:
2978 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00002979 setFeatureEnabledImpl(Features, "sse", true);
2980 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002981 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002982 break;
2983 case CK_K8:
2984 case CK_Opteron:
2985 case CK_Athlon64:
2986 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00002987 setFeatureEnabledImpl(Features, "sse2", true);
2988 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002989 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002990 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002991 case CK_AMDFAM10:
2992 setFeatureEnabledImpl(Features, "sse4a", true);
2993 setFeatureEnabledImpl(Features, "lzcnt", true);
2994 setFeatureEnabledImpl(Features, "popcnt", true);
2995 // FALLTHROUGH
Chandler Carruth212334f2011-09-28 08:55:37 +00002996 case CK_K8SSE3:
2997 case CK_OpteronSSE3:
2998 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002999 setFeatureEnabledImpl(Features, "sse3", true);
3000 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003001 setFeatureEnabledImpl(Features, "fxsr", true);
Roman Divackyce253d82011-10-30 13:47:56 +00003002 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00003003 case CK_BTVER2:
3004 setFeatureEnabledImpl(Features, "avx", true);
3005 setFeatureEnabledImpl(Features, "aes", true);
3006 setFeatureEnabledImpl(Features, "pclmul", true);
3007 setFeatureEnabledImpl(Features, "bmi", true);
3008 setFeatureEnabledImpl(Features, "f16c", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003009 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00003010 // FALLTHROUGH
Benjamin Kramer569f2152012-01-10 11:50:18 +00003011 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00003012 setFeatureEnabledImpl(Features, "ssse3", true);
3013 setFeatureEnabledImpl(Features, "sse4a", true);
3014 setFeatureEnabledImpl(Features, "lzcnt", true);
3015 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00003016 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003017 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003018 setFeatureEnabledImpl(Features, "fxsr", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003019 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003020 case CK_BDVER4:
3021 setFeatureEnabledImpl(Features, "avx2", true);
3022 setFeatureEnabledImpl(Features, "bmi2", true);
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003023 setFeatureEnabledImpl(Features, "mwaitx", true);
Benjamin Kramer56c58222014-05-02 15:47:51 +00003024 // FALLTHROUGH
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003025 case CK_BDVER3:
Craig Topper8c7f2512014-11-03 06:51:41 +00003026 setFeatureEnabledImpl(Features, "fsgsbase", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003027 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topper8c7f2512014-11-03 06:51:41 +00003028 // FALLTHROUGH
3029 case CK_BDVER2:
Andrea Di Biagio9760a442014-11-06 12:08:57 +00003030 setFeatureEnabledImpl(Features, "bmi", true);
3031 setFeatureEnabledImpl(Features, "fma", true);
3032 setFeatureEnabledImpl(Features, "f16c", true);
3033 setFeatureEnabledImpl(Features, "tbm", true);
3034 // FALLTHROUGH
3035 case CK_BDVER1:
3036 // xop implies avx, sse4a and fma4.
Craig Topper86d79ef2013-09-17 04:51:29 +00003037 setFeatureEnabledImpl(Features, "xop", true);
3038 setFeatureEnabledImpl(Features, "lzcnt", true);
3039 setFeatureEnabledImpl(Features, "aes", true);
3040 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00003041 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003042 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003043 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003044 setFeatureEnabledImpl(Features, "xsave", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003045 break;
Eli Friedman33465822011-07-08 23:31:17 +00003046 }
Eric Christopherbbd746d2015-10-08 20:10:14 +00003047 if (!TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec))
3048 return false;
3049
3050 // Can't do this earlier because we need to be able to explicitly enable
3051 // or disable these features and the things that they depend upon.
3052
3053 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
3054 auto I = Features.find("sse4.2");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003055 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00003056 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-popcnt") ==
3057 FeaturesVec.end())
3058 Features["popcnt"] = true;
3059
3060 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
3061 I = Features.find("3dnow");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003062 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00003063 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-prfchw") ==
3064 FeaturesVec.end())
3065 Features["prfchw"] = true;
3066
Eric Christophera7260af2015-10-08 20:10:18 +00003067 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
3068 // then enable MMX.
3069 I = Features.find("sse");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003070 if (I != Features.end() && I->getValue() &&
Eric Christophera7260af2015-10-08 20:10:18 +00003071 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-mmx") ==
3072 FeaturesVec.end())
3073 Features["mmx"] = true;
3074
Eric Christopherbbd746d2015-10-08 20:10:14 +00003075 return true;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003076}
3077
Rafael Espindolae62e2792013-08-20 13:44:29 +00003078void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00003079 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003080 if (Enabled) {
3081 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003082 case AVX512F:
3083 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003084 case AVX2:
3085 Features["avx2"] = true;
3086 case AVX:
3087 Features["avx"] = true;
Craig Topperda9fe562015-10-15 05:23:38 +00003088 Features["xsave"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003089 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00003090 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003091 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00003092 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003093 case SSSE3:
3094 Features["ssse3"] = true;
3095 case SSE3:
3096 Features["sse3"] = true;
3097 case SSE2:
3098 Features["sse2"] = true;
3099 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00003100 Features["sse"] = true;
3101 case NoSSE:
3102 break;
3103 }
3104 return;
3105 }
3106
3107 switch (Level) {
3108 case NoSSE:
3109 case SSE1:
3110 Features["sse"] = false;
3111 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00003112 Features["sse2"] = Features["pclmul"] = Features["aes"] =
3113 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003114 case SSE3:
3115 Features["sse3"] = false;
3116 setXOPLevel(Features, NoXOP, false);
3117 case SSSE3:
3118 Features["ssse3"] = false;
3119 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00003120 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003121 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00003122 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003123 case AVX:
Craig Topperda9fe562015-10-15 05:23:38 +00003124 Features["fma"] = Features["avx"] = Features["f16c"] = Features["xsave"] =
3125 Features["xsaveopt"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00003126 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003127 case AVX2:
3128 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00003129 case AVX512F:
Eric Christopher917e9522014-11-18 22:36:15 +00003130 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
Craig Toppera31a5da2014-12-27 06:59:37 +00003131 Features["avx512pf"] = Features["avx512dq"] = Features["avx512bw"] =
Craig Topperb4f83a02016-02-29 06:51:38 +00003132 Features["avx512vl"] = Features["avx512vbmi"] =
3133 Features["avx512ifma"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003134 }
3135}
3136
3137void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00003138 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003139 if (Enabled) {
3140 switch (Level) {
3141 case AMD3DNowAthlon:
3142 Features["3dnowa"] = true;
3143 case AMD3DNow:
3144 Features["3dnow"] = true;
3145 case MMX:
3146 Features["mmx"] = true;
3147 case NoMMX3DNow:
3148 break;
3149 }
3150 return;
3151 }
3152
3153 switch (Level) {
3154 case NoMMX3DNow:
3155 case MMX:
3156 Features["mmx"] = false;
3157 case AMD3DNow:
3158 Features["3dnow"] = false;
3159 case AMD3DNowAthlon:
3160 Features["3dnowa"] = false;
3161 }
3162}
3163
3164void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00003165 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003166 if (Enabled) {
3167 switch (Level) {
3168 case XOP:
3169 Features["xop"] = true;
3170 case FMA4:
3171 Features["fma4"] = true;
3172 setSSELevel(Features, AVX, true);
3173 case SSE4A:
3174 Features["sse4a"] = true;
3175 setSSELevel(Features, SSE3, true);
3176 case NoXOP:
3177 break;
3178 }
3179 return;
3180 }
3181
3182 switch (Level) {
3183 case NoXOP:
3184 case SSE4A:
3185 Features["sse4a"] = false;
3186 case FMA4:
3187 Features["fma4"] = false;
3188 case XOP:
3189 Features["xop"] = false;
3190 }
3191}
3192
Craig Topper86d79ef2013-09-17 04:51:29 +00003193void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
3194 StringRef Name, bool Enabled) {
Eric Christopher298ac302015-07-01 00:08:32 +00003195 // This is a bit of a hack to deal with the sse4 target feature when used
3196 // as part of the target attribute. We handle sse4 correctly everywhere
3197 // else. See below for more information on how we handle the sse4 options.
3198 if (Name != "sse4")
3199 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00003200
Craig Topper29561122013-09-19 01:13:07 +00003201 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003202 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003203 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003204 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003205 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003206 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003207 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003208 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003209 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003210 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003211 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003212 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003213 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003214 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003215 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003216 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003217 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003218 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003219 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003220 if (Enabled)
3221 setSSELevel(Features, SSE2, Enabled);
3222 } else if (Name == "pclmul") {
3223 if (Enabled)
3224 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003225 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003226 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003227 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003228 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003229 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003230 setSSELevel(Features, AVX512F, Enabled);
Craig Topperb4f83a02016-02-29 06:51:38 +00003231 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf" ||
3232 Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl" ||
3233 Name == "avx512vbmi" || Name == "avx512ifma") {
Craig Topper679b53a2013-08-21 05:29:10 +00003234 if (Enabled)
3235 setSSELevel(Features, AVX512F, Enabled);
3236 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003237 if (Enabled)
3238 setSSELevel(Features, AVX, Enabled);
3239 } else if (Name == "fma4") {
3240 setXOPLevel(Features, FMA4, Enabled);
3241 } else if (Name == "xop") {
3242 setXOPLevel(Features, XOP, Enabled);
3243 } else if (Name == "sse4a") {
3244 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00003245 } else if (Name == "f16c") {
3246 if (Enabled)
3247 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00003248 } else if (Name == "sha") {
3249 if (Enabled)
3250 setSSELevel(Features, SSE2, Enabled);
Eric Christopher298ac302015-07-01 00:08:32 +00003251 } else if (Name == "sse4") {
3252 // We can get here via the __target__ attribute since that's not controlled
3253 // via the -msse4/-mno-sse4 command line alias. Handle this the same way
3254 // here - turn on the sse4.2 if enabled, turn off the sse4.1 level if
3255 // disabled.
3256 if (Enabled)
3257 setSSELevel(Features, SSE42, Enabled);
3258 else
3259 setSSELevel(Features, SSE41, Enabled);
Craig Topperda9fe562015-10-15 05:23:38 +00003260 } else if (Name == "xsave") {
Craig Topper840927e2016-02-29 06:51:34 +00003261 if (!Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003262 Features["xsaveopt"] = false;
3263 } else if (Name == "xsaveopt" || Name == "xsavec" || Name == "xsaves") {
Craig Topper840927e2016-02-29 06:51:34 +00003264 if (Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003265 Features["xsave"] = true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003266 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003267}
3268
Eric Christopher3ff21b32013-10-16 21:26:26 +00003269/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003270/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00003271bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00003272 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00003273 for (const auto &Feature : Features) {
3274 if (Feature[0] != '+')
Daniel Dunbar979586e2009-11-11 09:38:56 +00003275 continue;
3276
Eric Christopher610fe112015-08-26 08:21:55 +00003277 if (Feature == "+aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00003278 HasAES = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003279 } else if (Feature == "+pclmul") {
Craig Topper3f122a72012-05-31 05:18:48 +00003280 HasPCLMUL = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003281 } else if (Feature == "+lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00003282 HasLZCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003283 } else if (Feature == "+rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00003284 HasRDRND = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003285 } else if (Feature == "+fsgsbase") {
Craig Topper8c7f2512014-11-03 06:51:41 +00003286 HasFSGSBASE = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003287 } else if (Feature == "+bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00003288 HasBMI = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003289 } else if (Feature == "+bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00003290 HasBMI2 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003291 } else if (Feature == "+popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00003292 HasPOPCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003293 } else if (Feature == "+rtm") {
Michael Liao625a8752012-11-10 05:17:46 +00003294 HasRTM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003295 } else if (Feature == "+prfchw") {
Michael Liao74f4eaf2013-03-26 17:52:08 +00003296 HasPRFCHW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003297 } else if (Feature == "+rdseed") {
Michael Liaoffaae352013-03-29 05:17:55 +00003298 HasRDSEED = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003299 } else if (Feature == "+adx") {
Robert Khasanov50e6f582014-09-19 09:53:48 +00003300 HasADX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003301 } else if (Feature == "+tbm") {
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003302 HasTBM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003303 } else if (Feature == "+fma") {
Craig Topperbba778b2012-06-03 21:46:30 +00003304 HasFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003305 } else if (Feature == "+f16c") {
Manman Rena45358c2012-10-11 00:59:55 +00003306 HasF16C = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003307 } else if (Feature == "+avx512cd") {
Craig Topper679b53a2013-08-21 05:29:10 +00003308 HasAVX512CD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003309 } else if (Feature == "+avx512er") {
Craig Topper679b53a2013-08-21 05:29:10 +00003310 HasAVX512ER = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003311 } else if (Feature == "+avx512pf") {
Craig Topper679b53a2013-08-21 05:29:10 +00003312 HasAVX512PF = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003313 } else if (Feature == "+avx512dq") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003314 HasAVX512DQ = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003315 } else if (Feature == "+avx512bw") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003316 HasAVX512BW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003317 } else if (Feature == "+avx512vl") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003318 HasAVX512VL = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003319 } else if (Feature == "+avx512vbmi") {
3320 HasAVX512VBMI = true;
3321 } else if (Feature == "+avx512ifma") {
3322 HasAVX512IFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003323 } else if (Feature == "+sha") {
Ben Langmuir58078d02013-09-19 13:22:04 +00003324 HasSHA = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003325 } else if (Feature == "+mpx") {
3326 HasMPX = true;
3327 } else if (Feature == "+movbe") {
3328 HasMOVBE = true;
3329 } else if (Feature == "+sgx") {
3330 HasSGX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003331 } else if (Feature == "+cx16") {
Nick Lewycky50e8f482013-10-05 20:14:27 +00003332 HasCX16 = true;
Craig Toppere33f51f2015-10-16 06:22:36 +00003333 } else if (Feature == "+fxsr") {
3334 HasFXSR = true;
Craig Topperda9fe562015-10-15 05:23:38 +00003335 } else if (Feature == "+xsave") {
3336 HasXSAVE = true;
3337 } else if (Feature == "+xsaveopt") {
3338 HasXSAVEOPT = true;
3339 } else if (Feature == "+xsavec") {
3340 HasXSAVEC = true;
3341 } else if (Feature == "+xsaves") {
3342 HasXSAVES = true;
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003343 } else if (Feature == "+mwaitx") {
3344 HasMWAITX = true;
Asaf Badouha9d1e182015-12-31 14:14:07 +00003345 } else if (Feature == "+pku") {
3346 HasPKU = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003347 } else if (Feature == "+clflushopt") {
3348 HasCLFLUSHOPT = true;
3349 } else if (Feature == "+pcommit") {
3350 HasPCOMMIT = true;
3351 } else if (Feature == "+clwb") {
3352 HasCLWB = true;
3353 } else if (Feature == "+umip") {
3354 HasUMIP = true;
3355 } else if (Feature == "+prefetchwt1") {
3356 HasPREFETCHWT1 = true;
Nick Lewycky50e8f482013-10-05 20:14:27 +00003357 }
3358
Benjamin Kramer27402c62012-03-05 15:10:44 +00003359 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003360 .Case("+avx512f", AVX512F)
3361 .Case("+avx2", AVX2)
3362 .Case("+avx", AVX)
3363 .Case("+sse4.2", SSE42)
3364 .Case("+sse4.1", SSE41)
3365 .Case("+ssse3", SSSE3)
3366 .Case("+sse3", SSE3)
3367 .Case("+sse2", SSE2)
3368 .Case("+sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00003369 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003370 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003371
Eli Friedman33465822011-07-08 23:31:17 +00003372 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00003373 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003374 .Case("+3dnowa", AMD3DNowAthlon)
3375 .Case("+3dnow", AMD3DNow)
3376 .Case("+mmx", MMX)
Eli Friedman33465822011-07-08 23:31:17 +00003377 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00003378 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003379
3380 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003381 .Case("+xop", XOP)
3382 .Case("+fma4", FMA4)
3383 .Case("+sse4a", SSE4A)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003384 .Default(NoXOP);
3385 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003386 }
Eli Friedman33465822011-07-08 23:31:17 +00003387
Rafael Espindolaeb265472013-08-21 21:59:03 +00003388 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
3389 // matches the selected sse level.
Craig Topperd945d502015-10-20 00:00:17 +00003390 if ((FPMath == FP_SSE && SSELevel < SSE1) ||
3391 (FPMath == FP_387 && SSELevel >= SSE1)) {
3392 Diags.Report(diag::err_target_unsupported_fpmath) <<
3393 (FPMath == FP_SSE ? "sse" : "387");
Rafael Espindolaeb265472013-08-21 21:59:03 +00003394 return false;
3395 }
3396
Alexey Bataev00396512015-07-02 03:40:19 +00003397 SimdDefaultAlign =
Ahmed Bougacha68bf64e2015-08-27 22:24:56 +00003398 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Rafael Espindolaeb265472013-08-21 21:59:03 +00003399 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00003400}
Chris Lattnerecd49032009-03-02 22:27:17 +00003401
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003402/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
3403/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00003404void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003405 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00003406 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00003407 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003408 Builder.defineMacro("__amd64__");
3409 Builder.defineMacro("__amd64");
3410 Builder.defineMacro("__x86_64");
3411 Builder.defineMacro("__x86_64__");
Bob Wilsona2acb1e2014-08-08 23:46:28 +00003412 if (getTriple().getArchName() == "x86_64h") {
3413 Builder.defineMacro("__x86_64h");
3414 Builder.defineMacro("__x86_64h__");
3415 }
Chris Lattnerecd49032009-03-02 22:27:17 +00003416 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003417 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00003418 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003419
Chris Lattnerecd49032009-03-02 22:27:17 +00003420 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003421 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
3422 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00003423 switch (CPU) {
3424 case CK_Generic:
3425 break;
3426 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003427 // The rest are coming from the i386 define above.
3428 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003429 break;
3430 case CK_i486:
3431 case CK_WinChipC6:
3432 case CK_WinChip2:
3433 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003434 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00003435 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003436 case CK_PentiumMMX:
3437 Builder.defineMacro("__pentium_mmx__");
3438 Builder.defineMacro("__tune_pentium_mmx__");
3439 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003440 case CK_i586:
3441 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003442 defineCPUMacros(Builder, "i586");
3443 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00003444 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003445 case CK_Pentium3:
3446 case CK_Pentium3M:
3447 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003448 Builder.defineMacro("__tune_pentium3__");
3449 // Fallthrough
3450 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00003451 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003452 Builder.defineMacro("__tune_pentium2__");
3453 // Fallthrough
3454 case CK_PentiumPro:
3455 Builder.defineMacro("__tune_i686__");
3456 Builder.defineMacro("__tune_pentiumpro__");
3457 // Fallthrough
3458 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003459 Builder.defineMacro("__i686");
3460 Builder.defineMacro("__i686__");
3461 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
3462 Builder.defineMacro("__pentiumpro");
3463 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003464 break;
3465 case CK_Pentium4:
3466 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003467 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00003468 break;
3469 case CK_Yonah:
3470 case CK_Prescott:
3471 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003472 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00003473 break;
3474 case CK_Core2:
3475 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003476 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00003477 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003478 case CK_Bonnell:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003479 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00003480 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00003481 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00003482 defineCPUMacros(Builder, "slm");
3483 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003484 case CK_Nehalem:
3485 case CK_Westmere:
3486 case CK_SandyBridge:
3487 case CK_IvyBridge:
3488 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00003489 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003490 case CK_SkylakeClient:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003491 // FIXME: Historically, we defined this legacy name, it would be nice to
3492 // remove it at some point. We've never exposed fine-grained names for
3493 // recent primary x86 CPUs, and we should keep it that way.
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003494 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00003495 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003496 case CK_SkylakeServer:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003497 defineCPUMacros(Builder, "skx");
3498 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003499 case CK_Cannonlake:
3500 break;
Craig Topper449314e2013-08-20 07:09:39 +00003501 case CK_KNL:
3502 defineCPUMacros(Builder, "knl");
3503 break;
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003504 case CK_Lakemont:
3505 Builder.defineMacro("__tune_lakemont__");
3506 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003507 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003508 Builder.defineMacro("__k6_2__");
3509 Builder.defineMacro("__tune_k6_2__");
3510 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003511 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003512 if (CPU != CK_K6_2) { // In case of fallthrough
3513 // FIXME: GCC may be enabling these in cases where some other k6
3514 // architecture is specified but -m3dnow is explicitly provided. The
3515 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003516 Builder.defineMacro("__k6_3__");
3517 Builder.defineMacro("__tune_k6_3__");
3518 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003519 // Fallthrough
3520 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003521 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00003522 break;
3523 case CK_Athlon:
3524 case CK_AthlonThunderbird:
3525 case CK_Athlon4:
3526 case CK_AthlonXP:
3527 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003528 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003529 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003530 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003531 Builder.defineMacro("__tune_athlon_sse__");
3532 }
Chandler Carruth212334f2011-09-28 08:55:37 +00003533 break;
3534 case CK_K8:
3535 case CK_K8SSE3:
3536 case CK_x86_64:
3537 case CK_Opteron:
3538 case CK_OpteronSSE3:
3539 case CK_Athlon64:
3540 case CK_Athlon64SSE3:
3541 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003542 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00003543 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00003544 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003545 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00003546 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00003547 case CK_BTVER1:
3548 defineCPUMacros(Builder, "btver1");
3549 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003550 case CK_BTVER2:
3551 defineCPUMacros(Builder, "btver2");
3552 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003553 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003554 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003555 break;
3556 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003557 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003558 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003559 case CK_BDVER3:
3560 defineCPUMacros(Builder, "bdver3");
3561 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003562 case CK_BDVER4:
3563 defineCPUMacros(Builder, "bdver4");
3564 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003565 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003566 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00003567 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003568 }
Chris Lattner96e43572009-03-02 22:40:39 +00003569
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003570 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003571 Builder.defineMacro("__REGISTER_PREFIX__", "");
3572
Chris Lattner6df41af2009-04-19 17:32:33 +00003573 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
3574 // functions in glibc header files that use FP Stack inline asm which the
3575 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003576 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003577
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003578 if (HasAES)
3579 Builder.defineMacro("__AES__");
3580
Craig Topper3f122a72012-05-31 05:18:48 +00003581 if (HasPCLMUL)
3582 Builder.defineMacro("__PCLMUL__");
3583
Craig Topper22967d42011-12-25 05:06:45 +00003584 if (HasLZCNT)
3585 Builder.defineMacro("__LZCNT__");
3586
Benjamin Kramer1e250392012-07-07 09:39:18 +00003587 if (HasRDRND)
3588 Builder.defineMacro("__RDRND__");
3589
Craig Topper8c7f2512014-11-03 06:51:41 +00003590 if (HasFSGSBASE)
3591 Builder.defineMacro("__FSGSBASE__");
3592
Craig Topper22967d42011-12-25 05:06:45 +00003593 if (HasBMI)
3594 Builder.defineMacro("__BMI__");
3595
3596 if (HasBMI2)
3597 Builder.defineMacro("__BMI2__");
3598
Craig Topper1de83482011-12-29 16:10:46 +00003599 if (HasPOPCNT)
3600 Builder.defineMacro("__POPCNT__");
3601
Michael Liao625a8752012-11-10 05:17:46 +00003602 if (HasRTM)
3603 Builder.defineMacro("__RTM__");
3604
Michael Liao74f4eaf2013-03-26 17:52:08 +00003605 if (HasPRFCHW)
3606 Builder.defineMacro("__PRFCHW__");
3607
Michael Liaoffaae352013-03-29 05:17:55 +00003608 if (HasRDSEED)
3609 Builder.defineMacro("__RDSEED__");
3610
Robert Khasanov50e6f582014-09-19 09:53:48 +00003611 if (HasADX)
3612 Builder.defineMacro("__ADX__");
3613
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003614 if (HasTBM)
3615 Builder.defineMacro("__TBM__");
3616
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003617 if (HasMWAITX)
3618 Builder.defineMacro("__MWAITX__");
3619
Rafael Espindolae62e2792013-08-20 13:44:29 +00003620 switch (XOPLevel) {
3621 case XOP:
3622 Builder.defineMacro("__XOP__");
3623 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00003624 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00003625 case SSE4A:
3626 Builder.defineMacro("__SSE4A__");
3627 case NoXOP:
3628 break;
3629 }
Craig Topperffdb46c2011-12-30 07:33:42 +00003630
Craig Topperbba778b2012-06-03 21:46:30 +00003631 if (HasFMA)
3632 Builder.defineMacro("__FMA__");
3633
Manman Rena45358c2012-10-11 00:59:55 +00003634 if (HasF16C)
3635 Builder.defineMacro("__F16C__");
3636
Craig Topper679b53a2013-08-21 05:29:10 +00003637 if (HasAVX512CD)
3638 Builder.defineMacro("__AVX512CD__");
3639 if (HasAVX512ER)
3640 Builder.defineMacro("__AVX512ER__");
3641 if (HasAVX512PF)
3642 Builder.defineMacro("__AVX512PF__");
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003643 if (HasAVX512DQ)
3644 Builder.defineMacro("__AVX512DQ__");
3645 if (HasAVX512BW)
3646 Builder.defineMacro("__AVX512BW__");
3647 if (HasAVX512VL)
3648 Builder.defineMacro("__AVX512VL__");
Craig Topperb4f83a02016-02-29 06:51:38 +00003649 if (HasAVX512VBMI)
3650 Builder.defineMacro("__AVX512VBMI__");
3651 if (HasAVX512IFMA)
3652 Builder.defineMacro("__AVX512IFMA__");
Craig Topper679b53a2013-08-21 05:29:10 +00003653
Ben Langmuir58078d02013-09-19 13:22:04 +00003654 if (HasSHA)
3655 Builder.defineMacro("__SHA__");
3656
Craig Toppere33f51f2015-10-16 06:22:36 +00003657 if (HasFXSR)
3658 Builder.defineMacro("__FXSR__");
Craig Topperda9fe562015-10-15 05:23:38 +00003659 if (HasXSAVE)
3660 Builder.defineMacro("__XSAVE__");
3661 if (HasXSAVEOPT)
3662 Builder.defineMacro("__XSAVEOPT__");
3663 if (HasXSAVEC)
3664 Builder.defineMacro("__XSAVEC__");
3665 if (HasXSAVES)
3666 Builder.defineMacro("__XSAVES__");
Asaf Badouha9d1e182015-12-31 14:14:07 +00003667 if (HasPKU)
3668 Builder.defineMacro("__PKU__");
Nick Lewycky50e8f482013-10-05 20:14:27 +00003669 if (HasCX16)
3670 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
3671
Chris Lattner96e43572009-03-02 22:40:39 +00003672 // Each case falls through to the previous one here.
3673 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003674 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00003675 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00003676 case AVX2:
3677 Builder.defineMacro("__AVX2__");
3678 case AVX:
3679 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00003680 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003681 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00003682 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003683 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00003684 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003685 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003686 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003687 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003688 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003689 Builder.defineMacro("__SSE2__");
3690 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00003691 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003692 Builder.defineMacro("__SSE__");
3693 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00003694 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00003695 break;
3696 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003697
Derek Schuffc7dd7222012-10-11 15:52:22 +00003698 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003699 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003700 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00003701 case AVX2:
3702 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003703 case SSE42:
3704 case SSE41:
3705 case SSSE3:
3706 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003707 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003708 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003709 break;
3710 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003711 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003712 break;
3713 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003714 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003715 }
3716 }
3717
Anders Carlssone437c682010-01-27 03:47:49 +00003718 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00003719 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00003720 case AMD3DNowAthlon:
3721 Builder.defineMacro("__3dNOW_A__");
3722 case AMD3DNow:
3723 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00003724 case MMX:
3725 Builder.defineMacro("__MMX__");
3726 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00003727 break;
3728 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00003729
3730 if (CPU >= CK_i486) {
3731 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
3732 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
3733 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
3734 }
3735 if (CPU >= CK_i586)
3736 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00003737}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003738
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003739bool X86TargetInfo::hasFeature(StringRef Feature) const {
3740 return llvm::StringSwitch<bool>(Feature)
3741 .Case("aes", HasAES)
3742 .Case("avx", SSELevel >= AVX)
3743 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00003744 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00003745 .Case("avx512cd", HasAVX512CD)
3746 .Case("avx512er", HasAVX512ER)
3747 .Case("avx512pf", HasAVX512PF)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003748 .Case("avx512dq", HasAVX512DQ)
3749 .Case("avx512bw", HasAVX512BW)
3750 .Case("avx512vl", HasAVX512VL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003751 .Case("avx512vbmi", HasAVX512VBMI)
3752 .Case("avx512ifma", HasAVX512IFMA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003753 .Case("bmi", HasBMI)
3754 .Case("bmi2", HasBMI2)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003755 .Case("clflushopt", HasCLFLUSHOPT)
3756 .Case("clwb", HasCLWB)
Nick Lewycky50e8f482013-10-05 20:14:27 +00003757 .Case("cx16", HasCX16)
3758 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00003759 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003760 .Case("fma4", XOPLevel >= FMA4)
Craig Topper8c7f2512014-11-03 06:51:41 +00003761 .Case("fsgsbase", HasFSGSBASE)
Craig Toppere33f51f2015-10-16 06:22:36 +00003762 .Case("fxsr", HasFXSR)
Craig Topper8dbc5842014-11-03 07:05:26 +00003763 .Case("lzcnt", HasLZCNT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003764 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
3765 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
3766 .Case("mmx", MMX3DNowLevel >= MMX)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003767 .Case("movbe", HasMOVBE)
3768 .Case("mpx", HasMPX)
Craig Topper3f122a72012-05-31 05:18:48 +00003769 .Case("pclmul", HasPCLMUL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003770 .Case("pcommit", HasPCOMMIT)
3771 .Case("pku", HasPKU)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003772 .Case("popcnt", HasPOPCNT)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003773 .Case("prefetchwt1", HasPREFETCHWT1)
Michael Liao74f4eaf2013-03-26 17:52:08 +00003774 .Case("prfchw", HasPRFCHW)
Craig Topper8dbc5842014-11-03 07:05:26 +00003775 .Case("rdrnd", HasRDRND)
Michael Liaoffaae352013-03-29 05:17:55 +00003776 .Case("rdseed", HasRDSEED)
Craig Topper8dbc5842014-11-03 07:05:26 +00003777 .Case("rtm", HasRTM)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003778 .Case("sgx", HasSGX)
Ben Langmuir58078d02013-09-19 13:22:04 +00003779 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003780 .Case("sse", SSELevel >= SSE1)
3781 .Case("sse2", SSELevel >= SSE2)
3782 .Case("sse3", SSELevel >= SSE3)
3783 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00003784 .Case("sse4.1", SSELevel >= SSE41)
3785 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003786 .Case("sse4a", XOPLevel >= SSE4A)
Craig Topper8dbc5842014-11-03 07:05:26 +00003787 .Case("tbm", HasTBM)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003788 .Case("umip", HasUMIP)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003789 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00003790 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
3791 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003792 .Case("xop", XOPLevel >= XOP)
Craig Topperda9fe562015-10-15 05:23:38 +00003793 .Case("xsave", HasXSAVE)
3794 .Case("xsavec", HasXSAVEC)
3795 .Case("xsaves", HasXSAVES)
3796 .Case("xsaveopt", HasXSAVEOPT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003797 .Default(false);
3798}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003799
Eric Christopherd9832702015-06-29 21:00:05 +00003800// We can't use a generic validation scheme for the features accepted here
3801// versus subtarget features accepted in the target attribute because the
3802// bitfield structure that's initialized in the runtime only supports the
3803// below currently rather than the full range of subtarget features. (See
3804// X86TargetInfo::hasFeature for a somewhat comprehensive list).
3805bool X86TargetInfo::validateCpuSupports(StringRef FeatureStr) const {
3806 return llvm::StringSwitch<bool>(FeatureStr)
3807 .Case("cmov", true)
3808 .Case("mmx", true)
3809 .Case("popcnt", true)
3810 .Case("sse", true)
3811 .Case("sse2", true)
3812 .Case("sse3", true)
Benjamin Kramerf4c520d2016-05-20 15:21:08 +00003813 .Case("ssse3", true)
Eric Christopherd9832702015-06-29 21:00:05 +00003814 .Case("sse4.1", true)
3815 .Case("sse4.2", true)
3816 .Case("avx", true)
3817 .Case("avx2", true)
3818 .Case("sse4a", true)
3819 .Case("fma4", true)
3820 .Case("xop", true)
3821 .Case("fma", true)
3822 .Case("avx512f", true)
3823 .Case("bmi", true)
3824 .Case("bmi2", true)
Benjamin Kramerf4c520d2016-05-20 15:21:08 +00003825 .Case("aes", true)
3826 .Case("pclmul", true)
3827 .Case("avx512vl", true)
3828 .Case("avx512bw", true)
3829 .Case("avx512dq", true)
3830 .Case("avx512cd", true)
3831 .Case("avx512er", true)
3832 .Case("avx512pf", true)
3833 .Case("avx512vbmi", true)
3834 .Case("avx512ifma", true)
Eric Christopherd9832702015-06-29 21:00:05 +00003835 .Default(false);
3836}
3837
Eli Friedman3fd920a2008-08-20 02:34:37 +00003838bool
Anders Carlsson58436352009-02-28 17:11:49 +00003839X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00003840 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00003841 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003842 default: return false;
Alexey Bataev91e58602015-07-20 12:08:00 +00003843 // Constant constraints.
3844 case 'e': // 32-bit signed integer constant for use with sign-extending x86_64
3845 // instructions.
3846 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
3847 // x86_64 instructions.
3848 case 's':
3849 Info.setRequiresImmediate();
3850 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003851 case 'I':
3852 Info.setRequiresImmediate(0, 31);
3853 return true;
3854 case 'J':
3855 Info.setRequiresImmediate(0, 63);
3856 return true;
3857 case 'K':
3858 Info.setRequiresImmediate(-128, 127);
3859 return true;
3860 case 'L':
Alexey Bataev91e58602015-07-20 12:08:00 +00003861 Info.setRequiresImmediate({ int(0xff), int(0xffff), int(0xffffffff) });
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003862 return true;
3863 case 'M':
3864 Info.setRequiresImmediate(0, 3);
3865 return true;
3866 case 'N':
3867 Info.setRequiresImmediate(0, 255);
3868 return true;
3869 case 'O':
3870 Info.setRequiresImmediate(0, 127);
3871 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003872 // Register constraints.
3873 case 'Y': // 'Y' is the first character for several 2-character constraints.
3874 // Shift the pointer to the second character of the constraint.
3875 Name++;
3876 switch (*Name) {
3877 default:
3878 return false;
3879 case '0': // First SSE register.
3880 case 't': // Any SSE register, when SSE2 is enabled.
3881 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
3882 case 'm': // Any MMX register, when inter-unit moves enabled.
3883 Info.setAllowsRegister();
3884 return true;
3885 }
3886 case 'f': // Any x87 floating point stack register.
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003887 // Constraint 'f' cannot be used for output operands.
3888 if (Info.ConstraintStr[0] == '=')
3889 return false;
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003890 Info.setAllowsRegister();
3891 return true;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003892 case 'a': // eax.
3893 case 'b': // ebx.
3894 case 'c': // ecx.
3895 case 'd': // edx.
3896 case 'S': // esi.
3897 case 'D': // edi.
3898 case 'A': // edx:eax.
Alexey Bataev91e58602015-07-20 12:08:00 +00003899 case 't': // Top of floating point stack.
3900 case 'u': // Second from top of floating point stack.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003901 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00003902 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00003903 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003904 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00003905 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
3906 case 'l': // "Index" registers: any general register that can be used as an
3907 // index in a base+index memory access.
3908 Info.setAllowsRegister();
3909 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003910 // Floating point constant constraints.
Dale Johannesen46742a42010-08-24 22:33:12 +00003911 case 'C': // SSE floating point constant.
3912 case 'G': // x87 floating point constant.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003913 return true;
3914 }
3915}
3916
Akira Hatanaka974131e2014-09-18 18:17:18 +00003917bool X86TargetInfo::validateOutputSize(StringRef Constraint,
3918 unsigned Size) const {
3919 // Strip off constraint modifiers.
3920 while (Constraint[0] == '=' ||
3921 Constraint[0] == '+' ||
3922 Constraint[0] == '&')
3923 Constraint = Constraint.substr(1);
3924
3925 return validateOperandSize(Constraint, Size);
3926}
3927
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003928bool X86TargetInfo::validateInputSize(StringRef Constraint,
3929 unsigned Size) const {
Akira Hatanaka974131e2014-09-18 18:17:18 +00003930 return validateOperandSize(Constraint, Size);
3931}
3932
3933bool X86TargetInfo::validateOperandSize(StringRef Constraint,
3934 unsigned Size) const {
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003935 switch (Constraint[0]) {
3936 default: break;
3937 case 'y':
3938 return Size <= 64;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003939 case 'f':
3940 case 't':
3941 case 'u':
3942 return Size <= 128;
Hans Wennborg3c619a42014-09-18 20:24:04 +00003943 case 'x':
Alexey Bataev91e58602015-07-20 12:08:00 +00003944 if (SSELevel >= AVX512F)
3945 // 512-bit zmm registers can be used if target supports AVX512F.
3946 return Size <= 512U;
3947 else if (SSELevel >= AVX)
3948 // 256-bit ymm registers can be used if target supports AVX.
3949 return Size <= 256U;
3950 return Size <= 128U;
3951 case 'Y':
3952 // 'Y' is the first character for several 2-character constraints.
3953 switch (Constraint[1]) {
3954 default: break;
3955 case 'm':
3956 // 'Ym' is synonymous with 'y'.
3957 return Size <= 64;
3958 case 'i':
3959 case 't':
3960 // 'Yi' and 'Yt' are synonymous with 'x' when SSE2 is enabled.
3961 if (SSELevel >= AVX512F)
3962 return Size <= 512U;
3963 else if (SSELevel >= AVX)
3964 return Size <= 256U;
3965 return SSELevel >= SSE2 && Size <= 128U;
3966 }
3967
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003968 }
3969
3970 return true;
3971}
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00003972
Eli Friedman3fd920a2008-08-20 02:34:37 +00003973std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003974X86TargetInfo::convertConstraint(const char *&Constraint) const {
3975 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003976 case 'a': return std::string("{ax}");
3977 case 'b': return std::string("{bx}");
3978 case 'c': return std::string("{cx}");
3979 case 'd': return std::string("{dx}");
3980 case 'S': return std::string("{si}");
3981 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00003982 case 'p': // address
3983 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00003984 case 't': // top of floating point stack.
3985 return std::string("{st}");
3986 case 'u': // second from top of floating point stack.
3987 return std::string("{st(1)}"); // second from top of floating point stack.
3988 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003989 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00003990 }
3991}
Chris Lattner5ba61f02006-10-14 07:39:34 +00003992
Eli Friedman3fd920a2008-08-20 02:34:37 +00003993// X86-32 generic target
3994class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00003995public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00003996 X86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
3997 : X86TargetInfo(Triple, Opts) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003998 DoubleAlign = LongLongAlign = 32;
3999 LongDoubleWidth = 96;
4000 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00004001 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00004002 resetDataLayout("e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128");
Eli Friedman32ca82a2009-03-29 20:31:09 +00004003 SizeType = UnsignedInt;
4004 PtrDiffType = SignedInt;
4005 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00004006 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00004007
4008 // Use fpret for all types.
4009 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
4010 (1 << TargetInfo::Double) |
4011 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004012
4013 // x86-32 has atomics up to 8 bytes
4014 // FIXME: Check that we actually have cmpxchg8b before setting
4015 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
4016 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004017 }
Craig Topper3164f332014-03-11 03:39:26 +00004018 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004019 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004020 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004021
Craig Topper3164f332014-03-11 03:39:26 +00004022 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00004023 if (RegNo == 0) return 0;
4024 if (RegNo == 1) return 2;
4025 return -1;
4026 }
Akira Hatanaka974131e2014-09-18 18:17:18 +00004027 bool validateOperandSize(StringRef Constraint,
4028 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00004029 switch (Constraint[0]) {
4030 default: break;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004031 case 'R':
4032 case 'q':
4033 case 'Q':
Bill Wendling887b4852012-11-12 06:42:51 +00004034 case 'a':
4035 case 'b':
4036 case 'c':
4037 case 'd':
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004038 case 'S':
4039 case 'D':
Bill Wendling3c7fed82012-11-12 18:52:32 +00004040 return Size <= 32;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004041 case 'A':
4042 return Size <= 64;
Bill Wendling887b4852012-11-12 06:42:51 +00004043 }
4044
Akira Hatanaka974131e2014-09-18 18:17:18 +00004045 return X86TargetInfo::validateOperandSize(Constraint, Size);
Bill Wendling887b4852012-11-12 06:42:51 +00004046 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004047};
Eli Friedman3fd920a2008-08-20 02:34:37 +00004048
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004049class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
4050public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004051 NetBSDI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4052 : NetBSDTargetInfo<X86_32TargetInfo>(Triple, Opts) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004053
Craig Topper3164f332014-03-11 03:39:26 +00004054 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00004055 unsigned Major, Minor, Micro;
4056 getTriple().getOSVersion(Major, Minor, Micro);
4057 // New NetBSD uses the default rounding mode.
4058 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
4059 return X86_32TargetInfo::getFloatEvalMethod();
4060 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004061 return 1;
4062 }
4063};
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004064
Eli Friedmane3aa4542009-07-05 18:47:56 +00004065class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
4066public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004067 OpenBSDI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4068 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00004069 SizeType = UnsignedLong;
4070 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004071 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00004072 }
4073};
Eli Friedmane3aa4542009-07-05 18:47:56 +00004074
Eli Friedman9fa28852012-08-08 23:57:20 +00004075class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
4076public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004077 BitrigI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4078 : BitrigTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman9fa28852012-08-08 23:57:20 +00004079 SizeType = UnsignedLong;
4080 IntPtrType = SignedLong;
4081 PtrDiffType = SignedLong;
4082 }
4083};
Eli Friedman9fa28852012-08-08 23:57:20 +00004084
Torok Edwinb2b37c62009-06-30 17:10:35 +00004085class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004086public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004087 DarwinI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4088 : DarwinTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004089 LongDoubleWidth = 128;
4090 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004091 SuitableAlign = 128;
Tim Northover5627d392015-10-30 16:30:45 +00004092 MaxVectorAlign = 256;
4093 // The watchOS simulator uses the builtin bool type for Objective-C.
4094 llvm::Triple T = llvm::Triple(Triple);
4095 if (T.isWatchOS())
4096 UseSignedCharForObjCBool = false;
Eli Friedman32ca82a2009-03-29 20:31:09 +00004097 SizeType = UnsignedLong;
4098 IntPtrType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00004099 resetDataLayout("e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128");
Daniel Dunbarbd606522010-05-27 00:35:16 +00004100 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00004101 }
4102
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004103 bool handleTargetFeatures(std::vector<std::string> &Features,
4104 DiagnosticsEngine &Diags) override {
4105 if (!DarwinTargetInfo<X86_32TargetInfo>::handleTargetFeatures(Features,
4106 Diags))
4107 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004108 // We now know the features we have: we can decide how to align vectors.
4109 MaxVectorAlign =
4110 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004111 return true;
4112 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004113};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004114
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004115// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004116class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004117public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004118 WindowsX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4119 : WindowsTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Chris Lattner46be2e12009-06-24 17:12:15 +00004120 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00004121 DoubleAlign = LongLongAlign = 64;
Reid Kleckner7510c092015-04-01 16:45:06 +00004122 bool IsWinCOFF =
4123 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
James Y Knightb214cbc2016-03-04 19:00:41 +00004124 resetDataLayout(IsWinCOFF
4125 ? "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
4126 : "e-m:e-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32");
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004127 }
Craig Topper3164f332014-03-11 03:39:26 +00004128 void getTargetDefines(const LangOptions &Opts,
4129 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004130 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
4131 }
4132};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004133
4134// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004135class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004136public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004137 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple,
4138 const TargetOptions &Opts)
4139 : WindowsX86_32TargetInfo(Triple, Opts) {
Eli Friedman015d6282011-03-22 21:25:11 +00004140 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004141 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
4142 }
Craig Topper3164f332014-03-11 03:39:26 +00004143 void getTargetDefines(const LangOptions &Opts,
4144 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004145 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
4146 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
4147 // The value of the following reflects processor type.
4148 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
4149 // We lost the original triple, so we use the default.
4150 Builder.defineMacro("_M_IX86", "600");
4151 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004152};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004153
David Majnemerae1ed0e2015-05-28 04:36:18 +00004154static void addCygMingDefines(const LangOptions &Opts, MacroBuilder &Builder) {
Eric Christopherb093d692015-10-09 18:39:59 +00004155 // Mingw and cygwin define __declspec(a) to __attribute__((a)). Clang
4156 // supports __declspec natively under -fms-extensions, but we define a no-op
4157 // __declspec macro anyway for pre-processor compatibility.
Reid Kleckner47606832014-04-21 20:58:00 +00004158 if (Opts.MicrosoftExt)
4159 Builder.defineMacro("__declspec", "__declspec");
4160 else
4161 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
4162
4163 if (!Opts.MicrosoftExt) {
4164 // Provide macros for all the calling convention keywords. Provide both
4165 // single and double underscore prefixed variants. These are available on
4166 // x64 as well as x86, even though they have no effect.
4167 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
4168 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00004169 std::string GCCSpelling = "__attribute__((__";
4170 GCCSpelling += CC;
4171 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00004172 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
4173 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
4174 }
4175 }
4176}
4177
David Majnemerae1ed0e2015-05-28 04:36:18 +00004178static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
4179 Builder.defineMacro("__MSVCRT__");
4180 Builder.defineMacro("__MINGW32__");
4181 addCygMingDefines(Opts, Builder);
4182}
4183
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004184// x86-32 MinGW target
4185class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
4186public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004187 MinGWX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4188 : WindowsX86_32TargetInfo(Triple, Opts) {}
Craig Topper3164f332014-03-11 03:39:26 +00004189 void getTargetDefines(const LangOptions &Opts,
4190 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004191 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004192 DefineStd(Builder, "WIN32", Opts);
4193 DefineStd(Builder, "WINNT", Opts);
4194 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00004195 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004196 }
4197};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004198
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004199// x86-32 Cygwin target
4200class CygwinX86_32TargetInfo : public X86_32TargetInfo {
4201public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004202 CygwinX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4203 : X86_32TargetInfo(Triple, Opts) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004204 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004205 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00004206 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 +00004207 }
Craig Topper3164f332014-03-11 03:39:26 +00004208 void getTargetDefines(const LangOptions &Opts,
4209 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004210 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00004211 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004212 Builder.defineMacro("__CYGWIN__");
4213 Builder.defineMacro("__CYGWIN32__");
David Majnemerae1ed0e2015-05-28 04:36:18 +00004214 addCygMingDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004215 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00004216 if (Opts.CPlusPlus)
4217 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00004218 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004219};
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004220
Chris Lattnerb986aba2010-04-11 19:29:39 +00004221// x86-32 Haiku target
Reid Kleckner330fb172016-05-11 16:19:05 +00004222class HaikuX86_32TargetInfo : public HaikuTargetInfo<X86_32TargetInfo> {
Chris Lattnerb986aba2010-04-11 19:29:39 +00004223public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004224 HaikuX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Reid Kleckner330fb172016-05-11 16:19:05 +00004225 : HaikuTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman04831922010-08-22 01:00:03 +00004226 }
Craig Topper3164f332014-03-11 03:39:26 +00004227 void getTargetDefines(const LangOptions &Opts,
4228 MacroBuilder &Builder) const override {
Reid Kleckner330fb172016-05-11 16:19:05 +00004229 HaikuTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
Chris Lattnerb986aba2010-04-11 19:29:39 +00004230 Builder.defineMacro("__INTEL__");
Chris Lattnerb986aba2010-04-11 19:29:39 +00004231 }
4232};
Chris Lattnerb986aba2010-04-11 19:29:39 +00004233
Alexey Bataevc99b0492015-11-25 09:24:26 +00004234// X86-32 MCU target
4235class MCUX86_32TargetInfo : public X86_32TargetInfo {
4236public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004237 MCUX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4238 : X86_32TargetInfo(Triple, Opts) {
Alexey Bataevc99b0492015-11-25 09:24:26 +00004239 LongDoubleWidth = 64;
4240 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
James Y Knightb214cbc2016-03-04 19:00:41 +00004241 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 +00004242 WIntType = UnsignedInt;
Alexey Bataevc99b0492015-11-25 09:24:26 +00004243 }
4244
4245 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
4246 // On MCU we support only C calling convention.
4247 return CC == CC_C ? CCCR_OK : CCCR_Warning;
4248 }
4249
4250 void getTargetDefines(const LangOptions &Opts,
4251 MacroBuilder &Builder) const override {
4252 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4253 Builder.defineMacro("__iamcu");
4254 Builder.defineMacro("__iamcu__");
4255 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00004256
4257 bool allowsLargerPreferedTypeAlignment() const override {
4258 return false;
4259 }
Alexey Bataevc99b0492015-11-25 09:24:26 +00004260};
4261
Douglas Gregor9fabd852011-07-01 22:41:14 +00004262// RTEMS Target
4263template<typename Target>
4264class RTEMSTargetInfo : public OSTargetInfo<Target> {
4265protected:
Craig Topper3164f332014-03-11 03:39:26 +00004266 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4267 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004268 // RTEMS defines; list based off of gcc output
4269
Douglas Gregor9fabd852011-07-01 22:41:14 +00004270 Builder.defineMacro("__rtems__");
4271 Builder.defineMacro("__ELF__");
4272 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004273
Douglas Gregor9fabd852011-07-01 22:41:14 +00004274public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004275 RTEMSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4276 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004277 switch (Triple.getArch()) {
4278 default:
4279 case llvm::Triple::x86:
4280 // this->MCountName = ".mcount";
4281 break;
4282 case llvm::Triple::mips:
4283 case llvm::Triple::mipsel:
4284 case llvm::Triple::ppc:
4285 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00004286 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004287 // this->MCountName = "_mcount";
4288 break;
4289 case llvm::Triple::arm:
4290 // this->MCountName = "__mcount";
4291 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004292 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004293 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00004294};
4295
Douglas Gregor9fabd852011-07-01 22:41:14 +00004296// x86-32 RTEMS target
4297class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
4298public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004299 RTEMSX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4300 : X86_32TargetInfo(Triple, Opts) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004301 SizeType = UnsignedLong;
4302 IntPtrType = SignedLong;
4303 PtrDiffType = SignedLong;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004304 }
Craig Topper3164f332014-03-11 03:39:26 +00004305 void getTargetDefines(const LangOptions &Opts,
4306 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004307 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4308 Builder.defineMacro("__INTEL__");
4309 Builder.defineMacro("__rtems__");
4310 }
4311};
Douglas Gregor9fabd852011-07-01 22:41:14 +00004312
Eli Friedman3fd920a2008-08-20 02:34:37 +00004313// x86-64 generic target
4314class X86_64TargetInfo : public X86TargetInfo {
4315public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004316 X86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4317 : X86TargetInfo(Triple, Opts) {
David Blaikie40f842d2014-07-10 18:46:15 +00004318 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
David Majnemer8fa8c382015-03-17 23:55:00 +00004319 bool IsWinCOFF =
4320 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Zinovy Nis1db95732014-07-10 15:27:19 +00004321 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00004322 LongDoubleWidth = 128;
4323 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00004324 LargeArrayMinWidth = 128;
4325 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004326 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00004327 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
4328 PtrDiffType = IsX32 ? SignedInt : SignedLong;
4329 IntPtrType = IsX32 ? SignedInt : SignedLong;
4330 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00004331 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00004332 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00004333
Eric Christopher917e9522014-11-18 22:36:15 +00004334 // Pointers are 32-bit in x32.
James Y Knightb214cbc2016-03-04 19:00:41 +00004335 resetDataLayout(IsX32
4336 ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128"
4337 : IsWinCOFF ? "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
4338 : "e-m:e-i64:64-f80:128-n8:16:32:64-S128");
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00004339
4340 // Use fpret only for long double.
4341 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004342
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00004343 // Use fp2ret for _Complex long double.
4344 ComplexLongDoubleUsesFP2Ret = true;
4345
Charles Davisc7d5c942015-09-17 20:55:33 +00004346 // Make __builtin_ms_va_list available.
4347 HasBuiltinMSVaList = true;
4348
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004349 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004350 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00004351 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00004352 }
Craig Topper3164f332014-03-11 03:39:26 +00004353 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004354 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00004355 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004356
Craig Topper3164f332014-03-11 03:39:26 +00004357 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00004358 if (RegNo == 0) return 0;
4359 if (RegNo == 1) return 1;
4360 return -1;
4361 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004362
Craig Topper3164f332014-03-11 03:39:26 +00004363 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00004364 switch (CC) {
4365 case CC_C:
4366 case CC_Swift:
4367 case CC_X86VectorCall:
4368 case CC_IntelOclBicc:
4369 case CC_X86_64Win64:
Roman Levenstein35aa5ce2016-03-16 18:00:46 +00004370 case CC_PreserveMost:
4371 case CC_PreserveAll:
John McCall477f2bb2016-03-03 06:39:32 +00004372 return CCCR_OK;
4373 default:
4374 return CCCR_Warning;
4375 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004376 }
4377
Craig Topper3164f332014-03-11 03:39:26 +00004378 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00004379 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004380 }
4381
Pavel Chupinfd223e12014-08-04 12:39:43 +00004382 // for x32 we need it here explicitly
4383 bool hasInt128Type() const override { return true; }
Reid Klecknerf27e7522016-02-01 18:58:24 +00004384 unsigned getUnwindWordWidth() const override { return 64; }
4385 unsigned getRegisterWidth() const override { return 64; }
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00004386
4387 bool validateGlobalRegisterVariable(StringRef RegName,
4388 unsigned RegSize,
4389 bool &HasSizeMismatch) const override {
4390 // rsp and rbp are the only 64-bit registers the x86 backend can currently
4391 // handle.
4392 if (RegName.equals("rsp") || RegName.equals("rbp")) {
4393 // Check that the register size is 64-bit.
4394 HasSizeMismatch = RegSize != 64;
4395 return true;
4396 }
4397
4398 // Check if the register is a 32-bit register the backend can handle.
4399 return X86TargetInfo::validateGlobalRegisterVariable(RegName, RegSize,
4400 HasSizeMismatch);
4401 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004402};
Eli Friedman3fd920a2008-08-20 02:34:37 +00004403
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004404// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004405class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004406public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004407 WindowsX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4408 : WindowsTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004409 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00004410 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004411 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004412 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004413 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00004414 SizeType = UnsignedLongLong;
4415 PtrDiffType = SignedLongLong;
4416 IntPtrType = SignedLongLong;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004417 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004418
Craig Topper3164f332014-03-11 03:39:26 +00004419 void getTargetDefines(const LangOptions &Opts,
4420 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004421 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004422 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004423 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004424
Craig Topper3164f332014-03-11 03:39:26 +00004425 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004426 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00004427 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004428
Craig Topper3164f332014-03-11 03:39:26 +00004429 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004430 switch (CC) {
4431 case CC_X86StdCall:
4432 case CC_X86ThisCall:
4433 case CC_X86FastCall:
4434 return CCCR_Ignore;
4435 case CC_C:
4436 case CC_X86VectorCall:
4437 case CC_IntelOclBicc:
4438 case CC_X86_64SysV:
4439 return CCCR_OK;
4440 default:
4441 return CCCR_Warning;
4442 }
Charles Davisb5a214e2013-08-30 04:39:01 +00004443 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004444};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004445
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004446// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004447class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004448public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004449 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple,
4450 const TargetOptions &Opts)
4451 : WindowsX86_64TargetInfo(Triple, Opts) {
Eli Friedman015d6282011-03-22 21:25:11 +00004452 LongDoubleWidth = LongDoubleAlign = 64;
4453 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004454 }
Craig Topper3164f332014-03-11 03:39:26 +00004455 void getTargetDefines(const LangOptions &Opts,
4456 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004457 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
4458 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
David Majnemerb856e8f2015-07-26 23:17:29 +00004459 Builder.defineMacro("_M_X64", "100");
4460 Builder.defineMacro("_M_AMD64", "100");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004461 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004462};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004463
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004464// x86-64 MinGW target
4465class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
4466public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004467 MinGWX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4468 : WindowsX86_64TargetInfo(Triple, Opts) {
Reid Kleckner11a17192015-10-28 22:29:52 +00004469 // Mingw64 rounds long double size and alignment up to 16 bytes, but sticks
4470 // with x86 FP ops. Weird.
4471 LongDoubleWidth = LongDoubleAlign = 128;
4472 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
4473 }
4474
Craig Topper3164f332014-03-11 03:39:26 +00004475 void getTargetDefines(const LangOptions &Opts,
4476 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004477 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004478 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004479 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00004480 addMinGWDefines(Opts, Builder);
Reid Klecknere070b992014-11-14 02:01:10 +00004481
4482 // GCC defines this macro when it is using __gxx_personality_seh0.
4483 if (!Opts.SjLjExceptions)
4484 Builder.defineMacro("__SEH__");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004485 }
4486};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004487
Yaron Kerend030d112015-07-22 17:38:19 +00004488// x86-64 Cygwin target
4489class CygwinX86_64TargetInfo : public X86_64TargetInfo {
4490public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004491 CygwinX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4492 : X86_64TargetInfo(Triple, Opts) {
Yaron Kerend030d112015-07-22 17:38:19 +00004493 TLSSupported = false;
4494 WCharType = UnsignedShort;
4495 }
4496 void getTargetDefines(const LangOptions &Opts,
4497 MacroBuilder &Builder) const override {
4498 X86_64TargetInfo::getTargetDefines(Opts, Builder);
4499 Builder.defineMacro("__x86_64__");
4500 Builder.defineMacro("__CYGWIN__");
4501 Builder.defineMacro("__CYGWIN64__");
4502 addCygMingDefines(Opts, Builder);
4503 DefineStd(Builder, "unix", Opts);
4504 if (Opts.CPlusPlus)
4505 Builder.defineMacro("_GNU_SOURCE");
4506
4507 // GCC defines this macro when it is using __gxx_personality_seh0.
4508 if (!Opts.SjLjExceptions)
4509 Builder.defineMacro("__SEH__");
4510 }
4511};
4512
Eli Friedman2857ccb2009-07-01 03:36:11 +00004513class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
4514public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004515 DarwinX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4516 : DarwinTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00004517 Int64Type = SignedLongLong;
Tim Northovera2ee4332014-03-29 15:09:45 +00004518 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
4519 llvm::Triple T = llvm::Triple(Triple);
Bob Wilson946c04c2014-10-19 02:19:27 +00004520 if (T.isiOS())
Tim Northovera2ee4332014-03-29 15:09:45 +00004521 UseSignedCharForObjCBool = false;
James Y Knightb214cbc2016-03-04 19:00:41 +00004522 resetDataLayout("e-m:o-i64:64-f80:128-n8:16:32:64-S128");
Eli Friedman2857ccb2009-07-01 03:36:11 +00004523 }
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004524
4525 bool handleTargetFeatures(std::vector<std::string> &Features,
4526 DiagnosticsEngine &Diags) override {
4527 if (!DarwinTargetInfo<X86_64TargetInfo>::handleTargetFeatures(Features,
4528 Diags))
4529 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004530 // We now know the features we have: we can decide how to align vectors.
4531 MaxVectorAlign =
4532 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004533 return true;
4534 }
Eli Friedman2857ccb2009-07-01 03:36:11 +00004535};
Eli Friedman2857ccb2009-07-01 03:36:11 +00004536
Eli Friedman245f2292009-07-05 22:31:18 +00004537class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
4538public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004539 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4540 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Eli Friedman245f2292009-07-05 22:31:18 +00004541 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004542 Int64Type = SignedLongLong;
4543 }
4544};
Eli Friedman245f2292009-07-05 22:31:18 +00004545
Eli Friedman9fa28852012-08-08 23:57:20 +00004546class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
4547public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004548 BitrigX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4549 : BitrigTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004550 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004551 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00004552 }
4553};
Tim Northover9bb857a2013-01-31 12:13:10 +00004554
Eli Friedmanf05b7722008-08-20 07:44:10 +00004555class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004556 // Possible FPU choices.
4557 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004558 VFP2FPU = (1 << 0),
4559 VFP3FPU = (1 << 1),
4560 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00004561 NeonFPU = (1 << 3),
4562 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004563 };
4564
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004565 // Possible HWDiv features.
4566 enum HWDivMode {
4567 HWDivThumb = (1 << 0),
4568 HWDivARM = (1 << 1)
4569 };
4570
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004571 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004572 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004573 }
4574
4575 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4576 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004577
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004578 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004579
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004580 StringRef CPUProfile;
4581 StringRef CPUAttr;
4582
Rafael Espindolaeb265472013-08-21 21:59:03 +00004583 enum {
4584 FP_Default,
4585 FP_VFP,
4586 FP_Neon
4587 } FPMath;
4588
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004589 unsigned ArchISA;
Renato Goline84b0002015-10-08 16:43:26 +00004590 unsigned ArchKind = llvm::ARM::AK_ARMV4T;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004591 unsigned ArchProfile;
4592 unsigned ArchVersion;
4593
Bernard Ogdenda13af32013-10-24 18:32:51 +00004594 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004595
Logan Chien57086ce2012-10-10 06:56:20 +00004596 unsigned IsAAPCS : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004597 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004598
4599 // Initialized via features.
4600 unsigned SoftFloat : 1;
4601 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004602
Bernard Ogden18b57012013-10-29 09:47:51 +00004603 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00004604 unsigned Crypto : 1;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004605 unsigned DSP : 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004606 unsigned Unaligned : 1;
4607
4608 enum {
4609 LDREX_B = (1 << 0), /// byte (8-bit)
4610 LDREX_H = (1 << 1), /// half (16-bit)
4611 LDREX_W = (1 << 2), /// word (32-bit)
4612 LDREX_D = (1 << 3), /// double (64-bit)
4613 };
4614
4615 uint32_t LDREX;
Bernard Ogden18b57012013-10-29 09:47:51 +00004616
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004617 // ACLE 6.5.1 Hardware floating point
4618 enum {
4619 HW_FP_HP = (1 << 1), /// half (16-bit)
4620 HW_FP_SP = (1 << 2), /// single (32-bit)
4621 HW_FP_DP = (1 << 3), /// double (64-bit)
4622 };
4623 uint32_t HW_FP;
4624
Chris Lattner5cc15e02010-03-03 19:03:45 +00004625 static const Builtin::Info BuiltinInfo[];
4626
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004627 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004628 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004629
4630 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00004631 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004632
Renato Golin9ba39232015-02-27 16:35:48 +00004633 // size_t is unsigned long on MachO-derived environments, NetBSD and Bitrig.
4634 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD ||
4635 T.getOS() == llvm::Triple::Bitrig)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004636 SizeType = UnsignedLong;
4637 else
4638 SizeType = UnsignedInt;
4639
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004640 switch (T.getOS()) {
4641 case llvm::Triple::NetBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004642 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004643 break;
4644 case llvm::Triple::Win32:
4645 WCharType = UnsignedShort;
4646 break;
4647 case llvm::Triple::Linux:
4648 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004649 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
4650 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004651 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004652 }
4653
4654 UseBitFieldTypeAlignment = true;
4655
4656 ZeroLengthBitfieldBoundary = 0;
4657
Tim Northover147cd2f2014-10-14 22:12:21 +00004658 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
4659 // so set preferred for small types to 32.
4660 if (T.isOSBinFormatMachO()) {
James Y Knightb214cbc2016-03-04 19:00:41 +00004661 resetDataLayout(BigEndian
4662 ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4663 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Tim Northover147cd2f2014-10-14 22:12:21 +00004664 } else if (T.isOSWindows()) {
Tim Northover147cd2f2014-10-14 22:12:21 +00004665 assert(!BigEndian && "Windows on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004666 resetDataLayout("e"
4667 "-m:w"
4668 "-p:32:32"
4669 "-i64:64"
4670 "-v128:64:128"
4671 "-a:0:32"
4672 "-n32"
4673 "-S64");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00004674 } else if (T.isOSNaCl()) {
4675 assert(!BigEndian && "NaCl on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004676 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004677 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00004678 resetDataLayout(BigEndian
4679 ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4680 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004681 }
4682
4683 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004684 }
4685
Tim Northover5627d392015-10-30 16:30:45 +00004686 void setABIAPCS(bool IsAAPCS16) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00004687 const llvm::Triple &T = getTriple();
4688
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004689 IsAAPCS = false;
4690
Tim Northover5627d392015-10-30 16:30:45 +00004691 if (IsAAPCS16)
4692 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
4693 else
4694 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004695
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004696 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00004697 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004698 SizeType = UnsignedInt;
4699 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004700 SizeType = UnsignedLong;
4701
4702 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
4703 WCharType = SignedInt;
4704
4705 // Do not respect the alignment of bit-field types when laying out
4706 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
4707 UseBitFieldTypeAlignment = false;
4708
4709 /// gcc forces the alignment to 4 bytes, regardless of the type of the
4710 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
4711 /// gcc.
4712 ZeroLengthBitfieldBoundary = 32;
4713
Tim Northover5627d392015-10-30 16:30:45 +00004714 if (T.isOSBinFormatMachO() && IsAAPCS16) {
4715 assert(!BigEndian && "AAPCS16 does not support big-endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004716 resetDataLayout("e-m:o-p:32:32-i64:64-a:0:32-n32-S128");
Tim Northover5627d392015-10-30 16:30:45 +00004717 } else if (T.isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00004718 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00004719 BigEndian
4720 ? "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 +00004721 : "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 +00004722 else
James Y Knightb214cbc2016-03-04 19:00:41 +00004723 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00004724 BigEndian
4725 ? "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 +00004726 : "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 +00004727
4728 // FIXME: Override "preferred align" for double and long long.
4729 }
4730
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004731 void setArchInfo() {
4732 StringRef ArchName = getTriple().getArchName();
4733
Renato Goline84b0002015-10-08 16:43:26 +00004734 ArchISA = llvm::ARM::parseArchISA(ArchName);
4735 CPU = llvm::ARM::getDefaultCPU(ArchName);
4736 unsigned AK = llvm::ARM::parseArch(ArchName);
4737 if (AK != llvm::ARM::AK_INVALID)
4738 ArchKind = AK;
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004739 setArchInfo(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004740 }
4741
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004742 void setArchInfo(unsigned Kind) {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004743 StringRef SubArch;
4744
4745 // cache TargetParser info
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004746 ArchKind = Kind;
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00004747 SubArch = llvm::ARM::getSubArch(ArchKind);
4748 ArchProfile = llvm::ARM::parseArchProfile(SubArch);
4749 ArchVersion = llvm::ARM::parseArchVersion(SubArch);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004750
4751 // cache CPU related strings
4752 CPUAttr = getCPUAttr();
4753 CPUProfile = getCPUProfile();
4754 }
4755
4756 void setAtomic() {
Eric Christopherb093d692015-10-09 18:39:59 +00004757 // when triple does not specify a sub arch,
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004758 // then we are not using inline atomics
Renato Goline84b0002015-10-08 16:43:26 +00004759 bool ShouldUseInlineAtomic =
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004760 (ArchISA == llvm::ARM::IK_ARM && ArchVersion >= 6) ||
4761 (ArchISA == llvm::ARM::IK_THUMB && ArchVersion >= 7);
Eric Christopherb093d692015-10-09 18:39:59 +00004762 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004763 if (ArchProfile == llvm::ARM::PK_M) {
4764 MaxAtomicPromoteWidth = 32;
4765 if (ShouldUseInlineAtomic)
4766 MaxAtomicInlineWidth = 32;
4767 }
4768 else {
4769 MaxAtomicPromoteWidth = 64;
4770 if (ShouldUseInlineAtomic)
4771 MaxAtomicInlineWidth = 64;
Eric Christopherb093d692015-10-09 18:39:59 +00004772 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004773 }
4774
4775 bool isThumb() const {
4776 return (ArchISA == llvm::ARM::IK_THUMB);
4777 }
4778
4779 bool supportsThumb() const {
4780 return CPUAttr.count('T') || ArchVersion >= 6;
4781 }
4782
4783 bool supportsThumb2() const {
Bradley Smithf4affc12016-03-03 13:52:22 +00004784 return CPUAttr.equals("6T2") ||
4785 (ArchVersion >= 7 && !CPUAttr.equals("8M_BASE"));
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004786 }
4787
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004788 StringRef getCPUAttr() const {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004789 // For most sub-arches, the build attribute CPU name is enough.
4790 // For Cortex variants, it's slightly different.
4791 switch(ArchKind) {
4792 default:
Chandler Carruthd96f37a2015-08-30 07:51:18 +00004793 return llvm::ARM::getCPUAttr(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004794 case llvm::ARM::AK_ARMV6M:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004795 return "6M";
Tim Northover525c73c2015-07-21 21:47:33 +00004796 case llvm::ARM::AK_ARMV7S:
4797 return "7S";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004798 case llvm::ARM::AK_ARMV7A:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004799 return "7A";
4800 case llvm::ARM::AK_ARMV7R:
4801 return "7R";
4802 case llvm::ARM::AK_ARMV7M:
4803 return "7M";
4804 case llvm::ARM::AK_ARMV7EM:
4805 return "7EM";
4806 case llvm::ARM::AK_ARMV8A:
4807 return "8A";
4808 case llvm::ARM::AK_ARMV8_1A:
4809 return "8_1A";
Oliver Stannard3086c042016-02-11 16:05:52 +00004810 case llvm::ARM::AK_ARMV8_2A:
4811 return "8_2A";
Bradley Smithf4affc12016-03-03 13:52:22 +00004812 case llvm::ARM::AK_ARMV8MBaseline:
4813 return "8M_BASE";
4814 case llvm::ARM::AK_ARMV8MMainline:
4815 return "8M_MAIN";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004816 }
4817 }
4818
4819 StringRef getCPUProfile() const {
4820 switch(ArchProfile) {
4821 case llvm::ARM::PK_A:
4822 return "A";
4823 case llvm::ARM::PK_R:
4824 return "R";
4825 case llvm::ARM::PK_M:
4826 return "M";
4827 default:
4828 return "";
4829 }
4830 }
4831
Chris Lattner17df24e2008-04-21 18:56:49 +00004832public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004833 ARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts,
4834 bool IsBigEndian)
4835 : TargetInfo(Triple), FPMath(FP_Default), IsAAPCS(true), LDREX(0),
4836 HW_FP(0) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004837 BigEndian = IsBigEndian;
4838
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004839 switch (getTriple().getOS()) {
4840 case llvm::Triple::NetBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004841 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004842 break;
4843 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004844 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004845 break;
4846 }
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004847
Renato Goline84b0002015-10-08 16:43:26 +00004848 // Cache arch related info.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004849 setArchInfo();
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004850
Chris Lattner1a8f3942010-04-23 16:29:58 +00004851 // {} in inline assembly are neon specifiers, not assembly variant
4852 // specifiers.
4853 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004854
Eric Christopher0e261882014-12-05 01:06:59 +00004855 // FIXME: This duplicates code from the driver that sets the -target-abi
4856 // option - this code is used if -target-abi isn't passed and should
4857 // be unified in some way.
4858 if (Triple.isOSBinFormatMachO()) {
4859 // The backend is hardwired to assume AAPCS for M-class processors, ensure
4860 // the frontend matches that.
4861 if (Triple.getEnvironment() == llvm::Triple::EABI ||
4862 Triple.getOS() == llvm::Triple::UnknownOS ||
4863 StringRef(CPU).startswith("cortex-m")) {
4864 setABI("aapcs");
Tim Northoverd88ecb32016-01-27 19:32:40 +00004865 } else if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00004866 setABI("aapcs16");
Eric Christopher0e261882014-12-05 01:06:59 +00004867 } else {
4868 setABI("apcs-gnu");
4869 }
4870 } else if (Triple.isOSWindows()) {
4871 // FIXME: this is invalid for WindowsCE
4872 setABI("aapcs");
4873 } else {
4874 // Select the default based on the platform.
4875 switch (Triple.getEnvironment()) {
4876 case llvm::Triple::Android:
4877 case llvm::Triple::GNUEABI:
4878 case llvm::Triple::GNUEABIHF:
4879 setABI("aapcs-linux");
4880 break;
4881 case llvm::Triple::EABIHF:
4882 case llvm::Triple::EABI:
4883 setABI("aapcs");
4884 break;
Eric Christopher560cc4f2014-12-18 02:08:55 +00004885 case llvm::Triple::GNU:
Renato Goline84b0002015-10-08 16:43:26 +00004886 setABI("apcs-gnu");
4887 break;
Eric Christopher0e261882014-12-05 01:06:59 +00004888 default:
4889 if (Triple.getOS() == llvm::Triple::NetBSD)
4890 setABI("apcs-gnu");
4891 else
4892 setABI("aapcs");
4893 break;
4894 }
4895 }
John McCall86353412010-08-21 22:46:04 +00004896
4897 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00004898 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004899
Renato Golin15b86152015-07-03 16:41:13 +00004900 // ARM has atomics up to 8 bytes
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004901 setAtomic();
Rafael Espindola5ab8e2e2015-07-02 15:14:10 +00004902
James Molloya7139222012-03-12 09:14:10 +00004903 // Do force alignment of members that follow zero length bitfields. If
Eric Christopher917e9522014-11-18 22:36:15 +00004904 // the alignment of the zero-length bitfield is greater than the member
4905 // that follows it, `bar', `bar' will be aligned as the type of the
James Molloya7139222012-03-12 09:14:10 +00004906 // zero length bitfield.
4907 UseZeroLengthBitfieldAlignment = true;
Saleem Abdulrasool9b5ba542016-04-10 03:19:47 +00004908
4909 if (Triple.getOS() == llvm::Triple::Linux ||
4910 Triple.getOS() == llvm::Triple::UnknownOS)
4911 this->MCountName =
4912 Opts.EABIVersion == "gnu" ? "\01__gnu_mcount_nc" : "\01mcount";
Eli Friedmanb5366062008-05-20 14:21:01 +00004913 }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00004914
Alp Toker4925ba72014-06-07 23:30:42 +00004915 StringRef getABI() const override { return ABI; }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00004916
Craig Topper3164f332014-03-11 03:39:26 +00004917 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004918 ABI = Name;
4919
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004920 // The defaults (above) are for AAPCS, check if we need to change them.
4921 //
4922 // FIXME: We need support for -meabi... we could just mangle it into the
4923 // name.
Tim Northover756447a2015-10-30 16:30:36 +00004924 if (Name == "apcs-gnu" || Name == "aapcs16") {
Tim Northover5627d392015-10-30 16:30:45 +00004925 setABIAPCS(Name == "aapcs16");
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004926 return true;
4927 }
4928 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
4929 setABIAAPCS();
4930 return true;
4931 }
4932 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004933 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004934
Renato Golinf5c4dec2015-05-27 13:33:00 +00004935 // FIXME: This should be based on Arch attributes, not CPU names.
Eric Christopher8c47b422015-10-09 18:39:55 +00004936 bool
4937 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
4938 StringRef CPU,
4939 const std::vector<std::string> &FeaturesVec) const override {
4940
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004941 std::vector<const char*> TargetFeatures;
Bradley Smithb3501962015-11-16 11:16:36 +00004942 unsigned Arch = llvm::ARM::parseArch(getTriple().getArchName());
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004943
4944 // get default FPU features
Bradley Smithb3501962015-11-16 11:16:36 +00004945 unsigned FPUKind = llvm::ARM::getDefaultFPU(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004946 llvm::ARM::getFPUFeatures(FPUKind, TargetFeatures);
4947
4948 // get default Extension features
Bradley Smithb3501962015-11-16 11:16:36 +00004949 unsigned Extensions = llvm::ARM::getDefaultExtensions(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004950 llvm::ARM::getExtensionFeatures(Extensions, TargetFeatures);
4951
4952 for (const char *Feature : TargetFeatures)
4953 if (Feature[0] == '+')
Eric Christopherb093d692015-10-09 18:39:59 +00004954 Features[Feature+1] = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004955
Eric Christopher007b0a02015-08-28 22:32:01 +00004956 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004957 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004958
Craig Topper3164f332014-03-11 03:39:26 +00004959 bool handleTargetFeatures(std::vector<std::string> &Features,
4960 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004961 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00004962 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00004963 Crypto = 0;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004964 DSP = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004965 Unaligned = 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004966 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004967 HWDiv = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004968
Ranjeet Singhac08e532015-06-24 23:39:25 +00004969 // This does not diagnose illegal cases like having both
4970 // "+vfpv2" and "+vfpv3" or having "+neon" and "+fp-only-sp".
4971 uint32_t HW_FP_remove = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004972 for (const auto &Feature : Features) {
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004973 if (Feature == "+soft-float") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004974 SoftFloat = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004975 } else if (Feature == "+soft-float-abi") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004976 SoftFloatABI = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004977 } else if (Feature == "+vfp2") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004978 FPU |= VFP2FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004979 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004980 } else if (Feature == "+vfp3") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004981 FPU |= VFP3FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004982 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004983 } else if (Feature == "+vfp4") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004984 FPU |= VFP4FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004985 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004986 } else if (Feature == "+fp-armv8") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004987 FPU |= FPARMV8;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004988 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004989 } else if (Feature == "+neon") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004990 FPU |= NeonFPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004991 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004992 } else if (Feature == "+hwdiv") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004993 HWDiv |= HWDivThumb;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004994 } else if (Feature == "+hwdiv-arm") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004995 HWDiv |= HWDivARM;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004996 } else if (Feature == "+crc") {
Bernard Ogden18b57012013-10-29 09:47:51 +00004997 CRC = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004998 } else if (Feature == "+crypto") {
Tim Northover02e38602014-02-03 17:28:04 +00004999 Crypto = 1;
Artyom Skrobov05d85ae2015-10-23 17:19:02 +00005000 } else if (Feature == "+dsp") {
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005001 DSP = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005002 } else if (Feature == "+fp-only-sp") {
Matt Arsenault250024f2016-06-08 01:56:42 +00005003 HW_FP_remove |= HW_FP_DP;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005004 } else if (Feature == "+strict-align") {
5005 Unaligned = 0;
5006 } else if (Feature == "+fp16") {
5007 HW_FP |= HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005008 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00005009 }
Ranjeet Singhac08e532015-06-24 23:39:25 +00005010 HW_FP &= ~HW_FP_remove;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005011
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005012 switch (ArchVersion) {
5013 case 6:
5014 if (ArchProfile == llvm::ARM::PK_M)
5015 LDREX = 0;
5016 else if (ArchKind == llvm::ARM::AK_ARMV6K)
5017 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5018 else
5019 LDREX = LDREX_W;
5020 break;
5021 case 7:
5022 if (ArchProfile == llvm::ARM::PK_M)
5023 LDREX = LDREX_W | LDREX_H | LDREX_B ;
5024 else
5025 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5026 break;
5027 case 8:
5028 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5029 }
5030
Rafael Espindolaeb265472013-08-21 21:59:03 +00005031 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
5032 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
5033 return false;
5034 }
5035
5036 if (FPMath == FP_Neon)
5037 Features.push_back("+neonfp");
5038 else if (FPMath == FP_VFP)
5039 Features.push_back("-neonfp");
5040
Daniel Dunbar893d4752009-12-19 04:15:38 +00005041 // Remove front-end specific options which the backend handles differently.
Eric Christopher9e172d22015-05-12 01:26:21 +00005042 auto Feature =
5043 std::find(Features.begin(), Features.end(), "+soft-float-abi");
5044 if (Feature != Features.end())
5045 Features.erase(Feature);
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005046
Rafael Espindolaeb265472013-08-21 21:59:03 +00005047 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005048 }
5049
Craig Topper3164f332014-03-11 03:39:26 +00005050 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005051 return llvm::StringSwitch<bool>(Feature)
5052 .Case("arm", true)
Ben Langmuir587aeaf2015-08-07 01:59:56 +00005053 .Case("aarch32", true)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005054 .Case("softfloat", SoftFloat)
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005055 .Case("thumb", isThumb())
Amara Emerson8c3de542013-09-16 18:07:35 +00005056 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005057 .Case("hwdiv", HWDiv & HWDivThumb)
5058 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005059 .Default(false);
5060 }
Renato Golin15b86152015-07-03 16:41:13 +00005061
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005062 bool setCPU(const std::string &Name) override {
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005063 if (Name != "generic")
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00005064 setArchInfo(llvm::ARM::parseCPUArch(Name));
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005065
Renato Golin15b86152015-07-03 16:41:13 +00005066 if (ArchKind == llvm::ARM::AK_INVALID)
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005067 return false;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005068 setAtomic();
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005069 CPU = Name;
5070 return true;
5071 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005072
Craig Topper3164f332014-03-11 03:39:26 +00005073 bool setFPMath(StringRef Name) override;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005074
Craig Topper3164f332014-03-11 03:39:26 +00005075 void getTargetDefines(const LangOptions &Opts,
5076 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00005077 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005078 Builder.defineMacro("__arm");
5079 Builder.defineMacro("__arm__");
Weiming Zhaob0613132016-04-18 16:25:46 +00005080 // For bare-metal none-eabi.
5081 if (getTriple().getOS() == llvm::Triple::UnknownOS &&
5082 getTriple().getEnvironment() == llvm::Triple::EABI)
5083 Builder.defineMacro("__ELF__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00005084
Chris Lattnerecd49032009-03-02 22:27:17 +00005085 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005086 Builder.defineMacro("__REGISTER_PREFIX__", "");
Tim Northover5627d392015-10-30 16:30:45 +00005087
5088 // Unfortunately, __ARM_ARCH_7K__ is now more of an ABI descriptor. The CPU
5089 // happens to be Cortex-A7 though, so it should still get __ARM_ARCH_7A__.
Tim Northoverd88ecb32016-01-27 19:32:40 +00005090 if (getTriple().isWatchABI())
Tim Northover5627d392015-10-30 16:30:45 +00005091 Builder.defineMacro("__ARM_ARCH_7K__", "2");
5092
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005093 if (!CPUAttr.empty())
5094 Builder.defineMacro("__ARM_ARCH_" + CPUAttr + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005095
5096 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005097 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
Benjamin Kramerb42d9a52015-12-24 10:07:37 +00005098 Builder.defineMacro("__ARM_ARCH", Twine(ArchVersion));
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005099
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005100 if (ArchVersion >= 8) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005101 // ACLE 6.5.7 Crypto Extension
5102 if (Crypto)
5103 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
5104 // ACLE 6.5.8 CRC32 Extension
5105 if (CRC)
5106 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
5107 // ACLE 6.5.10 Numeric Maximum and Minimum
5108 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
5109 // ACLE 6.5.9 Directed Rounding
5110 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
James Molloy0ffb0932014-09-15 11:25:38 +00005111 }
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005112
5113 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
5114 // is not defined for the M-profile.
Bradley Smithf4affc12016-03-03 13:52:22 +00005115 // NOTE that the default profile is assumed to be 'A'
5116 if (CPUProfile.empty() || ArchProfile != llvm::ARM::PK_M)
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005117 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
5118
Bradley Smithf4affc12016-03-03 13:52:22 +00005119 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supports the original
5120 // Thumb ISA (including v6-M and v8-M Baseline). It is set to 2 if the
5121 // core supports the Thumb-2 ISA as found in the v6T2 architecture and all
5122 // v7 and v8 architectures excluding v8-M Baseline.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005123 if (supportsThumb2())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005124 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005125 else if (supportsThumb())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005126 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
5127
5128 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
5129 // instruction set such as ARM or Thumb.
5130 Builder.defineMacro("__ARM_32BIT_STATE", "1");
5131
5132 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
5133
5134 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005135 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005136 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00005137
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005138 // ACLE 6.4.3 Unaligned access supported in hardware
Eric Christopherb093d692015-10-09 18:39:59 +00005139 if (Unaligned)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005140 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Eric Christopherb093d692015-10-09 18:39:59 +00005141
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005142 // ACLE 6.4.4 LDREX/STREX
5143 if (LDREX)
5144 Builder.defineMacro("__ARM_FEATURE_LDREX", "0x" + llvm::utohexstr(LDREX));
5145
5146 // ACLE 6.4.5 CLZ
Eric Christopherb093d692015-10-09 18:39:59 +00005147 if (ArchVersion == 5 ||
5148 (ArchVersion == 6 && CPUProfile != "M") ||
5149 ArchVersion > 6)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005150 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
5151
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005152 // ACLE 6.5.1 Hardware Floating Point
5153 if (HW_FP)
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +00005154 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005155
Yi Konga44c4d72014-06-27 21:25:42 +00005156 // ACLE predefines.
5157 Builder.defineMacro("__ARM_ACLE", "200");
5158
Oliver Stannarddc2854c2015-09-03 12:40:58 +00005159 // FP16 support (we currently only support IEEE format).
5160 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
5161 Builder.defineMacro("__ARM_FP16_ARGS", "1");
5162
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005163 // ACLE 6.5.3 Fused multiply-accumulate (FMA)
Silviu Baranga632fdc52016-04-28 11:29:08 +00005164 if (ArchVersion >= 7 && (FPU & VFP4FPU))
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005165 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
5166
Mike Stump9d54bd72009-04-08 02:07:04 +00005167 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005168
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005169 // FIXME: It's more complicated than this and we don't really support
5170 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005171 // Windows on ARM does not "support" interworking
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005172 if (5 <= ArchVersion && ArchVersion <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005173 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005174
David Tweed8f676532012-10-25 13:33:01 +00005175 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00005176 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005177 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
Tim Northover862eaf82016-05-13 21:26:45 +00005178 if (!getTriple().isOSBinFormatMachO() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00005179 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005180 Builder.defineMacro("__ARM_PCS", "1");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005181 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005182
Tim Northover28fc0e12016-04-28 13:59:55 +00005183 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp" ||
5184 ABI == "aapcs16")
5185 Builder.defineMacro("__ARM_PCS_VFP", "1");
5186
Daniel Dunbar893d4752009-12-19 04:15:38 +00005187 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005188 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005189
5190 if (CPU == "xscale")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005191 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005192
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005193 if (isThumb()) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005194 Builder.defineMacro("__THUMBEL__");
5195 Builder.defineMacro("__thumb__");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005196 if (supportsThumb2())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005197 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005198 }
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005199
5200 // ACLE 6.4.9 32-bit SIMD instructions
5201 if (ArchVersion >= 6 && (CPUProfile != "M" || CPUAttr == "7EM"))
5202 Builder.defineMacro("__ARM_FEATURE_SIMD32", "1");
5203
5204 // ACLE 6.4.10 Hardware Integer Divide
Eric Christopherb093d692015-10-09 18:39:59 +00005205 if (((HWDiv & HWDivThumb) && isThumb()) ||
5206 ((HWDiv & HWDivARM) && !isThumb())) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005207 Builder.defineMacro("__ARM_FEATURE_IDIV", "1");
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005208 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005209 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005210
5211 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005212 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005213
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005214 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005215 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005216 if (FPU & VFP2FPU)
5217 Builder.defineMacro("__ARM_VFPV2__");
5218 if (FPU & VFP3FPU)
5219 Builder.defineMacro("__ARM_VFPV3__");
5220 if (FPU & VFP4FPU)
5221 Builder.defineMacro("__ARM_VFPV4__");
5222 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00005223
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005224 // This only gets set when Neon instructions are actually available, unlike
5225 // the VFP define, hence the soft float and arch check. This is subtly
5226 // different from gcc, we follow the intent which was that it should be set
5227 // when Neon instructions are actually available.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005228 if ((FPU & NeonFPU) && !SoftFloat && ArchVersion >= 7) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005229 Builder.defineMacro("__ARM_NEON", "1");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005230 Builder.defineMacro("__ARM_NEON__");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005231 // current AArch32 NEON implementations do not support double-precision
5232 // floating-point even when it is present in VFP.
Eric Christopherb093d692015-10-09 18:39:59 +00005233 Builder.defineMacro("__ARM_NEON_FP",
5234 "0x" + llvm::utohexstr(HW_FP & ~HW_FP_DP));
Tim Northover5bb34ca2013-11-21 12:36:34 +00005235 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00005236
Bradley Smith0f28f0c2014-01-20 10:52:00 +00005237 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
5238 Opts.ShortWChar ? "2" : "4");
5239
5240 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5241 Opts.ShortEnums ? "1" : "4");
5242
Bradley Smithf4affc12016-03-03 13:52:22 +00005243 if (ArchVersion >= 6 && CPUAttr != "6M" && CPUAttr != "8M_BASE") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00005244 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5245 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5246 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5247 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
5248 }
Sergey Dmitrouk745f5302014-11-25 08:57:36 +00005249
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005250 // ACLE 6.4.7 DSP instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005251 if (DSP) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005252 Builder.defineMacro("__ARM_FEATURE_DSP", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005253 }
5254
5255 // ACLE 6.4.8 Saturation instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005256 bool SAT = false;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005257 if ((ArchVersion == 6 && CPUProfile != "M") || ArchVersion > 6 ) {
5258 Builder.defineMacro("__ARM_FEATURE_SAT", "1");
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005259 SAT = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005260 }
5261
5262 // ACLE 6.4.6 Q (saturation) flag
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005263 if (DSP || SAT)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005264 Builder.defineMacro("__ARM_FEATURE_QBIT", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005265
5266 if (Opts.UnsafeFPMath)
5267 Builder.defineMacro("__ARM_FP_FAST", "1");
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005268
5269 if (ArchKind == llvm::ARM::AK_ARMV8_1A)
5270 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
Chris Lattner17df24e2008-04-21 18:56:49 +00005271 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005272
Craig Topper6c03a542015-10-19 04:51:35 +00005273 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5274 return llvm::makeArrayRef(BuiltinInfo,
5275 clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner17df24e2008-04-21 18:56:49 +00005276 }
Craig Topper3164f332014-03-11 03:39:26 +00005277 bool isCLZForZeroUndef() const override { return false; }
5278 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northover5627d392015-10-30 16:30:45 +00005279 return IsAAPCS
5280 ? AAPCSABIBuiltinVaList
Tim Northoverd88ecb32016-01-27 19:32:40 +00005281 : (getTriple().isWatchABI() ? TargetInfo::CharPtrBuiltinVaList
5282 : TargetInfo::VoidPtrBuiltinVaList);
Chris Lattner17df24e2008-04-21 18:56:49 +00005283 }
Craig Topperf054e3a2015-10-19 03:52:27 +00005284 ArrayRef<const char *> getGCCRegNames() const override;
5285 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00005286 bool validateAsmConstraint(const char *&Name,
5287 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00005288 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00005289 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00005290 case 'l': // r0-r7
5291 case 'h': // r8-r15
JF Bastien750caef2016-02-19 06:54:45 +00005292 case 't': // VFP Floating point register single precision
5293 case 'w': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00005294 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00005295 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005296 case 'I':
5297 case 'J':
5298 case 'K':
5299 case 'L':
5300 case 'M':
5301 // FIXME
5302 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00005303 case 'Q': // A memory address that is a single base register.
5304 Info.setAllowsMemory();
5305 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005306 case 'U': // a memory reference...
5307 switch (Name[1]) {
5308 case 'q': // ...ARMV4 ldrsb
5309 case 'v': // ...VFP load/store (reg+constant offset)
5310 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00005311 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00005312 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00005313 case 'n': // valid address for Neon doubleword vector load/store
5314 case 'm': // valid address for Neon element and structure load/store
5315 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00005316 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005317 Info.setAllowsMemory();
5318 Name++;
5319 return true;
5320 }
Nate Begeman2908fa02008-04-22 05:03:19 +00005321 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005322 return false;
5323 }
Craig Topper3164f332014-03-11 03:39:26 +00005324 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005325 std::string R;
5326 switch (*Constraint) {
5327 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00005328 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005329 Constraint++;
5330 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00005331 case 'p': // 'p' should be translated to 'r' by default.
5332 R = std::string("r");
5333 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005334 default:
5335 return std::string(1, *Constraint);
5336 }
5337 return R;
5338 }
Akira Hatanaka987f1862014-08-22 06:05:21 +00005339 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005340 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005341 std::string &SuggestedModifier) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00005342 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00005343 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00005344
Bill Wendling9d1ee112012-10-25 23:28:48 +00005345 // Strip off constraint modifiers.
5346 while (Constraint[0] == '=' ||
5347 Constraint[0] == '+' ||
5348 Constraint[0] == '&')
5349 Constraint = Constraint.substr(1);
5350
5351 switch (Constraint[0]) {
5352 default: break;
5353 case 'r': {
5354 switch (Modifier) {
5355 default:
Tim Northover8f24b172013-12-08 15:24:55 +00005356 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00005357 case 'q':
5358 // A register of size 32 cannot fit a vector type.
5359 return false;
5360 }
5361 }
5362 }
5363
5364 return true;
5365 }
Craig Topper3164f332014-03-11 03:39:26 +00005366 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00005367 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00005368 return "";
5369 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005370
Craig Topper3164f332014-03-11 03:39:26 +00005371 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00005372 switch (CC) {
5373 case CC_AAPCS:
5374 case CC_AAPCS_VFP:
5375 case CC_Swift:
5376 return CCCR_OK;
5377 default:
5378 return CCCR_Warning;
5379 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005380 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00005381
Craig Topper3164f332014-03-11 03:39:26 +00005382 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00005383 if (RegNo == 0) return 0;
5384 if (RegNo == 1) return 1;
5385 return -1;
5386 }
Matthias Braund1e2fad2015-07-17 00:15:22 +00005387
5388 bool hasSjLjLowering() const override {
5389 return true;
5390 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005391};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005392
Rafael Espindolaeb265472013-08-21 21:59:03 +00005393bool ARMTargetInfo::setFPMath(StringRef Name) {
5394 if (Name == "neon") {
5395 FPMath = FP_Neon;
5396 return true;
5397 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
5398 Name == "vfp4") {
5399 FPMath = FP_VFP;
5400 return true;
5401 }
5402 return false;
5403}
5404
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005405const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005406 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005407 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005408 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
5409
5410 // Float registers
5411 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
5412 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
5413 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005414 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005415
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005416 // Double registers
5417 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
5418 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005419 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
5420 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005421
5422 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005423 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
5424 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005425};
5426
Craig Topperf054e3a2015-10-19 03:52:27 +00005427ArrayRef<const char *> ARMTargetInfo::getGCCRegNames() const {
5428 return llvm::makeArrayRef(GCCRegNames);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005429}
5430
5431const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005432 { { "a1" }, "r0" },
5433 { { "a2" }, "r1" },
5434 { { "a3" }, "r2" },
5435 { { "a4" }, "r3" },
5436 { { "v1" }, "r4" },
5437 { { "v2" }, "r5" },
5438 { { "v3" }, "r6" },
5439 { { "v4" }, "r7" },
5440 { { "v5" }, "r8" },
5441 { { "v6", "rfp" }, "r9" },
5442 { { "sl" }, "r10" },
5443 { { "fp" }, "r11" },
5444 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00005445 { { "r13" }, "sp" },
5446 { { "r14" }, "lr" },
5447 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005448 // The S, D and Q registers overlap, but aren't really aliases; we
5449 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005450};
5451
Craig Topperf054e3a2015-10-19 03:52:27 +00005452ArrayRef<TargetInfo::GCCRegAlias> ARMTargetInfo::getGCCRegAliases() const {
5453 return llvm::makeArrayRef(GCCRegAliases);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005454}
Chris Lattner5cc15e02010-03-03 19:03:45 +00005455
5456const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00005457#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005458 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005459#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5460 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00005461#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00005462
Craig Topper07d3b622015-08-07 05:14:44 +00005463#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005464 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005465#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005466 { #ID, TYPE, ATTRS, nullptr, LANG, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005467#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5468 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5cc15e02010-03-03 19:03:45 +00005469#include "clang/Basic/BuiltinsARM.def"
5470};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005471
5472class ARMleTargetInfo : public ARMTargetInfo {
5473public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005474 ARMleTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5475 : ARMTargetInfo(Triple, Opts, /*BigEndian=*/false) {}
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005476 void getTargetDefines(const LangOptions &Opts,
5477 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005478 Builder.defineMacro("__ARMEL__");
5479 ARMTargetInfo::getTargetDefines(Opts, Builder);
5480 }
5481};
5482
5483class ARMbeTargetInfo : public ARMTargetInfo {
5484public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005485 ARMbeTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5486 : ARMTargetInfo(Triple, Opts, /*BigEndian=*/true) {}
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005487 void getTargetDefines(const LangOptions &Opts,
5488 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005489 Builder.defineMacro("__ARMEB__");
5490 Builder.defineMacro("__ARM_BIG_ENDIAN");
5491 ARMTargetInfo::getTargetDefines(Opts, Builder);
5492 }
5493};
Chris Lattner17df24e2008-04-21 18:56:49 +00005494
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005495class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
5496 const llvm::Triple Triple;
5497public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005498 WindowsARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5499 : WindowsTargetInfo<ARMleTargetInfo>(Triple, Opts), Triple(Triple) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005500 WCharType = UnsignedShort;
5501 SizeType = UnsignedInt;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005502 }
5503 void getVisualStudioDefines(const LangOptions &Opts,
5504 MacroBuilder &Builder) const {
5505 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
5506
5507 // FIXME: this is invalid for WindowsCE
5508 Builder.defineMacro("_M_ARM_NT", "1");
5509 Builder.defineMacro("_M_ARMT", "_M_ARM");
5510 Builder.defineMacro("_M_THUMB", "_M_ARM");
5511
5512 assert((Triple.getArch() == llvm::Triple::arm ||
5513 Triple.getArch() == llvm::Triple::thumb) &&
5514 "invalid architecture for Windows ARM target info");
5515 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
5516 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
5517
5518 // TODO map the complete set of values
5519 // 31: VFPv3 40: VFPv4
5520 Builder.defineMacro("_M_ARM_FP", "31");
5521 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00005522 BuiltinVaListKind getBuiltinVaListKind() const override {
5523 return TargetInfo::CharPtrBuiltinVaList;
5524 }
Martell Malone7ccda3c2015-08-14 18:00:09 +00005525 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5526 switch (CC) {
5527 case CC_X86StdCall:
5528 case CC_X86ThisCall:
5529 case CC_X86FastCall:
5530 case CC_X86VectorCall:
5531 return CCCR_Ignore;
5532 case CC_C:
5533 return CCCR_OK;
5534 default:
5535 return CCCR_Warning;
5536 }
5537 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005538};
5539
5540// Windows ARM + Itanium C++ ABI Target
5541class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
5542public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005543 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple,
5544 const TargetOptions &Opts)
5545 : WindowsARMTargetInfo(Triple, Opts) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005546 TheCXXABI.set(TargetCXXABI::GenericARM);
5547 }
5548
5549 void getTargetDefines(const LangOptions &Opts,
5550 MacroBuilder &Builder) const override {
5551 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5552
5553 if (Opts.MSVCCompat)
5554 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5555 }
5556};
5557
5558// Windows ARM, MS (C++) ABI
5559class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
5560public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005561 MicrosoftARMleTargetInfo(const llvm::Triple &Triple,
5562 const TargetOptions &Opts)
5563 : WindowsARMTargetInfo(Triple, Opts) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005564 TheCXXABI.set(TargetCXXABI::Microsoft);
5565 }
5566
5567 void getTargetDefines(const LangOptions &Opts,
5568 MacroBuilder &Builder) const override {
5569 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5570 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5571 }
5572};
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005573
Yaron Keren321249c2015-07-15 13:32:23 +00005574// ARM MinGW target
5575class MinGWARMTargetInfo : public WindowsARMTargetInfo {
5576public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005577 MinGWARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5578 : WindowsARMTargetInfo(Triple, Opts) {
Yaron Keren321249c2015-07-15 13:32:23 +00005579 TheCXXABI.set(TargetCXXABI::GenericARM);
5580 }
5581
5582 void getTargetDefines(const LangOptions &Opts,
5583 MacroBuilder &Builder) const override {
5584 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5585 DefineStd(Builder, "WIN32", Opts);
5586 DefineStd(Builder, "WINNT", Opts);
5587 Builder.defineMacro("_ARM_");
5588 addMinGWDefines(Opts, Builder);
5589 }
5590};
5591
5592// ARM Cygwin target
5593class CygwinARMTargetInfo : public ARMleTargetInfo {
5594public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005595 CygwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5596 : ARMleTargetInfo(Triple, Opts) {
Yaron Keren321249c2015-07-15 13:32:23 +00005597 TLSSupported = false;
5598 WCharType = UnsignedShort;
5599 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00005600 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Yaron Keren321249c2015-07-15 13:32:23 +00005601 }
5602 void getTargetDefines(const LangOptions &Opts,
5603 MacroBuilder &Builder) const override {
5604 ARMleTargetInfo::getTargetDefines(Opts, Builder);
5605 Builder.defineMacro("_ARM_");
5606 Builder.defineMacro("__CYGWIN__");
5607 Builder.defineMacro("__CYGWIN32__");
5608 DefineStd(Builder, "unix", Opts);
5609 if (Opts.CPlusPlus)
5610 Builder.defineMacro("_GNU_SOURCE");
5611 }
5612};
5613
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005614class DarwinARMTargetInfo : public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00005615protected:
Craig Topper3164f332014-03-11 03:39:26 +00005616 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5617 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00005618 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00005619 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005620
Torok Edwinb2b37c62009-06-30 17:10:35 +00005621public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005622 DarwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5623 : DarwinTargetInfo<ARMleTargetInfo>(Triple, Opts) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005624 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005625 // iOS always has 64-bit atomic instructions.
Eric Christopher917e9522014-11-18 22:36:15 +00005626 // FIXME: This should be based off of the target features in
5627 // ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005628 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00005629
Tim Northoverd88ecb32016-01-27 19:32:40 +00005630 if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00005631 // Darwin on iOS uses a variant of the ARM C++ ABI.
5632 TheCXXABI.set(TargetCXXABI::WatchOS);
5633
5634 // The 32-bit ABI is silent on what ptrdiff_t should be, but given that
5635 // size_t is long, it's a bit weird for it to be int.
5636 PtrDiffType = SignedLong;
5637
5638 // BOOL should be a real boolean on the new ABI
5639 UseSignedCharForObjCBool = false;
5640 } else
5641 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005642 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005643};
Eli Friedmanf05b7722008-08-20 07:44:10 +00005644
Tim Northover573cbee2014-05-24 12:52:07 +00005645class AArch64TargetInfo : public TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00005646 virtual void setDataLayout() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00005647 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5648 static const char *const GCCRegNames[];
5649
James Molloy75f5f9e2014-04-16 15:33:48 +00005650 enum FPUModeEnum {
5651 FPUMode,
5652 NeonMode
5653 };
5654
5655 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00005656 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00005657 unsigned Crypto;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005658 unsigned Unaligned;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005659 unsigned V8_1A;
James Molloy75f5f9e2014-04-16 15:33:48 +00005660
Tim Northovera2ee4332014-03-29 15:09:45 +00005661 static const Builtin::Info BuiltinInfo[];
5662
5663 std::string ABI;
5664
5665public:
Saleem Abdulrasool9b5ba542016-04-10 03:19:47 +00005666 AArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Tim Northovera2ee4332014-03-29 15:09:45 +00005667 : TargetInfo(Triple), ABI("aapcs") {
Tim Northover25e8a672014-05-24 12:51:25 +00005668 if (getTriple().getOS() == llvm::Triple::NetBSD) {
5669 WCharType = SignedInt;
5670
5671 // NetBSD apparently prefers consistency across ARM targets to consistency
5672 // across 64-bit targets.
5673 Int64Type = SignedLongLong;
5674 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005675 } else {
5676 WCharType = UnsignedInt;
5677 Int64Type = SignedLong;
5678 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005679 }
5680
Tim Northovera2ee4332014-03-29 15:09:45 +00005681 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005682 MaxVectorAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005683 MaxAtomicInlineWidth = 128;
5684 MaxAtomicPromoteWidth = 128;
5685
Tim Northovera6a19f12015-02-06 01:25:07 +00005686 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005687 LongDoubleFormat = &llvm::APFloat::IEEEquad;
5688
Tim Northovera2ee4332014-03-29 15:09:45 +00005689 // {} in inline assembly are neon specifiers, not assembly variant
5690 // specifiers.
5691 NoAsmVariants = true;
5692
Tim Northover7ad87af2015-01-16 18:44:04 +00005693 // AAPCS gives rules for bitfields. 7.1.7 says: "The container type
5694 // contributes to the alignment of the containing aggregate in the same way
5695 // a plain (non bit-field) member of that type would, without exception for
5696 // zero-sized or anonymous bit-fields."
Tim Northover5627d392015-10-30 16:30:45 +00005697 assert(UseBitFieldTypeAlignment && "bitfields affect type alignment");
Tim Northover7ad87af2015-01-16 18:44:04 +00005698 UseZeroLengthBitfieldAlignment = true;
5699
Tim Northover573cbee2014-05-24 12:52:07 +00005700 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00005701 TheCXXABI.set(TargetCXXABI::GenericAArch64);
Saleem Abdulrasoolc066d9c2016-04-12 03:05:03 +00005702
5703 if (Triple.getOS() == llvm::Triple::Linux ||
5704 Triple.getOS() == llvm::Triple::UnknownOS)
5705 this->MCountName = Opts.EABIVersion == "gnu" ? "\01_mcount" : "mcount";
Tim Northovera2ee4332014-03-29 15:09:45 +00005706 }
5707
Alp Toker4925ba72014-06-07 23:30:42 +00005708 StringRef getABI() const override { return ABI; }
David Blaikie1cbb9712014-11-14 19:09:44 +00005709 bool setABI(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005710 if (Name != "aapcs" && Name != "darwinpcs")
5711 return false;
5712
5713 ABI = Name;
5714 return true;
5715 }
5716
David Blaikie1cbb9712014-11-14 19:09:44 +00005717 bool setCPU(const std::string &Name) override {
Renato Golin3b8709c2016-05-25 12:36:31 +00005718 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5719 .Case("generic", true)
5720 .Cases("cortex-a53", "cortex-a57", "cortex-a72",
5721 "cortex-a35", "exynos-m1", true)
Sjoerd Meijer90df4a72016-06-02 10:48:37 +00005722 .Case("cortex-a73", true)
Renato Golin3b8709c2016-05-25 12:36:31 +00005723 .Case("cyclone", true)
5724 .Case("kryo", true)
5725 .Default(false);
5726 return CPUKnown;
Tim Northovera2ee4332014-03-29 15:09:45 +00005727 }
5728
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005729 void getTargetDefines(const LangOptions &Opts,
5730 MacroBuilder &Builder) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005731 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00005732 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005733
5734 // Target properties.
5735 Builder.defineMacro("_LP64");
5736 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005737
5738 // ACLE predefines. Many can only have one possible value on v8 AArch64.
5739 Builder.defineMacro("__ARM_ACLE", "200");
5740 Builder.defineMacro("__ARM_ARCH", "8");
5741 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
5742
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005743 Builder.defineMacro("__ARM_64BIT_STATE", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005744 Builder.defineMacro("__ARM_PCS_AAPCS64", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005745 Builder.defineMacro("__ARM_ARCH_ISA_A64", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005746
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005747 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
5748 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
5749 Builder.defineMacro("__ARM_FEATURE_LDREX", "0xF");
5750 Builder.defineMacro("__ARM_FEATURE_IDIV", "1"); // As specified in ACLE
James Molloy0ffb0932014-09-15 11:25:38 +00005751 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005752 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
5753 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005754
5755 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
5756
5757 // 0xe implies support for half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005758 Builder.defineMacro("__ARM_FP", "0xE");
Tim Northovera2ee4332014-03-29 15:09:45 +00005759
5760 // PCS specifies this for SysV variants, which is all we support. Other ABIs
5761 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005762 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
5763 Builder.defineMacro("__ARM_FP16_ARGS", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005764
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005765 if (Opts.UnsafeFPMath)
5766 Builder.defineMacro("__ARM_FP_FAST", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005767
5768 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
5769
5770 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5771 Opts.ShortEnums ? "1" : "4");
5772
James Molloy75f5f9e2014-04-16 15:33:48 +00005773 if (FPU == NeonMode) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005774 Builder.defineMacro("__ARM_NEON", "1");
James Molloy75f5f9e2014-04-16 15:33:48 +00005775 // 64-bit NEON supports half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005776 Builder.defineMacro("__ARM_NEON_FP", "0xE");
James Molloy75f5f9e2014-04-16 15:33:48 +00005777 }
Tim Northovera2ee4332014-03-29 15:09:45 +00005778
Bradley Smith418c5932014-05-02 15:17:51 +00005779 if (CRC)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005780 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
Bradley Smith418c5932014-05-02 15:17:51 +00005781
James Molloy75f5f9e2014-04-16 15:33:48 +00005782 if (Crypto)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005783 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
5784
5785 if (Unaligned)
5786 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Reid Klecknerd167d422015-05-06 15:31:46 +00005787
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005788 if (V8_1A)
5789 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
5790
Reid Klecknerd167d422015-05-06 15:31:46 +00005791 // All of the __sync_(bool|val)_compare_and_swap_(1|2|4|8) builtins work.
5792 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5793 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5794 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5795 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Tim Northovera2ee4332014-03-29 15:09:45 +00005796 }
5797
Craig Topper6c03a542015-10-19 04:51:35 +00005798 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5799 return llvm::makeArrayRef(BuiltinInfo,
5800 clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin);
Tim Northovera2ee4332014-03-29 15:09:45 +00005801 }
5802
David Blaikie1cbb9712014-11-14 19:09:44 +00005803 bool hasFeature(StringRef Feature) const override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005804 return Feature == "aarch64" ||
5805 Feature == "arm64" ||
Ben Langmuir587aeaf2015-08-07 01:59:56 +00005806 Feature == "arm" ||
James Molloy75f5f9e2014-04-16 15:33:48 +00005807 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00005808 }
5809
James Molloy5e73df52014-04-16 15:06:20 +00005810 bool handleTargetFeatures(std::vector<std::string> &Features,
5811 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005812 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00005813 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00005814 Crypto = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005815 Unaligned = 1;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005816 V8_1A = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005817
Eric Christopher610fe112015-08-26 08:21:55 +00005818 for (const auto &Feature : Features) {
5819 if (Feature == "+neon")
James Molloy75f5f9e2014-04-16 15:33:48 +00005820 FPU = NeonMode;
Eric Christopher610fe112015-08-26 08:21:55 +00005821 if (Feature == "+crc")
Bradley Smith418c5932014-05-02 15:17:51 +00005822 CRC = 1;
Eric Christopher610fe112015-08-26 08:21:55 +00005823 if (Feature == "+crypto")
James Molloy75f5f9e2014-04-16 15:33:48 +00005824 Crypto = 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005825 if (Feature == "+strict-align")
5826 Unaligned = 0;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005827 if (Feature == "+v8.1a")
5828 V8_1A = 1;
James Molloy75f5f9e2014-04-16 15:33:48 +00005829 }
5830
James Y Knightb214cbc2016-03-04 19:00:41 +00005831 setDataLayout();
James Molloy5e73df52014-04-16 15:06:20 +00005832
5833 return true;
5834 }
5835
John McCall477f2bb2016-03-03 06:39:32 +00005836 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5837 switch (CC) {
5838 case CC_C:
5839 case CC_Swift:
Roman Levenstein35aa5ce2016-03-16 18:00:46 +00005840 case CC_PreserveMost:
5841 case CC_PreserveAll:
John McCall477f2bb2016-03-03 06:39:32 +00005842 return CCCR_OK;
5843 default:
5844 return CCCR_Warning;
5845 }
5846 }
5847
David Blaikie1cbb9712014-11-14 19:09:44 +00005848 bool isCLZForZeroUndef() const override { return false; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005849
David Blaikie1cbb9712014-11-14 19:09:44 +00005850 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005851 return TargetInfo::AArch64ABIBuiltinVaList;
5852 }
5853
Craig Topperf054e3a2015-10-19 03:52:27 +00005854 ArrayRef<const char *> getGCCRegNames() const override;
5855 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00005856
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005857 bool validateAsmConstraint(const char *&Name,
5858 TargetInfo::ConstraintInfo &Info) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005859 switch (*Name) {
5860 default:
5861 return false;
5862 case 'w': // Floating point and SIMD registers (V0-V31)
5863 Info.setAllowsRegister();
5864 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00005865 case 'I': // Constant that can be used with an ADD instruction
5866 case 'J': // Constant that can be used with a SUB instruction
5867 case 'K': // Constant that can be used with a 32-bit logical instruction
5868 case 'L': // Constant that can be used with a 64-bit logical instruction
5869 case 'M': // Constant that can be used as a 32-bit MOV immediate
5870 case 'N': // Constant that can be used as a 64-bit MOV immediate
5871 case 'Y': // Floating point constant zero
5872 case 'Z': // Integer constant zero
5873 return true;
5874 case 'Q': // A memory reference with base register and no offset
5875 Info.setAllowsMemory();
5876 return true;
5877 case 'S': // A symbolic address
5878 Info.setAllowsRegister();
5879 return true;
5880 case 'U':
Eric Christopher917e9522014-11-18 22:36:15 +00005881 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
5882 // Utf: A memory address suitable for ldp/stp in TF mode.
5883 // Usa: An absolute symbolic address.
5884 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
5885 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
Tim Northovera2ee4332014-03-29 15:09:45 +00005886 case 'z': // Zero register, wzr or xzr
5887 Info.setAllowsRegister();
5888 return true;
5889 case 'x': // Floating point and SIMD registers (V0-V15)
5890 Info.setAllowsRegister();
5891 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00005892 }
5893 return false;
5894 }
5895
Akira Hatanaka987f1862014-08-22 06:05:21 +00005896 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005897 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005898 std::string &SuggestedModifier) const override {
James Molloy8a157bf2014-07-25 10:19:47 +00005899 // Strip off constraint modifiers.
5900 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
5901 Constraint = Constraint.substr(1);
5902
5903 switch (Constraint[0]) {
5904 default:
5905 return true;
5906 case 'z':
5907 case 'r': {
5908 switch (Modifier) {
5909 case 'x':
5910 case 'w':
5911 // For now assume that the person knows what they're
5912 // doing with the modifier.
5913 return true;
5914 default:
5915 // By default an 'r' constraint will be in the 'x'
5916 // registers.
Akira Hatanaka987f1862014-08-22 06:05:21 +00005917 if (Size == 64)
5918 return true;
5919
5920 SuggestedModifier = "w";
5921 return false;
James Molloy8a157bf2014-07-25 10:19:47 +00005922 }
5923 }
5924 }
5925 }
5926
David Blaikie1cbb9712014-11-14 19:09:44 +00005927 const char *getClobbers() const override { return ""; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005928
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00005929 int getEHDataRegisterNumber(unsigned RegNo) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005930 if (RegNo == 0)
5931 return 0;
5932 if (RegNo == 1)
5933 return 1;
5934 return -1;
5935 }
5936};
5937
Tim Northover573cbee2014-05-24 12:52:07 +00005938const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005939 // 32-bit Integer registers
5940 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
5941 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
5942 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
5943
5944 // 64-bit Integer registers
5945 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
5946 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
5947 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
5948
5949 // 32-bit floating point regsisters
5950 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
5951 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
5952 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
5953
5954 // 64-bit floating point regsisters
5955 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
5956 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
5957 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
5958
5959 // Vector registers
5960 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
5961 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
5962 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
5963};
5964
Craig Topperf054e3a2015-10-19 03:52:27 +00005965ArrayRef<const char *> AArch64TargetInfo::getGCCRegNames() const {
5966 return llvm::makeArrayRef(GCCRegNames);
Tim Northovera2ee4332014-03-29 15:09:45 +00005967}
5968
Tim Northover573cbee2014-05-24 12:52:07 +00005969const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005970 { { "w31" }, "wsp" },
5971 { { "x29" }, "fp" },
5972 { { "x30" }, "lr" },
5973 { { "x31" }, "sp" },
5974 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
5975 // don't want to substitute one of these for a different-sized one.
5976};
5977
Craig Topperf054e3a2015-10-19 03:52:27 +00005978ArrayRef<TargetInfo::GCCRegAlias> AArch64TargetInfo::getGCCRegAliases() const {
5979 return llvm::makeArrayRef(GCCRegAliases);
Tim Northovera2ee4332014-03-29 15:09:45 +00005980}
5981
Tim Northover573cbee2014-05-24 12:52:07 +00005982const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005983#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00005984 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00005985#include "clang/Basic/BuiltinsNEON.def"
5986
5987#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00005988 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northover573cbee2014-05-24 12:52:07 +00005989#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00005990};
James Molloy5e73df52014-04-16 15:06:20 +00005991
Tim Northover573cbee2014-05-24 12:52:07 +00005992class AArch64leTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00005993 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00005994 if (getTriple().isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00005995 resetDataLayout("e-m:o-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00005996 else
James Y Knightb214cbc2016-03-04 19:00:41 +00005997 resetDataLayout("e-m:e-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00005998 }
5999
6000public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006001 AArch64leTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6002 : AArch64TargetInfo(Triple, Opts) {
James Molloy5e73df52014-04-16 15:06:20 +00006003 BigEndian = false;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006004 }
James Molloy5e73df52014-04-16 15:06:20 +00006005 void getTargetDefines(const LangOptions &Opts,
6006 MacroBuilder &Builder) const override {
6007 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00006008 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00006009 }
6010};
6011
Tim Northover573cbee2014-05-24 12:52:07 +00006012class AArch64beTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00006013 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00006014 assert(!getTriple().isOSBinFormatMachO());
James Y Knightb214cbc2016-03-04 19:00:41 +00006015 resetDataLayout("E-m:e-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006016 }
6017
6018public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006019 AArch64beTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6020 : AArch64TargetInfo(Triple, Opts) {}
James Molloy5e73df52014-04-16 15:06:20 +00006021 void getTargetDefines(const LangOptions &Opts,
6022 MacroBuilder &Builder) const override {
6023 Builder.defineMacro("__AARCH64EB__");
6024 Builder.defineMacro("__AARCH_BIG_ENDIAN");
6025 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00006026 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00006027 }
6028};
Tim Northovera2ee4332014-03-29 15:09:45 +00006029
Tim Northover573cbee2014-05-24 12:52:07 +00006030class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00006031protected:
6032 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
6033 MacroBuilder &Builder) const override {
6034 Builder.defineMacro("__AARCH64_SIMD__");
6035 Builder.defineMacro("__ARM64_ARCH_8__");
6036 Builder.defineMacro("__ARM_NEON__");
6037 Builder.defineMacro("__LITTLE_ENDIAN__");
6038 Builder.defineMacro("__REGISTER_PREFIX__", "");
6039 Builder.defineMacro("__arm64", "1");
6040 Builder.defineMacro("__arm64__", "1");
6041
6042 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
6043 }
6044
Tim Northovera2ee4332014-03-29 15:09:45 +00006045public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006046 DarwinAArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6047 : DarwinTargetInfo<AArch64leTargetInfo>(Triple, Opts) {
Tim Northovera2ee4332014-03-29 15:09:45 +00006048 Int64Type = SignedLongLong;
6049 WCharType = SignedInt;
6050 UseSignedCharForObjCBool = false;
6051
Tim Northovera6a19f12015-02-06 01:25:07 +00006052 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00006053 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
6054
6055 TheCXXABI.set(TargetCXXABI::iOS64);
6056 }
6057
David Blaikie1cbb9712014-11-14 19:09:44 +00006058 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006059 return TargetInfo::CharPtrBuiltinVaList;
6060 }
6061};
Tim Northovera2ee4332014-03-29 15:09:45 +00006062
Tony Linthicum76329bf2011-12-12 21:14:55 +00006063// Hexagon abstract base class
6064class HexagonTargetInfo : public TargetInfo {
6065 static const Builtin::Info BuiltinInfo[];
6066 static const char * const GCCRegNames[];
6067 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6068 std::string CPU;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006069 bool HasHVX, HasHVXDouble;
6070
Tony Linthicum76329bf2011-12-12 21:14:55 +00006071public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006072 HexagonTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6073 : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006074 BigEndian = false;
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00006075 // Specify the vector alignment explicitly. For v512x1, the calculated
6076 // alignment would be 512*alignment(i1), which is 512 bytes, instead of
6077 // the required minimum of 64 bytes.
James Y Knightb214cbc2016-03-04 19:00:41 +00006078 resetDataLayout("e-m:e-p:32:32:32-a:0-n16:32-"
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00006079 "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 +00006080 "v32:32:32-v64:64:64-v512:512:512-v1024:1024:1024-v2048:2048:2048");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006081 SizeType = UnsignedInt;
6082 PtrDiffType = SignedInt;
6083 IntPtrType = SignedInt;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006084
6085 // {} in inline assembly are packet specifiers, not assembly variant
6086 // specifiers.
6087 NoAsmVariants = true;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006088
6089 LargeArrayMinWidth = 64;
6090 LargeArrayAlign = 64;
6091 UseBitFieldTypeAlignment = true;
6092 ZeroLengthBitfieldBoundary = 32;
6093 HasHVX = HasHVXDouble = false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006094 }
6095
Craig Topper6c03a542015-10-19 04:51:35 +00006096 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6097 return llvm::makeArrayRef(BuiltinInfo,
6098 clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006099 }
6100
Craig Topper3164f332014-03-11 03:39:26 +00006101 bool validateAsmConstraint(const char *&Name,
6102 TargetInfo::ConstraintInfo &Info) const override {
Krzysztof Parzyszeke0026e42016-05-18 14:56:14 +00006103 switch (*Name) {
6104 case 'v':
6105 case 'q':
6106 if (HasHVX) {
6107 Info.setAllowsRegister();
6108 return true;
6109 }
6110 break;
Krzysztof Parzyszek89fb4412016-05-20 13:50:32 +00006111 case 's':
6112 // Relocatable constant.
6113 return true;
Krzysztof Parzyszeke0026e42016-05-18 14:56:14 +00006114 }
6115 return false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006116 }
6117
Craig Topper3164f332014-03-11 03:39:26 +00006118 void getTargetDefines(const LangOptions &Opts,
6119 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006120
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006121 bool isCLZForZeroUndef() const override { return false; }
6122
Craig Topper3164f332014-03-11 03:39:26 +00006123 bool hasFeature(StringRef Feature) const override {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006124 return llvm::StringSwitch<bool>(Feature)
6125 .Case("hexagon", true)
6126 .Case("hvx", HasHVX)
6127 .Case("hvx-double", HasHVXDouble)
6128 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006129 }
Craig Topper3164f332014-03-11 03:39:26 +00006130
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006131 bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6132 StringRef CPU, const std::vector<std::string> &FeaturesVec)
6133 const override;
6134
6135 bool handleTargetFeatures(std::vector<std::string> &Features,
6136 DiagnosticsEngine &Diags) override;
6137
Craig Topper3164f332014-03-11 03:39:26 +00006138 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006139 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006140 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006141 ArrayRef<const char *> getGCCRegNames() const override;
6142 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00006143 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006144 return "";
6145 }
Sebastian Pop86500282012-01-13 20:37:10 +00006146
6147 static const char *getHexagonCPUSuffix(StringRef Name) {
6148 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00006149 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006150 .Case("hexagonv5", "5")
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006151 .Case("hexagonv55", "55")
6152 .Case("hexagonv60", "60")
Craig Topperf1186c52014-05-08 06:41:40 +00006153 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00006154 }
6155
Craig Topper3164f332014-03-11 03:39:26 +00006156 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00006157 if (!getHexagonCPUSuffix(Name))
6158 return false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006159 CPU = Name;
6160 return true;
6161 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006162
6163 int getEHDataRegisterNumber(unsigned RegNo) const override {
6164 return RegNo < 2 ? RegNo : -1;
6165 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006166};
6167
6168void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006169 MacroBuilder &Builder) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006170 Builder.defineMacro("__qdsp6__", "1");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006171 Builder.defineMacro("__hexagon__", "1");
6172
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006173 if (CPU == "hexagonv4") {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006174 Builder.defineMacro("__HEXAGON_V4__");
6175 Builder.defineMacro("__HEXAGON_ARCH__", "4");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006176 if (Opts.HexagonQdsp6Compat) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006177 Builder.defineMacro("__QDSP6_V4__");
6178 Builder.defineMacro("__QDSP6_ARCH__", "4");
6179 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006180 } else if (CPU == "hexagonv5") {
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006181 Builder.defineMacro("__HEXAGON_V5__");
6182 Builder.defineMacro("__HEXAGON_ARCH__", "5");
6183 if(Opts.HexagonQdsp6Compat) {
6184 Builder.defineMacro("__QDSP6_V5__");
6185 Builder.defineMacro("__QDSP6_ARCH__", "5");
6186 }
Krzysztof Parzyszeka58ff512016-04-21 14:30:04 +00006187 } else if (CPU == "hexagonv55") {
6188 Builder.defineMacro("__HEXAGON_V55__");
6189 Builder.defineMacro("__HEXAGON_ARCH__", "55");
6190 Builder.defineMacro("__QDSP6_V55__");
6191 Builder.defineMacro("__QDSP6_ARCH__", "55");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006192 } else if (CPU == "hexagonv60") {
6193 Builder.defineMacro("__HEXAGON_V60__");
6194 Builder.defineMacro("__HEXAGON_ARCH__", "60");
6195 Builder.defineMacro("__QDSP6_V60__");
6196 Builder.defineMacro("__QDSP6_ARCH__", "60");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006197 }
Krzysztof Parzyszek7f0756c2016-04-18 18:38:11 +00006198
6199 if (hasFeature("hvx")) {
6200 Builder.defineMacro("__HVX__");
6201 if (hasFeature("hvx-double"))
6202 Builder.defineMacro("__HVXDBL__");
6203 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006204}
6205
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006206bool HexagonTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
6207 DiagnosticsEngine &Diags) {
6208 for (auto &F : Features) {
6209 if (F == "+hvx")
6210 HasHVX = true;
6211 else if (F == "-hvx")
6212 HasHVX = HasHVXDouble = false;
6213 else if (F == "+hvx-double")
6214 HasHVX = HasHVXDouble = true;
6215 else if (F == "-hvx-double")
6216 HasHVXDouble = false;
6217 }
6218 return true;
6219}
6220
6221bool HexagonTargetInfo::initFeatureMap(llvm::StringMap<bool> &Features,
6222 DiagnosticsEngine &Diags, StringRef CPU,
6223 const std::vector<std::string> &FeaturesVec) const {
6224 // Default for v60: -hvx, -hvx-double.
6225 Features["hvx"] = false;
6226 Features["hvx-double"] = false;
6227
6228 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
6229}
6230
6231
6232const char *const HexagonTargetInfo::GCCRegNames[] = {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006233 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6234 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6235 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6236 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
6237 "p0", "p1", "p2", "p3",
6238 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
6239};
6240
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006241ArrayRef<const char*> HexagonTargetInfo::getGCCRegNames() const {
Craig Topperf054e3a2015-10-19 03:52:27 +00006242 return llvm::makeArrayRef(GCCRegNames);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006243}
6244
Tony Linthicum76329bf2011-12-12 21:14:55 +00006245const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
6246 { { "sp" }, "r29" },
6247 { { "fp" }, "r30" },
6248 { { "lr" }, "r31" },
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006249};
Tony Linthicum76329bf2011-12-12 21:14:55 +00006250
Craig Topperf054e3a2015-10-19 03:52:27 +00006251ArrayRef<TargetInfo::GCCRegAlias> HexagonTargetInfo::getGCCRegAliases() const {
6252 return llvm::makeArrayRef(GCCRegAliases);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006253}
6254
6255
6256const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00006257#define BUILTIN(ID, TYPE, ATTRS) \
6258 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
6259#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
6260 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tony Linthicum76329bf2011-12-12 21:14:55 +00006261#include "clang/Basic/BuiltinsHexagon.def"
6262};
Tony Linthicum76329bf2011-12-12 21:14:55 +00006263
Jacques Pienaard964cc22016-03-28 21:02:54 +00006264class LanaiTargetInfo : public TargetInfo {
6265 // Class for Lanai (32-bit).
6266 // The CPU profiles supported by the Lanai backend
6267 enum CPUKind {
6268 CK_NONE,
6269 CK_V11,
6270 } CPU;
6271
6272 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6273 static const char *const GCCRegNames[];
6274
6275public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006276 LanaiTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6277 : TargetInfo(Triple) {
Jacques Pienaard964cc22016-03-28 21:02:54 +00006278 // Description string has to be kept in sync with backend.
6279 resetDataLayout("E" // Big endian
6280 "-m:e" // ELF name manging
6281 "-p:32:32" // 32 bit pointers, 32 bit aligned
6282 "-i64:64" // 64 bit integers, 64 bit aligned
6283 "-a:0:32" // 32 bit alignment of objects of aggregate type
6284 "-n32" // 32 bit native integer width
6285 "-S64" // 64 bit natural stack alignment
6286 );
6287
6288 // Setting RegParmMax equal to what mregparm was set to in the old
6289 // toolchain
6290 RegParmMax = 4;
6291
6292 // Set the default CPU to V11
6293 CPU = CK_V11;
6294
6295 // Temporary approach to make everything at least word-aligned and allow for
6296 // safely casting between pointers with different alignment requirements.
6297 // TODO: Remove this when there are no more cast align warnings on the
6298 // firmware.
6299 MinGlobalAlign = 32;
6300 }
6301
6302 void getTargetDefines(const LangOptions &Opts,
6303 MacroBuilder &Builder) const override {
6304 // Define __lanai__ when building for target lanai.
6305 Builder.defineMacro("__lanai__");
6306
6307 // Set define for the CPU specified.
6308 switch (CPU) {
6309 case CK_V11:
6310 Builder.defineMacro("__LANAI_V11__");
6311 break;
6312 case CK_NONE:
6313 llvm_unreachable("Unhandled target CPU");
6314 }
6315 }
6316
6317 bool setCPU(const std::string &Name) override {
6318 CPU = llvm::StringSwitch<CPUKind>(Name)
6319 .Case("v11", CK_V11)
6320 .Default(CK_NONE);
6321
6322 return CPU != CK_NONE;
6323 }
6324
6325 bool hasFeature(StringRef Feature) const override {
6326 return llvm::StringSwitch<bool>(Feature).Case("lanai", true).Default(false);
6327 }
6328
6329 ArrayRef<const char *> getGCCRegNames() const override;
6330
6331 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
6332
6333 BuiltinVaListKind getBuiltinVaListKind() const override {
6334 return TargetInfo::VoidPtrBuiltinVaList;
6335 }
6336
6337 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
6338
6339 bool validateAsmConstraint(const char *&Name,
6340 TargetInfo::ConstraintInfo &info) const override {
6341 return false;
6342 }
6343
6344 const char *getClobbers() const override { return ""; }
6345};
6346
6347const char *const LanaiTargetInfo::GCCRegNames[] = {
6348 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10",
6349 "r11", "r12", "r13", "r14", "r15", "r16", "r17", "r18", "r19", "r20", "r21",
6350 "r22", "r23", "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"};
6351
6352ArrayRef<const char *> LanaiTargetInfo::getGCCRegNames() const {
6353 return llvm::makeArrayRef(GCCRegNames);
6354}
6355
6356const TargetInfo::GCCRegAlias LanaiTargetInfo::GCCRegAliases[] = {
6357 {{"pc"}, "r2"},
6358 {{"sp"}, "r4"},
6359 {{"fp"}, "r5"},
6360 {{"rv"}, "r8"},
6361 {{"rr1"}, "r10"},
6362 {{"rr2"}, "r11"},
6363 {{"rca"}, "r15"},
6364};
6365
6366ArrayRef<TargetInfo::GCCRegAlias> LanaiTargetInfo::getGCCRegAliases() const {
6367 return llvm::makeArrayRef(GCCRegAliases);
6368}
6369
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006370// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
6371class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00006372 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6373 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006374 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00006375public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006376 SparcTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
James Y Knighta3518ad2016-01-27 01:04:51 +00006377 : TargetInfo(Triple), SoftFloat(false) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006378
Joerg Sonnenbergerd0be8dc2016-03-07 17:19:15 +00006379 int getEHDataRegisterNumber(unsigned RegNo) const override {
6380 if (RegNo == 0) return 24;
6381 if (RegNo == 1) return 25;
6382 return -1;
6383 }
6384
Craig Topper3164f332014-03-11 03:39:26 +00006385 bool handleTargetFeatures(std::vector<std::string> &Features,
6386 DiagnosticsEngine &Diags) override {
Jacob Baungard Hansen13a49372016-05-24 08:30:08 +00006387 // Check if software floating point is enabled
Eric Christopherfb481a42015-04-29 23:32:17 +00006388 auto Feature = std::find(Features.begin(), Features.end(), "+soft-float");
6389 if (Feature != Features.end()) {
6390 SoftFloat = true;
Eric Christopherfb481a42015-04-29 23:32:17 +00006391 }
Rafael Espindolaeb265472013-08-21 21:59:03 +00006392 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006393 }
Craig Topper3164f332014-03-11 03:39:26 +00006394 void getTargetDefines(const LangOptions &Opts,
6395 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006396 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006397 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006398
6399 if (SoftFloat)
6400 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00006401 }
Craig Topper3164f332014-03-11 03:39:26 +00006402
6403 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006404 return llvm::StringSwitch<bool>(Feature)
6405 .Case("softfloat", SoftFloat)
6406 .Case("sparc", true)
6407 .Default(false);
6408 }
Craig Topper3164f332014-03-11 03:39:26 +00006409
Chris Dewhurst0381cd72016-06-15 12:44:47 +00006410 bool hasSjLjLowering() const override {
6411 return true;
6412 }
6413
Craig Topper6c03a542015-10-19 04:51:35 +00006414 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006415 // FIXME: Implement!
Craig Topper6c03a542015-10-19 04:51:35 +00006416 return None;
Gabor Greif49991682008-02-21 16:29:08 +00006417 }
Craig Topper3164f332014-03-11 03:39:26 +00006418 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006419 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00006420 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006421 ArrayRef<const char *> getGCCRegNames() const override;
6422 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00006423 bool validateAsmConstraint(const char *&Name,
6424 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006425 // FIXME: Implement!
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00006426 switch (*Name) {
6427 case 'I': // Signed 13-bit constant
6428 case 'J': // Zero
6429 case 'K': // 32-bit constant with the low 12 bits clear
6430 case 'L': // A constant in the range supported by movcc (11-bit signed imm)
6431 case 'M': // A constant in the range supported by movrcc (19-bit signed imm)
6432 case 'N': // Same as 'K' but zext (required for SIMode)
6433 case 'O': // The constant 4096
6434 return true;
6435 }
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006436 return false;
Gabor Greif49991682008-02-21 16:29:08 +00006437 }
Craig Topper3164f332014-03-11 03:39:26 +00006438 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006439 // FIXME: Implement!
6440 return "";
Gabor Greif49991682008-02-21 16:29:08 +00006441 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006442
6443 // No Sparc V7 for now, the backend doesn't support it anyway.
6444 enum CPUKind {
6445 CK_GENERIC,
6446 CK_V8,
6447 CK_SUPERSPARC,
6448 CK_SPARCLITE,
6449 CK_F934,
6450 CK_HYPERSPARC,
6451 CK_SPARCLITE86X,
6452 CK_SPARCLET,
6453 CK_TSC701,
6454 CK_V9,
6455 CK_ULTRASPARC,
6456 CK_ULTRASPARC3,
6457 CK_NIAGARA,
6458 CK_NIAGARA2,
6459 CK_NIAGARA3,
Douglas Katzman6871afc2016-03-15 22:34:02 +00006460 CK_NIAGARA4,
6461 CK_MYRIAD2_1,
6462 CK_MYRIAD2_2
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006463 } CPU = CK_GENERIC;
6464
6465 enum CPUGeneration {
6466 CG_V8,
6467 CG_V9,
6468 };
6469
6470 CPUGeneration getCPUGeneration(CPUKind Kind) const {
6471 switch (Kind) {
6472 case CK_GENERIC:
6473 case CK_V8:
6474 case CK_SUPERSPARC:
6475 case CK_SPARCLITE:
6476 case CK_F934:
6477 case CK_HYPERSPARC:
6478 case CK_SPARCLITE86X:
6479 case CK_SPARCLET:
6480 case CK_TSC701:
Douglas Katzman6871afc2016-03-15 22:34:02 +00006481 case CK_MYRIAD2_1:
6482 case CK_MYRIAD2_2:
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006483 return CG_V8;
6484 case CK_V9:
6485 case CK_ULTRASPARC:
6486 case CK_ULTRASPARC3:
6487 case CK_NIAGARA:
6488 case CK_NIAGARA2:
6489 case CK_NIAGARA3:
6490 case CK_NIAGARA4:
6491 return CG_V9;
6492 }
Aaron Ballmana9a72852015-11-11 13:42:02 +00006493 llvm_unreachable("Unexpected CPU kind");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006494 }
6495
6496 CPUKind getCPUKind(StringRef Name) const {
6497 return llvm::StringSwitch<CPUKind>(Name)
6498 .Case("v8", CK_V8)
6499 .Case("supersparc", CK_SUPERSPARC)
6500 .Case("sparclite", CK_SPARCLITE)
6501 .Case("f934", CK_F934)
6502 .Case("hypersparc", CK_HYPERSPARC)
6503 .Case("sparclite86x", CK_SPARCLITE86X)
6504 .Case("sparclet", CK_SPARCLET)
6505 .Case("tsc701", CK_TSC701)
6506 .Case("v9", CK_V9)
6507 .Case("ultrasparc", CK_ULTRASPARC)
6508 .Case("ultrasparc3", CK_ULTRASPARC3)
6509 .Case("niagara", CK_NIAGARA)
6510 .Case("niagara2", CK_NIAGARA2)
6511 .Case("niagara3", CK_NIAGARA3)
6512 .Case("niagara4", CK_NIAGARA4)
Douglas Katzman6871afc2016-03-15 22:34:02 +00006513 .Case("myriad2", CK_MYRIAD2_1)
6514 .Case("myriad2.1", CK_MYRIAD2_1)
6515 .Case("myriad2.2", CK_MYRIAD2_2)
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006516 .Default(CK_GENERIC);
6517 }
6518
6519 bool setCPU(const std::string &Name) override {
6520 CPU = getCPUKind(Name);
6521 return CPU != CK_GENERIC;
6522 }
Gabor Greif49991682008-02-21 16:29:08 +00006523};
6524
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006525const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00006526 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6527 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6528 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6529 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
6530};
6531
Craig Topperf054e3a2015-10-19 03:52:27 +00006532ArrayRef<const char *> SparcTargetInfo::getGCCRegNames() const {
6533 return llvm::makeArrayRef(GCCRegNames);
Chris Lattner9b415d62009-01-27 01:58:38 +00006534}
6535
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006536const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00006537 { { "g0" }, "r0" },
6538 { { "g1" }, "r1" },
6539 { { "g2" }, "r2" },
6540 { { "g3" }, "r3" },
6541 { { "g4" }, "r4" },
6542 { { "g5" }, "r5" },
6543 { { "g6" }, "r6" },
6544 { { "g7" }, "r7" },
6545 { { "o0" }, "r8" },
6546 { { "o1" }, "r9" },
6547 { { "o2" }, "r10" },
6548 { { "o3" }, "r11" },
6549 { { "o4" }, "r12" },
6550 { { "o5" }, "r13" },
6551 { { "o6", "sp" }, "r14" },
6552 { { "o7" }, "r15" },
6553 { { "l0" }, "r16" },
6554 { { "l1" }, "r17" },
6555 { { "l2" }, "r18" },
6556 { { "l3" }, "r19" },
6557 { { "l4" }, "r20" },
6558 { { "l5" }, "r21" },
6559 { { "l6" }, "r22" },
6560 { { "l7" }, "r23" },
6561 { { "i0" }, "r24" },
6562 { { "i1" }, "r25" },
6563 { { "i2" }, "r26" },
6564 { { "i3" }, "r27" },
6565 { { "i4" }, "r28" },
6566 { { "i5" }, "r29" },
6567 { { "i6", "fp" }, "r30" },
6568 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00006569};
6570
Craig Topperf054e3a2015-10-19 03:52:27 +00006571ArrayRef<TargetInfo::GCCRegAlias> SparcTargetInfo::getGCCRegAliases() const {
6572 return llvm::makeArrayRef(GCCRegAliases);
Chris Lattner9b415d62009-01-27 01:58:38 +00006573}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006574
6575// SPARC v8 is the 32-bit mode selected by Triple::sparc.
6576class SparcV8TargetInfo : public SparcTargetInfo {
6577public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006578 SparcV8TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6579 : SparcTargetInfo(Triple, Opts) {
James Y Knightb214cbc2016-03-04 19:00:41 +00006580 resetDataLayout("E-m:e-p:32:32-i64:64-f128:64-n32-S64");
Brad Smith73859112015-08-13 21:45:57 +00006581 // NetBSD / OpenBSD use long (same as llvm default); everyone else uses int.
6582 switch (getTriple().getOS()) {
6583 default:
James Y Knight4b4d19e2015-06-04 15:36:29 +00006584 SizeType = UnsignedInt;
6585 IntPtrType = SignedInt;
6586 PtrDiffType = SignedInt;
Brad Smith73859112015-08-13 21:45:57 +00006587 break;
6588 case llvm::Triple::NetBSD:
6589 case llvm::Triple::OpenBSD:
6590 SizeType = UnsignedLong;
6591 IntPtrType = SignedLong;
6592 PtrDiffType = SignedLong;
6593 break;
Brad Smith56495d52015-08-13 22:00:53 +00006594 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006595 }
6596
Craig Topper3164f332014-03-11 03:39:26 +00006597 void getTargetDefines(const LangOptions &Opts,
6598 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006599 SparcTargetInfo::getTargetDefines(Opts, Builder);
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006600 switch (getCPUGeneration(CPU)) {
6601 case CG_V8:
6602 Builder.defineMacro("__sparcv8");
6603 if (getTriple().getOS() != llvm::Triple::Solaris)
6604 Builder.defineMacro("__sparcv8__");
6605 break;
6606 case CG_V9:
6607 Builder.defineMacro("__sparcv9");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00006608 if (getTriple().getOS() != llvm::Triple::Solaris) {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006609 Builder.defineMacro("__sparcv9__");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00006610 Builder.defineMacro("__sparc_v9__");
6611 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006612 break;
6613 }
Douglas Katzman6871afc2016-03-15 22:34:02 +00006614 if (getTriple().getVendor() == llvm::Triple::Myriad) {
6615 switch (CPU) {
6616 case CK_MYRIAD2_1:
6617 Builder.defineMacro("__myriad2", "1");
6618 Builder.defineMacro("__myriad2__", "1");
6619 break;
6620 case CK_MYRIAD2_2:
6621 Builder.defineMacro("__myriad2", "2");
6622 Builder.defineMacro("__myriad2__", "2");
6623 break;
6624 default:
6625 break;
6626 }
6627 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006628 }
Chris Dewhurst69fa1922016-05-04 09:33:30 +00006629
6630 bool hasSjLjLowering() const override {
6631 return true;
6632 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006633};
6634
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006635// SPARCV8el is the 32-bit little-endian mode selected by Triple::sparcel.
6636class SparcV8elTargetInfo : public SparcV8TargetInfo {
6637 public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006638 SparcV8elTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6639 : SparcV8TargetInfo(Triple, Opts) {
6640 resetDataLayout("e-m:e-p:32:32-i64:64-f128:64-n32-S64");
6641 BigEndian = false;
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006642 }
6643};
6644
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006645// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
6646class SparcV9TargetInfo : public SparcTargetInfo {
6647public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006648 SparcV9TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6649 : SparcTargetInfo(Triple, Opts) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006650 // FIXME: Support Sparc quad-precision long double?
James Y Knightb214cbc2016-03-04 19:00:41 +00006651 resetDataLayout("E-m:e-i64:64-n32:64-S128");
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00006652 // This is an LP64 platform.
6653 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006654
6655 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00006656 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006657 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00006658 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006659 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006660 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00006661
6662 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
6663 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
6664 LongDoubleWidth = 128;
6665 LongDoubleAlign = 128;
6666 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00006667 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006668 }
6669
Craig Topper3164f332014-03-11 03:39:26 +00006670 void getTargetDefines(const LangOptions &Opts,
6671 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006672 SparcTargetInfo::getTargetDefines(Opts, Builder);
6673 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00006674 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00006675 // Solaris doesn't need these variants, but the BSDs do.
6676 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00006677 Builder.defineMacro("__sparc64__");
6678 Builder.defineMacro("__sparc_v9__");
6679 Builder.defineMacro("__sparcv9__");
6680 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006681 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00006682
Craig Topper3164f332014-03-11 03:39:26 +00006683 bool setCPU(const std::string &Name) override {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006684 if (!SparcTargetInfo::setCPU(Name))
6685 return false;
6686 return getCPUGeneration(CPU) == CG_V9;
Roman Divackyb1ae3d42014-02-25 18:35:30 +00006687 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006688};
6689
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006690class SystemZTargetInfo : public TargetInfo {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006691 static const Builtin::Info BuiltinInfo[];
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006692 static const char *const GCCRegNames[];
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006693 std::string CPU;
6694 bool HasTransactionalExecution;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006695 bool HasVector;
Ulrich Weigand47445072013-05-06 16:26:41 +00006696
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006697public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006698 SystemZTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Eric Christopherb093d692015-10-09 18:39:59 +00006699 : TargetInfo(Triple), CPU("z10"), HasTransactionalExecution(false),
6700 HasVector(false) {
Ulrich Weigand881497a2015-03-30 13:50:21 +00006701 IntMaxType = SignedLong;
6702 Int64Type = SignedLong;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006703 TLSSupported = true;
6704 IntWidth = IntAlign = 32;
6705 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
6706 PointerWidth = PointerAlign = 64;
6707 LongDoubleWidth = 128;
6708 LongDoubleAlign = 64;
6709 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Ulrich Weigandca3cb7f2015-04-21 17:29:35 +00006710 DefaultAlignForAttributeAligned = 64;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006711 MinGlobalAlign = 16;
James Y Knightb214cbc2016-03-04 19:00:41 +00006712 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 +00006713 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
6714 }
6715 void getTargetDefines(const LangOptions &Opts,
6716 MacroBuilder &Builder) const override {
6717 Builder.defineMacro("__s390__");
6718 Builder.defineMacro("__s390x__");
6719 Builder.defineMacro("__zarch__");
6720 Builder.defineMacro("__LONG_DOUBLE_128__");
Ulrich Weigandb038a522016-02-05 21:34:28 +00006721
6722 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
6723 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
6724 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
6725 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
6726
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006727 if (HasTransactionalExecution)
6728 Builder.defineMacro("__HTM__");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00006729 if (Opts.ZVector)
6730 Builder.defineMacro("__VEC__", "10301");
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006731 }
Craig Topper6c03a542015-10-19 04:51:35 +00006732 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6733 return llvm::makeArrayRef(BuiltinInfo,
6734 clang::SystemZ::LastTSBuiltin-Builtin::FirstTSBuiltin);
Ulrich Weigand47445072013-05-06 16:26:41 +00006735 }
6736
Craig Topperf054e3a2015-10-19 03:52:27 +00006737 ArrayRef<const char *> getGCCRegNames() const override;
6738 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006739 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00006740 return None;
Ulrich Weigand47445072013-05-06 16:26:41 +00006741 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006742 bool validateAsmConstraint(const char *&Name,
6743 TargetInfo::ConstraintInfo &info) const override;
6744 const char *getClobbers() const override {
6745 // FIXME: Is this really right?
6746 return "";
6747 }
6748 BuiltinVaListKind getBuiltinVaListKind() const override {
6749 return TargetInfo::SystemZBuiltinVaList;
6750 }
6751 bool setCPU(const std::string &Name) override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006752 CPU = Name;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006753 bool CPUKnown = llvm::StringSwitch<bool>(Name)
6754 .Case("z10", true)
6755 .Case("z196", true)
6756 .Case("zEC12", true)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006757 .Case("z13", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006758 .Default(false);
6759
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006760 return CPUKnown;
6761 }
Eric Christopher8c47b422015-10-09 18:39:55 +00006762 bool
6763 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6764 StringRef CPU,
6765 const std::vector<std::string> &FeaturesVec) const override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006766 if (CPU == "zEC12")
6767 Features["transactional-execution"] = true;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006768 if (CPU == "z13") {
6769 Features["transactional-execution"] = true;
6770 Features["vector"] = true;
6771 }
Eric Christopher007b0a02015-08-28 22:32:01 +00006772 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006773 }
6774
6775 bool handleTargetFeatures(std::vector<std::string> &Features,
6776 DiagnosticsEngine &Diags) override {
6777 HasTransactionalExecution = false;
Eric Christopher610fe112015-08-26 08:21:55 +00006778 for (const auto &Feature : Features) {
6779 if (Feature == "+transactional-execution")
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006780 HasTransactionalExecution = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006781 else if (Feature == "+vector")
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006782 HasVector = true;
6783 }
6784 // If we use the vector ABI, vector types are 64-bit aligned.
6785 if (HasVector) {
6786 MaxVectorAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00006787 resetDataLayout("E-m:e-i1:8:16-i8:8:16-i64:64-f128:64"
6788 "-v128:64-a:8:16-n32:64");
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006789 }
6790 return true;
6791 }
6792
6793 bool hasFeature(StringRef Feature) const override {
6794 return llvm::StringSwitch<bool>(Feature)
Ulrich Weigandcc673442015-04-01 14:15:35 +00006795 .Case("systemz", true)
6796 .Case("htm", HasTransactionalExecution)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006797 .Case("vx", HasVector)
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006798 .Default(false);
6799 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006800
Bryan Chane3f1ed52016-04-28 13:56:43 +00006801 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
6802 switch (CC) {
6803 case CC_C:
6804 case CC_Swift:
6805 return CCCR_OK;
6806 default:
6807 return CCCR_Warning;
6808 }
6809 }
6810
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006811 StringRef getABI() const override {
6812 if (HasVector)
6813 return "vector";
6814 return "";
6815 }
Ulrich Weigand47fd2532015-06-16 15:21:47 +00006816
6817 bool useFloat128ManglingForLongDouble() const override {
6818 return true;
6819 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006820};
6821
6822const Builtin::Info SystemZTargetInfo::BuiltinInfo[] = {
6823#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006824 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Jonas Paulsson3ace74a2016-03-30 15:51:24 +00006825#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
6826 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006827#include "clang/Basic/BuiltinsSystemZ.def"
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006828};
6829
6830const char *const SystemZTargetInfo::GCCRegNames[] = {
6831 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6832 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6833 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
6834 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
6835};
6836
Craig Topperf054e3a2015-10-19 03:52:27 +00006837ArrayRef<const char *> SystemZTargetInfo::getGCCRegNames() const {
6838 return llvm::makeArrayRef(GCCRegNames);
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006839}
6840
6841bool SystemZTargetInfo::
6842validateAsmConstraint(const char *&Name,
6843 TargetInfo::ConstraintInfo &Info) const {
6844 switch (*Name) {
6845 default:
6846 return false;
6847
6848 case 'a': // Address register
6849 case 'd': // Data register (equivalent to 'r')
6850 case 'f': // Floating-point register
6851 Info.setAllowsRegister();
6852 return true;
6853
6854 case 'I': // Unsigned 8-bit constant
6855 case 'J': // Unsigned 12-bit constant
6856 case 'K': // Signed 16-bit constant
6857 case 'L': // Signed 20-bit displacement (on all targets we support)
6858 case 'M': // 0x7fffffff
6859 return true;
6860
6861 case 'Q': // Memory with base and unsigned 12-bit displacement
6862 case 'R': // Likewise, plus an index
6863 case 'S': // Memory with base and signed 20-bit displacement
6864 case 'T': // Likewise, plus an index
6865 Info.setAllowsMemory();
6866 return true;
6867 }
6868}
Ulrich Weigand47445072013-05-06 16:26:41 +00006869
Eric Christopherc48497a2015-09-18 21:26:24 +00006870class MSP430TargetInfo : public TargetInfo {
6871 static const char *const GCCRegNames[];
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006872
Eric Christopherc48497a2015-09-18 21:26:24 +00006873public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006874 MSP430TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6875 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00006876 BigEndian = false;
6877 TLSSupported = false;
6878 IntWidth = 16;
6879 IntAlign = 16;
6880 LongWidth = 32;
6881 LongLongWidth = 64;
6882 LongAlign = LongLongAlign = 16;
6883 PointerWidth = 16;
6884 PointerAlign = 16;
6885 SuitableAlign = 16;
6886 SizeType = UnsignedInt;
6887 IntMaxType = SignedLongLong;
6888 IntPtrType = SignedInt;
6889 PtrDiffType = SignedInt;
6890 SigAtomicType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00006891 resetDataLayout("e-m:e-p:16:16-i32:16:32-a:16-n8:16");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006892 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006893 void getTargetDefines(const LangOptions &Opts,
6894 MacroBuilder &Builder) const override {
6895 Builder.defineMacro("MSP430");
6896 Builder.defineMacro("__MSP430__");
6897 // FIXME: defines for different 'flavours' of MCU
6898 }
Craig Topper6c03a542015-10-19 04:51:35 +00006899 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00006900 // FIXME: Implement.
Craig Topper6c03a542015-10-19 04:51:35 +00006901 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00006902 }
6903 bool hasFeature(StringRef Feature) const override {
6904 return Feature == "msp430";
6905 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006906 ArrayRef<const char *> getGCCRegNames() const override;
6907 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00006908 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00006909 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00006910 }
6911 bool validateAsmConstraint(const char *&Name,
6912 TargetInfo::ConstraintInfo &info) const override {
6913 // FIXME: implement
6914 switch (*Name) {
6915 case 'K': // the constant 1
6916 case 'L': // constant -1^20 .. 1^19
6917 case 'M': // constant 1-4:
Eli Friedmana9c3d712009-08-19 20:47:07 +00006918 return true;
6919 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006920 // No target constraints for now.
6921 return false;
6922 }
6923 const char *getClobbers() const override {
6924 // FIXME: Is this really right?
6925 return "";
6926 }
6927 BuiltinVaListKind getBuiltinVaListKind() const override {
6928 // FIXME: implement
6929 return TargetInfo::CharPtrBuiltinVaList;
6930 }
6931};
6932
6933const char *const MSP430TargetInfo::GCCRegNames[] = {
6934 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6935 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"};
6936
Craig Topperf054e3a2015-10-19 03:52:27 +00006937ArrayRef<const char *> MSP430TargetInfo::getGCCRegNames() const {
6938 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00006939}
6940
6941// LLVM and Clang cannot be used directly to output native binaries for
6942// target, but is used to compile C code to llvm bitcode with correct
6943// type and alignment information.
6944//
6945// TCE uses the llvm bitcode as input and uses it for generating customized
6946// target processor and program binary. TCE co-design environment is
6947// publicly available in http://tce.cs.tut.fi
6948
6949static const unsigned TCEOpenCLAddrSpaceMap[] = {
6950 3, // opencl_global
6951 4, // opencl_local
6952 5, // opencl_constant
6953 // FIXME: generic has to be added to the target
6954 0, // opencl_generic
6955 0, // cuda_device
6956 0, // cuda_constant
6957 0 // cuda_shared
6958};
6959
6960class TCETargetInfo : public TargetInfo {
6961public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006962 TCETargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6963 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00006964 TLSSupported = false;
6965 IntWidth = 32;
6966 LongWidth = LongLongWidth = 32;
6967 PointerWidth = 32;
6968 IntAlign = 32;
6969 LongAlign = LongLongAlign = 32;
6970 PointerAlign = 32;
6971 SuitableAlign = 32;
6972 SizeType = UnsignedInt;
6973 IntMaxType = SignedLong;
6974 IntPtrType = SignedInt;
6975 PtrDiffType = SignedInt;
6976 FloatWidth = 32;
6977 FloatAlign = 32;
6978 DoubleWidth = 32;
6979 DoubleAlign = 32;
6980 LongDoubleWidth = 32;
6981 LongDoubleAlign = 32;
6982 FloatFormat = &llvm::APFloat::IEEEsingle;
6983 DoubleFormat = &llvm::APFloat::IEEEsingle;
6984 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
James Y Knightb214cbc2016-03-04 19:00:41 +00006985 resetDataLayout("E-p:32:32-i8:8:32-i16:16:32-i64:32"
6986 "-f64:32-v64:32-v128:32-a:0:32-n32");
Eric Christopherc48497a2015-09-18 21:26:24 +00006987 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
6988 UseAddrSpaceMapMangling = true;
6989 }
6990
6991 void getTargetDefines(const LangOptions &Opts,
6992 MacroBuilder &Builder) const override {
6993 DefineStd(Builder, "tce", Opts);
6994 Builder.defineMacro("__TCE__");
6995 Builder.defineMacro("__TCE_V1__");
6996 }
6997 bool hasFeature(StringRef Feature) const override { return Feature == "tce"; }
6998
Craig Topper6c03a542015-10-19 04:51:35 +00006999 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007000 const char *getClobbers() const override { return ""; }
7001 BuiltinVaListKind getBuiltinVaListKind() const override {
7002 return TargetInfo::VoidPtrBuiltinVaList;
7003 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007004 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007005 bool validateAsmConstraint(const char *&Name,
7006 TargetInfo::ConstraintInfo &info) const override {
7007 return true;
7008 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007009 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7010 return None;
7011 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007012};
Eli Friedmana9c3d712009-08-19 20:47:07 +00007013
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007014class BPFTargetInfo : public TargetInfo {
7015public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007016 BPFTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7017 : TargetInfo(Triple) {
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007018 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
7019 SizeType = UnsignedLong;
7020 PtrDiffType = SignedLong;
7021 IntPtrType = SignedLong;
7022 IntMaxType = SignedLong;
7023 Int64Type = SignedLong;
7024 RegParmMax = 5;
7025 if (Triple.getArch() == llvm::Triple::bpfeb) {
7026 BigEndian = true;
James Y Knightb214cbc2016-03-04 19:00:41 +00007027 resetDataLayout("E-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007028 } else {
7029 BigEndian = false;
James Y Knightb214cbc2016-03-04 19:00:41 +00007030 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007031 }
7032 MaxAtomicPromoteWidth = 64;
7033 MaxAtomicInlineWidth = 64;
7034 TLSSupported = false;
7035 }
7036 void getTargetDefines(const LangOptions &Opts,
7037 MacroBuilder &Builder) const override {
7038 DefineStd(Builder, "bpf", Opts);
7039 Builder.defineMacro("__BPF__");
7040 }
7041 bool hasFeature(StringRef Feature) const override {
7042 return Feature == "bpf";
7043 }
7044
Craig Topper6c03a542015-10-19 04:51:35 +00007045 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007046 const char *getClobbers() const override {
7047 return "";
7048 }
7049 BuiltinVaListKind getBuiltinVaListKind() const override {
7050 return TargetInfo::VoidPtrBuiltinVaList;
7051 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007052 ArrayRef<const char *> getGCCRegNames() const override {
7053 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007054 }
7055 bool validateAsmConstraint(const char *&Name,
7056 TargetInfo::ConstraintInfo &info) const override {
7057 return true;
7058 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007059 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7060 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007061 }
7062};
7063
Daniel Sanders4672af62016-05-27 11:51:02 +00007064class MipsTargetInfo : public TargetInfo {
7065 void setDataLayout() {
Daniel Sanders55e40692016-06-03 10:11:01 +00007066 StringRef Layout;
7067
7068 if (ABI == "o32")
7069 Layout = "m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
7070 else if (ABI == "n32")
7071 Layout = "m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32:64-S128";
7072 else if (ABI == "n64")
7073 Layout = "m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
7074 else
7075 llvm_unreachable("Invalid ABI");
7076
7077 if (BigEndian)
7078 resetDataLayout(("E-" + Layout).str());
7079 else
7080 resetDataLayout(("e-" + Layout).str());
Daniel Sanders4672af62016-05-27 11:51:02 +00007081 }
7082
Akira Hatanaka9064e362013-10-29 18:30:33 +00007083
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00007084 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007085 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00007086 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00007087 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007088 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00007089 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007090 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00007091 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007092 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007093 enum DspRevEnum {
7094 NoDSP, DSP1, DSP2
7095 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00007096 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007097
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007098protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00007099 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007100 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007101
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007102public:
Daniel Sanders4672af62016-05-27 11:51:02 +00007103 MipsTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007104 : TargetInfo(Triple), IsMips16(false), IsMicromips(false),
7105 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
7106 DspRev(NoDSP), HasMSA(false), HasFP64(false) {
Zoran Jovanovic26a12162015-02-18 15:21:35 +00007107 TheCXXABI.set(TargetCXXABI::GenericMIPS);
Daniel Sanders4672af62016-05-27 11:51:02 +00007108 BigEndian = getTriple().getArch() == llvm::Triple::mips ||
7109 getTriple().getArch() == llvm::Triple::mips64;
7110
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007111 setABI((getTriple().getArch() == llvm::Triple::mips ||
7112 getTriple().getArch() == llvm::Triple::mipsel)
7113 ? "o32"
7114 : "n64");
7115
7116 CPU = ABI == "o32" ? "mips32r2" : "mips64r2";
Zoran Jovanovic26a12162015-02-18 15:21:35 +00007117 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007118
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007119 bool isNaN2008Default() const {
7120 return CPU == "mips32r6" || CPU == "mips64r6";
7121 }
7122
7123 bool isFP64Default() const {
7124 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
7125 }
7126
Petar Jovanovicd55ae6b2015-02-26 18:19:22 +00007127 bool isNan2008() const override {
7128 return IsNan2008;
7129 }
7130
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007131 bool processorSupportsGPR64() const {
7132 return llvm::StringSwitch<bool>(CPU)
7133 .Case("mips3", true)
7134 .Case("mips4", true)
7135 .Case("mips5", true)
7136 .Case("mips64", true)
7137 .Case("mips64r2", true)
7138 .Case("mips64r3", true)
7139 .Case("mips64r5", true)
7140 .Case("mips64r6", true)
7141 .Case("octeon", true)
7142 .Default(false);
7143 return false;
7144 }
7145
Alp Toker4925ba72014-06-07 23:30:42 +00007146 StringRef getABI() const override { return ABI; }
Daniel Sanders4672af62016-05-27 11:51:02 +00007147 bool setABI(const std::string &Name) override {
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007148 if (Name == "o32") {
7149 setO32ABITypes();
7150 ABI = Name;
7151 return true;
Daniel Sanders4672af62016-05-27 11:51:02 +00007152 }
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007153
7154 if (Name == "n32") {
7155 setN32ABITypes();
7156 ABI = Name;
7157 return true;
7158 }
7159 if (Name == "n64") {
7160 setN64ABITypes();
7161 ABI = Name;
7162 return true;
Daniel Sanders4672af62016-05-27 11:51:02 +00007163 }
7164 return false;
7165 }
7166
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007167 void setO32ABITypes() {
7168 Int64Type = SignedLongLong;
7169 IntMaxType = Int64Type;
7170 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
7171 LongDoubleWidth = LongDoubleAlign = 64;
7172 LongWidth = LongAlign = 32;
7173 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
7174 PointerWidth = PointerAlign = 32;
7175 PtrDiffType = SignedInt;
7176 SizeType = UnsignedInt;
7177 SuitableAlign = 64;
7178 }
7179
7180 void setN32N64ABITypes() {
7181 LongDoubleWidth = LongDoubleAlign = 128;
7182 LongDoubleFormat = &llvm::APFloat::IEEEquad;
7183 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
7184 LongDoubleWidth = LongDoubleAlign = 64;
7185 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
7186 }
7187 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
7188 SuitableAlign = 128;
7189 }
7190
Daniel Sanders4672af62016-05-27 11:51:02 +00007191 void setN64ABITypes() {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007192 setN32N64ABITypes();
Daniel Sanders4672af62016-05-27 11:51:02 +00007193 Int64Type = SignedLong;
7194 IntMaxType = Int64Type;
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007195 LongWidth = LongAlign = 64;
7196 PointerWidth = PointerAlign = 64;
7197 PtrDiffType = SignedLong;
7198 SizeType = UnsignedLong;
Daniel Sanders4672af62016-05-27 11:51:02 +00007199 }
7200
7201 void setN32ABITypes() {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007202 setN32N64ABITypes();
Daniel Sanders4672af62016-05-27 11:51:02 +00007203 Int64Type = SignedLongLong;
7204 IntMaxType = Int64Type;
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007205 LongWidth = LongAlign = 32;
7206 PointerWidth = PointerAlign = 32;
7207 PtrDiffType = SignedInt;
7208 SizeType = UnsignedInt;
Daniel Sanders4672af62016-05-27 11:51:02 +00007209 }
7210
Craig Topper3164f332014-03-11 03:39:26 +00007211 bool setCPU(const std::string &Name) override {
Eric Christopher0b26a612010-03-02 02:41:08 +00007212 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007213 return llvm::StringSwitch<bool>(Name)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007214 .Case("mips1", true)
7215 .Case("mips2", true)
Simon Atanasyan26610c52014-07-04 12:36:56 +00007216 .Case("mips3", true)
7217 .Case("mips4", true)
7218 .Case("mips5", true)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007219 .Case("mips32", true)
7220 .Case("mips32r2", true)
7221 .Case("mips32r3", true)
7222 .Case("mips32r5", true)
7223 .Case("mips32r6", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007224 .Case("mips64", true)
7225 .Case("mips64r2", true)
Simon Atanasyan162feb52015-02-20 23:37:40 +00007226 .Case("mips64r3", true)
7227 .Case("mips64r5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007228 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00007229 .Case("octeon", true)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007230 .Case("p5600", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007231 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00007232 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00007233 const std::string& getCPU() const { return CPU; }
Eric Christopher8c47b422015-10-09 18:39:55 +00007234 bool
7235 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7236 StringRef CPU,
7237 const std::vector<std::string> &FeaturesVec) const override {
Bhushan D. Attardebacb988732016-03-04 06:56:29 +00007238 if (CPU.empty())
7239 CPU = getCPU();
Simon Atanasyan4e16a422014-07-04 12:37:04 +00007240 if (CPU == "octeon")
7241 Features["mips64r2"] = Features["cnmips"] = true;
7242 else
7243 Features[CPU] = true;
Eric Christopher007b0a02015-08-28 22:32:01 +00007244 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Eric Christopher0b26a612010-03-02 02:41:08 +00007245 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007246
Craig Topper3164f332014-03-11 03:39:26 +00007247 void getTargetDefines(const LangOptions &Opts,
7248 MacroBuilder &Builder) const override {
Daniel Sanders4672af62016-05-27 11:51:02 +00007249 if (BigEndian) {
7250 DefineStd(Builder, "MIPSEB", Opts);
7251 Builder.defineMacro("_MIPSEB");
7252 } else {
7253 DefineStd(Builder, "MIPSEL", Opts);
7254 Builder.defineMacro("_MIPSEL");
7255 }
7256
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007257 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00007258 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007259 if (Opts.GNUMode)
7260 Builder.defineMacro("mips");
7261
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007262 if (ABI == "o32") {
Daniel Sanders4672af62016-05-27 11:51:02 +00007263 Builder.defineMacro("__mips", "32");
7264 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
7265 } else {
7266 Builder.defineMacro("__mips", "64");
7267 Builder.defineMacro("__mips64");
7268 Builder.defineMacro("__mips64__");
7269 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
7270 }
7271
7272 const std::string ISARev = llvm::StringSwitch<std::string>(getCPU())
7273 .Cases("mips32", "mips64", "1")
7274 .Cases("mips32r2", "mips64r2", "2")
7275 .Cases("mips32r3", "mips64r3", "3")
7276 .Cases("mips32r5", "mips64r5", "5")
7277 .Cases("mips32r6", "mips64r6", "6")
7278 .Default("");
7279 if (!ISARev.empty())
7280 Builder.defineMacro("__mips_isa_rev", ISARev);
7281
7282 if (ABI == "o32") {
7283 Builder.defineMacro("__mips_o32");
7284 Builder.defineMacro("_ABIO32", "1");
7285 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
Daniel Sanders07c86542016-05-27 14:30:23 +00007286 } else if (ABI == "n32") {
Daniel Sanders4672af62016-05-27 11:51:02 +00007287 Builder.defineMacro("__mips_n32");
7288 Builder.defineMacro("_ABIN32", "2");
7289 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
7290 } else if (ABI == "n64") {
7291 Builder.defineMacro("__mips_n64");
7292 Builder.defineMacro("_ABI64", "3");
7293 Builder.defineMacro("_MIPS_SIM", "_ABI64");
7294 } else
7295 llvm_unreachable("Invalid ABI.");
7296
Simon Atanasyan683535b2012-08-29 19:14:58 +00007297 Builder.defineMacro("__REGISTER_PREFIX__", "");
7298
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007299 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007300 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00007301 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007302 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007303 case SoftFloat:
7304 Builder.defineMacro("__mips_soft_float", Twine(1));
7305 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00007306 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00007307
Simon Atanasyan16071912013-04-14 14:07:30 +00007308 if (IsSingleFloat)
7309 Builder.defineMacro("__mips_single_float", Twine(1));
7310
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007311 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
7312 Builder.defineMacro("_MIPS_FPSET",
7313 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
7314
Simon Atanasyan72244b62012-07-05 16:06:06 +00007315 if (IsMips16)
7316 Builder.defineMacro("__mips16", Twine(1));
7317
Simon Atanasyan60777612013-04-14 14:07:51 +00007318 if (IsMicromips)
7319 Builder.defineMacro("__mips_micromips", Twine(1));
7320
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007321 if (IsNan2008)
7322 Builder.defineMacro("__mips_nan2008", Twine(1));
7323
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007324 switch (DspRev) {
7325 default:
7326 break;
7327 case DSP1:
7328 Builder.defineMacro("__mips_dsp_rev", Twine(1));
7329 Builder.defineMacro("__mips_dsp", Twine(1));
7330 break;
7331 case DSP2:
7332 Builder.defineMacro("__mips_dsp_rev", Twine(2));
7333 Builder.defineMacro("__mips_dspr2", Twine(1));
7334 Builder.defineMacro("__mips_dsp", Twine(1));
7335 break;
7336 }
7337
Jack Carter44ff1e52013-08-12 17:20:29 +00007338 if (HasMSA)
7339 Builder.defineMacro("__mips_msa", Twine(1));
7340
Simon Atanasyan26f19672012-04-05 19:28:31 +00007341 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
7342 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
7343 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00007344
7345 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
7346 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Daniel Sanders5176f7e2015-12-22 12:59:30 +00007347
7348 // These shouldn't be defined for MIPS-I but there's no need to check
7349 // for that since MIPS-I isn't supported.
7350 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
7351 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
7352 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007353
7354 // 32-bit MIPS processors don't have the necessary lld/scd instructions
7355 // found in 64-bit processors. In the case of O32 on a 64-bit processor,
7356 // the instructions exist but using them violates the ABI since they
7357 // require 64-bit GPRs and O32 only supports 32-bit GPRs.
7358 if (ABI == "n32" || ABI == "n64")
Daniel Sanders4672af62016-05-27 11:51:02 +00007359 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007360 }
7361
Craig Topper6c03a542015-10-19 04:51:35 +00007362 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7363 return llvm::makeArrayRef(BuiltinInfo,
7364 clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin);
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007365 }
Craig Topper3164f332014-03-11 03:39:26 +00007366 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00007367 return llvm::StringSwitch<bool>(Feature)
7368 .Case("mips", true)
7369 .Case("fp64", HasFP64)
7370 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00007371 }
Craig Topper3164f332014-03-11 03:39:26 +00007372 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00007373 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007374 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007375 ArrayRef<const char *> getGCCRegNames() const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00007376 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00007377 // CPU register names
7378 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007379 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
7380 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
7381 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00007382 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
7383 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007384 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
7385 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
7386 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
7387 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00007388 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007389 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Hrvoje Varga14c42ee2016-03-29 12:46:16 +00007390 "$fcc5","$fcc6","$fcc7","$ac1hi","$ac1lo","$ac2hi","$ac2lo",
7391 "$ac3hi","$ac3lo",
Daniel Sanders8b59af12013-11-12 12:56:01 +00007392 // MSA register names
7393 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
7394 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
7395 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
7396 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
7397 // MSA control register names
7398 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
7399 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007400 };
Craig Topperf054e3a2015-10-19 03:52:27 +00007401 return llvm::makeArrayRef(GCCRegNames);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007402 }
Craig Topper3164f332014-03-11 03:39:26 +00007403 bool validateAsmConstraint(const char *&Name,
7404 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007405 switch (*Name) {
7406 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00007407 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007408 case 'r': // CPU registers.
7409 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00007410 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007411 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00007412 case 'c': // $25 for indirect jumps
7413 case 'l': // lo register
7414 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007415 Info.setAllowsRegister();
7416 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00007417 case 'I': // Signed 16-bit constant
7418 case 'J': // Integer 0
7419 case 'K': // Unsigned 16-bit constant
7420 case 'L': // Signed 32-bit constant, lower 16-bit zeros (for lui)
7421 case 'M': // Constants not loadable via lui, addiu, or ori
7422 case 'N': // Constant -1 to -65535
7423 case 'O': // A signed 15-bit constant
7424 case 'P': // A constant between 1 go 65535
7425 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00007426 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00007427 Info.setAllowsMemory();
7428 return true;
Daniel Sanders48fa39e2015-03-30 13:47:23 +00007429 case 'Z':
7430 if (Name[1] == 'C') { // An address usable by ll, and sc.
7431 Info.setAllowsMemory();
7432 Name++; // Skip over 'Z'.
7433 return true;
7434 }
7435 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007436 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007437 }
7438
Daniel Sanders48fa39e2015-03-30 13:47:23 +00007439 std::string convertConstraint(const char *&Constraint) const override {
7440 std::string R;
7441 switch (*Constraint) {
7442 case 'Z': // Two-character constraint; add "^" hint for later parsing.
7443 if (Constraint[1] == 'C') {
7444 R = std::string("^") + std::string(Constraint, 2);
7445 Constraint++;
7446 return R;
7447 }
7448 break;
7449 }
7450 return TargetInfo::convertConstraint(Constraint);
7451 }
7452
Craig Topper3164f332014-03-11 03:39:26 +00007453 const char *getClobbers() const override {
Toma Tabacucfab40f2015-01-12 14:41:30 +00007454 // In GCC, $1 is not widely used in generated code (it's used only in a few
7455 // specific situations), so there is no real need for users to add it to
7456 // the clobbers list if they want to use it in their inline assembly code.
7457 //
7458 // In LLVM, $1 is treated as a normal GPR and is always allocatable during
7459 // code generation, so using it in inline assembly without adding it to the
7460 // clobbers list can cause conflicts between the inline assembly code and
7461 // the surrounding generated code.
7462 //
7463 // Another problem is that LLVM is allowed to choose $1 for inline assembly
7464 // operands, which will conflict with the ".set at" assembler option (which
7465 // we use only for inline assembly, in order to maintain compatibility with
7466 // GCC) and will also conflict with the user's usage of $1.
7467 //
7468 // The easiest way to avoid these conflicts and keep $1 as an allocatable
7469 // register for generated code is to automatically clobber $1 for all inline
7470 // assembly code.
7471 //
7472 // FIXME: We should automatically clobber $1 only for inline assembly code
7473 // which actually uses it. This would allow LLVM to use $1 for inline
7474 // assembly operands if the user's assembly code doesn't use it.
Toma Tabacu99411952014-12-17 12:02:58 +00007475 return "~{$1}";
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007476 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007477
Craig Topper3164f332014-03-11 03:39:26 +00007478 bool handleTargetFeatures(std::vector<std::string> &Features,
7479 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00007480 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00007481 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007482 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00007483 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007484 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007485 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007486 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007487
Eric Christopher610fe112015-08-26 08:21:55 +00007488 for (const auto &Feature : Features) {
7489 if (Feature == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00007490 IsSingleFloat = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007491 else if (Feature == "+soft-float")
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007492 FloatABI = SoftFloat;
Eric Christopher610fe112015-08-26 08:21:55 +00007493 else if (Feature == "+mips16")
Simon Atanasyan72244b62012-07-05 16:06:06 +00007494 IsMips16 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007495 else if (Feature == "+micromips")
Simon Atanasyan60777612013-04-14 14:07:51 +00007496 IsMicromips = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007497 else if (Feature == "+dsp")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007498 DspRev = std::max(DspRev, DSP1);
Eric Christopher610fe112015-08-26 08:21:55 +00007499 else if (Feature == "+dspr2")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007500 DspRev = std::max(DspRev, DSP2);
Eric Christopher610fe112015-08-26 08:21:55 +00007501 else if (Feature == "+msa")
Jack Carter44ff1e52013-08-12 17:20:29 +00007502 HasMSA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007503 else if (Feature == "+fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007504 HasFP64 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007505 else if (Feature == "-fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007506 HasFP64 = false;
Eric Christopher610fe112015-08-26 08:21:55 +00007507 else if (Feature == "+nan2008")
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007508 IsNan2008 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007509 else if (Feature == "-nan2008")
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007510 IsNan2008 = false;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007511 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007512
James Y Knightb214cbc2016-03-04 19:00:41 +00007513 setDataLayout();
Akira Hatanaka9064e362013-10-29 18:30:33 +00007514
Rafael Espindolaeb265472013-08-21 21:59:03 +00007515 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007516 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00007517
Craig Topper3164f332014-03-11 03:39:26 +00007518 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00007519 if (RegNo == 0) return 4;
7520 if (RegNo == 1) return 5;
7521 return -1;
7522 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00007523
7524 bool isCLZForZeroUndef() const override { return false; }
Daniel Sanders4672af62016-05-27 11:51:02 +00007525
7526 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7527 static const TargetInfo::GCCRegAlias O32RegAliases[] = {
7528 {{"at"}, "$1"}, {{"v0"}, "$2"}, {{"v1"}, "$3"},
7529 {{"a0"}, "$4"}, {{"a1"}, "$5"}, {{"a2"}, "$6"},
7530 {{"a3"}, "$7"}, {{"t0"}, "$8"}, {{"t1"}, "$9"},
7531 {{"t2"}, "$10"}, {{"t3"}, "$11"}, {{"t4"}, "$12"},
7532 {{"t5"}, "$13"}, {{"t6"}, "$14"}, {{"t7"}, "$15"},
7533 {{"s0"}, "$16"}, {{"s1"}, "$17"}, {{"s2"}, "$18"},
7534 {{"s3"}, "$19"}, {{"s4"}, "$20"}, {{"s5"}, "$21"},
7535 {{"s6"}, "$22"}, {{"s7"}, "$23"}, {{"t8"}, "$24"},
7536 {{"t9"}, "$25"}, {{"k0"}, "$26"}, {{"k1"}, "$27"},
7537 {{"gp"}, "$28"}, {{"sp", "$sp"}, "$29"}, {{"fp", "$fp"}, "$30"},
7538 {{"ra"}, "$31"}};
7539 static const TargetInfo::GCCRegAlias NewABIRegAliases[] = {
7540 {{"at"}, "$1"}, {{"v0"}, "$2"}, {{"v1"}, "$3"},
7541 {{"a0"}, "$4"}, {{"a1"}, "$5"}, {{"a2"}, "$6"},
7542 {{"a3"}, "$7"}, {{"a4"}, "$8"}, {{"a5"}, "$9"},
7543 {{"a6"}, "$10"}, {{"a7"}, "$11"}, {{"t0"}, "$12"},
7544 {{"t1"}, "$13"}, {{"t2"}, "$14"}, {{"t3"}, "$15"},
7545 {{"s0"}, "$16"}, {{"s1"}, "$17"}, {{"s2"}, "$18"},
7546 {{"s3"}, "$19"}, {{"s4"}, "$20"}, {{"s5"}, "$21"},
7547 {{"s6"}, "$22"}, {{"s7"}, "$23"}, {{"t8"}, "$24"},
7548 {{"t9"}, "$25"}, {{"k0"}, "$26"}, {{"k1"}, "$27"},
7549 {{"gp"}, "$28"}, {{"sp", "$sp"}, "$29"}, {{"fp", "$fp"}, "$30"},
7550 {{"ra"}, "$31"}};
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007551 if (ABI == "o32")
Daniel Sanders4672af62016-05-27 11:51:02 +00007552 return llvm::makeArrayRef(O32RegAliases);
7553 return llvm::makeArrayRef(NewABIRegAliases);
7554 }
7555
7556 bool hasInt128Type() const override {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007557 return ABI == "n32" || ABI == "n64";
Daniel Sanders4672af62016-05-27 11:51:02 +00007558 }
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007559
7560 bool validateTarget(DiagnosticsEngine &Diags) const override {
7561 // FIXME: It's valid to use O32 on a 64-bit CPU but the backend can't handle
7562 // this yet. It's better to fail here than on the backend assertion.
7563 if (processorSupportsGPR64() && ABI == "o32") {
7564 Diags.Report(diag::err_target_unsupported_abi) << ABI << CPU;
7565 return false;
7566 }
7567
7568 // 64-bit ABI's require 64-bit CPU's.
7569 if (!processorSupportsGPR64() && (ABI == "n32" || ABI == "n64")) {
7570 Diags.Report(diag::err_target_unsupported_abi) << ABI << CPU;
7571 return false;
7572 }
7573
7574 // FIXME: It's valid to use O32 on a mips64/mips64el triple but the backend
7575 // can't handle this yet. It's better to fail here than on the
7576 // backend assertion.
7577 if ((getTriple().getArch() == llvm::Triple::mips64 ||
7578 getTriple().getArch() == llvm::Triple::mips64el) &&
7579 ABI == "o32") {
7580 Diags.Report(diag::err_target_unsupported_abi_for_triple)
7581 << ABI << getTriple().str();
7582 return false;
7583 }
7584
7585 // FIXME: It's valid to use N32/N64 on a mips/mipsel triple but the backend
7586 // can't handle this yet. It's better to fail here than on the
7587 // backend assertion.
7588 if ((getTriple().getArch() == llvm::Triple::mips ||
7589 getTriple().getArch() == llvm::Triple::mipsel) &&
7590 (ABI == "n32" || ABI == "n64")) {
7591 Diags.Report(diag::err_target_unsupported_abi_for_triple)
7592 << ABI << getTriple().str();
7593 return false;
7594 }
7595
7596 return true;
7597 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007598};
7599
Daniel Sanders4672af62016-05-27 11:51:02 +00007600const Builtin::Info MipsTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00007601#define BUILTIN(ID, TYPE, ATTRS) \
7602 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7603#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7604 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00007605#include "clang/Basic/BuiltinsMips.def"
7606};
7607
Ivan Krasindd7403e2011-08-24 20:22:22 +00007608class PNaClTargetInfo : public TargetInfo {
7609public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007610 PNaClTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7611 : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00007612 BigEndian = false;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007613 this->LongAlign = 32;
7614 this->LongWidth = 32;
7615 this->PointerAlign = 32;
7616 this->PointerWidth = 32;
7617 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007618 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00007619 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00007620 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00007621 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00007622 this->SizeType = TargetInfo::UnsignedInt;
7623 this->PtrDiffType = TargetInfo::SignedInt;
7624 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00007625 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00007626 }
7627
Craig Toppere6f17d02014-03-11 04:07:52 +00007628 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007629 Builder.defineMacro("__le32__");
7630 Builder.defineMacro("__pnacl__");
7631 }
Craig Topper3164f332014-03-11 03:39:26 +00007632 void getTargetDefines(const LangOptions &Opts,
7633 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007634 getArchDefines(Opts, Builder);
7635 }
Craig Topper3164f332014-03-11 03:39:26 +00007636 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00007637 return Feature == "pnacl";
7638 }
Craig Topper6c03a542015-10-19 04:51:35 +00007639 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Craig Topper3164f332014-03-11 03:39:26 +00007640 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00007641 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007642 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007643 ArrayRef<const char *> getGCCRegNames() const override;
7644 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00007645 bool validateAsmConstraint(const char *&Name,
7646 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007647 return false;
7648 }
7649
Craig Topper3164f332014-03-11 03:39:26 +00007650 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007651 return "";
7652 }
7653};
7654
Craig Topperf054e3a2015-10-19 03:52:27 +00007655ArrayRef<const char *> PNaClTargetInfo::getGCCRegNames() const {
7656 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007657}
7658
Craig Topperf054e3a2015-10-19 03:52:27 +00007659ArrayRef<TargetInfo::GCCRegAlias> PNaClTargetInfo::getGCCRegAliases() const {
7660 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007661}
Ivan Krasindd7403e2011-08-24 20:22:22 +00007662
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007663// We attempt to use PNaCl (le32) frontend and Mips32EL backend.
Daniel Sanders4672af62016-05-27 11:51:02 +00007664class NaClMips32TargetInfo : public MipsTargetInfo {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007665public:
Daniel Sanders4672af62016-05-27 11:51:02 +00007666 NaClMips32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7667 : MipsTargetInfo(Triple, Opts) {}
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007668
7669 BuiltinVaListKind getBuiltinVaListKind() const override {
7670 return TargetInfo::PNaClABIBuiltinVaList;
7671 }
7672};
7673
JF Bastien643817d2014-09-12 17:52:47 +00007674class Le64TargetInfo : public TargetInfo {
7675 static const Builtin::Info BuiltinInfo[];
7676
7677public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007678 Le64TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7679 : TargetInfo(Triple) {
JF Bastien643817d2014-09-12 17:52:47 +00007680 BigEndian = false;
7681 NoAsmVariants = true;
7682 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
7683 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00007684 resetDataLayout("e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128");
JF Bastien643817d2014-09-12 17:52:47 +00007685 }
7686
7687 void getTargetDefines(const LangOptions &Opts,
7688 MacroBuilder &Builder) const override {
7689 DefineStd(Builder, "unix", Opts);
7690 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
7691 Builder.defineMacro("__ELF__");
7692 }
Craig Topper6c03a542015-10-19 04:51:35 +00007693 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7694 return llvm::makeArrayRef(BuiltinInfo,
7695 clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin);
JF Bastien643817d2014-09-12 17:52:47 +00007696 }
7697 BuiltinVaListKind getBuiltinVaListKind() const override {
7698 return TargetInfo::PNaClABIBuiltinVaList;
7699 }
7700 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00007701 ArrayRef<const char *> getGCCRegNames() const override {
7702 return None;
JF Bastien643817d2014-09-12 17:52:47 +00007703 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007704 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7705 return None;
JF Bastien643817d2014-09-12 17:52:47 +00007706 }
7707 bool validateAsmConstraint(const char *&Name,
7708 TargetInfo::ConstraintInfo &Info) const override {
7709 return false;
7710 }
7711
7712 bool hasProtectedVisibility() const override { return false; }
JF Bastien643817d2014-09-12 17:52:47 +00007713};
Dan Gohmanc2853072015-09-03 22:51:53 +00007714
7715class WebAssemblyTargetInfo : public TargetInfo {
7716 static const Builtin::Info BuiltinInfo[];
7717
7718 enum SIMDEnum {
7719 NoSIMD,
7720 SIMD128,
7721 } SIMDLevel;
7722
7723public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007724 explicit WebAssemblyTargetInfo(const llvm::Triple &T, const TargetOptions &)
Dan Gohmanc2853072015-09-03 22:51:53 +00007725 : TargetInfo(T), SIMDLevel(NoSIMD) {
7726 BigEndian = false;
7727 NoAsmVariants = true;
7728 SuitableAlign = 128;
7729 LargeArrayMinWidth = 128;
7730 LargeArrayAlign = 128;
7731 SimdDefaultAlign = 128;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007732 SigAtomicType = SignedLong;
Dan Gohman6db46402015-11-10 21:01:46 +00007733 LongDoubleWidth = LongDoubleAlign = 128;
7734 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Dan Gohmanc2853072015-09-03 22:51:53 +00007735 }
7736
7737protected:
7738 void getTargetDefines(const LangOptions &Opts,
7739 MacroBuilder &Builder) const override {
7740 defineCPUMacros(Builder, "wasm", /*Tuning=*/false);
7741 if (SIMDLevel >= SIMD128)
7742 Builder.defineMacro("__wasm_simd128__");
7743 }
7744
7745private:
Eric Christopher8c47b422015-10-09 18:39:55 +00007746 bool
7747 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7748 StringRef CPU,
7749 const std::vector<std::string> &FeaturesVec) const override {
Dan Gohmanc2853072015-09-03 22:51:53 +00007750 if (CPU == "bleeding-edge")
7751 Features["simd128"] = true;
7752 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
7753 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007754 bool hasFeature(StringRef Feature) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007755 return llvm::StringSwitch<bool>(Feature)
7756 .Case("simd128", SIMDLevel >= SIMD128)
7757 .Default(false);
7758 }
7759 bool handleTargetFeatures(std::vector<std::string> &Features,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007760 DiagnosticsEngine &Diags) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007761 for (const auto &Feature : Features) {
7762 if (Feature == "+simd128") {
7763 SIMDLevel = std::max(SIMDLevel, SIMD128);
7764 continue;
7765 }
7766 if (Feature == "-simd128") {
7767 SIMDLevel = std::min(SIMDLevel, SIMDEnum(SIMD128 - 1));
7768 continue;
7769 }
7770
7771 Diags.Report(diag::err_opt_not_valid_with_opt) << Feature
7772 << "-target-feature";
7773 return false;
7774 }
7775 return true;
7776 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007777 bool setCPU(const std::string &Name) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007778 return llvm::StringSwitch<bool>(Name)
7779 .Case("mvp", true)
7780 .Case("bleeding-edge", true)
7781 .Case("generic", true)
7782 .Default(false);
7783 }
Craig Topper6c03a542015-10-19 04:51:35 +00007784 ArrayRef<Builtin::Info> getTargetBuiltins() const final {
7785 return llvm::makeArrayRef(BuiltinInfo,
7786 clang::WebAssembly::LastTSBuiltin - Builtin::FirstTSBuiltin);
Dan Gohmanc2853072015-09-03 22:51:53 +00007787 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007788 BuiltinVaListKind getBuiltinVaListKind() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007789 return VoidPtrBuiltinVaList;
7790 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007791 ArrayRef<const char *> getGCCRegNames() const final {
7792 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00007793 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007794 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const final {
7795 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00007796 }
7797 bool
7798 validateAsmConstraint(const char *&Name,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007799 TargetInfo::ConstraintInfo &Info) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007800 return false;
7801 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007802 const char *getClobbers() const final { return ""; }
7803 bool isCLZForZeroUndef() const final { return false; }
7804 bool hasInt128Type() const final { return true; }
Dan Gohmanab0e31f2015-09-14 21:49:41 +00007805 IntType getIntTypeByWidth(unsigned BitWidth,
7806 bool IsSigned) const final {
7807 // WebAssembly prefers long long for explicitly 64-bit integers.
7808 return BitWidth == 64 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
7809 : TargetInfo::getIntTypeByWidth(BitWidth, IsSigned);
7810 }
7811 IntType getLeastIntTypeByWidth(unsigned BitWidth,
7812 bool IsSigned) const final {
7813 // WebAssembly uses long long for int_least64_t and int_fast64_t.
7814 return BitWidth == 64
7815 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
7816 : TargetInfo::getLeastIntTypeByWidth(BitWidth, IsSigned);
7817 }
Dan Gohmanc2853072015-09-03 22:51:53 +00007818};
7819
7820const Builtin::Info WebAssemblyTargetInfo::BuiltinInfo[] = {
7821#define BUILTIN(ID, TYPE, ATTRS) \
7822 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7823#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7824 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
7825#include "clang/Basic/BuiltinsWebAssembly.def"
7826};
7827
7828class WebAssembly32TargetInfo : public WebAssemblyTargetInfo {
7829public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007830 explicit WebAssembly32TargetInfo(const llvm::Triple &T,
7831 const TargetOptions &Opts)
7832 : WebAssemblyTargetInfo(T, Opts) {
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007833 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
James Y Knightb214cbc2016-03-04 19:00:41 +00007834 resetDataLayout("e-m:e-p:32:32-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00007835 }
7836
7837protected:
7838 void getTargetDefines(const LangOptions &Opts,
7839 MacroBuilder &Builder) const override {
7840 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
7841 defineCPUMacros(Builder, "wasm32", /*Tuning=*/false);
7842 }
7843};
7844
7845class WebAssembly64TargetInfo : public WebAssemblyTargetInfo {
7846public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007847 explicit WebAssembly64TargetInfo(const llvm::Triple &T,
7848 const TargetOptions &Opts)
7849 : WebAssemblyTargetInfo(T, Opts) {
Dan Gohmanc2853072015-09-03 22:51:53 +00007850 LongAlign = LongWidth = 64;
7851 PointerAlign = PointerWidth = 64;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007852 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00007853 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00007854 }
7855
7856protected:
7857 void getTargetDefines(const LangOptions &Opts,
7858 MacroBuilder &Builder) const override {
7859 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
7860 defineCPUMacros(Builder, "wasm64", /*Tuning=*/false);
7861 }
7862};
7863
JF Bastien643817d2014-09-12 17:52:47 +00007864const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
7865#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00007866 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
JF Bastien643817d2014-09-12 17:52:47 +00007867#include "clang/Basic/BuiltinsLe64.def"
7868};
7869
Eric Christopherc48497a2015-09-18 21:26:24 +00007870static const unsigned SPIRAddrSpaceMap[] = {
7871 1, // opencl_global
7872 3, // opencl_local
7873 2, // opencl_constant
7874 4, // opencl_generic
7875 0, // cuda_device
7876 0, // cuda_constant
7877 0 // cuda_shared
7878};
7879class SPIRTargetInfo : public TargetInfo {
7880public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007881 SPIRTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7882 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007883 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
7884 "SPIR target must use unknown OS");
7885 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
7886 "SPIR target must use unknown environment type");
7887 BigEndian = false;
7888 TLSSupported = false;
7889 LongWidth = LongAlign = 64;
7890 AddrSpaceMap = &SPIRAddrSpaceMap;
7891 UseAddrSpaceMapMangling = true;
7892 // Define available target features
7893 // These must be defined in sorted order!
7894 NoAsmVariants = true;
7895 }
7896 void getTargetDefines(const LangOptions &Opts,
7897 MacroBuilder &Builder) const override {
7898 DefineStd(Builder, "SPIR", Opts);
7899 }
7900 bool hasFeature(StringRef Feature) const override {
7901 return Feature == "spir";
7902 }
Craig Topper3164f332014-03-11 03:39:26 +00007903
Craig Topper6c03a542015-10-19 04:51:35 +00007904 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007905 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00007906 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007907 bool validateAsmConstraint(const char *&Name,
7908 TargetInfo::ConstraintInfo &info) const override {
7909 return true;
7910 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007911 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7912 return None;
7913 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007914 BuiltinVaListKind getBuiltinVaListKind() const override {
7915 return TargetInfo::VoidPtrBuiltinVaList;
7916 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00007917
Eric Christopherc48497a2015-09-18 21:26:24 +00007918 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
7919 return (CC == CC_SpirFunction || CC == CC_SpirKernel) ? CCCR_OK
7920 : CCCR_Warning;
7921 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00007922
Eric Christopherc48497a2015-09-18 21:26:24 +00007923 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
7924 return CC_SpirFunction;
7925 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00007926
7927 void setSupportedOpenCLOpts() override {
7928 // Assume all OpenCL extensions and optional core features are supported
7929 // for SPIR since it is a generic target.
7930 getSupportedOpenCLOpts().setAll();
7931 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007932};
Guy Benyeib798fc92012-12-11 21:38:14 +00007933
Eric Christopherc48497a2015-09-18 21:26:24 +00007934class SPIR32TargetInfo : public SPIRTargetInfo {
7935public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007936 SPIR32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7937 : SPIRTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007938 PointerWidth = PointerAlign = 32;
7939 SizeType = TargetInfo::UnsignedInt;
7940 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +00007941 resetDataLayout("e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
7942 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00007943 }
7944 void getTargetDefines(const LangOptions &Opts,
7945 MacroBuilder &Builder) const override {
7946 DefineStd(Builder, "SPIR32", Opts);
7947 }
7948};
Guy Benyeib798fc92012-12-11 21:38:14 +00007949
Eric Christopherc48497a2015-09-18 21:26:24 +00007950class SPIR64TargetInfo : public SPIRTargetInfo {
7951public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007952 SPIR64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7953 : SPIRTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007954 PointerWidth = PointerAlign = 64;
7955 SizeType = TargetInfo::UnsignedLong;
7956 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00007957 resetDataLayout("e-i64:64-v16:16-v24:32-v32:32-v48:64-"
7958 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00007959 }
7960 void getTargetDefines(const LangOptions &Opts,
7961 MacroBuilder &Builder) const override {
7962 DefineStd(Builder, "SPIR64", Opts);
7963 }
7964};
Guy Benyeib798fc92012-12-11 21:38:14 +00007965
Robert Lytton0e076492013-08-13 09:43:10 +00007966class XCoreTargetInfo : public TargetInfo {
7967 static const Builtin::Info BuiltinInfo[];
7968public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007969 XCoreTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7970 : TargetInfo(Triple) {
Robert Lytton0e076492013-08-13 09:43:10 +00007971 BigEndian = false;
7972 NoAsmVariants = true;
7973 LongLongAlign = 32;
7974 SuitableAlign = 32;
7975 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00007976 SizeType = UnsignedInt;
7977 PtrDiffType = SignedInt;
7978 IntPtrType = SignedInt;
7979 WCharType = UnsignedChar;
7980 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00007981 UseZeroLengthBitfieldAlignment = true;
James Y Knightb214cbc2016-03-04 19:00:41 +00007982 resetDataLayout("e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32"
7983 "-f64:32-a:0:32-n32");
Robert Lytton0e076492013-08-13 09:43:10 +00007984 }
Craig Topper3164f332014-03-11 03:39:26 +00007985 void getTargetDefines(const LangOptions &Opts,
7986 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007987 Builder.defineMacro("__XS1B__");
7988 }
Craig Topper6c03a542015-10-19 04:51:35 +00007989 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7990 return llvm::makeArrayRef(BuiltinInfo,
7991 clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin);
Robert Lytton0e076492013-08-13 09:43:10 +00007992 }
Craig Topper3164f332014-03-11 03:39:26 +00007993 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007994 return TargetInfo::VoidPtrBuiltinVaList;
7995 }
Craig Topper3164f332014-03-11 03:39:26 +00007996 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007997 return "";
7998 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007999 ArrayRef<const char *> getGCCRegNames() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008000 static const char * const GCCRegNames[] = {
8001 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
8002 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
8003 };
Craig Topperf054e3a2015-10-19 03:52:27 +00008004 return llvm::makeArrayRef(GCCRegNames);
Robert Lytton0e076492013-08-13 09:43:10 +00008005 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008006 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8007 return None;
Robert Lytton0e076492013-08-13 09:43:10 +00008008 }
Craig Topper3164f332014-03-11 03:39:26 +00008009 bool validateAsmConstraint(const char *&Name,
8010 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008011 return false;
8012 }
Craig Topper3164f332014-03-11 03:39:26 +00008013 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00008014 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
8015 return (RegNo < 2)? RegNo : -1;
8016 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00008017 bool allowsLargerPreferedTypeAlignment() const override {
8018 return false;
8019 }
Robert Lytton0e076492013-08-13 09:43:10 +00008020};
8021
8022const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00008023#define BUILTIN(ID, TYPE, ATTRS) \
8024 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
8025#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
8026 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Robert Lytton0e076492013-08-13 09:43:10 +00008027#include "clang/Basic/BuiltinsXCore.def"
8028};
Robert Lytton0e076492013-08-13 09:43:10 +00008029
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008030// x86_32 Android target
8031class AndroidX86_32TargetInfo : public LinuxTargetInfo<X86_32TargetInfo> {
8032public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008033 AndroidX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8034 : LinuxTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008035 SuitableAlign = 32;
8036 LongDoubleWidth = 64;
8037 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
8038 }
8039};
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008040
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008041// x86_64 Android target
8042class AndroidX86_64TargetInfo : public LinuxTargetInfo<X86_64TargetInfo> {
8043public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008044 AndroidX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8045 : LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008046 LongDoubleFormat = &llvm::APFloat::IEEEquad;
8047 }
Chih-Hung Hsieh0b0eeaa2015-07-24 18:12:54 +00008048
8049 bool useFloat128ManglingForLongDouble() const override {
8050 return true;
8051 }
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008052};
8053} // end anonymous namespace
8054
Chris Lattner5ba61f02006-10-14 07:39:34 +00008055//===----------------------------------------------------------------------===//
8056// Driver code
8057//===----------------------------------------------------------------------===//
8058
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008059static TargetInfo *AllocateTarget(const llvm::Triple &Triple,
8060 const TargetOptions &Opts) {
Daniel Dunbar52322032009-08-18 05:47:58 +00008061 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00008062
Daniel Dunbar52322032009-08-18 05:47:58 +00008063 switch (Triple.getArch()) {
8064 default:
Craig Topperf1186c52014-05-08 06:41:40 +00008065 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00008066
Tim Northover2a0783d2014-05-30 14:14:07 +00008067 case llvm::Triple::xcore:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008068 return new XCoreTargetInfo(Triple, Opts);
Tim Northover2a0783d2014-05-30 14:14:07 +00008069
8070 case llvm::Triple::hexagon:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008071 return new HexagonTargetInfo(Triple, Opts);
Tim Northover2a0783d2014-05-30 14:14:07 +00008072
Jacques Pienaard964cc22016-03-28 21:02:54 +00008073 case llvm::Triple::lanai:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008074 return new LanaiTargetInfo(Triple, Opts);
Jacques Pienaard964cc22016-03-28 21:02:54 +00008075
Tim Northover2a0783d2014-05-30 14:14:07 +00008076 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00008077 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008078 return new DarwinAArch64TargetInfo(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00008079
8080 switch (os) {
Ed Schoutenea9448e2015-10-15 15:07:07 +00008081 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008082 return new CloudABITargetInfo<AArch64leTargetInfo>(Triple, Opts);
Ed Maste6a9eda52014-11-13 16:55:42 +00008083 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008084 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00008085 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008086 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple, Opts);
James Molloy5e73df52014-04-16 15:06:20 +00008087 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008088 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00008089 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008090 return new AArch64leTargetInfo(Triple, Opts);
James Molloy5e73df52014-04-16 15:06:20 +00008091 }
8092
Christian Pirker9b019ae2014-02-25 13:51:00 +00008093 case llvm::Triple::aarch64_be:
8094 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00008095 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008096 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00008097 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008098 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00008099 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008100 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00008101 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008102 return new AArch64beTargetInfo(Triple, Opts);
Tim Northover9bb857a2013-01-31 12:13:10 +00008103 }
8104
Daniel Dunbar52322032009-08-18 05:47:58 +00008105 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00008106 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00008107 if (Triple.isOSBinFormatMachO())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008108 return new DarwinARMTargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008109
Daniel Dunbar52322032009-08-18 05:47:58 +00008110 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00008111 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008112 return new LinuxTargetInfo<ARMleTargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008113 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008114 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008115 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008116 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008117 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008118 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00008119 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008120 return new BitrigTargetInfo<ARMleTargetInfo>(Triple, Opts);
Douglas Gregor9fabd852011-07-01 22:41:14 +00008121 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008122 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00008123 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008124 return new NaClTargetInfo<ARMleTargetInfo>(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008125 case llvm::Triple::Win32:
8126 switch (Triple.getEnvironment()) {
Yaron Keren321249c2015-07-15 13:32:23 +00008127 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008128 return new CygwinARMTargetInfo(Triple, Opts);
Yaron Keren321249c2015-07-15 13:32:23 +00008129 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008130 return new MinGWARMTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008131 case llvm::Triple::Itanium:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008132 return new ItaniumWindowsARMleTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008133 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008134 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008135 return new MicrosoftARMleTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008136 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008137 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008138 return new ARMleTargetInfo(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008139 }
8140
8141 case llvm::Triple::armeb:
8142 case llvm::Triple::thumbeb:
8143 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008144 return new DarwinARMTargetInfo(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008145
8146 switch (os) {
8147 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008148 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008149 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008150 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008151 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008152 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008153 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008154 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008155 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008156 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008157 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008158 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008159 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008160 return new NaClTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008161 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008162 return new ARMbeTargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008163 }
Eli Friedmanb5366062008-05-20 14:21:01 +00008164
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00008165 case llvm::Triple::bpfeb:
8166 case llvm::Triple::bpfel:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008167 return new BPFTargetInfo(Triple, Opts);
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00008168
Daniel Dunbar52322032009-08-18 05:47:58 +00008169 case llvm::Triple::msp430:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008170 return new MSP430TargetInfo(Triple, Opts);
Eli Friedmanb5366062008-05-20 14:21:01 +00008171
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008172 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008173 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008174 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00008175 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008176 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00008177 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008178 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008179 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008180 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008181 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008182 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00008183 return new MipsTargetInfo(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008184 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008185
8186 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008187 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008188 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00008189 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008190 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00008191 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008192 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008193 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008194 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008195 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00008196 case llvm::Triple::NaCl:
Daniel Sanders4672af62016-05-27 11:51:02 +00008197 return new NaClTargetInfo<NaClMips32TargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008198 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00008199 return new MipsTargetInfo(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008200 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008201
Akira Hatanakabef17452011-09-20 19:21:49 +00008202 case llvm::Triple::mips64:
8203 switch (os) {
8204 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00008205 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008206 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00008207 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008208 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008209 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008210 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008211 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008212 case llvm::Triple::OpenBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008213 return new OpenBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008214 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00008215 return new MipsTargetInfo(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008216 }
8217
8218 case llvm::Triple::mips64el:
8219 switch (os) {
8220 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00008221 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008222 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00008223 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008224 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008225 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008226 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008227 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008228 case llvm::Triple::OpenBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008229 return new OpenBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008230 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00008231 return new MipsTargetInfo(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008232 }
8233
Ivan Krasindd7403e2011-08-24 20:22:22 +00008234 case llvm::Triple::le32:
8235 switch (os) {
Douglas Katzman78d7c542015-05-12 21:18:10 +00008236 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008237 return new NaClTargetInfo<PNaClTargetInfo>(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00008238 default:
8239 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00008240 }
8241
JF Bastien643817d2014-09-12 17:52:47 +00008242 case llvm::Triple::le64:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008243 return new Le64TargetInfo(Triple, Opts);
JF Bastien643817d2014-09-12 17:52:47 +00008244
Daniel Dunbar52322032009-08-18 05:47:58 +00008245 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008246 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008247 return new DarwinPPC32TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008248 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00008249 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008250 return new LinuxTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008251 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008252 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008253 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008254 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008255 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008256 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008257 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008258 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008259 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008260 return new PPC32TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008261 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008262
8263 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008264 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008265 return new DarwinPPC64TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008266 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00008267 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008268 return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008269 case llvm::Triple::Lv2:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008270 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008271 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008272 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008273 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008274 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008275 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008276 return new PPC64TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008277 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008278
Bill Schmidt778d3872013-07-26 01:36:11 +00008279 case llvm::Triple::ppc64le:
8280 switch (os) {
8281 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008282 return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger22a2d992015-04-10 20:53:48 +00008283 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008284 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Bill Schmidt778d3872013-07-26 01:36:11 +00008285 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008286 return new PPC64TargetInfo(Triple, Opts);
Bill Schmidt778d3872013-07-26 01:36:11 +00008287 }
8288
Peter Collingbournec947aae2012-05-20 23:28:41 +00008289 case llvm::Triple::nvptx:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008290 return new NVPTX32TargetInfo(Triple, Opts);
Peter Collingbournec947aae2012-05-20 23:28:41 +00008291 case llvm::Triple::nvptx64:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008292 return new NVPTX64TargetInfo(Triple, Opts);
Peter Collingbournec947aae2012-05-20 23:28:41 +00008293
Tom Stellardd8e38a32015-01-06 20:34:47 +00008294 case llvm::Triple::amdgcn:
Eli Friedmand13b41e2012-10-12 23:32:00 +00008295 case llvm::Triple::r600:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008296 return new AMDGPUTargetInfo(Triple, Opts);
Eli Friedmand13b41e2012-10-12 23:32:00 +00008297
Daniel Dunbar52322032009-08-18 05:47:58 +00008298 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008299 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00008300 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008301 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008302 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008303 return new SolarisTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008304 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008305 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008306 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008307 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008308 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008309 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008310 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008311 return new SparcV8TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008312 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008313
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008314 // The 'sparcel' architecture copies all the above cases except for Solaris.
8315 case llvm::Triple::sparcel:
8316 switch (os) {
8317 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008318 return new LinuxTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008319 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008320 return new NetBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008321 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008322 return new OpenBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008323 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008324 return new RTEMSTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008325 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008326 return new SparcV8elTargetInfo(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008327 }
8328
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008329 case llvm::Triple::sparcv9:
8330 switch (os) {
8331 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008332 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008333 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008334 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008335 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008336 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008337 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008338 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008339 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008340 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008341 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008342 return new SparcV9TargetInfo(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008343 }
8344
Ulrich Weigand47445072013-05-06 16:26:41 +00008345 case llvm::Triple::systemz:
8346 switch (os) {
8347 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008348 return new LinuxTargetInfo<SystemZTargetInfo>(Triple, Opts);
Ulrich Weigand47445072013-05-06 16:26:41 +00008349 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008350 return new SystemZTargetInfo(Triple, Opts);
Ulrich Weigand47445072013-05-06 16:26:41 +00008351 }
8352
Eli Friedmana9c3d712009-08-19 20:47:07 +00008353 case llvm::Triple::tce:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008354 return new TCETargetInfo(Triple, Opts);
Eli Friedmana9c3d712009-08-19 20:47:07 +00008355
Daniel Dunbar52322032009-08-18 05:47:58 +00008356 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008357 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008358 return new DarwinI386TargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008359
Daniel Dunbar52322032009-08-18 05:47:58 +00008360 switch (os) {
Ed Schouten7893e682015-06-13 21:33:49 +00008361 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008362 return new CloudABITargetInfo<X86_32TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008363 case llvm::Triple::Linux: {
8364 switch (Triple.getEnvironment()) {
8365 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008366 return new LinuxTargetInfo<X86_32TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008367 case llvm::Triple::Android:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008368 return new AndroidX86_32TargetInfo(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008369 }
8370 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008371 case llvm::Triple::DragonFly:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008372 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008373 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008374 return new NetBSDI386TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008375 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008376 return new OpenBSDI386TargetInfo(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00008377 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008378 return new BitrigI386TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008379 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008380 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00008381 case llvm::Triple::KFreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008382 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008383 case llvm::Triple::Minix:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008384 return new MinixTargetInfo<X86_32TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008385 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008386 return new SolarisTargetInfo<X86_32TargetInfo>(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008387 case llvm::Triple::Win32: {
8388 switch (Triple.getEnvironment()) {
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008389 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008390 return new CygwinX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008391 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008392 return new MinGWX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00008393 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008394 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008395 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008396 return new MicrosoftX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008397 }
8398 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00008399 case llvm::Triple::Haiku:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008400 return new HaikuX86_32TargetInfo(Triple, Opts);
Douglas Gregor9fabd852011-07-01 22:41:14 +00008401 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008402 return new RTEMSX86_32TargetInfo(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00008403 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008404 return new NaClTargetInfo<X86_32TargetInfo>(Triple, Opts);
Alexey Bataevc99b0492015-11-25 09:24:26 +00008405 case llvm::Triple::ELFIAMCU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008406 return new MCUX86_32TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008407 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008408 return new X86_32TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008409 }
8410
8411 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008412 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008413 return new DarwinX86_64TargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008414
Daniel Dunbar52322032009-08-18 05:47:58 +00008415 switch (os) {
Ed Schoutenf33c6072015-03-11 08:42:46 +00008416 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008417 return new CloudABITargetInfo<X86_64TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008418 case llvm::Triple::Linux: {
8419 switch (Triple.getEnvironment()) {
8420 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008421 return new LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008422 case llvm::Triple::Android:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008423 return new AndroidX86_64TargetInfo(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008424 }
8425 }
Chris Lattner002ba6b2010-01-09 05:41:14 +00008426 case llvm::Triple::DragonFly:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008427 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008428 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008429 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008430 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008431 return new OpenBSDX86_64TargetInfo(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00008432 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008433 return new BitrigX86_64TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008434 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008435 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00008436 case llvm::Triple::KFreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008437 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008438 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008439 return new SolarisTargetInfo<X86_64TargetInfo>(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008440 case llvm::Triple::Win32: {
8441 switch (Triple.getEnvironment()) {
Yaron Kerend030d112015-07-22 17:38:19 +00008442 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008443 return new CygwinX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008444 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008445 return new MinGWX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008446 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008447 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008448 return new MicrosoftX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008449 }
8450 }
Reid Kleckner330fb172016-05-11 16:19:05 +00008451 case llvm::Triple::Haiku:
8452 return new HaikuTargetInfo<X86_64TargetInfo>(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00008453 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008454 return new NaClTargetInfo<X86_64TargetInfo>(Triple, Opts);
Alex Rosenberg12207fa2015-01-27 14:47:44 +00008455 case llvm::Triple::PS4:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008456 return new PS4OSTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008457 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008458 return new X86_64TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008459 }
Guy Benyeib798fc92012-12-11 21:38:14 +00008460
Douglas Katzman78d7c542015-05-12 21:18:10 +00008461 case llvm::Triple::spir: {
8462 if (Triple.getOS() != llvm::Triple::UnknownOS ||
8463 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
8464 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008465 return new SPIR32TargetInfo(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00008466 }
8467 case llvm::Triple::spir64: {
8468 if (Triple.getOS() != llvm::Triple::UnknownOS ||
8469 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
8470 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008471 return new SPIR64TargetInfo(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00008472 }
Dan Gohmanc2853072015-09-03 22:51:53 +00008473 case llvm::Triple::wasm32:
8474 if (!(Triple == llvm::Triple("wasm32-unknown-unknown")))
8475 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008476 return new WebAssemblyOSTargetInfo<WebAssembly32TargetInfo>(Triple, Opts);
Dan Gohmanc2853072015-09-03 22:51:53 +00008477 case llvm::Triple::wasm64:
8478 if (!(Triple == llvm::Triple("wasm64-unknown-unknown")))
8479 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008480 return new WebAssemblyOSTargetInfo<WebAssembly64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008481 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00008482}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008483
8484/// CreateTargetInfo - Return the target info object for the specified target
Eric Christophere4f73b32015-08-07 19:07:08 +00008485/// options.
Alp Toker80758082014-07-06 05:26:44 +00008486TargetInfo *
8487TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
Saleem Abdulrasool10a49722016-04-08 16:52:00 +00008488 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00008489 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008490
8491 // Construct the target
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008492 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple, *Opts));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008493 if (!Target) {
8494 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00008495 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008496 }
Alp Toker80758082014-07-06 05:26:44 +00008497 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008498
Daniel Dunbaracde99e2009-12-18 18:42:37 +00008499 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008500 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
8501 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00008502 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00008503 }
8504
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008505 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008506 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
8507 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00008508 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008509 }
8510
Rafael Espindolaeb265472013-08-21 21:59:03 +00008511 // Set the fp math unit.
8512 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
8513 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00008514 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00008515 }
8516
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008517 // Compute the default target features, we need the target to handle this
8518 // because features may have dependencies on one another.
8519 llvm::StringMap<bool> Features;
Eric Christopher007b0a02015-08-28 22:32:01 +00008520 if (!Target->initFeatureMap(Features, Diags, Opts->CPU,
8521 Opts->FeaturesAsWritten))
Eric Christopher6b454372015-08-25 13:45:24 +00008522 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008523
8524 // Add the features to the compile options.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008525 Opts->Features.clear();
Aaron Ballmanb226d3d2015-08-12 13:38:59 +00008526 for (const auto &F : Features)
8527 Opts->Features.push_back((F.getValue() ? "+" : "-") + F.getKey().str());
8528
Eric Christopher3ff21b32013-10-16 21:26:26 +00008529 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00008530 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008531
Yaxun Liu39cf40f2016-05-16 17:06:34 +00008532 Target->setSupportedOpenCLOpts();
8533
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00008534 if (!Target->validateTarget(Diags))
8535 return nullptr;
8536
Ahmed Charles9a16beb2014-03-07 19:33:25 +00008537 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008538}