blob: 76cbb5e41aaa45d7c16ae411641550b65792c733 [file] [log] [blame]
Eric Christopherb39156d2015-08-26 04:23:11 +00001//===--- Targets.cpp - Implement target feature support -------------------===//
Chris Lattner5ba61f02006-10-14 07:39:34 +00002//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner5b12ab82007-12-29 19:59:25 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Chris Lattner5ba61f02006-10-14 07:39:34 +00007//
8//===----------------------------------------------------------------------===//
9//
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000010// This file implements construction of a TargetInfo object from a
Ted Kremenek6f6ff372007-12-12 18:05:32 +000011// target triple.
Chris Lattner5ba61f02006-10-14 07:39:34 +000012//
13//===----------------------------------------------------------------------===//
14
Saleem Abdulrasool10a49722016-04-08 16:52:00 +000015#include "clang/Basic/TargetInfo.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000016#include "clang/Basic/Builtins.h"
17#include "clang/Basic/Diagnostic.h"
Chris Lattnerc7c6dd42008-12-04 22:54:33 +000018#include "clang/Basic/LangOptions.h"
Chandler Carruth26b29a02010-01-20 06:13:02 +000019#include "clang/Basic/MacroBuilder.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000020#include "clang/Basic/TargetBuiltins.h"
21#include "clang/Basic/TargetOptions.h"
Tim Northover756447a2015-10-30 16:30:36 +000022#include "clang/Basic/Version.h"
Eli Friedman7cef49e2008-05-20 14:27:34 +000023#include "llvm/ADT/APFloat.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000024#include "llvm/ADT/STLExtras.h"
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +000025#include "llvm/ADT/StringExtras.h"
Daniel Dunbar58bc48c2009-08-19 20:04:03 +000026#include "llvm/ADT/StringRef.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000027#include "llvm/ADT/StringSwitch.h"
Chris Lattner859c37a2009-08-12 06:24:27 +000028#include "llvm/ADT/Triple.h"
Chris Lattner30ba6742009-08-10 19:03:04 +000029#include "llvm/MC/MCSectionMachO.h"
David Blaikie76bd3c82011-09-23 05:35:21 +000030#include "llvm/Support/ErrorHandling.h"
Renato Golinf5c4dec2015-05-27 13:33:00 +000031#include "llvm/Support/TargetParser.h"
Benjamin Kramerdc2f0062010-01-09 18:20:57 +000032#include <algorithm>
Ahmed Charlesdfca6f92014-03-09 11:36:40 +000033#include <memory>
Hans Wennborg7eb54642015-09-10 17:07:54 +000034
Chris Lattner5ba61f02006-10-14 07:39:34 +000035using namespace clang;
36
Chris Lattner5ba61f02006-10-14 07:39:34 +000037//===----------------------------------------------------------------------===//
Chris Lattner1f5ad112006-10-14 18:32:12 +000038// Common code shared among targets.
Chris Lattner5ba61f02006-10-14 07:39:34 +000039//===----------------------------------------------------------------------===//
40
Chris Lattner1e1c0b92009-03-20 16:06:38 +000041/// DefineStd - Define a macro name and standard variants. For example if
42/// MacroName is "unix", then this will define "__unix", "__unix__", and "unix"
43/// when in GNU mode.
Chris Lattner0e62c1c2011-07-23 10:55:15 +000044static void DefineStd(MacroBuilder &Builder, StringRef MacroName,
Chris Lattner1e1c0b92009-03-20 16:06:38 +000045 const LangOptions &Opts) {
46 assert(MacroName[0] != '_' && "Identifier should be in the user's namespace");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000047
Chris Lattner1e1c0b92009-03-20 16:06:38 +000048 // If in GNU mode (e.g. -std=gnu99 but not -std=c99) define the raw identifier
49 // in the user's namespace.
50 if (Opts.GNUMode)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000051 Builder.defineMacro(MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000052
Chris Lattner1e1c0b92009-03-20 16:06:38 +000053 // Define __unix.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000054 Builder.defineMacro("__" + MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000055
Chris Lattner1e1c0b92009-03-20 16:06:38 +000056 // Define __unix__.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000057 Builder.defineMacro("__" + MacroName + "__");
Chris Lattner1e1c0b92009-03-20 16:06:38 +000058}
59
Benjamin Kramere3b442d2012-01-10 11:50:09 +000060static void defineCPUMacros(MacroBuilder &Builder, StringRef CPUName,
61 bool Tuning = true) {
62 Builder.defineMacro("__" + CPUName);
63 Builder.defineMacro("__" + CPUName + "__");
64 if (Tuning)
65 Builder.defineMacro("__tune_" + CPUName + "__");
66}
67
Justin Lebar76945b22016-04-29 23:05:19 +000068static TargetInfo *AllocateTarget(const llvm::Triple &Triple,
69 const TargetOptions &Opts);
70
Chris Lattner09d98f52008-10-05 21:50:58 +000071//===----------------------------------------------------------------------===//
72// Defines specific to certain operating systems.
73//===----------------------------------------------------------------------===//
Chris Lattner30ba6742009-08-10 19:03:04 +000074
Torok Edwinb2b37c62009-06-30 17:10:35 +000075namespace {
Douglas Gregorc05d2a12009-07-01 15:12:53 +000076template<typename TgtInfo>
77class OSTargetInfo : public TgtInfo {
Torok Edwinb2b37c62009-06-30 17:10:35 +000078protected:
Daniel Dunbar40165182009-08-24 09:10:05 +000079 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000080 MacroBuilder &Builder) const=0;
Torok Edwinb2b37c62009-06-30 17:10:35 +000081public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +000082 OSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
83 : TgtInfo(Triple, Opts) {}
Craig Topper3164f332014-03-11 03:39:26 +000084 void getTargetDefines(const LangOptions &Opts,
85 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000086 TgtInfo::getTargetDefines(Opts, Builder);
87 getOSDefines(Opts, TgtInfo::getTriple(), Builder);
Torok Edwin4e054162009-06-30 17:00:25 +000088 }
Torok Edwinb2b37c62009-06-30 17:10:35 +000089
90};
Chris Lattner30ba6742009-08-10 19:03:04 +000091
Eric Christopher7d0c7252015-09-24 21:17:04 +000092// CloudABI Target
93template <typename Target>
94class CloudABITargetInfo : public OSTargetInfo<Target> {
95protected:
96 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
97 MacroBuilder &Builder) const override {
98 Builder.defineMacro("__CloudABI__");
99 Builder.defineMacro("__ELF__");
100
101 // CloudABI uses ISO/IEC 10646:2012 for wchar_t, char16_t and char32_t.
102 Builder.defineMacro("__STDC_ISO_10646__", "201206L");
103 Builder.defineMacro("__STDC_UTF_16__");
104 Builder.defineMacro("__STDC_UTF_32__");
105 }
106
107public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000108 CloudABITargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
109 : OSTargetInfo<Target>(Triple, Opts) {}
Eric Christopher7d0c7252015-09-24 21:17:04 +0000110};
111
Daniel Dunbard86666f2010-01-26 01:44:04 +0000112static void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000113 const llvm::Triple &Triple,
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000114 StringRef &PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000115 VersionTuple &PlatformMinVersion) {
Bob Wilson834400b2013-08-19 20:23:37 +0000116 Builder.defineMacro("__APPLE_CC__", "6000");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000117 Builder.defineMacro("__APPLE__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000118 Builder.defineMacro("OBJC_NEW_PROPERTIES");
Alexander Potapenkob4f81902012-09-20 10:10:01 +0000119 // AddressSanitizer doesn't play well with source fortification, which is on
120 // by default on Darwin.
Alexey Samsonovedf99a92014-11-07 22:29:38 +0000121 if (Opts.Sanitize.has(SanitizerKind::Address))
122 Builder.defineMacro("_FORTIFY_SOURCE", "0");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000123
John McCall460ce582015-10-22 18:38:17 +0000124 // Darwin defines __weak, __strong, and __unsafe_unretained even in C mode.
125 if (!Opts.ObjC1) {
John McCall31168b02011-06-15 23:02:42 +0000126 // __weak is always defined, for use in blocks and with objc pointers.
127 Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))");
John McCall460ce582015-10-22 18:38:17 +0000128 Builder.defineMacro("__strong", "");
John McCall31168b02011-06-15 23:02:42 +0000129 Builder.defineMacro("__unsafe_unretained", "");
John McCall31168b02011-06-15 23:02:42 +0000130 }
Eric Christopher0c912c52011-07-07 22:55:26 +0000131
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000132 if (Opts.Static)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000133 Builder.defineMacro("__STATIC__");
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000134 else
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000135 Builder.defineMacro("__DYNAMIC__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000136
137 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000138 Builder.defineMacro("_REENTRANT");
Daniel Dunbar497ff132009-04-10 19:52:24 +0000139
Daniel Dunbarecf13562011-04-19 21:40:34 +0000140 // Get the platform type and version number from the triple.
Daniel Dunbar497ff132009-04-10 19:52:24 +0000141 unsigned Maj, Min, Rev;
Bob Wilson8e5acc52012-01-31 23:52:58 +0000142 if (Triple.isMacOSX()) {
143 Triple.getMacOSXVersion(Maj, Min, Rev);
Daniel Dunbarecf13562011-04-19 21:40:34 +0000144 PlatformName = "macosx";
Daniel Dunbarecf13562011-04-19 21:40:34 +0000145 } else {
Bob Wilson8e5acc52012-01-31 23:52:58 +0000146 Triple.getOSVersion(Maj, Min, Rev);
147 PlatformName = llvm::Triple::getOSTypeName(Triple.getOS());
Daniel Dunbarecf13562011-04-19 21:40:34 +0000148 }
Daniel Dunbard86666f2010-01-26 01:44:04 +0000149
Sebastian Pop422377c2012-01-20 22:01:23 +0000150 // If -target arch-pc-win32-macho option specified, we're
Eric Christopherb081ba62011-07-29 21:20:35 +0000151 // generating code for Win32 ABI. No need to emit
Chad Rosierb90e4022011-07-19 20:00:06 +0000152 // __ENVIRONMENT_XX_OS_VERSION_MIN_REQUIRED__.
153 if (PlatformName == "win32") {
154 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
155 return;
156 }
157
Evan Cheng31dd9a62014-01-26 23:12:43 +0000158 // Set the appropriate OS version define.
159 if (Triple.isiOS()) {
160 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
161 char Str[6];
162 Str[0] = '0' + Maj;
163 Str[1] = '0' + (Min / 10);
164 Str[2] = '0' + (Min % 10);
165 Str[3] = '0' + (Rev / 10);
166 Str[4] = '0' + (Rev % 10);
167 Str[5] = '\0';
Tim Northover67465f82015-10-30 16:30:30 +0000168 if (Triple.isTvOS())
169 Builder.defineMacro("__ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__", Str);
170 else
171 Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__",
172 Str);
173
174 } else if (Triple.isWatchOS()) {
175 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
176 char Str[6];
177 Str[0] = '0' + Maj;
178 Str[1] = '0' + (Min / 10);
179 Str[2] = '0' + (Min % 10);
180 Str[3] = '0' + (Rev / 10);
181 Str[4] = '0' + (Rev % 10);
182 Str[5] = '\0';
183 Builder.defineMacro("__ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__", Str);
Evan Cheng31dd9a62014-01-26 23:12:43 +0000184 } else if (Triple.isMacOSX()) {
185 // Note that the Driver allows versions which aren't representable in the
186 // define (because we only get a single digit for the minor and micro
187 // revision numbers). So, we limit them to the maximum representable
188 // version.
189 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
Bob Wilson2a3710e2014-08-08 21:45:53 +0000190 char Str[7];
191 if (Maj < 10 || (Maj == 10 && Min < 10)) {
192 Str[0] = '0' + (Maj / 10);
193 Str[1] = '0' + (Maj % 10);
194 Str[2] = '0' + std::min(Min, 9U);
195 Str[3] = '0' + std::min(Rev, 9U);
196 Str[4] = '\0';
197 } else {
198 // Handle versions > 10.9.
199 Str[0] = '0' + (Maj / 10);
200 Str[1] = '0' + (Maj % 10);
201 Str[2] = '0' + (Min / 10);
202 Str[3] = '0' + (Min % 10);
203 Str[4] = '0' + (Rev / 10);
204 Str[5] = '0' + (Rev % 10);
205 Str[6] = '\0';
206 }
Evan Cheng31dd9a62014-01-26 23:12:43 +0000207 Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
Daniel Dunbar497ff132009-04-10 19:52:24 +0000208 }
Daniel Dunbarecf13562011-04-19 21:40:34 +0000209
Tim Northover157d9112014-01-16 08:48:16 +0000210 // Tell users about the kernel if there is one.
211 if (Triple.isOSDarwin())
212 Builder.defineMacro("__MACH__");
213
Chris Bieneman46977b62016-04-29 17:53:00 +0000214 // The Watch ABI uses Dwarf EH.
215 if(Triple.isWatchABI())
216 Builder.defineMacro("__ARM_DWARF_EH__");
217
Daniel Dunbarecf13562011-04-19 21:40:34 +0000218 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
Eli Friedman3fd920a2008-08-20 02:34:37 +0000219}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000220
Torok Edwinb2b37c62009-06-30 17:10:35 +0000221template<typename Target>
222class DarwinTargetInfo : public OSTargetInfo<Target> {
223protected:
Craig Topper3164f332014-03-11 03:39:26 +0000224 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
225 MacroBuilder &Builder) const override {
Eric Christopher0c912c52011-07-07 22:55:26 +0000226 getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000227 this->PlatformMinVersion);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000228 }
Mike Stump11289f42009-09-09 15:08:12 +0000229
Torok Edwinb2b37c62009-06-30 17:10:35 +0000230public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000231 DarwinTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
232 : OSTargetInfo<Target>(Triple, Opts) {
Tim Northovera12d0a92016-01-07 09:04:46 +0000233 // By default, no TLS, and we whitelist permitted architecture/OS
234 // combinations.
235 this->TLSSupported = false;
236
237 if (Triple.isMacOSX())
238 this->TLSSupported = !Triple.isMacOSXVersionLT(10, 7);
239 else if (Triple.isiOS()) {
240 // 64-bit iOS supported it from 8 onwards, 32-bit from 9 onwards.
241 if (Triple.getArch() == llvm::Triple::x86_64 ||
242 Triple.getArch() == llvm::Triple::aarch64)
243 this->TLSSupported = !Triple.isOSVersionLT(8);
244 else if (Triple.getArch() == llvm::Triple::x86 ||
245 Triple.getArch() == llvm::Triple::arm ||
246 Triple.getArch() == llvm::Triple::thumb)
247 this->TLSSupported = !Triple.isOSVersionLT(9);
248 } else if (Triple.isWatchOS())
249 this->TLSSupported = !Triple.isOSVersionLT(2);
250
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000251 this->MCountName = "\01mcount";
252 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000253
Craig Topper3164f332014-03-11 03:39:26 +0000254 std::string isValidSectionSpecifier(StringRef SR) const override {
Chris Lattner30ba6742009-08-10 19:03:04 +0000255 // Let MCSectionMachO validate this.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000256 StringRef Segment, Section;
Chris Lattner30ba6742009-08-10 19:03:04 +0000257 unsigned TAA, StubSize;
Daniel Dunbar75942372011-03-19 02:06:21 +0000258 bool HasTAA;
Chris Lattner30ba6742009-08-10 19:03:04 +0000259 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
Daniel Dunbar75942372011-03-19 02:06:21 +0000260 TAA, HasTAA, StubSize);
Chris Lattner30ba6742009-08-10 19:03:04 +0000261 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000262
Craig Topper3164f332014-03-11 03:39:26 +0000263 const char *getStaticInitSectionSpecifier() const override {
Anders Carlsson851318a2010-06-08 22:47:50 +0000264 // FIXME: We should return 0 when building kexts.
265 return "__TEXT,__StaticInit,regular,pure_instructions";
266 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000267
John McCalleed64c72012-01-29 01:20:30 +0000268 /// Darwin does not support protected visibility. Darwin's "default"
269 /// is very similar to ELF's "protected"; Darwin requires a "weak"
270 /// attribute on declarations that can be dynamically replaced.
Craig Topper3164f332014-03-11 03:39:26 +0000271 bool hasProtectedVisibility() const override {
John McCalleed64c72012-01-29 01:20:30 +0000272 return false;
273 }
Akira Hatanaka68ab7fe2016-03-31 06:36:07 +0000274
275 unsigned getExnObjectAlignment() const override {
276 // The alignment of an exception object is 8-bytes for darwin since
277 // libc++abi doesn't declare _Unwind_Exception with __attribute__((aligned))
278 // and therefore doesn't guarantee 16-byte alignment.
279 return 64;
280 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000281};
282
Chris Lattner30ba6742009-08-10 19:03:04 +0000283
Torok Edwinb2b37c62009-06-30 17:10:35 +0000284// DragonFlyBSD Target
285template<typename Target>
286class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
287protected:
Craig Topper3164f332014-03-11 03:39:26 +0000288 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
289 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000290 // DragonFly defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000291 Builder.defineMacro("__DragonFly__");
292 Builder.defineMacro("__DragonFly_cc_version", "100001");
293 Builder.defineMacro("__ELF__");
294 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
295 Builder.defineMacro("__tune_i386__");
296 DefineStd(Builder, "unix", Opts);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000297 }
298public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000299 DragonFlyBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
300 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000301 switch (Triple.getArch()) {
302 default:
303 case llvm::Triple::x86:
304 case llvm::Triple::x86_64:
305 this->MCountName = ".mcount";
306 break;
307 }
Eli Friedman4286fba2012-02-10 23:02:29 +0000308 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000309};
310
Dimitry Andricc6d924c2016-05-20 17:27:22 +0000311#ifndef FREEBSD_CC_VERSION
312#define FREEBSD_CC_VERSION 0U
313#endif
314
Torok Edwinb2b37c62009-06-30 17:10:35 +0000315// FreeBSD Target
316template<typename Target>
317class FreeBSDTargetInfo : public OSTargetInfo<Target> {
318protected:
Craig Topper3164f332014-03-11 03:39:26 +0000319 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
320 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000321 // FreeBSD defines; list based off of gcc output
322
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000323 unsigned Release = Triple.getOSMajorVersion();
324 if (Release == 0U)
Dimitry Andricc6d924c2016-05-20 17:27:22 +0000325 Release = 8U;
326 unsigned CCVersion = FREEBSD_CC_VERSION;
327 if (CCVersion == 0U)
328 CCVersion = Release * 100000U + 1U;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000329
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000330 Builder.defineMacro("__FreeBSD__", Twine(Release));
Dimitry Andricc6d924c2016-05-20 17:27:22 +0000331 Builder.defineMacro("__FreeBSD_cc_version", Twine(CCVersion));
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000332 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
333 DefineStd(Builder, "unix", Opts);
334 Builder.defineMacro("__ELF__");
Ed Schoutend0621462013-09-29 07:54:52 +0000335
336 // On FreeBSD, wchar_t contains the number of the code point as
337 // used by the character set of the locale. These character sets are
338 // not necessarily a superset of ASCII.
Richard Smith00a4a852015-01-13 01:47:45 +0000339 //
340 // FIXME: This is wrong; the macro refers to the numerical values
341 // of wchar_t *literals*, which are not locale-dependent. However,
342 // FreeBSD systems apparently depend on us getting this wrong, and
343 // setting this to 1 is conforming even if all the basic source
344 // character literals have the same encoding as char and wchar_t.
Ed Schoutend0621462013-09-29 07:54:52 +0000345 Builder.defineMacro("__STDC_MB_MIGHT_NEQ_WC__", "1");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000346 }
347public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000348 FreeBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
349 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000350 switch (Triple.getArch()) {
351 default:
352 case llvm::Triple::x86:
353 case llvm::Triple::x86_64:
354 this->MCountName = ".mcount";
355 break;
356 case llvm::Triple::mips:
357 case llvm::Triple::mipsel:
358 case llvm::Triple::ppc:
359 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +0000360 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000361 this->MCountName = "_mcount";
362 break;
363 case llvm::Triple::arm:
364 this->MCountName = "__mcount";
365 break;
Duncan Sands9cb27e92009-07-08 13:55:08 +0000366 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000367 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000368};
369
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000370// GNU/kFreeBSD Target
371template<typename Target>
372class KFreeBSDTargetInfo : public OSTargetInfo<Target> {
373protected:
Craig Topper3164f332014-03-11 03:39:26 +0000374 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
375 MacroBuilder &Builder) const override {
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000376 // GNU/kFreeBSD defines; list based off of gcc output
377
378 DefineStd(Builder, "unix", Opts);
379 Builder.defineMacro("__FreeBSD_kernel__");
380 Builder.defineMacro("__GLIBC__");
381 Builder.defineMacro("__ELF__");
382 if (Opts.POSIXThreads)
383 Builder.defineMacro("_REENTRANT");
384 if (Opts.CPlusPlus)
385 Builder.defineMacro("_GNU_SOURCE");
386 }
387public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000388 KFreeBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
389 : OSTargetInfo<Target>(Triple, Opts) {}
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000390};
391
Reid Kleckner330fb172016-05-11 16:19:05 +0000392// Haiku Target
393template<typename Target>
394class HaikuTargetInfo : public OSTargetInfo<Target> {
395protected:
396 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
397 MacroBuilder &Builder) const override {
398 // Haiku defines; list based off of gcc output
399 Builder.defineMacro("__HAIKU__");
400 Builder.defineMacro("__ELF__");
401 DefineStd(Builder, "unix", Opts);
402 }
403public:
404 HaikuTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
405 : OSTargetInfo<Target>(Triple, Opts) {
406 this->SizeType = TargetInfo::UnsignedLong;
407 this->IntPtrType = TargetInfo::SignedLong;
408 this->PtrDiffType = TargetInfo::SignedLong;
409 this->ProcessIDType = TargetInfo::SignedLong;
410 this->TLSSupported = false;
411
412 }
413};
414
Chris Lattner3e2ee142010-07-07 16:01:42 +0000415// Minix Target
416template<typename Target>
417class MinixTargetInfo : public OSTargetInfo<Target> {
418protected:
Craig Topper3164f332014-03-11 03:39:26 +0000419 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
420 MacroBuilder &Builder) const override {
Chris Lattner3e2ee142010-07-07 16:01:42 +0000421 // Minix defines
422
423 Builder.defineMacro("__minix", "3");
424 Builder.defineMacro("_EM_WSIZE", "4");
425 Builder.defineMacro("_EM_PSIZE", "4");
426 Builder.defineMacro("_EM_SSIZE", "2");
427 Builder.defineMacro("_EM_LSIZE", "4");
428 Builder.defineMacro("_EM_FSIZE", "4");
429 Builder.defineMacro("_EM_DSIZE", "8");
Eli Friedman83de5132011-12-08 23:54:21 +0000430 Builder.defineMacro("__ELF__");
Chris Lattner3e2ee142010-07-07 16:01:42 +0000431 DefineStd(Builder, "unix", Opts);
432 }
433public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000434 MinixTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
435 : OSTargetInfo<Target>(Triple, Opts) {}
Chris Lattner3e2ee142010-07-07 16:01:42 +0000436};
437
Torok Edwinb2b37c62009-06-30 17:10:35 +0000438// Linux target
439template<typename Target>
440class LinuxTargetInfo : public OSTargetInfo<Target> {
441protected:
Craig Topper3164f332014-03-11 03:39:26 +0000442 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
443 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000444 // Linux defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000445 DefineStd(Builder, "unix", Opts);
446 DefineStd(Builder, "linux", Opts);
447 Builder.defineMacro("__gnu_linux__");
448 Builder.defineMacro("__ELF__");
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +0000449 if (Triple.isAndroid()) {
Evgeniy Stepanov94dc4c92012-04-26 12:08:09 +0000450 Builder.defineMacro("__ANDROID__", "1");
Dan Albert84aee012015-03-03 18:28:38 +0000451 unsigned Maj, Min, Rev;
David Majnemer5c2589a2015-06-01 23:38:25 +0000452 Triple.getEnvironmentVersion(Maj, Min, Rev);
Dan Albert84aee012015-03-03 18:28:38 +0000453 this->PlatformName = "android";
454 this->PlatformMinVersion = VersionTuple(Maj, Min, Rev);
455 }
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000456 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000457 Builder.defineMacro("_REENTRANT");
Douglas Gregor3ecc6652010-04-21 05:52:38 +0000458 if (Opts.CPlusPlus)
459 Builder.defineMacro("_GNU_SOURCE");
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +0000460 if (this->HasFloat128)
461 Builder.defineMacro("__FLOAT128__");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000462 }
463public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000464 LinuxTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
465 : OSTargetInfo<Target>(Triple, Opts) {
Douglas Gregore6d6e512011-01-12 21:19:25 +0000466 this->WIntType = TargetInfo::UnsignedInt;
Hal Finkelecdb4542014-03-30 13:00:06 +0000467
468 switch (Triple.getArch()) {
469 default:
470 break;
471 case llvm::Triple::ppc:
472 case llvm::Triple::ppc64:
473 case llvm::Triple::ppc64le:
474 this->MCountName = "_mcount";
475 break;
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +0000476 case llvm::Triple::x86:
477 case llvm::Triple::x86_64:
478 case llvm::Triple::systemz:
479 this->HasFloat128 = true;
480 break;
Hal Finkelecdb4542014-03-30 13:00:06 +0000481 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000482 }
Benjamin Kramera518b222011-10-15 17:53:33 +0000483
Craig Topper3164f332014-03-11 03:39:26 +0000484 const char *getStaticInitSectionSpecifier() const override {
Benjamin Kramera518b222011-10-15 17:53:33 +0000485 return ".text.startup";
486 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000487};
488
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000489// NetBSD Target
490template<typename Target>
491class NetBSDTargetInfo : public OSTargetInfo<Target> {
492protected:
Craig Topper3164f332014-03-11 03:39:26 +0000493 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
494 MacroBuilder &Builder) const override {
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000495 // NetBSD defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000496 Builder.defineMacro("__NetBSD__");
497 Builder.defineMacro("__unix__");
498 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000499 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000500 Builder.defineMacro("_POSIX_THREADS");
Joerg Sonnenbergercc1edb52014-05-13 18:58:36 +0000501
502 switch (Triple.getArch()) {
503 default:
504 break;
505 case llvm::Triple::arm:
506 case llvm::Triple::armeb:
507 case llvm::Triple::thumb:
508 case llvm::Triple::thumbeb:
509 Builder.defineMacro("__ARM_DWARF_EH__");
510 break;
511 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000512 }
513public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000514 NetBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
515 : OSTargetInfo<Target>(Triple, Opts) {
Joerg Sonnenberger740f3f42015-04-10 21:02:53 +0000516 this->MCountName = "_mcount";
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000517 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000518};
519
Torok Edwinb2b37c62009-06-30 17:10:35 +0000520// OpenBSD Target
521template<typename Target>
522class OpenBSDTargetInfo : public OSTargetInfo<Target> {
523protected:
Craig Topper3164f332014-03-11 03:39:26 +0000524 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
525 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000526 // OpenBSD defines; list based off of gcc output
527
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000528 Builder.defineMacro("__OpenBSD__");
529 DefineStd(Builder, "unix", Opts);
530 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000531 if (Opts.POSIXThreads)
Chris Lattner024e12d2012-04-25 06:12:24 +0000532 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000533 }
534public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000535 OpenBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
536 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000537 this->TLSSupported = false;
Eli Friedman3715d1f2011-12-15 02:15:56 +0000538
Eli Friedman3715d1f2011-12-15 02:15:56 +0000539 switch (Triple.getArch()) {
540 default:
541 case llvm::Triple::x86:
542 case llvm::Triple::x86_64:
543 case llvm::Triple::arm:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000544 case llvm::Triple::sparc:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000545 this->MCountName = "__mcount";
546 break;
547 case llvm::Triple::mips64:
548 case llvm::Triple::mips64el:
549 case llvm::Triple::ppc:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000550 case llvm::Triple::sparcv9:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000551 this->MCountName = "_mcount";
552 break;
553 }
554 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000555};
556
Eli Friedman9fa28852012-08-08 23:57:20 +0000557// Bitrig Target
558template<typename Target>
559class BitrigTargetInfo : public OSTargetInfo<Target> {
560protected:
Craig Topper3164f332014-03-11 03:39:26 +0000561 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
562 MacroBuilder &Builder) const override {
Eli Friedman9fa28852012-08-08 23:57:20 +0000563 // Bitrig defines; list based off of gcc output
564
565 Builder.defineMacro("__Bitrig__");
566 DefineStd(Builder, "unix", Opts);
567 Builder.defineMacro("__ELF__");
568 if (Opts.POSIXThreads)
569 Builder.defineMacro("_REENTRANT");
Renato Golin9ba39232015-02-27 16:35:48 +0000570
571 switch (Triple.getArch()) {
572 default:
573 break;
574 case llvm::Triple::arm:
575 case llvm::Triple::armeb:
576 case llvm::Triple::thumb:
577 case llvm::Triple::thumbeb:
578 Builder.defineMacro("__ARM_DWARF_EH__");
579 break;
580 }
Eli Friedman9fa28852012-08-08 23:57:20 +0000581 }
582public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000583 BitrigTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
584 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000585 this->MCountName = "__mcount";
Eli Friedman9fa28852012-08-08 23:57:20 +0000586 }
587};
588
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000589// PSP Target
590template<typename Target>
591class PSPTargetInfo : public OSTargetInfo<Target> {
592protected:
Craig Topper3164f332014-03-11 03:39:26 +0000593 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
594 MacroBuilder &Builder) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000595 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000596 Builder.defineMacro("PSP");
597 Builder.defineMacro("_PSP");
598 Builder.defineMacro("__psp__");
599 Builder.defineMacro("__ELF__");
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000600 }
601public:
James Y Knightb214cbc2016-03-04 19:00:41 +0000602 PSPTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {}
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000603};
604
John Thompsone467e192009-11-19 17:18:50 +0000605// PS3 PPU Target
606template<typename Target>
607class PS3PPUTargetInfo : public OSTargetInfo<Target> {
608protected:
Craig Topper3164f332014-03-11 03:39:26 +0000609 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
610 MacroBuilder &Builder) const override {
John Thompsone467e192009-11-19 17:18:50 +0000611 // PS3 PPU defines.
John Thompson957816f2010-03-25 16:18:32 +0000612 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000613 Builder.defineMacro("__PPU__");
614 Builder.defineMacro("__CELLOS_LV2__");
615 Builder.defineMacro("__ELF__");
616 Builder.defineMacro("__LP32__");
John Thompson07a61a42010-06-24 22:44:13 +0000617 Builder.defineMacro("_ARCH_PPC64");
618 Builder.defineMacro("__powerpc64__");
John Thompsone467e192009-11-19 17:18:50 +0000619 }
620public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000621 PS3PPUTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
622 : OSTargetInfo<Target>(Triple, Opts) {
Nick Lewyckyc0a61732011-12-16 22:32:39 +0000623 this->LongWidth = this->LongAlign = 32;
624 this->PointerWidth = this->PointerAlign = 32;
John Thompson07a61a42010-06-24 22:44:13 +0000625 this->IntMaxType = TargetInfo::SignedLongLong;
John Thompson07a61a42010-06-24 22:44:13 +0000626 this->Int64Type = TargetInfo::SignedLongLong;
John Thompson6f8dba72009-12-18 14:21:08 +0000627 this->SizeType = TargetInfo::UnsignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +0000628 this->resetDataLayout("E-m:e-p:32:32-i64:64-n32:64");
John Thompsone467e192009-11-19 17:18:50 +0000629 }
630};
631
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000632template <typename Target>
633class PS4OSTargetInfo : public OSTargetInfo<Target> {
634protected:
635 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
636 MacroBuilder &Builder) const override {
637 Builder.defineMacro("__FreeBSD__", "9");
638 Builder.defineMacro("__FreeBSD_cc_version", "900001");
639 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
640 DefineStd(Builder, "unix", Opts);
641 Builder.defineMacro("__ELF__");
Paul Robinson9d613612016-05-16 17:22:25 +0000642 Builder.defineMacro("__ORBIS__");
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000643 }
644public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000645 PS4OSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
646 : OSTargetInfo<Target>(Triple, Opts) {
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000647 this->WCharType = this->UnsignedShort;
648
Paul Robinsond30e2ee2015-07-14 20:52:32 +0000649 // On PS4, TLS variable cannot be aligned to more than 32 bytes (256 bits).
650 this->MaxTLSAlign = 256;
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000651
Sunil Srivastava0ce2f222016-02-05 20:50:02 +0000652 // On PS4, do not honor explicit bit field alignment,
653 // as in "__attribute__((aligned(2))) int b : 1;".
654 this->UseExplicitBitFieldAlignment = false;
655
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000656 switch (Triple.getArch()) {
657 default:
658 case llvm::Triple::x86_64:
659 this->MCountName = ".mcount";
660 break;
661 }
662 }
663};
664
Torok Edwinb2b37c62009-06-30 17:10:35 +0000665// Solaris target
666template<typename Target>
667class SolarisTargetInfo : public OSTargetInfo<Target> {
668protected:
Craig Topper3164f332014-03-11 03:39:26 +0000669 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
670 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000671 DefineStd(Builder, "sun", Opts);
672 DefineStd(Builder, "unix", Opts);
673 Builder.defineMacro("__ELF__");
674 Builder.defineMacro("__svr4__");
675 Builder.defineMacro("__SVR4");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000676 // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and
677 // newer, but to 500 for everything else. feature_test.h has a check to
678 // ensure that you are not using C99 with an old version of X/Open or C89
Richard Smithab506ad2014-10-20 23:26:58 +0000679 // with a new version.
680 if (Opts.C99)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000681 Builder.defineMacro("_XOPEN_SOURCE", "600");
682 else
683 Builder.defineMacro("_XOPEN_SOURCE", "500");
David Chisnalle04307e2012-03-02 10:49:52 +0000684 if (Opts.CPlusPlus)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000685 Builder.defineMacro("__C99FEATURES__");
David Chisnall0c1941cb2012-02-17 18:35:11 +0000686 Builder.defineMacro("_LARGEFILE_SOURCE");
687 Builder.defineMacro("_LARGEFILE64_SOURCE");
688 Builder.defineMacro("__EXTENSIONS__");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000689 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000690 }
691public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000692 SolarisTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
693 : OSTargetInfo<Target>(Triple, Opts) {
David Chisnallb526e932012-03-28 18:04:14 +0000694 this->WCharType = this->SignedInt;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000695 // FIXME: WIntType should be SignedLong
696 }
697};
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000698
699// Windows target
700template<typename Target>
701class WindowsTargetInfo : public OSTargetInfo<Target> {
702protected:
Craig Topper3164f332014-03-11 03:39:26 +0000703 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
704 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000705 Builder.defineMacro("_WIN32");
706 }
707 void getVisualStudioDefines(const LangOptions &Opts,
708 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000709 if (Opts.CPlusPlus) {
David Majnemerf6072342014-07-01 22:24:56 +0000710 if (Opts.RTTIData)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000711 Builder.defineMacro("_CPPRTTI");
712
Reid Kleckner16514352015-01-30 21:42:55 +0000713 if (Opts.CXXExceptions)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000714 Builder.defineMacro("_CPPUNWIND");
715 }
716
David Majnemer6a658902015-07-22 22:36:26 +0000717 if (Opts.Bool)
718 Builder.defineMacro("__BOOL_DEFINED");
719
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000720 if (!Opts.CharIsSigned)
721 Builder.defineMacro("_CHAR_UNSIGNED");
722
723 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
724 // but it works for now.
725 if (Opts.POSIXThreads)
726 Builder.defineMacro("_MT");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000727
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +0000728 if (Opts.MSCompatibilityVersion) {
729 Builder.defineMacro("_MSC_VER",
730 Twine(Opts.MSCompatibilityVersion / 100000));
731 Builder.defineMacro("_MSC_FULL_VER", Twine(Opts.MSCompatibilityVersion));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000732 // FIXME We cannot encode the revision information into 32-bits
733 Builder.defineMacro("_MSC_BUILD", Twine(1));
David Majnemeraaf2b842015-03-18 07:53:18 +0000734
David Majnemerb710a932015-05-11 03:57:49 +0000735 if (Opts.CPlusPlus11 && Opts.isCompatibleWithMSVC(LangOptions::MSVC2015))
David Majnemeraaf2b842015-03-18 07:53:18 +0000736 Builder.defineMacro("_HAS_CHAR16_T_LANGUAGE_SUPPORT", Twine(1));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000737 }
Reid Kleckner6f6e76d2014-04-16 20:10:16 +0000738
739 if (Opts.MicrosoftExt) {
740 Builder.defineMacro("_MSC_EXTENSIONS");
741
742 if (Opts.CPlusPlus11) {
743 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
744 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
745 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
746 }
747 }
748
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000749 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000750 }
751
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000752public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000753 WindowsTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
754 : OSTargetInfo<Target>(Triple, Opts) {}
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000755};
756
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000757template <typename Target>
758class NaClTargetInfo : public OSTargetInfo<Target> {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000759protected:
Craig Topper3164f332014-03-11 03:39:26 +0000760 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
761 MacroBuilder &Builder) const override {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000762 if (Opts.POSIXThreads)
763 Builder.defineMacro("_REENTRANT");
764 if (Opts.CPlusPlus)
765 Builder.defineMacro("_GNU_SOURCE");
766
767 DefineStd(Builder, "unix", Opts);
768 Builder.defineMacro("__ELF__");
769 Builder.defineMacro("__native_client__");
770 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000771
772public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000773 NaClTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
774 : OSTargetInfo<Target>(Triple, Opts) {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000775 this->LongAlign = 32;
776 this->LongWidth = 32;
777 this->PointerAlign = 32;
778 this->PointerWidth = 32;
779 this->IntMaxType = TargetInfo::SignedLongLong;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000780 this->Int64Type = TargetInfo::SignedLongLong;
781 this->DoubleAlign = 64;
782 this->LongDoubleWidth = 64;
783 this->LongDoubleAlign = 64;
Jan Wen Voung1f9c4ee2014-01-15 21:42:41 +0000784 this->LongLongWidth = 64;
785 this->LongLongAlign = 64;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000786 this->SizeType = TargetInfo::UnsignedInt;
787 this->PtrDiffType = TargetInfo::SignedInt;
788 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +0000789 // RegParmMax is inherited from the underlying architecture
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000790 this->LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Rafael Espindola1c09b262013-12-18 23:41:04 +0000791 if (Triple.getArch() == llvm::Triple::arm) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +0000792 // Handled in ARM's setABI().
Rafael Espindola1c09b262013-12-18 23:41:04 +0000793 } else if (Triple.getArch() == llvm::Triple::x86) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000794 this->resetDataLayout("e-m:e-p:32:32-i64:64-n8:16:32-S128");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000795 } else if (Triple.getArch() == llvm::Triple::x86_64) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000796 this->resetDataLayout("e-m:e-p:32:32-i64:64-n8:16:32:64-S128");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000797 } else if (Triple.getArch() == llvm::Triple::mipsel) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000798 // Handled on mips' setDataLayout.
Rafael Espindola1c09b262013-12-18 23:41:04 +0000799 } else {
800 assert(Triple.getArch() == llvm::Triple::le32);
James Y Knightb214cbc2016-03-04 19:00:41 +0000801 this->resetDataLayout("e-p:32:32-i64:64");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000802 }
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000803 }
804};
Torok Edwinb2b37c62009-06-30 17:10:35 +0000805
Dan Gohmanc2853072015-09-03 22:51:53 +0000806// WebAssembly target
807template <typename Target>
808class WebAssemblyOSTargetInfo : public OSTargetInfo<Target> {
809 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Hans Wennborg7eb54642015-09-10 17:07:54 +0000810 MacroBuilder &Builder) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +0000811 // A common platform macro.
812 if (Opts.POSIXThreads)
813 Builder.defineMacro("_REENTRANT");
814 // Follow g++ convention and predefine _GNU_SOURCE for C++.
815 if (Opts.CPlusPlus)
816 Builder.defineMacro("_GNU_SOURCE");
817 }
818
819 // As an optimization, group static init code together in a section.
Hans Wennborg7eb54642015-09-10 17:07:54 +0000820 const char *getStaticInitSectionSpecifier() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +0000821 return ".text.__startup";
822 }
823
824public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000825 explicit WebAssemblyOSTargetInfo(const llvm::Triple &Triple,
826 const TargetOptions &Opts)
827 : OSTargetInfo<Target>(Triple, Opts) {
Dan Gohmanc2853072015-09-03 22:51:53 +0000828 this->MCountName = "__mcount";
Dan Gohmanc2853072015-09-03 22:51:53 +0000829 this->TheCXXABI.set(TargetCXXABI::WebAssembly);
830 }
831};
Dan Gohmanc2853072015-09-03 22:51:53 +0000832
Chris Lattner09d98f52008-10-05 21:50:58 +0000833//===----------------------------------------------------------------------===//
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000834// Specific target implementations.
835//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000836
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000837// PPC abstract base class
838class PPCTargetInfo : public TargetInfo {
839 static const Builtin::Info BuiltinInfo[];
840 static const char * const GCCRegNames[];
841 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Hal Finkel8eb59282012-06-11 22:35:19 +0000842 std::string CPU;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000843
844 // Target cpu features.
845 bool HasVSX;
Bill Schmidt8c184e32014-10-10 17:21:23 +0000846 bool HasP8Vector;
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +0000847 bool HasP8Crypto;
Nemanja Ivanovic35458c22015-04-11 10:43:36 +0000848 bool HasDirectMove;
Hal Finkel0d0a1a52015-03-11 19:14:15 +0000849 bool HasQPX;
Kit Barton8246f282015-03-25 19:41:41 +0000850 bool HasHTM;
Nemanja Ivanovic239eec72015-04-09 23:58:16 +0000851 bool HasBPERMD;
852 bool HasExtDiv;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000853
Ulrich Weigand8afad612014-07-28 13:17:52 +0000854protected:
855 std::string ABI;
856
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000857public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000858 PPCTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Saleem Abdulrasool10a49722016-04-08 16:52:00 +0000859 : TargetInfo(Triple), HasVSX(false), HasP8Vector(false),
860 HasP8Crypto(false), HasDirectMove(false), HasQPX(false), HasHTM(false),
Nemanja Ivanovicd7d45bf2016-04-15 18:04:13 +0000861 HasBPERMD(false), HasExtDiv(false) {
Bill Schmidt778d3872013-07-26 01:36:11 +0000862 BigEndian = (Triple.getArch() != llvm::Triple::ppc64le);
Alexey Bataev00396512015-07-02 03:40:19 +0000863 SimdDefaultAlign = 128;
Nico Weber3435ede2012-01-31 02:07:33 +0000864 LongDoubleWidth = LongDoubleAlign = 128;
865 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble;
866 }
Eli Friedman9ffd4a92009-06-05 07:05:05 +0000867
Hal Finkel6b984f02012-07-03 16:51:04 +0000868 /// \brief Flags for architecture specific defines.
869 typedef enum {
870 ArchDefineNone = 0,
871 ArchDefineName = 1 << 0, // <name> is substituted for arch name.
872 ArchDefinePpcgr = 1 << 1,
873 ArchDefinePpcsq = 1 << 2,
874 ArchDefine440 = 1 << 3,
875 ArchDefine603 = 1 << 4,
876 ArchDefine604 = 1 << 5,
877 ArchDefinePwr4 = 1 << 6,
Bill Schmidt38378a02013-02-01 20:23:10 +0000878 ArchDefinePwr5 = 1 << 7,
879 ArchDefinePwr5x = 1 << 8,
880 ArchDefinePwr6 = 1 << 9,
881 ArchDefinePwr6x = 1 << 10,
882 ArchDefinePwr7 = 1 << 11,
Will Schmidtf0487512014-06-26 13:34:10 +0000883 ArchDefinePwr8 = 1 << 12,
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +0000884 ArchDefinePwr9 = 1 << 13,
885 ArchDefineA2 = 1 << 14,
886 ArchDefineA2q = 1 << 15
Hal Finkel6b984f02012-07-03 16:51:04 +0000887 } ArchDefineTypes;
888
Bill Schmidt38378a02013-02-01 20:23:10 +0000889 // Note: GCC recognizes the following additional cpus:
890 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
891 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
892 // titan, rs64.
Craig Topper3164f332014-03-11 03:39:26 +0000893 bool setCPU(const std::string &Name) override {
Hal Finkel8eb59282012-06-11 22:35:19 +0000894 bool CPUKnown = llvm::StringSwitch<bool>(Name)
895 .Case("generic", true)
896 .Case("440", true)
897 .Case("450", true)
898 .Case("601", true)
899 .Case("602", true)
900 .Case("603", true)
901 .Case("603e", true)
902 .Case("603ev", true)
903 .Case("604", true)
904 .Case("604e", true)
905 .Case("620", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000906 .Case("630", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000907 .Case("g3", true)
908 .Case("7400", true)
909 .Case("g4", true)
910 .Case("7450", true)
911 .Case("g4+", true)
912 .Case("750", true)
913 .Case("970", true)
914 .Case("g5", true)
915 .Case("a2", true)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +0000916 .Case("a2q", true)
Hal Finkelf6d6cb02012-09-18 22:25:03 +0000917 .Case("e500mc", true)
918 .Case("e5500", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000919 .Case("power3", true)
920 .Case("pwr3", true)
921 .Case("power4", true)
922 .Case("pwr4", true)
923 .Case("power5", true)
924 .Case("pwr5", true)
925 .Case("power5x", true)
926 .Case("pwr5x", true)
927 .Case("power6", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000928 .Case("pwr6", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000929 .Case("power6x", true)
930 .Case("pwr6x", true)
931 .Case("power7", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000932 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +0000933 .Case("power8", true)
934 .Case("pwr8", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +0000935 .Case("power9", true)
936 .Case("pwr9", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000937 .Case("powerpc", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000938 .Case("ppc", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000939 .Case("powerpc64", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000940 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +0000941 .Case("powerpc64le", true)
942 .Case("ppc64le", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000943 .Default(false);
944
945 if (CPUKnown)
946 CPU = Name;
947
948 return CPUKnown;
949 }
950
Ulrich Weigand8afad612014-07-28 13:17:52 +0000951
952 StringRef getABI() const override { return ABI; }
953
Craig Topper6c03a542015-10-19 04:51:35 +0000954 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
955 return llvm::makeArrayRef(BuiltinInfo,
956 clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner10a5b382007-01-29 05:24:35 +0000957 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000958
Craig Topper3164f332014-03-11 03:39:26 +0000959 bool isCLZForZeroUndef() const override { return false; }
Bob Wilson19a2f2b2012-01-28 18:02:29 +0000960
Craig Topper3164f332014-03-11 03:39:26 +0000961 void getTargetDefines(const LangOptions &Opts,
962 MacroBuilder &Builder) const override;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000963
Eric Christopher8c47b422015-10-09 18:39:55 +0000964 bool
965 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
966 StringRef CPU,
967 const std::vector<std::string> &FeaturesVec) const override;
Bill Schmidt2fe4c672013-02-01 02:14:03 +0000968
Craig Topper3164f332014-03-11 03:39:26 +0000969 bool handleTargetFeatures(std::vector<std::string> &Features,
970 DiagnosticsEngine &Diags) override;
971 bool hasFeature(StringRef Feature) const override;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +0000972 void setFeatureEnabled(llvm::StringMap<bool> &Features, StringRef Name,
973 bool Enabled) const override;
Craig Topper3164f332014-03-11 03:39:26 +0000974
Craig Topperf054e3a2015-10-19 03:52:27 +0000975 ArrayRef<const char *> getGCCRegNames() const override;
976 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +0000977 bool validateAsmConstraint(const char *&Name,
978 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +0000979 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +0000980 default: return false;
981 case 'O': // Zero
John Thompson07a61a42010-06-24 22:44:13 +0000982 break;
Anders Carlssonf511f642007-11-27 04:11:28 +0000983 case 'b': // Base register
984 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +0000985 Info.setAllowsRegister();
John Thompson07a61a42010-06-24 22:44:13 +0000986 break;
987 // FIXME: The following are added to allow parsing.
988 // I just took a guess at what the actions should be.
989 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000990 case 'd': // Floating point register (containing 64-bit value)
John Thompson07a61a42010-06-24 22:44:13 +0000991 case 'v': // Altivec vector register
992 Info.setAllowsRegister();
993 break;
994 case 'w':
995 switch (Name[1]) {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000996 case 'd':// VSX vector register to hold vector double data
997 case 'f':// VSX vector register to hold vector float data
998 case 's':// VSX vector register to hold scalar float data
999 case 'a':// Any VSX register
Hal Finkelf7a07a52014-03-02 18:24:18 +00001000 case 'c':// An individual CR bit
John Thompson07a61a42010-06-24 22:44:13 +00001001 break;
1002 default:
1003 return false;
1004 }
1005 Info.setAllowsRegister();
1006 Name++; // Skip over 'w'.
1007 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001008 case 'h': // `MQ', `CTR', or `LINK' register
1009 case 'q': // `MQ' register
1010 case 'c': // `CTR' register
1011 case 'l': // `LINK' register
1012 case 'x': // `CR' register (condition register) number 0
1013 case 'y': // `CR' register (condition register)
1014 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson07a61a42010-06-24 22:44:13 +00001015 Info.setAllowsRegister();
1016 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001017 case 'I': // Signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +00001018 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001019 // (use `L' instead for SImode constants)
1020 case 'K': // Unsigned 16-bit constant
1021 case 'L': // Signed 16-bit constant shifted left 16 bits
1022 case 'M': // Constant larger than 31
1023 case 'N': // Exact power of 2
1024 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +00001025 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001026 // register with one instruction per word
John Thompson07a61a42010-06-24 22:44:13 +00001027 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001028 // into a register using three instructions
John Thompson07a61a42010-06-24 22:44:13 +00001029 break;
1030 case 'm': // Memory operand. Note that on PowerPC targets, m can
1031 // include addresses that update the base register. It
1032 // is therefore only safe to use `m' in an asm statement
1033 // if that asm statement accesses the operand exactly once.
1034 // The asm statement must also use `%U<opno>' as a
Sebastian Redldd008712010-08-17 22:42:34 +00001035 // placeholder for the "update" flag in the corresponding
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001036 // load or store instruction. For example:
John Thompson07a61a42010-06-24 22:44:13 +00001037 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001038 // is correct but:
John Thompson07a61a42010-06-24 22:44:13 +00001039 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
1040 // is not. Use es rather than m if you don't want the base
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001041 // register to be updated.
1042 case 'e':
John Thompsonceebdf12010-06-25 00:02:05 +00001043 if (Name[1] != 's')
1044 return false;
Sebastian Redldd008712010-08-17 22:42:34 +00001045 // es: A "stable" memory operand; that is, one which does not
John Thompson07a61a42010-06-24 22:44:13 +00001046 // include any automodification of the base register. Unlike
1047 // `m', this constraint can be used in asm statements that
1048 // might access the operand several times, or that might not
John Thompsonceebdf12010-06-25 00:02:05 +00001049 // access it at all.
John Thompson07a61a42010-06-24 22:44:13 +00001050 Info.setAllowsMemory();
John Thompsonceebdf12010-06-25 00:02:05 +00001051 Name++; // Skip over 'e'.
John Thompson07a61a42010-06-24 22:44:13 +00001052 break;
1053 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001054 // usually better to use `m' or `es' in asm statements)
John Thompson07a61a42010-06-24 22:44:13 +00001055 case 'Z': // Memory operand that is an indexed or indirect from a
1056 // register (it is usually better to use `m' or `es' in
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001057 // asm statements)
John Thompson07a61a42010-06-24 22:44:13 +00001058 Info.setAllowsMemory();
1059 Info.setAllowsRegister();
1060 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001061 case 'R': // AIX TOC entry
John Thompson07a61a42010-06-24 22:44:13 +00001062 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001063 // register (`p' is preferable for asm statements)
1064 case 'S': // Constant suitable as a 64-bit mask operand
1065 case 'T': // Constant suitable as a 32-bit mask operand
1066 case 'U': // System V Release 4 small data area reference
John Thompson07a61a42010-06-24 22:44:13 +00001067 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001068 // instructions
1069 case 'W': // Vector constant that does not require memory
1070 case 'j': // Vector constant that is all zeros.
John Thompson07a61a42010-06-24 22:44:13 +00001071 break;
1072 // End FIXME.
Anders Carlssonf511f642007-11-27 04:11:28 +00001073 }
John Thompson07a61a42010-06-24 22:44:13 +00001074 return true;
Anders Carlssonf511f642007-11-27 04:11:28 +00001075 }
Craig Topper3164f332014-03-11 03:39:26 +00001076 std::string convertConstraint(const char *&Constraint) const override {
Hal Finkelf7a07a52014-03-02 18:24:18 +00001077 std::string R;
1078 switch (*Constraint) {
1079 case 'e':
1080 case 'w':
1081 // Two-character constraint; add "^" hint for later parsing.
1082 R = std::string("^") + std::string(Constraint, 2);
1083 Constraint++;
1084 break;
1085 default:
1086 return TargetInfo::convertConstraint(Constraint);
1087 }
1088 return R;
1089 }
Craig Topper3164f332014-03-11 03:39:26 +00001090 const char *getClobbers() const override {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001091 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +00001092 }
Craig Topper3164f332014-03-11 03:39:26 +00001093 int getEHDataRegisterNumber(unsigned RegNo) const override {
Adhemerval Zanella5d874ae2013-01-22 20:02:45 +00001094 if (RegNo == 0) return 3;
1095 if (RegNo == 1) return 4;
1096 return -1;
1097 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00001098
1099 bool hasSjLjLowering() const override {
1100 return true;
1101 }
David Majnemer2617ea62015-06-09 18:05:33 +00001102
1103 bool useFloat128ManglingForLongDouble() const override {
1104 return LongDoubleWidth == 128 &&
1105 LongDoubleFormat == &llvm::APFloat::PPCDoubleDouble &&
1106 getTriple().isOSBinFormatELF();
1107 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001108};
Anders Carlssonf511f642007-11-27 04:11:28 +00001109
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001110const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00001111#define BUILTIN(ID, TYPE, ATTRS) \
1112 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1113#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1114 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5abdec72009-06-14 01:05:48 +00001115#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001116};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001117
Eric Christopher917e9522014-11-18 22:36:15 +00001118/// handleTargetFeatures - Perform initialization based on the user
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001119/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00001120bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001121 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00001122 for (const auto &Feature : Features) {
1123 if (Feature == "+vsx") {
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001124 HasVSX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001125 } else if (Feature == "+bpermd") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001126 HasBPERMD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001127 } else if (Feature == "+extdiv") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001128 HasExtDiv = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001129 } else if (Feature == "+power8-vector") {
Bill Schmidt8c184e32014-10-10 17:21:23 +00001130 HasP8Vector = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001131 } else if (Feature == "+crypto") {
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001132 HasP8Crypto = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001133 } else if (Feature == "+direct-move") {
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001134 HasDirectMove = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001135 } else if (Feature == "+qpx") {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001136 HasQPX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001137 } else if (Feature == "+htm") {
Kit Barton8246f282015-03-25 19:41:41 +00001138 HasHTM = true;
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001139 } else if (Feature == "+float128") {
1140 HasFloat128 = true;
Kit Barton8246f282015-03-25 19:41:41 +00001141 }
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001142 // TODO: Finish this list and add an assert that we've handled them
1143 // all.
1144 }
Eric Christopher02c33352015-08-25 00:59:11 +00001145
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001146 return true;
1147}
1148
Chris Lattnerecd49032009-03-02 22:27:17 +00001149/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
1150/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001151void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001152 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00001153 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001154 Builder.defineMacro("__ppc__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001155 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001156 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001157 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001158 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001159 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001160 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001161 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001162 Builder.defineMacro("__ppc64__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001163 Builder.defineMacro("__PPC64__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001164 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001165
Chris Lattnerecd49032009-03-02 22:27:17 +00001166 // Target properties.
Bill Schmidt778d3872013-07-26 01:36:11 +00001167 if (getTriple().getArch() == llvm::Triple::ppc64le) {
1168 Builder.defineMacro("_LITTLE_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001169 } else {
1170 if (getTriple().getOS() != llvm::Triple::NetBSD &&
1171 getTriple().getOS() != llvm::Triple::OpenBSD)
1172 Builder.defineMacro("_BIG_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001173 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001174
Ulrich Weigand8afad612014-07-28 13:17:52 +00001175 // ABI options.
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001176 if (ABI == "elfv1" || ABI == "elfv1-qpx")
Ulrich Weigand8afad612014-07-28 13:17:52 +00001177 Builder.defineMacro("_CALL_ELF", "1");
1178 if (ABI == "elfv2")
1179 Builder.defineMacro("_CALL_ELF", "2");
1180
Chris Lattnerecd49032009-03-02 22:27:17 +00001181 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001182 Builder.defineMacro("__NATURAL_ALIGNMENT__");
1183 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001184
Chris Lattnerecd49032009-03-02 22:27:17 +00001185 // FIXME: Should be controlled by command line option.
Roman Divacky13b586f2013-07-03 19:45:54 +00001186 if (LongDoubleWidth == 128)
1187 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001188
John Thompsone467e192009-11-19 17:18:50 +00001189 if (Opts.AltiVec) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001190 Builder.defineMacro("__VEC__", "10206");
1191 Builder.defineMacro("__ALTIVEC__");
John Thompsone467e192009-11-19 17:18:50 +00001192 }
Hal Finkel8eb59282012-06-11 22:35:19 +00001193
1194 // CPU identification.
Hal Finkel6b984f02012-07-03 16:51:04 +00001195 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
1196 .Case("440", ArchDefineName)
1197 .Case("450", ArchDefineName | ArchDefine440)
1198 .Case("601", ArchDefineName)
1199 .Case("602", ArchDefineName | ArchDefinePpcgr)
1200 .Case("603", ArchDefineName | ArchDefinePpcgr)
1201 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1202 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1203 .Case("604", ArchDefineName | ArchDefinePpcgr)
1204 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
1205 .Case("620", ArchDefineName | ArchDefinePpcgr)
Bill Schmidt38378a02013-02-01 20:23:10 +00001206 .Case("630", ArchDefineName | ArchDefinePpcgr)
Hal Finkel6b984f02012-07-03 16:51:04 +00001207 .Case("7400", ArchDefineName | ArchDefinePpcgr)
1208 .Case("7450", ArchDefineName | ArchDefinePpcgr)
1209 .Case("750", ArchDefineName | ArchDefinePpcgr)
1210 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1211 | ArchDefinePpcsq)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001212 .Case("a2", ArchDefineA2)
1213 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
Bill Schmidt38378a02013-02-01 20:23:10 +00001214 .Case("pwr3", ArchDefinePpcgr)
1215 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
1216 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1217 | ArchDefinePpcsq)
1218 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4
1219 | ArchDefinePpcgr | ArchDefinePpcsq)
1220 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5
1221 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1222 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x
1223 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1224 | ArchDefinePpcsq)
1225 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6
1226 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001227 | ArchDefinePpcgr | ArchDefinePpcsq)
1228 .Case("pwr8", ArchDefineName | ArchDefinePwr7 | ArchDefinePwr6x
1229 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1230 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001231 .Case("pwr9", ArchDefineName | ArchDefinePwr8 | ArchDefinePwr7
1232 | ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1233 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1234 | ArchDefinePpcsq)
Bill Schmidt38378a02013-02-01 20:23:10 +00001235 .Case("power3", ArchDefinePpcgr)
1236 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1237 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1238 | ArchDefinePpcsq)
1239 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1240 | ArchDefinePpcgr | ArchDefinePpcsq)
1241 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1242 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1243 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1244 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1245 | ArchDefinePpcsq)
1246 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6
1247 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001248 | ArchDefinePpcgr | ArchDefinePpcsq)
1249 .Case("power8", ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr6x
1250 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1251 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001252 .Case("power9", ArchDefinePwr9 | ArchDefinePwr8 | ArchDefinePwr7
1253 | ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1254 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1255 | ArchDefinePpcsq)
Hal Finkel6b984f02012-07-03 16:51:04 +00001256 .Default(ArchDefineNone);
1257
1258 if (defs & ArchDefineName)
1259 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
1260 if (defs & ArchDefinePpcgr)
1261 Builder.defineMacro("_ARCH_PPCGR");
1262 if (defs & ArchDefinePpcsq)
1263 Builder.defineMacro("_ARCH_PPCSQ");
1264 if (defs & ArchDefine440)
Hal Finkel8eb59282012-06-11 22:35:19 +00001265 Builder.defineMacro("_ARCH_440");
Hal Finkel6b984f02012-07-03 16:51:04 +00001266 if (defs & ArchDefine603)
1267 Builder.defineMacro("_ARCH_603");
1268 if (defs & ArchDefine604)
1269 Builder.defineMacro("_ARCH_604");
Bill Schmidt38378a02013-02-01 20:23:10 +00001270 if (defs & ArchDefinePwr4)
Hal Finkel6b984f02012-07-03 16:51:04 +00001271 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt38378a02013-02-01 20:23:10 +00001272 if (defs & ArchDefinePwr5)
Hal Finkel6b984f02012-07-03 16:51:04 +00001273 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt38378a02013-02-01 20:23:10 +00001274 if (defs & ArchDefinePwr5x)
1275 Builder.defineMacro("_ARCH_PWR5X");
1276 if (defs & ArchDefinePwr6)
Hal Finkel8eb59282012-06-11 22:35:19 +00001277 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt38378a02013-02-01 20:23:10 +00001278 if (defs & ArchDefinePwr6x)
1279 Builder.defineMacro("_ARCH_PWR6X");
1280 if (defs & ArchDefinePwr7)
1281 Builder.defineMacro("_ARCH_PWR7");
Will Schmidtf0487512014-06-26 13:34:10 +00001282 if (defs & ArchDefinePwr8)
1283 Builder.defineMacro("_ARCH_PWR8");
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001284 if (defs & ArchDefinePwr9)
1285 Builder.defineMacro("_ARCH_PWR9");
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001286 if (defs & ArchDefineA2)
1287 Builder.defineMacro("_ARCH_A2");
1288 if (defs & ArchDefineA2q) {
1289 Builder.defineMacro("_ARCH_A2Q");
1290 Builder.defineMacro("_ARCH_QP");
1291 }
1292
1293 if (getTriple().getVendor() == llvm::Triple::BGQ) {
1294 Builder.defineMacro("__bg__");
1295 Builder.defineMacro("__THW_BLUEGENE__");
1296 Builder.defineMacro("__bgq__");
1297 Builder.defineMacro("__TOS_BGQ__");
1298 }
Bill Schmidt38378a02013-02-01 20:23:10 +00001299
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001300 if (HasVSX)
1301 Builder.defineMacro("__VSX__");
Bill Schmidt8c184e32014-10-10 17:21:23 +00001302 if (HasP8Vector)
Bill Schmidt59eb7672014-10-10 15:09:43 +00001303 Builder.defineMacro("__POWER8_VECTOR__");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001304 if (HasP8Crypto)
1305 Builder.defineMacro("__CRYPTO__");
Kit Barton8246f282015-03-25 19:41:41 +00001306 if (HasHTM)
1307 Builder.defineMacro("__HTM__");
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001308 if (HasFloat128)
1309 Builder.defineMacro("__FLOAT128__");
Hal Finkela57b8902015-10-01 13:39:49 +00001310
1311 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
1312 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
1313 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
1314 if (PointerWidth == 64)
1315 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001316
Bill Schmidt38378a02013-02-01 20:23:10 +00001317 // FIXME: The following are not yet generated here by Clang, but are
1318 // generated by GCC:
1319 //
1320 // _SOFT_FLOAT_
1321 // __RECIP_PRECISION__
1322 // __APPLE_ALTIVEC__
Bill Schmidt38378a02013-02-01 20:23:10 +00001323 // __RECIP__
1324 // __RECIPF__
1325 // __RSQRTE__
1326 // __RSQRTEF__
1327 // _SOFT_DOUBLE_
1328 // __NO_LWSYNC__
1329 // __HAVE_BSWAP__
1330 // __LONGDOUBLE128
1331 // __CMODEL_MEDIUM__
1332 // __CMODEL_LARGE__
1333 // _CALL_SYSV
1334 // _CALL_DARWIN
1335 // __NO_FPRS__
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001336}
1337
Eric Christophera8a14c32015-08-31 18:39:16 +00001338// Handle explicit options being passed to the compiler here: if we've
1339// explicitly turned off vsx and turned on power8-vector or direct-move then
1340// go ahead and error since the customer has expressed a somewhat incompatible
1341// set of options.
1342static bool ppcUserFeaturesCheck(DiagnosticsEngine &Diags,
Eric Christopher8c47b422015-10-09 18:39:55 +00001343 const std::vector<std::string> &FeaturesVec) {
Eric Christophera8a14c32015-08-31 18:39:16 +00001344
1345 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "-vsx") !=
1346 FeaturesVec.end()) {
1347 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+power8-vector") !=
1348 FeaturesVec.end()) {
1349 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mpower8-vector"
1350 << "-mno-vsx";
1351 return false;
1352 }
1353
1354 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+direct-move") !=
1355 FeaturesVec.end()) {
1356 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mdirect-move"
1357 << "-mno-vsx";
1358 return false;
1359 }
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001360
1361 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+float128") !=
1362 FeaturesVec.end()) {
1363 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mfloat128"
1364 << "-mno-vsx";
1365 return false;
1366 }
Eric Christophera8a14c32015-08-31 18:39:16 +00001367 }
1368
1369 return true;
1370}
1371
Eric Christopher8c47b422015-10-09 18:39:55 +00001372bool PPCTargetInfo::initFeatureMap(
1373 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
1374 const std::vector<std::string> &FeaturesVec) const {
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001375 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1376 .Case("7400", true)
1377 .Case("g4", true)
1378 .Case("7450", true)
1379 .Case("g4+", true)
1380 .Case("970", true)
1381 .Case("g5", true)
1382 .Case("pwr6", true)
1383 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +00001384 .Case("pwr8", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001385 .Case("pwr9", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001386 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +00001387 .Case("ppc64le", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001388 .Default(false);
Hal Finkelb58ce852013-02-01 18:44:19 +00001389
1390 Features["qpx"] = (CPU == "a2q");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001391 Features["crypto"] = llvm::StringSwitch<bool>(CPU)
1392 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001393 .Case("pwr9", true)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001394 .Case("pwr8", true)
1395 .Default(false);
1396 Features["power8-vector"] = llvm::StringSwitch<bool>(CPU)
1397 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001398 .Case("pwr9", true)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001399 .Case("pwr8", true)
1400 .Default(false);
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001401 Features["bpermd"] = llvm::StringSwitch<bool>(CPU)
1402 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001403 .Case("pwr9", true)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001404 .Case("pwr8", true)
1405 .Case("pwr7", true)
1406 .Default(false);
1407 Features["extdiv"] = llvm::StringSwitch<bool>(CPU)
1408 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001409 .Case("pwr9", true)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001410 .Case("pwr8", true)
1411 .Case("pwr7", true)
1412 .Default(false);
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001413 Features["direct-move"] = llvm::StringSwitch<bool>(CPU)
1414 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001415 .Case("pwr9", true)
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001416 .Case("pwr8", true)
1417 .Default(false);
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001418 Features["vsx"] = llvm::StringSwitch<bool>(CPU)
1419 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001420 .Case("pwr9", true)
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001421 .Case("pwr8", true)
1422 .Case("pwr7", true)
1423 .Default(false);
Eric Christopheref1e2952015-08-28 02:13:58 +00001424
Eric Christophera8a14c32015-08-31 18:39:16 +00001425 if (!ppcUserFeaturesCheck(Diags, FeaturesVec))
1426 return false;
Eric Christopher007b0a02015-08-28 22:32:01 +00001427
Eric Christopher007b0a02015-08-28 22:32:01 +00001428 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001429}
1430
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001431bool PPCTargetInfo::hasFeature(StringRef Feature) const {
Bill Schmidte6e9d152014-11-02 14:56:41 +00001432 return llvm::StringSwitch<bool>(Feature)
1433 .Case("powerpc", true)
1434 .Case("vsx", HasVSX)
1435 .Case("power8-vector", HasP8Vector)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001436 .Case("crypto", HasP8Crypto)
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001437 .Case("direct-move", HasDirectMove)
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001438 .Case("qpx", HasQPX)
Kit Barton8246f282015-03-25 19:41:41 +00001439 .Case("htm", HasHTM)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001440 .Case("bpermd", HasBPERMD)
1441 .Case("extdiv", HasExtDiv)
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001442 .Case("float128", HasFloat128)
Bill Schmidte6e9d152014-11-02 14:56:41 +00001443 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001444}
Chris Lattner17df24e2008-04-21 18:56:49 +00001445
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001446void PPCTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
1447 StringRef Name, bool Enabled) const {
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001448 // If we're enabling direct-move or power8-vector go ahead and enable vsx
1449 // as well. Do the inverse if we're disabling vsx. We'll diagnose any user
1450 // incompatible options.
1451 if (Enabled) {
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001452 if (Name == "direct-move") {
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001453 Features[Name] = Features["vsx"] = true;
1454 } else if (Name == "power8-vector") {
1455 Features[Name] = Features["vsx"] = true;
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001456 } else if (Name == "float128") {
1457 Features[Name] = Features["vsx"] = true;
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001458 } else {
1459 Features[Name] = true;
1460 }
1461 } else {
1462 if (Name == "vsx") {
1463 Features[Name] = Features["direct-move"] = Features["power8-vector"] =
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001464 Features["float128"] = false;
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001465 } else {
1466 Features[Name] = false;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001467 }
1468 }
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001469}
1470
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001471const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001472 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1473 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1474 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1475 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1476 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1477 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1478 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1479 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001480 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001481 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001482 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001483 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1484 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1485 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1486 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001487 "vrsave", "vscr",
1488 "spe_acc", "spefscr",
1489 "sfp"
1490};
Chris Lattner10a5b382007-01-29 05:24:35 +00001491
Craig Topperf054e3a2015-10-19 03:52:27 +00001492ArrayRef<const char*> PPCTargetInfo::getGCCRegNames() const {
1493 return llvm::makeArrayRef(GCCRegNames);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001494}
Chris Lattner5ba61f02006-10-14 07:39:34 +00001495
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001496const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1497 // While some of these aliases do map to different registers
1498 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001499 { { "0" }, "r0" },
1500 { { "1"}, "r1" },
1501 { { "2" }, "r2" },
1502 { { "3" }, "r3" },
1503 { { "4" }, "r4" },
1504 { { "5" }, "r5" },
1505 { { "6" }, "r6" },
1506 { { "7" }, "r7" },
1507 { { "8" }, "r8" },
1508 { { "9" }, "r9" },
1509 { { "10" }, "r10" },
1510 { { "11" }, "r11" },
1511 { { "12" }, "r12" },
1512 { { "13" }, "r13" },
1513 { { "14" }, "r14" },
1514 { { "15" }, "r15" },
1515 { { "16" }, "r16" },
1516 { { "17" }, "r17" },
1517 { { "18" }, "r18" },
1518 { { "19" }, "r19" },
1519 { { "20" }, "r20" },
1520 { { "21" }, "r21" },
1521 { { "22" }, "r22" },
1522 { { "23" }, "r23" },
1523 { { "24" }, "r24" },
1524 { { "25" }, "r25" },
1525 { { "26" }, "r26" },
1526 { { "27" }, "r27" },
1527 { { "28" }, "r28" },
1528 { { "29" }, "r29" },
1529 { { "30" }, "r30" },
1530 { { "31" }, "r31" },
1531 { { "fr0" }, "f0" },
1532 { { "fr1" }, "f1" },
1533 { { "fr2" }, "f2" },
1534 { { "fr3" }, "f3" },
1535 { { "fr4" }, "f4" },
1536 { { "fr5" }, "f5" },
1537 { { "fr6" }, "f6" },
1538 { { "fr7" }, "f7" },
1539 { { "fr8" }, "f8" },
1540 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +00001541 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001542 { { "fr11" }, "f11" },
1543 { { "fr12" }, "f12" },
1544 { { "fr13" }, "f13" },
1545 { { "fr14" }, "f14" },
1546 { { "fr15" }, "f15" },
1547 { { "fr16" }, "f16" },
1548 { { "fr17" }, "f17" },
1549 { { "fr18" }, "f18" },
1550 { { "fr19" }, "f19" },
1551 { { "fr20" }, "f20" },
1552 { { "fr21" }, "f21" },
1553 { { "fr22" }, "f22" },
1554 { { "fr23" }, "f23" },
1555 { { "fr24" }, "f24" },
1556 { { "fr25" }, "f25" },
1557 { { "fr26" }, "f26" },
1558 { { "fr27" }, "f27" },
1559 { { "fr28" }, "f28" },
1560 { { "fr29" }, "f29" },
1561 { { "fr30" }, "f30" },
1562 { { "fr31" }, "f31" },
1563 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001564};
1565
Craig Topperf054e3a2015-10-19 03:52:27 +00001566ArrayRef<TargetInfo::GCCRegAlias> PPCTargetInfo::getGCCRegAliases() const {
1567 return llvm::makeArrayRef(GCCRegAliases);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001568}
Chris Lattner02dffbd2006-10-14 07:50:21 +00001569
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001570class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001571public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001572 PPC32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1573 : PPCTargetInfo(Triple, Opts) {
James Y Knightb214cbc2016-03-04 19:00:41 +00001574 resetDataLayout("E-m:e-p:32:32-i64:64-n32");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001575
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001576 switch (getTriple().getOS()) {
Nico Weber3435ede2012-01-31 02:07:33 +00001577 case llvm::Triple::Linux:
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001578 case llvm::Triple::FreeBSD:
1579 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001580 SizeType = UnsignedInt;
Hal Finkel26908382012-03-02 20:54:36 +00001581 PtrDiffType = SignedInt;
1582 IntPtrType = SignedInt;
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001583 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +00001584 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001585 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001586 }
Roman Divacky816dcd12012-03-13 16:53:54 +00001587
Roman Divacky3ffe7462012-03-13 19:20:17 +00001588 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1589 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001590 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Roman Divacky3ffe7462012-03-13 19:20:17 +00001591 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001592
1593 // PPC32 supports atomics up to 4 bytes.
1594 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divacky965b0b72011-01-06 08:27:10 +00001595 }
1596
Craig Topper3164f332014-03-11 03:39:26 +00001597 BuiltinVaListKind getBuiltinVaListKind() const override {
Roman Divacky965b0b72011-01-06 08:27:10 +00001598 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Inge5d3fb222012-06-16 03:34:49 +00001599 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman873f65a2008-08-21 00:13:15 +00001600 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001601};
Chris Lattner5ba61f02006-10-14 07:39:34 +00001602
Bill Schmidt778d3872013-07-26 01:36:11 +00001603// Note: ABI differences may eventually require us to have a separate
1604// TargetInfo for little endian.
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001605class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001606public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001607 PPC64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1608 : PPCTargetInfo(Triple, Opts) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001609 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001610 IntMaxType = SignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001611 Int64Type = SignedLong;
Roman Divacky816dcd12012-03-13 16:53:54 +00001612
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001613 if ((Triple.getArch() == llvm::Triple::ppc64le)) {
James Y Knightb214cbc2016-03-04 19:00:41 +00001614 resetDataLayout("e-m:e-i64:64-n32:64");
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001615 ABI = "elfv2";
1616 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00001617 resetDataLayout("E-m:e-i64:64-n32:64");
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001618 ABI = "elfv1";
1619 }
1620
1621 switch (getTriple().getOS()) {
1622 case llvm::Triple::FreeBSD:
Roman Divacky3ffe7462012-03-13 19:20:17 +00001623 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001624 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001625 break;
Joerg Sonnenbergeraac82c42014-10-15 19:52:03 +00001626 case llvm::Triple::NetBSD:
1627 IntMaxType = SignedLongLong;
1628 Int64Type = SignedLongLong;
1629 break;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001630 default:
1631 break;
Ulrich Weigand8afad612014-07-28 13:17:52 +00001632 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001633
1634 // PPC64 supports atomics up to 8 bytes.
1635 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001636 }
Craig Topper3164f332014-03-11 03:39:26 +00001637 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001638 return TargetInfo::CharPtrBuiltinVaList;
Roman Divacky965b0b72011-01-06 08:27:10 +00001639 }
Eric Christophere6b7cf42015-07-10 18:25:52 +00001640 // PPC64 Linux-specific ABI options.
Ulrich Weigand8afad612014-07-28 13:17:52 +00001641 bool setABI(const std::string &Name) override {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001642 if (Name == "elfv1" || Name == "elfv1-qpx" || Name == "elfv2") {
Ulrich Weigand8afad612014-07-28 13:17:52 +00001643 ABI = Name;
1644 return true;
1645 }
1646 return false;
1647 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001648};
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001649
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001650class DarwinPPC32TargetInfo : public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001651public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001652 DarwinPPC32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1653 : DarwinTargetInfo<PPC32TargetInfo>(Triple, Opts) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001654 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +00001655 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Eric Christopher917e9522014-11-18 22:36:15 +00001656 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev68d773c2012-01-17 22:40:00 +00001657 LongLongAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001658 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00001659 resetDataLayout("E-m:o-p:32:32-f64:32:64-n32");
Roman Divacky965b0b72011-01-06 08:27:10 +00001660 }
Craig Topper3164f332014-03-11 03:39:26 +00001661 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001662 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001663 }
1664};
1665
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001666class DarwinPPC64TargetInfo : public DarwinTargetInfo<PPC64TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001667public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001668 DarwinPPC64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1669 : DarwinTargetInfo<PPC64TargetInfo>(Triple, Opts) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001670 HasAlignMac68kSupport = true;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001671 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00001672 resetDataLayout("E-m:o-i64:64-n32:64");
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001673 }
1674};
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001675
Eric Christopherc48497a2015-09-18 21:26:24 +00001676static const unsigned NVPTXAddrSpaceMap[] = {
1677 1, // opencl_global
1678 3, // opencl_local
1679 4, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00001680 // FIXME: generic has to be added to the target
Eric Christopherc48497a2015-09-18 21:26:24 +00001681 0, // opencl_generic
1682 1, // cuda_device
1683 4, // cuda_constant
1684 3, // cuda_shared
1685};
1686
1687class NVPTXTargetInfo : public TargetInfo {
1688 static const char *const GCCRegNames[];
1689 static const Builtin::Info BuiltinInfo[];
Reid Klecknerbbc01782014-12-03 21:53:36 +00001690
1691 // The GPU profiles supported by the NVPTX backend
1692 enum GPUKind {
1693 GK_NONE,
1694 GK_SM20,
1695 GK_SM21,
1696 GK_SM30,
1697 GK_SM35,
Eli Bendersky7a0d8912015-03-31 17:03:16 +00001698 GK_SM37,
Artem Belevichffa5fc52016-05-19 17:47:47 +00001699 GK_SM50,
1700 GK_SM52,
1701 GK_SM53,
Reid Klecknerbbc01782014-12-03 21:53:36 +00001702 } GPU;
1703
Eric Christopherc48497a2015-09-18 21:26:24 +00001704public:
Justin Lebar76945b22016-04-29 23:05:19 +00001705 NVPTXTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001706 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00001707 BigEndian = false;
1708 TLSSupported = false;
1709 LongWidth = LongAlign = 64;
1710 AddrSpaceMap = &NVPTXAddrSpaceMap;
1711 UseAddrSpaceMapMangling = true;
1712 // Define available target features
1713 // These must be defined in sorted order!
1714 NoAsmVariants = true;
1715 // Set the default GPU to sm20
1716 GPU = GK_SM20;
Justin Lebar76945b22016-04-29 23:05:19 +00001717
1718 // If possible, get a TargetInfo for our host triple, so we can match its
1719 // types.
1720 llvm::Triple HostTriple(Opts.HostTriple);
1721 if (HostTriple.isNVPTX())
1722 return;
1723 std::unique_ptr<TargetInfo> HostTarget(
1724 AllocateTarget(llvm::Triple(Opts.HostTriple), Opts));
1725 if (!HostTarget) {
1726 return;
1727 }
1728
1729 PointerWidth = HostTarget->getPointerWidth(/* AddrSpace = */ 0);
1730 PointerAlign = HostTarget->getPointerAlign(/* AddrSpace = */ 0);
1731 BoolWidth = HostTarget->getBoolWidth();
1732 BoolAlign = HostTarget->getBoolAlign();
1733 IntWidth = HostTarget->getIntWidth();
1734 IntAlign = HostTarget->getIntAlign();
1735 HalfWidth = HostTarget->getHalfWidth();
1736 HalfAlign = HostTarget->getHalfAlign();
1737 FloatWidth = HostTarget->getFloatWidth();
1738 FloatAlign = HostTarget->getFloatAlign();
1739 DoubleWidth = HostTarget->getDoubleWidth();
1740 DoubleAlign = HostTarget->getDoubleAlign();
1741 LongWidth = HostTarget->getLongWidth();
1742 LongAlign = HostTarget->getLongAlign();
1743 LongLongWidth = HostTarget->getLongLongWidth();
1744 LongLongAlign = HostTarget->getLongLongAlign();
1745 MinGlobalAlign = HostTarget->getMinGlobalAlign();
1746 DefaultAlignForAttributeAligned =
1747 HostTarget->getDefaultAlignForAttributeAligned();
1748 SizeType = HostTarget->getSizeType();
1749 IntMaxType = HostTarget->getIntMaxType();
1750 PtrDiffType = HostTarget->getPtrDiffType(/* AddrSpace = */ 0);
1751 IntPtrType = HostTarget->getIntPtrType();
1752 WCharType = HostTarget->getWCharType();
1753 WIntType = HostTarget->getWIntType();
1754 Char16Type = HostTarget->getChar16Type();
1755 Char32Type = HostTarget->getChar32Type();
1756 Int64Type = HostTarget->getInt64Type();
1757 SigAtomicType = HostTarget->getSigAtomicType();
1758 ProcessIDType = HostTarget->getProcessIDType();
1759
1760 UseBitFieldTypeAlignment = HostTarget->useBitFieldTypeAlignment();
1761 UseZeroLengthBitfieldAlignment =
1762 HostTarget->useZeroLengthBitfieldAlignment();
1763 UseExplicitBitFieldAlignment = HostTarget->useExplicitBitFieldAlignment();
1764 ZeroLengthBitfieldBoundary = HostTarget->getZeroLengthBitfieldBoundary();
1765
1766 // Properties intentionally not copied from host:
1767 // - LargeArrayMinWidth, LargeArrayAlign: Not visible across the
1768 // host/device boundary.
1769 // - SuitableAlign: Not visible across the host/device boundary, and may
1770 // correctly be different on host/device, e.g. if host has wider vector
1771 // types than device.
1772 // - LongDoubleWidth, LongDoubleAlign: nvptx's long double type is the same
1773 // as its double type, but that's not necessarily true on the host.
1774 // TODO: nvcc emits a warning when using long double on device; we should
1775 // do the same.
Eric Christopherc48497a2015-09-18 21:26:24 +00001776 }
1777 void getTargetDefines(const LangOptions &Opts,
1778 MacroBuilder &Builder) const override {
1779 Builder.defineMacro("__PTX__");
1780 Builder.defineMacro("__NVPTX__");
1781 if (Opts.CUDAIsDevice) {
1782 // Set __CUDA_ARCH__ for the GPU specified.
1783 std::string CUDAArchCode;
1784 switch (GPU) {
1785 case GK_SM20:
1786 CUDAArchCode = "200";
1787 break;
1788 case GK_SM21:
1789 CUDAArchCode = "210";
1790 break;
1791 case GK_SM30:
1792 CUDAArchCode = "300";
1793 break;
1794 case GK_SM35:
1795 CUDAArchCode = "350";
1796 break;
1797 case GK_SM37:
1798 CUDAArchCode = "370";
1799 break;
Artem Belevichffa5fc52016-05-19 17:47:47 +00001800 case GK_SM50:
1801 CUDAArchCode = "500";
1802 break;
1803 case GK_SM52:
1804 CUDAArchCode = "520";
1805 break;
1806 case GK_SM53:
1807 CUDAArchCode = "530";
1808 break;
Eric Christopherc48497a2015-09-18 21:26:24 +00001809 default:
1810 llvm_unreachable("Unhandled target CPU");
Reid Klecknerbbc01782014-12-03 21:53:36 +00001811 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001812 Builder.defineMacro("__CUDA_ARCH__", CUDAArchCode);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001813 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001814 }
Craig Topper6c03a542015-10-19 04:51:35 +00001815 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
1816 return llvm::makeArrayRef(BuiltinInfo,
1817 clang::NVPTX::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eric Christopherc48497a2015-09-18 21:26:24 +00001818 }
1819 bool hasFeature(StringRef Feature) const override {
1820 return Feature == "ptx" || Feature == "nvptx";
Peter Collingbournec947aae2012-05-20 23:28:41 +00001821 }
1822
Craig Topperf054e3a2015-10-19 03:52:27 +00001823 ArrayRef<const char *> getGCCRegNames() const override;
1824 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00001825 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00001826 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00001827 }
1828 bool validateAsmConstraint(const char *&Name,
1829 TargetInfo::ConstraintInfo &Info) const override {
1830 switch (*Name) {
1831 default:
1832 return false;
1833 case 'c':
1834 case 'h':
1835 case 'r':
1836 case 'l':
1837 case 'f':
1838 case 'd':
1839 Info.setAllowsRegister();
1840 return true;
Eli Bendersky13467172015-04-01 20:29:18 +00001841 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001842 }
1843 const char *getClobbers() const override {
1844 // FIXME: Is this really right?
1845 return "";
1846 }
1847 BuiltinVaListKind getBuiltinVaListKind() const override {
1848 // FIXME: implement
1849 return TargetInfo::CharPtrBuiltinVaList;
1850 }
1851 bool setCPU(const std::string &Name) override {
1852 GPU = llvm::StringSwitch<GPUKind>(Name)
1853 .Case("sm_20", GK_SM20)
1854 .Case("sm_21", GK_SM21)
1855 .Case("sm_30", GK_SM30)
1856 .Case("sm_35", GK_SM35)
1857 .Case("sm_37", GK_SM37)
Artem Belevichffa5fc52016-05-19 17:47:47 +00001858 .Case("sm_50", GK_SM50)
1859 .Case("sm_52", GK_SM52)
1860 .Case("sm_53", GK_SM53)
Eric Christopherc48497a2015-09-18 21:26:24 +00001861 .Default(GK_NONE);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001862
Eric Christopherc48497a2015-09-18 21:26:24 +00001863 return GPU != GK_NONE;
1864 }
1865};
1866
1867const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1868#define BUILTIN(ID, TYPE, ATTRS) \
1869 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1870#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1871 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
1872#include "clang/Basic/BuiltinsNVPTX.def"
1873};
1874
1875const char *const NVPTXTargetInfo::GCCRegNames[] = {"r0"};
1876
Craig Topperf054e3a2015-10-19 03:52:27 +00001877ArrayRef<const char *> NVPTXTargetInfo::getGCCRegNames() const {
1878 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00001879}
1880
1881class NVPTX32TargetInfo : public NVPTXTargetInfo {
1882public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001883 NVPTX32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1884 : NVPTXTargetInfo(Triple, Opts) {
Artem Belevich236cfdc2015-09-28 22:54:08 +00001885 LongWidth = LongAlign = 32;
Eric Christopherc48497a2015-09-18 21:26:24 +00001886 PointerWidth = PointerAlign = 32;
1887 SizeType = TargetInfo::UnsignedInt;
1888 PtrDiffType = TargetInfo::SignedInt;
1889 IntPtrType = TargetInfo::SignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +00001890 resetDataLayout("e-p:32:32-i64:64-v16:16-v32:32-n16:32:64");
Eric Christopherc48497a2015-09-18 21:26:24 +00001891 }
1892};
1893
1894class NVPTX64TargetInfo : public NVPTXTargetInfo {
1895public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001896 NVPTX64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1897 : NVPTXTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00001898 PointerWidth = PointerAlign = 64;
1899 SizeType = TargetInfo::UnsignedLong;
1900 PtrDiffType = TargetInfo::SignedLong;
1901 IntPtrType = TargetInfo::SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00001902 resetDataLayout("e-i64:64-v16:16-v32:32-n16:32:64");
Eric Christopherc48497a2015-09-18 21:26:24 +00001903 }
1904};
Eli Friedmand13b41e2012-10-12 23:32:00 +00001905
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001906static const unsigned AMDGPUAddrSpaceMap[] = {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001907 1, // opencl_global
1908 3, // opencl_local
1909 2, // opencl_constant
Matt Arsenaultbfe25b22014-12-01 16:46:03 +00001910 4, // opencl_generic
Eli Friedmand13b41e2012-10-12 23:32:00 +00001911 1, // cuda_device
1912 2, // cuda_constant
1913 3 // cuda_shared
1914};
1915
Tom Stellarda96344b2014-08-21 13:58:40 +00001916// If you edit the description strings, make sure you update
1917// getPointerWidthV().
1918
Craig Topper273dbc62015-10-18 05:29:26 +00001919static const char *const DataLayoutStringR600 =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001920 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1921 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001922
Craig Topper273dbc62015-10-18 05:29:26 +00001923static const char *const DataLayoutStringSI =
Matt Arsenault6dc455f2016-05-31 16:58:18 +00001924 "e-p:32:32-p1:64:64-p2:64:64-p3:32:32-p4:64:64-p5:32:32"
Rafael Espindola29db13a2014-01-03 18:13:17 +00001925 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1926 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001927
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001928class AMDGPUTargetInfo : public TargetInfo {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001929 static const Builtin::Info BuiltinInfo[];
Tom Stellard7b1059b2015-04-14 14:36:56 +00001930 static const char * const GCCRegNames[];
Matt Arsenault56f008d2014-06-24 20:45:01 +00001931
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001932 /// \brief The GPU profiles supported by the AMDGPU target.
Tom Stellardc74b1e02013-03-04 17:40:53 +00001933 enum GPUKind {
1934 GK_NONE,
1935 GK_R600,
1936 GK_R600_DOUBLE_OPS,
1937 GK_R700,
1938 GK_R700_DOUBLE_OPS,
1939 GK_EVERGREEN,
1940 GK_EVERGREEN_DOUBLE_OPS,
1941 GK_NORTHERN_ISLANDS,
1942 GK_CAYMAN,
Tom Stellard08ded122013-10-29 16:38:29 +00001943 GK_SOUTHERN_ISLANDS,
Tom Stellard5c384402015-06-18 19:14:15 +00001944 GK_SEA_ISLANDS,
1945 GK_VOLCANIC_ISLANDS
Tom Stellardc74b1e02013-03-04 17:40:53 +00001946 } GPU;
1947
Jan Veselyeebeaea2015-05-04 19:53:36 +00001948 bool hasFP64:1;
1949 bool hasFMAF:1;
1950 bool hasLDEXPF:1;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001951
Eli Friedmand13b41e2012-10-12 23:32:00 +00001952public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001953 AMDGPUTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
1954 : TargetInfo(Triple) {
Tom Stellardd99fb952015-01-28 15:38:44 +00001955 if (Triple.getArch() == llvm::Triple::amdgcn) {
James Y Knightb214cbc2016-03-04 19:00:41 +00001956 resetDataLayout(DataLayoutStringSI);
Tom Stellardd99fb952015-01-28 15:38:44 +00001957 GPU = GK_SOUTHERN_ISLANDS;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001958 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001959 hasFMAF = true;
1960 hasLDEXPF = true;
Tom Stellardd99fb952015-01-28 15:38:44 +00001961 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00001962 resetDataLayout(DataLayoutStringR600);
Tom Stellardd99fb952015-01-28 15:38:44 +00001963 GPU = GK_R600;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001964 hasFP64 = false;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001965 hasFMAF = false;
1966 hasLDEXPF = false;
Tom Stellardd99fb952015-01-28 15:38:44 +00001967 }
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001968 AddrSpaceMap = &AMDGPUAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001969 UseAddrSpaceMapMangling = true;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001970 }
1971
Tom Stellarda96344b2014-08-21 13:58:40 +00001972 uint64_t getPointerWidthV(unsigned AddrSpace) const override {
1973 if (GPU <= GK_CAYMAN)
1974 return 32;
1975
1976 switch(AddrSpace) {
1977 default:
1978 return 64;
1979 case 0:
1980 case 3:
1981 case 5:
1982 return 32;
1983 }
1984 }
1985
Craig Topper3164f332014-03-11 03:39:26 +00001986 const char * getClobbers() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001987 return "";
1988 }
1989
Craig Topperf054e3a2015-10-19 03:52:27 +00001990 ArrayRef<const char *> getGCCRegNames() const override;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001991
Craig Topperf054e3a2015-10-19 03:52:27 +00001992 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
1993 return None;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001994 }
1995
Craig Topper3164f332014-03-11 03:39:26 +00001996 bool validateAsmConstraint(const char *&Name,
Tom Stellardd097e942015-11-19 22:11:58 +00001997 TargetInfo::ConstraintInfo &Info) const override {
1998 switch (*Name) {
1999 default: break;
2000 case 'v': // vgpr
2001 case 's': // sgpr
2002 Info.setAllowsRegister();
2003 return true;
2004 }
2005 return false;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002006 }
2007
Craig Topper6c03a542015-10-19 04:51:35 +00002008 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
2009 return llvm::makeArrayRef(BuiltinInfo,
2010 clang::AMDGPU::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eli Friedmand13b41e2012-10-12 23:32:00 +00002011 }
2012
Craig Topper3164f332014-03-11 03:39:26 +00002013 void getTargetDefines(const LangOptions &Opts,
2014 MacroBuilder &Builder) const override {
Matt Arsenault5e020b22016-02-27 09:06:26 +00002015 if (getTriple().getArch() == llvm::Triple::amdgcn)
2016 Builder.defineMacro("__AMDGCN__");
2017 else
2018 Builder.defineMacro("__R600__");
2019
Jan Veselyeebeaea2015-05-04 19:53:36 +00002020 if (hasFMAF)
2021 Builder.defineMacro("__HAS_FMAF__");
2022 if (hasLDEXPF)
2023 Builder.defineMacro("__HAS_LDEXPF__");
Eli Friedmand13b41e2012-10-12 23:32:00 +00002024 }
2025
Craig Topper3164f332014-03-11 03:39:26 +00002026 BuiltinVaListKind getBuiltinVaListKind() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00002027 return TargetInfo::CharPtrBuiltinVaList;
2028 }
2029
Craig Topper3164f332014-03-11 03:39:26 +00002030 bool setCPU(const std::string &Name) override {
Tom Stellardc74b1e02013-03-04 17:40:53 +00002031 GPU = llvm::StringSwitch<GPUKind>(Name)
2032 .Case("r600" , GK_R600)
2033 .Case("rv610", GK_R600)
2034 .Case("rv620", GK_R600)
2035 .Case("rv630", GK_R600)
2036 .Case("rv635", GK_R600)
2037 .Case("rs780", GK_R600)
2038 .Case("rs880", GK_R600)
2039 .Case("rv670", GK_R600_DOUBLE_OPS)
2040 .Case("rv710", GK_R700)
2041 .Case("rv730", GK_R700)
2042 .Case("rv740", GK_R700_DOUBLE_OPS)
2043 .Case("rv770", GK_R700_DOUBLE_OPS)
2044 .Case("palm", GK_EVERGREEN)
2045 .Case("cedar", GK_EVERGREEN)
2046 .Case("sumo", GK_EVERGREEN)
2047 .Case("sumo2", GK_EVERGREEN)
2048 .Case("redwood", GK_EVERGREEN)
2049 .Case("juniper", GK_EVERGREEN)
2050 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
2051 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
2052 .Case("barts", GK_NORTHERN_ISLANDS)
2053 .Case("turks", GK_NORTHERN_ISLANDS)
2054 .Case("caicos", GK_NORTHERN_ISLANDS)
2055 .Case("cayman", GK_CAYMAN)
2056 .Case("aruba", GK_CAYMAN)
Tom Stellard785699322013-04-01 20:56:49 +00002057 .Case("tahiti", GK_SOUTHERN_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00002058 .Case("pitcairn", GK_SOUTHERN_ISLANDS)
2059 .Case("verde", GK_SOUTHERN_ISLANDS)
2060 .Case("oland", GK_SOUTHERN_ISLANDS)
Tom Stellard9affba42014-08-21 13:58:38 +00002061 .Case("hainan", GK_SOUTHERN_ISLANDS)
Tom Stellard08ded122013-10-29 16:38:29 +00002062 .Case("bonaire", GK_SEA_ISLANDS)
2063 .Case("kabini", GK_SEA_ISLANDS)
2064 .Case("kaveri", GK_SEA_ISLANDS)
Tom Stellard55583042013-11-14 23:45:53 +00002065 .Case("hawaii", GK_SEA_ISLANDS)
Tom Stellard14e03962014-07-26 01:05:20 +00002066 .Case("mullins", GK_SEA_ISLANDS)
Tom Stellard5c384402015-06-18 19:14:15 +00002067 .Case("tonga", GK_VOLCANIC_ISLANDS)
2068 .Case("iceland", GK_VOLCANIC_ISLANDS)
2069 .Case("carrizo", GK_VOLCANIC_ISLANDS)
Tom Stellard2c7cdd22016-02-29 15:08:56 +00002070 .Case("fiji", GK_VOLCANIC_ISLANDS)
2071 .Case("stoney", GK_VOLCANIC_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00002072 .Default(GK_NONE);
2073
2074 if (GPU == GK_NONE) {
2075 return false;
2076 }
2077
2078 // Set the correct data layout
2079 switch (GPU) {
2080 case GK_NONE:
2081 case GK_R600:
2082 case GK_R700:
2083 case GK_EVERGREEN:
2084 case GK_NORTHERN_ISLANDS:
James Y Knightb214cbc2016-03-04 19:00:41 +00002085 resetDataLayout(DataLayoutStringR600);
Jan Veselya3abd6d2015-05-01 17:38:13 +00002086 hasFP64 = false;
Jan Veselyeebeaea2015-05-04 19:53:36 +00002087 hasFMAF = false;
2088 hasLDEXPF = false;
Tom Stellardc74b1e02013-03-04 17:40:53 +00002089 break;
2090 case GK_R600_DOUBLE_OPS:
2091 case GK_R700_DOUBLE_OPS:
2092 case GK_EVERGREEN_DOUBLE_OPS:
2093 case GK_CAYMAN:
Matt Arsenaultedc7c6b2016-03-30 21:32:37 +00002094 resetDataLayout(DataLayoutStringR600);
Jan Veselya3abd6d2015-05-01 17:38:13 +00002095 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00002096 hasFMAF = true;
2097 hasLDEXPF = false;
Tom Stellardc74b1e02013-03-04 17:40:53 +00002098 break;
2099 case GK_SOUTHERN_ISLANDS:
Tom Stellard08ded122013-10-29 16:38:29 +00002100 case GK_SEA_ISLANDS:
Tom Stellard64e0dd02015-06-18 21:13:29 +00002101 case GK_VOLCANIC_ISLANDS:
James Y Knightb214cbc2016-03-04 19:00:41 +00002102 resetDataLayout(DataLayoutStringSI);
Jan Veselya3abd6d2015-05-01 17:38:13 +00002103 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00002104 hasFMAF = true;
2105 hasLDEXPF = true;
Tom Stellardc74b1e02013-03-04 17:40:53 +00002106 break;
2107 }
2108
2109 return true;
2110 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002111
2112 void setSupportedOpenCLOpts() override {
2113 auto &Opts = getSupportedOpenCLOpts();
2114 Opts.cl_clang_storage_class_specifiers = 1;
2115 Opts.cl_khr_gl_sharing = 1;
2116 Opts.cl_khr_gl_event = 1;
2117 Opts.cl_khr_d3d10_sharing = 1;
2118 Opts.cl_khr_subgroups = 1;
2119
2120 if (hasFP64)
2121 Opts.cl_khr_fp64 = 1;
2122 if (GPU >= GK_NORTHERN_ISLANDS) {
2123 Opts.cl_khr_byte_addressable_store = 1;
2124 Opts.cl_khr_global_int32_base_atomics = 1;
2125 Opts.cl_khr_global_int32_extended_atomics = 1;
2126 Opts.cl_khr_local_int32_base_atomics = 1;
2127 Opts.cl_khr_local_int32_extended_atomics = 1;
2128 }
2129 if (GPU >= GK_SOUTHERN_ISLANDS)
2130 Opts.cl_khr_fp16 = 1;
2131 Opts.cl_khr_int64_base_atomics = 1;
2132 Opts.cl_khr_int64_extended_atomics = 1;
2133 Opts.cl_khr_3d_image_writes = 1;
2134 Opts.cl_khr_gl_msaa_sharing = 1;
2135 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00002136};
2137
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002138const Builtin::Info AMDGPUTargetInfo::BuiltinInfo[] = {
Matt Arsenault56f008d2014-06-24 20:45:01 +00002139#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00002140 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002141#include "clang/Basic/BuiltinsAMDGPU.def"
Matt Arsenault56f008d2014-06-24 20:45:01 +00002142};
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002143const char * const AMDGPUTargetInfo::GCCRegNames[] = {
Tom Stellard7b1059b2015-04-14 14:36:56 +00002144 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
2145 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
2146 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
2147 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
2148 "v32", "v33", "v34", "v35", "v36", "v37", "v38", "v39",
2149 "v40", "v41", "v42", "v43", "v44", "v45", "v46", "v47",
2150 "v48", "v49", "v50", "v51", "v52", "v53", "v54", "v55",
2151 "v56", "v57", "v58", "v59", "v60", "v61", "v62", "v63",
2152 "v64", "v65", "v66", "v67", "v68", "v69", "v70", "v71",
2153 "v72", "v73", "v74", "v75", "v76", "v77", "v78", "v79",
2154 "v80", "v81", "v82", "v83", "v84", "v85", "v86", "v87",
2155 "v88", "v89", "v90", "v91", "v92", "v93", "v94", "v95",
2156 "v96", "v97", "v98", "v99", "v100", "v101", "v102", "v103",
2157 "v104", "v105", "v106", "v107", "v108", "v109", "v110", "v111",
2158 "v112", "v113", "v114", "v115", "v116", "v117", "v118", "v119",
2159 "v120", "v121", "v122", "v123", "v124", "v125", "v126", "v127",
2160 "v128", "v129", "v130", "v131", "v132", "v133", "v134", "v135",
2161 "v136", "v137", "v138", "v139", "v140", "v141", "v142", "v143",
2162 "v144", "v145", "v146", "v147", "v148", "v149", "v150", "v151",
2163 "v152", "v153", "v154", "v155", "v156", "v157", "v158", "v159",
2164 "v160", "v161", "v162", "v163", "v164", "v165", "v166", "v167",
2165 "v168", "v169", "v170", "v171", "v172", "v173", "v174", "v175",
2166 "v176", "v177", "v178", "v179", "v180", "v181", "v182", "v183",
2167 "v184", "v185", "v186", "v187", "v188", "v189", "v190", "v191",
2168 "v192", "v193", "v194", "v195", "v196", "v197", "v198", "v199",
2169 "v200", "v201", "v202", "v203", "v204", "v205", "v206", "v207",
2170 "v208", "v209", "v210", "v211", "v212", "v213", "v214", "v215",
2171 "v216", "v217", "v218", "v219", "v220", "v221", "v222", "v223",
2172 "v224", "v225", "v226", "v227", "v228", "v229", "v230", "v231",
2173 "v232", "v233", "v234", "v235", "v236", "v237", "v238", "v239",
2174 "v240", "v241", "v242", "v243", "v244", "v245", "v246", "v247",
2175 "v248", "v249", "v250", "v251", "v252", "v253", "v254", "v255",
2176 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
2177 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
2178 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
2179 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
2180 "s32", "s33", "s34", "s35", "s36", "s37", "s38", "s39",
2181 "s40", "s41", "s42", "s43", "s44", "s45", "s46", "s47",
2182 "s48", "s49", "s50", "s51", "s52", "s53", "s54", "s55",
2183 "s56", "s57", "s58", "s59", "s60", "s61", "s62", "s63",
2184 "s64", "s65", "s66", "s67", "s68", "s69", "s70", "s71",
2185 "s72", "s73", "s74", "s75", "s76", "s77", "s78", "s79",
2186 "s80", "s81", "s82", "s83", "s84", "s85", "s86", "s87",
2187 "s88", "s89", "s90", "s91", "s92", "s93", "s94", "s95",
2188 "s96", "s97", "s98", "s99", "s100", "s101", "s102", "s103",
2189 "s104", "s105", "s106", "s107", "s108", "s109", "s110", "s111",
2190 "s112", "s113", "s114", "s115", "s116", "s117", "s118", "s119",
Etienne Bergerone8ae26f2016-03-24 18:29:24 +00002191 "s120", "s121", "s122", "s123", "s124", "s125", "s126", "s127",
Matt Arsenaultb015d622016-02-27 09:06:22 +00002192 "exec", "vcc", "scc", "m0", "flat_scratch", "exec_lo", "exec_hi",
2193 "vcc_lo", "vcc_hi", "flat_scratch_lo", "flat_scratch_hi"
Tom Stellard7b1059b2015-04-14 14:36:56 +00002194};
2195
Craig Topperf054e3a2015-10-19 03:52:27 +00002196ArrayRef<const char *> AMDGPUTargetInfo::getGCCRegNames() const {
2197 return llvm::makeArrayRef(GCCRegNames);
Tom Stellard7b1059b2015-04-14 14:36:56 +00002198}
Matt Arsenault56f008d2014-06-24 20:45:01 +00002199
Eli Friedman3fd920a2008-08-20 02:34:37 +00002200// Namespace for x86 abstract base class
2201const Builtin::Info BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00002202#define BUILTIN(ID, TYPE, ATTRS) \
2203 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002204#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
Craig Topper07d3b622015-08-07 05:14:44 +00002205 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002206#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
Craig Topper07d3b622015-08-07 05:14:44 +00002207 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Chris Lattner5abdec72009-06-14 01:05:48 +00002208#include "clang/Basic/BuiltinsX86.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00002209};
Eli Friedmanb5366062008-05-20 14:21:01 +00002210
Nuno Lopescfca1f02009-12-23 17:49:57 +00002211static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002212 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
2213 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00002214 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002215 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
2216 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
2217 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00002218 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00002219 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
2220 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Marina Yatsina41c45fa2016-02-03 11:32:08 +00002221 "xmm16", "xmm17", "xmm18", "xmm19", "xmm20", "xmm21", "xmm22", "xmm23",
2222 "xmm24", "xmm25", "xmm26", "xmm27", "xmm28", "xmm29", "xmm30", "xmm31",
2223 "ymm16", "ymm17", "ymm18", "ymm19", "ymm20", "ymm21", "ymm22", "ymm23",
2224 "ymm24", "ymm25", "ymm26", "ymm27", "ymm28", "ymm29", "ymm30", "ymm31",
2225 "zmm0", "zmm1", "zmm2", "zmm3", "zmm4", "zmm5", "zmm6", "zmm7",
2226 "zmm8", "zmm9", "zmm10", "zmm11", "zmm12", "zmm13", "zmm14", "zmm15",
2227 "zmm16", "zmm17", "zmm18", "zmm19", "zmm20", "zmm21", "zmm22", "zmm23",
2228 "zmm24", "zmm25", "zmm26", "zmm27", "zmm28", "zmm29", "zmm30", "zmm31",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002229};
2230
Eric Christophercdd36352011-06-21 00:05:20 +00002231const TargetInfo::AddlRegName AddlRegNames[] = {
2232 { { "al", "ah", "eax", "rax" }, 0 },
2233 { { "bl", "bh", "ebx", "rbx" }, 3 },
2234 { { "cl", "ch", "ecx", "rcx" }, 2 },
2235 { { "dl", "dh", "edx", "rdx" }, 1 },
2236 { { "esi", "rsi" }, 4 },
2237 { { "edi", "rdi" }, 5 },
2238 { { "esp", "rsp" }, 7 },
2239 { { "ebp", "rbp" }, 6 },
Alexey Bataeva7ab1b42015-09-04 03:42:23 +00002240 { { "r8d", "r8w", "r8b" }, 38 },
2241 { { "r9d", "r9w", "r9b" }, 39 },
2242 { { "r10d", "r10w", "r10b" }, 40 },
2243 { { "r11d", "r11w", "r11b" }, 41 },
2244 { { "r12d", "r12w", "r12b" }, 42 },
2245 { { "r13d", "r13w", "r13b" }, 43 },
2246 { { "r14d", "r14w", "r14b" }, 44 },
2247 { { "r15d", "r15w", "r15b" }, 45 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00002248};
2249
2250// X86 target abstract base class; x86-32 and x86-64 are very close, so
2251// most of the implementation can be shared.
2252class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00002253 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002254 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Craig Topper543f3bd2015-10-14 23:47:57 +00002255 } SSELevel = NoSSE;
Eli Friedman33465822011-07-08 23:31:17 +00002256 enum MMX3DNowEnum {
2257 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
Craig Topper543f3bd2015-10-14 23:47:57 +00002258 } MMX3DNowLevel = NoMMX3DNow;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002259 enum XOPEnum {
2260 NoXOP,
2261 SSE4A,
2262 FMA4,
2263 XOP
Craig Topper543f3bd2015-10-14 23:47:57 +00002264 } XOPLevel = NoXOP;
Anders Carlssone437c682010-01-27 03:47:49 +00002265
Craig Topper543f3bd2015-10-14 23:47:57 +00002266 bool HasAES = false;
2267 bool HasPCLMUL = false;
2268 bool HasLZCNT = false;
2269 bool HasRDRND = false;
2270 bool HasFSGSBASE = false;
2271 bool HasBMI = false;
2272 bool HasBMI2 = false;
2273 bool HasPOPCNT = false;
2274 bool HasRTM = false;
2275 bool HasPRFCHW = false;
2276 bool HasRDSEED = false;
2277 bool HasADX = false;
2278 bool HasTBM = false;
2279 bool HasFMA = false;
2280 bool HasF16C = false;
2281 bool HasAVX512CD = false;
2282 bool HasAVX512ER = false;
2283 bool HasAVX512PF = false;
2284 bool HasAVX512DQ = false;
2285 bool HasAVX512BW = false;
2286 bool HasAVX512VL = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002287 bool HasAVX512VBMI = false;
2288 bool HasAVX512IFMA = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002289 bool HasSHA = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002290 bool HasMPX = false;
2291 bool HasSGX = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002292 bool HasCX16 = false;
Craig Toppere33f51f2015-10-16 06:22:36 +00002293 bool HasFXSR = false;
Craig Topperda9fe562015-10-15 05:23:38 +00002294 bool HasXSAVE = false;
2295 bool HasXSAVEOPT = false;
2296 bool HasXSAVEC = false;
2297 bool HasXSAVES = false;
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00002298 bool HasMWAITX = false;
Asaf Badouha9d1e182015-12-31 14:14:07 +00002299 bool HasPKU = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002300 bool HasCLFLUSHOPT = false;
2301 bool HasPCOMMIT = false;
2302 bool HasCLWB = false;
2303 bool HasUMIP = false;
2304 bool HasMOVBE = false;
2305 bool HasPREFETCHWT1 = false;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00002306
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002307 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
2308 ///
2309 /// Each enumeration represents a particular CPU supported by Clang. These
2310 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
2311 enum CPUKind {
2312 CK_Generic,
2313
2314 /// \name i386
2315 /// i386-generation processors.
2316 //@{
2317 CK_i386,
2318 //@}
2319
2320 /// \name i486
2321 /// i486-generation processors.
2322 //@{
2323 CK_i486,
2324 CK_WinChipC6,
2325 CK_WinChip2,
2326 CK_C3,
2327 //@}
2328
2329 /// \name i586
2330 /// i586-generation processors, P5 microarchitecture based.
2331 //@{
2332 CK_i586,
2333 CK_Pentium,
2334 CK_PentiumMMX,
2335 //@}
2336
2337 /// \name i686
2338 /// i686-generation processors, P6 / Pentium M microarchitecture based.
2339 //@{
2340 CK_i686,
2341 CK_PentiumPro,
2342 CK_Pentium2,
2343 CK_Pentium3,
2344 CK_Pentium3M,
2345 CK_PentiumM,
2346 CK_C3_2,
2347
2348 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
2349 /// Clang however has some logic to suport this.
2350 // FIXME: Warn, deprecate, and potentially remove this.
2351 CK_Yonah,
2352 //@}
2353
2354 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00002355 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002356 //@{
2357 CK_Pentium4,
2358 CK_Pentium4M,
2359 CK_Prescott,
2360 CK_Nocona,
2361 //@}
2362
2363 /// \name Core
2364 /// Core microarchitecture based processors.
2365 //@{
2366 CK_Core2,
2367
2368 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
2369 /// codename which GCC no longer accepts as an option to -march, but Clang
2370 /// has some logic for recognizing it.
2371 // FIXME: Warn, deprecate, and potentially remove this.
2372 CK_Penryn,
2373 //@}
2374
2375 /// \name Atom
2376 /// Atom processors
2377 //@{
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002378 CK_Bonnell,
Preston Gurda3c58c02013-09-13 19:27:17 +00002379 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002380 //@}
2381
2382 /// \name Nehalem
2383 /// Nehalem microarchitecture based processors.
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002384 CK_Nehalem,
2385
2386 /// \name Westmere
2387 /// Westmere microarchitecture based processors.
2388 CK_Westmere,
2389
2390 /// \name Sandy Bridge
2391 /// Sandy Bridge microarchitecture based processors.
2392 CK_SandyBridge,
2393
2394 /// \name Ivy Bridge
2395 /// Ivy Bridge microarchitecture based processors.
2396 CK_IvyBridge,
2397
2398 /// \name Haswell
2399 /// Haswell microarchitecture based processors.
2400 CK_Haswell,
2401
2402 /// \name Broadwell
2403 /// Broadwell microarchitecture based processors.
Robert Khasanov50e6f582014-09-19 09:53:48 +00002404 CK_Broadwell,
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002405
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002406 /// \name Skylake Client
2407 /// Skylake client microarchitecture based processors.
2408 CK_SkylakeClient,
2409
2410 /// \name Skylake Server
2411 /// Skylake server microarchitecture based processors.
2412 CK_SkylakeServer,
2413
2414 /// \name Cannonlake Client
2415 /// Cannonlake client microarchitecture based processors.
2416 CK_Cannonlake,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002417
Craig Topper449314e2013-08-20 07:09:39 +00002418 /// \name Knights Landing
2419 /// Knights Landing processor.
2420 CK_KNL,
2421
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002422 /// \name Lakemont
2423 /// Lakemont microarchitecture based processors.
2424 CK_Lakemont,
2425
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002426 /// \name K6
2427 /// K6 architecture processors.
2428 //@{
2429 CK_K6,
2430 CK_K6_2,
2431 CK_K6_3,
2432 //@}
2433
2434 /// \name K7
2435 /// K7 architecture processors.
2436 //@{
2437 CK_Athlon,
2438 CK_AthlonThunderbird,
2439 CK_Athlon4,
2440 CK_AthlonXP,
2441 CK_AthlonMP,
2442 //@}
2443
2444 /// \name K8
2445 /// K8 architecture processors.
2446 //@{
2447 CK_Athlon64,
2448 CK_Athlon64SSE3,
2449 CK_AthlonFX,
2450 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00002451 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002452 CK_Opteron,
2453 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00002454 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002455 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002456
Benjamin Kramer569f2152012-01-10 11:50:18 +00002457 /// \name Bobcat
2458 /// Bobcat architecture processors.
2459 //@{
2460 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002461 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002462 //@}
2463
2464 /// \name Bulldozer
2465 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002466 //@{
2467 CK_BDVER1,
2468 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002469 CK_BDVER3,
Benjamin Kramer56c58222014-05-02 15:47:51 +00002470 CK_BDVER4,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002471 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002472
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002473 /// This specification is deprecated and will be removed in the future.
2474 /// Users should prefer \see CK_K8.
2475 // FIXME: Warn on this when the CPU is set to it.
Saleem Abdulrasoolcb29c1a2014-11-17 18:40:15 +00002476 //@{
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002477 CK_x86_64,
2478 //@}
2479
2480 /// \name Geode
2481 /// Geode processors.
2482 //@{
2483 CK_Geode
2484 //@}
Craig Topper543f3bd2015-10-14 23:47:57 +00002485 } CPU = CK_Generic;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002486
Eric Christopherc50738f2015-08-27 00:05:50 +00002487 CPUKind getCPUKind(StringRef CPU) const {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002488 return llvm::StringSwitch<CPUKind>(CPU)
2489 .Case("i386", CK_i386)
2490 .Case("i486", CK_i486)
2491 .Case("winchip-c6", CK_WinChipC6)
2492 .Case("winchip2", CK_WinChip2)
2493 .Case("c3", CK_C3)
2494 .Case("i586", CK_i586)
2495 .Case("pentium", CK_Pentium)
2496 .Case("pentium-mmx", CK_PentiumMMX)
2497 .Case("i686", CK_i686)
2498 .Case("pentiumpro", CK_PentiumPro)
2499 .Case("pentium2", CK_Pentium2)
2500 .Case("pentium3", CK_Pentium3)
2501 .Case("pentium3m", CK_Pentium3M)
2502 .Case("pentium-m", CK_PentiumM)
2503 .Case("c3-2", CK_C3_2)
2504 .Case("yonah", CK_Yonah)
2505 .Case("pentium4", CK_Pentium4)
2506 .Case("pentium4m", CK_Pentium4M)
2507 .Case("prescott", CK_Prescott)
2508 .Case("nocona", CK_Nocona)
2509 .Case("core2", CK_Core2)
2510 .Case("penryn", CK_Penryn)
2511 .Case("bonnell", CK_Bonnell)
2512 .Case("atom", CK_Bonnell) // Legacy name.
2513 .Case("silvermont", CK_Silvermont)
2514 .Case("slm", CK_Silvermont) // Legacy name.
2515 .Case("nehalem", CK_Nehalem)
2516 .Case("corei7", CK_Nehalem) // Legacy name.
2517 .Case("westmere", CK_Westmere)
2518 .Case("sandybridge", CK_SandyBridge)
2519 .Case("corei7-avx", CK_SandyBridge) // Legacy name.
2520 .Case("ivybridge", CK_IvyBridge)
2521 .Case("core-avx-i", CK_IvyBridge) // Legacy name.
2522 .Case("haswell", CK_Haswell)
2523 .Case("core-avx2", CK_Haswell) // Legacy name.
2524 .Case("broadwell", CK_Broadwell)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002525 .Case("skylake", CK_SkylakeClient)
2526 .Case("skylake-avx512", CK_SkylakeServer)
2527 .Case("skx", CK_SkylakeServer) // Legacy name.
2528 .Case("cannonlake", CK_Cannonlake)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002529 .Case("knl", CK_KNL)
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002530 .Case("lakemont", CK_Lakemont)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002531 .Case("k6", CK_K6)
2532 .Case("k6-2", CK_K6_2)
2533 .Case("k6-3", CK_K6_3)
2534 .Case("athlon", CK_Athlon)
2535 .Case("athlon-tbird", CK_AthlonThunderbird)
2536 .Case("athlon-4", CK_Athlon4)
2537 .Case("athlon-xp", CK_AthlonXP)
2538 .Case("athlon-mp", CK_AthlonMP)
2539 .Case("athlon64", CK_Athlon64)
2540 .Case("athlon64-sse3", CK_Athlon64SSE3)
2541 .Case("athlon-fx", CK_AthlonFX)
2542 .Case("k8", CK_K8)
2543 .Case("k8-sse3", CK_K8SSE3)
2544 .Case("opteron", CK_Opteron)
2545 .Case("opteron-sse3", CK_OpteronSSE3)
2546 .Case("barcelona", CK_AMDFAM10)
2547 .Case("amdfam10", CK_AMDFAM10)
2548 .Case("btver1", CK_BTVER1)
2549 .Case("btver2", CK_BTVER2)
2550 .Case("bdver1", CK_BDVER1)
2551 .Case("bdver2", CK_BDVER2)
2552 .Case("bdver3", CK_BDVER3)
2553 .Case("bdver4", CK_BDVER4)
2554 .Case("x86-64", CK_x86_64)
2555 .Case("geode", CK_Geode)
2556 .Default(CK_Generic);
2557 }
2558
Rafael Espindolaeb265472013-08-21 21:59:03 +00002559 enum FPMathKind {
2560 FP_Default,
2561 FP_SSE,
2562 FP_387
Craig Topper543f3bd2015-10-14 23:47:57 +00002563 } FPMath = FP_Default;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002564
Eli Friedman3fd920a2008-08-20 02:34:37 +00002565public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00002566 X86TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
2567 : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00002568 BigEndian = false;
Andrey Bokhanko94e1d582015-11-05 12:43:09 +00002569 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00002570 }
Craig Topper3164f332014-03-11 03:39:26 +00002571 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00002572 // X87 evaluates with 80 bits "long double" precision.
2573 return SSELevel == NoSSE ? 2 : 0;
2574 }
Craig Topper6c03a542015-10-19 04:51:35 +00002575 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
2576 return llvm::makeArrayRef(BuiltinInfo,
2577 clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner10a5b382007-01-29 05:24:35 +00002578 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002579 ArrayRef<const char *> getGCCRegNames() const override {
2580 return llvm::makeArrayRef(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00002581 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002582 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
2583 return None;
Eric Christophercdd36352011-06-21 00:05:20 +00002584 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002585 ArrayRef<TargetInfo::AddlRegName> getGCCAddlRegNames() const override {
2586 return llvm::makeArrayRef(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00002587 }
Eric Christopherd9832702015-06-29 21:00:05 +00002588 bool validateCpuSupports(StringRef Name) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002589 bool validateAsmConstraint(const char *&Name,
Eric Christopher917e9522014-11-18 22:36:15 +00002590 TargetInfo::ConstraintInfo &info) const override;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002591
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00002592 bool validateGlobalRegisterVariable(StringRef RegName,
2593 unsigned RegSize,
2594 bool &HasSizeMismatch) const override {
2595 // esp and ebp are the only 32-bit registers the x86 backend can currently
2596 // handle.
2597 if (RegName.equals("esp") || RegName.equals("ebp")) {
2598 // Check that the register size is 32-bit.
2599 HasSizeMismatch = RegSize != 32;
2600 return true;
2601 }
2602
2603 return false;
2604 }
2605
Akira Hatanaka974131e2014-09-18 18:17:18 +00002606 bool validateOutputSize(StringRef Constraint, unsigned Size) const override;
2607
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002608 bool validateInputSize(StringRef Constraint, unsigned Size) const override;
2609
Akira Hatanaka974131e2014-09-18 18:17:18 +00002610 virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const;
2611
Craig Topper3164f332014-03-11 03:39:26 +00002612 std::string convertConstraint(const char *&Constraint) const override;
2613 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002614 return "~{dirflag},~{fpsr},~{flags}";
2615 }
Craig Topper3164f332014-03-11 03:39:26 +00002616 void getTargetDefines(const LangOptions &Opts,
2617 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00002618 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
2619 bool Enabled);
2620 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
2621 bool Enabled);
2622 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
2623 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002624 void setFeatureEnabled(llvm::StringMap<bool> &Features,
2625 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00002626 setFeatureEnabledImpl(Features, Name, Enabled);
2627 }
2628 // This exists purely to cut down on the number of virtual calls in
Eric Christopheref1e2952015-08-28 02:13:58 +00002629 // initFeatureMap which calls this repeatedly.
Craig Topper86d79ef2013-09-17 04:51:29 +00002630 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2631 StringRef Name, bool Enabled);
Eric Christopher8c47b422015-10-09 18:39:55 +00002632 bool
2633 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
2634 StringRef CPU,
2635 const std::vector<std::string> &FeaturesVec) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002636 bool hasFeature(StringRef Feature) const override;
2637 bool handleTargetFeatures(std::vector<std::string> &Features,
2638 DiagnosticsEngine &Diags) override;
Alp Toker4925ba72014-06-07 23:30:42 +00002639 StringRef getABI() const override {
Ahmed Bougacha0b938282015-06-22 21:31:43 +00002640 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX512F)
2641 return "avx512";
Craig Topperd945d502015-10-20 00:00:17 +00002642 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002643 return "avx";
Craig Topperd945d502015-10-20 00:00:17 +00002644 if (getTriple().getArch() == llvm::Triple::x86 &&
Derek Schuffc7dd7222012-10-11 15:52:22 +00002645 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002646 return "no-mmx";
2647 return "";
Eli Friedman33465822011-07-08 23:31:17 +00002648 }
Craig Topper3164f332014-03-11 03:39:26 +00002649 bool setCPU(const std::string &Name) override {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002650 CPU = getCPUKind(Name);
Chandler Carruth212334f2011-09-28 08:55:37 +00002651
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002652 // Perform any per-CPU checks necessary to determine if this CPU is
2653 // acceptable.
2654 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
2655 // invalid without explaining *why*.
2656 switch (CPU) {
2657 case CK_Generic:
2658 // No processor selected!
2659 return false;
2660
2661 case CK_i386:
2662 case CK_i486:
2663 case CK_WinChipC6:
2664 case CK_WinChip2:
2665 case CK_C3:
2666 case CK_i586:
2667 case CK_Pentium:
2668 case CK_PentiumMMX:
2669 case CK_i686:
2670 case CK_PentiumPro:
2671 case CK_Pentium2:
2672 case CK_Pentium3:
2673 case CK_Pentium3M:
2674 case CK_PentiumM:
2675 case CK_Yonah:
2676 case CK_C3_2:
2677 case CK_Pentium4:
2678 case CK_Pentium4M:
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002679 case CK_Lakemont:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002680 case CK_Prescott:
2681 case CK_K6:
2682 case CK_K6_2:
2683 case CK_K6_3:
2684 case CK_Athlon:
2685 case CK_AthlonThunderbird:
2686 case CK_Athlon4:
2687 case CK_AthlonXP:
2688 case CK_AthlonMP:
2689 case CK_Geode:
2690 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002691 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002692 return false;
2693
2694 // Fallthrough
2695 case CK_Nocona:
2696 case CK_Core2:
2697 case CK_Penryn:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002698 case CK_Bonnell:
Preston Gurda3c58c02013-09-13 19:27:17 +00002699 case CK_Silvermont:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002700 case CK_Nehalem:
2701 case CK_Westmere:
2702 case CK_SandyBridge:
2703 case CK_IvyBridge:
2704 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002705 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002706 case CK_SkylakeClient:
2707 case CK_SkylakeServer:
2708 case CK_Cannonlake:
Craig Topper449314e2013-08-20 07:09:39 +00002709 case CK_KNL:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002710 case CK_Athlon64:
2711 case CK_Athlon64SSE3:
2712 case CK_AthlonFX:
2713 case CK_K8:
2714 case CK_K8SSE3:
2715 case CK_Opteron:
2716 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00002717 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00002718 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002719 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002720 case CK_BDVER1:
2721 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002722 case CK_BDVER3:
Benjamin Kramer56c58222014-05-02 15:47:51 +00002723 case CK_BDVER4:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002724 case CK_x86_64:
2725 return true;
2726 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00002727 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002728 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002729
Craig Topper3164f332014-03-11 03:39:26 +00002730 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002731
Craig Topper3164f332014-03-11 03:39:26 +00002732 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00002733 // Most of the non-ARM calling conventions are i386 conventions.
2734 switch (CC) {
2735 case CC_X86ThisCall:
2736 case CC_X86FastCall:
2737 case CC_X86StdCall:
2738 case CC_X86VectorCall:
2739 case CC_C:
2740 case CC_Swift:
2741 case CC_X86Pascal:
2742 case CC_IntelOclBicc:
2743 return CCCR_OK;
2744 default:
2745 return CCCR_Warning;
2746 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002747 }
2748
Craig Topper3164f332014-03-11 03:39:26 +00002749 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00002750 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002751 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00002752
2753 bool hasSjLjLowering() const override {
2754 return true;
2755 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002756
2757 void setSupportedOpenCLOpts() override {
2758 getSupportedOpenCLOpts().setAll();
2759 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00002760};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002761
Rafael Espindolaeb265472013-08-21 21:59:03 +00002762bool X86TargetInfo::setFPMath(StringRef Name) {
2763 if (Name == "387") {
2764 FPMath = FP_387;
2765 return true;
2766 }
2767 if (Name == "sse") {
2768 FPMath = FP_SSE;
2769 return true;
2770 }
2771 return false;
2772}
2773
Eric Christopher007b0a02015-08-28 22:32:01 +00002774bool X86TargetInfo::initFeatureMap(
2775 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
Eric Christopher8c47b422015-10-09 18:39:55 +00002776 const std::vector<std::string> &FeaturesVec) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002777 // FIXME: This *really* should not be here.
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002778 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002779 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00002780 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002781
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002782 const CPUKind Kind = getCPUKind(CPU);
Andrey Turetskiy5f1cf5f2016-03-23 11:15:10 +00002783
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002784 // Enable X87 for all X86 processors but Lakemont.
2785 if (Kind != CK_Lakemont)
2786 setFeatureEnabledImpl(Features, "x87", true);
2787
2788 switch (Kind) {
Chandler Carruth212334f2011-09-28 08:55:37 +00002789 case CK_Generic:
2790 case CK_i386:
2791 case CK_i486:
2792 case CK_i586:
2793 case CK_Pentium:
2794 case CK_i686:
2795 case CK_PentiumPro:
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002796 case CK_Lakemont:
Chandler Carruth212334f2011-09-28 08:55:37 +00002797 break;
2798 case CK_PentiumMMX:
2799 case CK_Pentium2:
Craig Topperdb4dc082014-11-06 05:52:19 +00002800 case CK_K6:
2801 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00002802 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002803 break;
2804 case CK_Pentium3:
2805 case CK_Pentium3M:
Craig Topperdb4dc082014-11-06 05:52:19 +00002806 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002807 setFeatureEnabledImpl(Features, "sse", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002808 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002809 break;
2810 case CK_PentiumM:
2811 case CK_Pentium4:
2812 case CK_Pentium4M:
2813 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00002814 setFeatureEnabledImpl(Features, "sse2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002815 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002816 break;
2817 case CK_Yonah:
2818 case CK_Prescott:
2819 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00002820 setFeatureEnabledImpl(Features, "sse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002821 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002822 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002823 break;
2824 case CK_Core2:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002825 case CK_Bonnell:
Craig Topper86d79ef2013-09-17 04:51:29 +00002826 setFeatureEnabledImpl(Features, "ssse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002827 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002828 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002829 break;
2830 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00002831 setFeatureEnabledImpl(Features, "sse4.1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002832 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002833 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002834 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002835 case CK_Cannonlake:
2836 setFeatureEnabledImpl(Features, "avx512ifma", true);
2837 setFeatureEnabledImpl(Features, "avx512vbmi", true);
2838 setFeatureEnabledImpl(Features, "sha", true);
2839 setFeatureEnabledImpl(Features, "umip", true);
2840 // FALLTHROUGH
2841 case CK_SkylakeServer:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002842 setFeatureEnabledImpl(Features, "avx512f", true);
2843 setFeatureEnabledImpl(Features, "avx512cd", true);
2844 setFeatureEnabledImpl(Features, "avx512dq", true);
2845 setFeatureEnabledImpl(Features, "avx512bw", true);
2846 setFeatureEnabledImpl(Features, "avx512vl", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002847 setFeatureEnabledImpl(Features, "pku", true);
2848 setFeatureEnabledImpl(Features, "pcommit", true);
2849 setFeatureEnabledImpl(Features, "clwb", true);
2850 // FALLTHROUGH
2851 case CK_SkylakeClient:
Craig Topperda9fe562015-10-15 05:23:38 +00002852 setFeatureEnabledImpl(Features, "xsavec", true);
2853 setFeatureEnabledImpl(Features, "xsaves", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002854 setFeatureEnabledImpl(Features, "mpx", true);
2855 setFeatureEnabledImpl(Features, "sgx", true);
2856 setFeatureEnabledImpl(Features, "clflushopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002857 // FALLTHROUGH
2858 case CK_Broadwell:
2859 setFeatureEnabledImpl(Features, "rdseed", true);
2860 setFeatureEnabledImpl(Features, "adx", true);
2861 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002862 case CK_Haswell:
Craig Topperdb4dc082014-11-06 05:52:19 +00002863 setFeatureEnabledImpl(Features, "avx2", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002864 setFeatureEnabledImpl(Features, "lzcnt", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002865 setFeatureEnabledImpl(Features, "bmi", true);
2866 setFeatureEnabledImpl(Features, "bmi2", true);
2867 setFeatureEnabledImpl(Features, "rtm", true);
2868 setFeatureEnabledImpl(Features, "fma", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002869 setFeatureEnabledImpl(Features, "movbe", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002870 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002871 case CK_IvyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002872 setFeatureEnabledImpl(Features, "rdrnd", true);
2873 setFeatureEnabledImpl(Features, "f16c", true);
2874 setFeatureEnabledImpl(Features, "fsgsbase", true);
2875 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002876 case CK_SandyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002877 setFeatureEnabledImpl(Features, "avx", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002878 setFeatureEnabledImpl(Features, "xsave", true);
2879 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002880 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002881 case CK_Westmere:
Craig Topperdb4dc082014-11-06 05:52:19 +00002882 case CK_Silvermont:
2883 setFeatureEnabledImpl(Features, "aes", true);
2884 setFeatureEnabledImpl(Features, "pclmul", true);
2885 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002886 case CK_Nehalem:
Craig Topperdb4dc082014-11-06 05:52:19 +00002887 setFeatureEnabledImpl(Features, "sse4.2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002888 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002889 setFeatureEnabledImpl(Features, "cx16", true);
2890 break;
2891 case CK_KNL:
2892 setFeatureEnabledImpl(Features, "avx512f", true);
2893 setFeatureEnabledImpl(Features, "avx512cd", true);
2894 setFeatureEnabledImpl(Features, "avx512er", true);
2895 setFeatureEnabledImpl(Features, "avx512pf", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002896 setFeatureEnabledImpl(Features, "prefetchwt1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002897 setFeatureEnabledImpl(Features, "fxsr", true);
Robert Khasanov50e6f582014-09-19 09:53:48 +00002898 setFeatureEnabledImpl(Features, "rdseed", true);
2899 setFeatureEnabledImpl(Features, "adx", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002900 setFeatureEnabledImpl(Features, "lzcnt", true);
2901 setFeatureEnabledImpl(Features, "bmi", true);
2902 setFeatureEnabledImpl(Features, "bmi2", true);
2903 setFeatureEnabledImpl(Features, "rtm", true);
2904 setFeatureEnabledImpl(Features, "fma", true);
2905 setFeatureEnabledImpl(Features, "rdrnd", true);
2906 setFeatureEnabledImpl(Features, "f16c", true);
2907 setFeatureEnabledImpl(Features, "fsgsbase", true);
2908 setFeatureEnabledImpl(Features, "aes", true);
2909 setFeatureEnabledImpl(Features, "pclmul", true);
2910 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002911 setFeatureEnabledImpl(Features, "xsaveopt", true);
2912 setFeatureEnabledImpl(Features, "xsave", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002913 setFeatureEnabledImpl(Features, "movbe", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002914 break;
2915 case CK_K6_2:
2916 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00002917 case CK_WinChip2:
2918 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002919 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002920 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002921 case CK_Athlon:
2922 case CK_AthlonThunderbird:
2923 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00002924 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002925 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002926 case CK_Athlon4:
2927 case CK_AthlonXP:
2928 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00002929 setFeatureEnabledImpl(Features, "sse", true);
2930 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002931 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002932 break;
2933 case CK_K8:
2934 case CK_Opteron:
2935 case CK_Athlon64:
2936 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00002937 setFeatureEnabledImpl(Features, "sse2", true);
2938 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002939 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002940 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002941 case CK_AMDFAM10:
2942 setFeatureEnabledImpl(Features, "sse4a", true);
2943 setFeatureEnabledImpl(Features, "lzcnt", true);
2944 setFeatureEnabledImpl(Features, "popcnt", true);
2945 // FALLTHROUGH
Chandler Carruth212334f2011-09-28 08:55:37 +00002946 case CK_K8SSE3:
2947 case CK_OpteronSSE3:
2948 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002949 setFeatureEnabledImpl(Features, "sse3", true);
2950 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002951 setFeatureEnabledImpl(Features, "fxsr", true);
Roman Divackyce253d82011-10-30 13:47:56 +00002952 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002953 case CK_BTVER2:
2954 setFeatureEnabledImpl(Features, "avx", true);
2955 setFeatureEnabledImpl(Features, "aes", true);
2956 setFeatureEnabledImpl(Features, "pclmul", true);
2957 setFeatureEnabledImpl(Features, "bmi", true);
2958 setFeatureEnabledImpl(Features, "f16c", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002959 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002960 // FALLTHROUGH
Benjamin Kramer569f2152012-01-10 11:50:18 +00002961 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00002962 setFeatureEnabledImpl(Features, "ssse3", true);
2963 setFeatureEnabledImpl(Features, "sse4a", true);
2964 setFeatureEnabledImpl(Features, "lzcnt", true);
2965 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002966 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002967 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002968 setFeatureEnabledImpl(Features, "fxsr", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002969 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00002970 case CK_BDVER4:
2971 setFeatureEnabledImpl(Features, "avx2", true);
2972 setFeatureEnabledImpl(Features, "bmi2", true);
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00002973 setFeatureEnabledImpl(Features, "mwaitx", true);
Benjamin Kramer56c58222014-05-02 15:47:51 +00002974 // FALLTHROUGH
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002975 case CK_BDVER3:
Craig Topper8c7f2512014-11-03 06:51:41 +00002976 setFeatureEnabledImpl(Features, "fsgsbase", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002977 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topper8c7f2512014-11-03 06:51:41 +00002978 // FALLTHROUGH
2979 case CK_BDVER2:
Andrea Di Biagio9760a442014-11-06 12:08:57 +00002980 setFeatureEnabledImpl(Features, "bmi", true);
2981 setFeatureEnabledImpl(Features, "fma", true);
2982 setFeatureEnabledImpl(Features, "f16c", true);
2983 setFeatureEnabledImpl(Features, "tbm", true);
2984 // FALLTHROUGH
2985 case CK_BDVER1:
2986 // xop implies avx, sse4a and fma4.
Craig Topper86d79ef2013-09-17 04:51:29 +00002987 setFeatureEnabledImpl(Features, "xop", true);
2988 setFeatureEnabledImpl(Features, "lzcnt", true);
2989 setFeatureEnabledImpl(Features, "aes", true);
2990 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002991 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002992 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002993 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002994 setFeatureEnabledImpl(Features, "xsave", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002995 break;
Eli Friedman33465822011-07-08 23:31:17 +00002996 }
Eric Christopherbbd746d2015-10-08 20:10:14 +00002997 if (!TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec))
2998 return false;
2999
3000 // Can't do this earlier because we need to be able to explicitly enable
3001 // or disable these features and the things that they depend upon.
3002
3003 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
3004 auto I = Features.find("sse4.2");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003005 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00003006 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-popcnt") ==
3007 FeaturesVec.end())
3008 Features["popcnt"] = true;
3009
3010 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
3011 I = Features.find("3dnow");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003012 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00003013 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-prfchw") ==
3014 FeaturesVec.end())
3015 Features["prfchw"] = true;
3016
Eric Christophera7260af2015-10-08 20:10:18 +00003017 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
3018 // then enable MMX.
3019 I = Features.find("sse");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003020 if (I != Features.end() && I->getValue() &&
Eric Christophera7260af2015-10-08 20:10:18 +00003021 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-mmx") ==
3022 FeaturesVec.end())
3023 Features["mmx"] = true;
3024
Eric Christopherbbd746d2015-10-08 20:10:14 +00003025 return true;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003026}
3027
Rafael Espindolae62e2792013-08-20 13:44:29 +00003028void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00003029 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003030 if (Enabled) {
3031 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003032 case AVX512F:
3033 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003034 case AVX2:
3035 Features["avx2"] = true;
3036 case AVX:
3037 Features["avx"] = true;
Craig Topperda9fe562015-10-15 05:23:38 +00003038 Features["xsave"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003039 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00003040 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003041 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00003042 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003043 case SSSE3:
3044 Features["ssse3"] = true;
3045 case SSE3:
3046 Features["sse3"] = true;
3047 case SSE2:
3048 Features["sse2"] = true;
3049 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00003050 Features["sse"] = true;
3051 case NoSSE:
3052 break;
3053 }
3054 return;
3055 }
3056
3057 switch (Level) {
3058 case NoSSE:
3059 case SSE1:
3060 Features["sse"] = false;
3061 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00003062 Features["sse2"] = Features["pclmul"] = Features["aes"] =
3063 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003064 case SSE3:
3065 Features["sse3"] = false;
3066 setXOPLevel(Features, NoXOP, false);
3067 case SSSE3:
3068 Features["ssse3"] = false;
3069 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00003070 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003071 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00003072 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003073 case AVX:
Craig Topperda9fe562015-10-15 05:23:38 +00003074 Features["fma"] = Features["avx"] = Features["f16c"] = Features["xsave"] =
3075 Features["xsaveopt"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00003076 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003077 case AVX2:
3078 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00003079 case AVX512F:
Eric Christopher917e9522014-11-18 22:36:15 +00003080 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
Craig Toppera31a5da2014-12-27 06:59:37 +00003081 Features["avx512pf"] = Features["avx512dq"] = Features["avx512bw"] =
Craig Topperb4f83a02016-02-29 06:51:38 +00003082 Features["avx512vl"] = Features["avx512vbmi"] =
3083 Features["avx512ifma"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003084 }
3085}
3086
3087void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00003088 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003089 if (Enabled) {
3090 switch (Level) {
3091 case AMD3DNowAthlon:
3092 Features["3dnowa"] = true;
3093 case AMD3DNow:
3094 Features["3dnow"] = true;
3095 case MMX:
3096 Features["mmx"] = true;
3097 case NoMMX3DNow:
3098 break;
3099 }
3100 return;
3101 }
3102
3103 switch (Level) {
3104 case NoMMX3DNow:
3105 case MMX:
3106 Features["mmx"] = false;
3107 case AMD3DNow:
3108 Features["3dnow"] = false;
3109 case AMD3DNowAthlon:
3110 Features["3dnowa"] = false;
3111 }
3112}
3113
3114void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00003115 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003116 if (Enabled) {
3117 switch (Level) {
3118 case XOP:
3119 Features["xop"] = true;
3120 case FMA4:
3121 Features["fma4"] = true;
3122 setSSELevel(Features, AVX, true);
3123 case SSE4A:
3124 Features["sse4a"] = true;
3125 setSSELevel(Features, SSE3, true);
3126 case NoXOP:
3127 break;
3128 }
3129 return;
3130 }
3131
3132 switch (Level) {
3133 case NoXOP:
3134 case SSE4A:
3135 Features["sse4a"] = false;
3136 case FMA4:
3137 Features["fma4"] = false;
3138 case XOP:
3139 Features["xop"] = false;
3140 }
3141}
3142
Craig Topper86d79ef2013-09-17 04:51:29 +00003143void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
3144 StringRef Name, bool Enabled) {
Eric Christopher298ac302015-07-01 00:08:32 +00003145 // This is a bit of a hack to deal with the sse4 target feature when used
3146 // as part of the target attribute. We handle sse4 correctly everywhere
3147 // else. See below for more information on how we handle the sse4 options.
3148 if (Name != "sse4")
3149 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00003150
Craig Topper29561122013-09-19 01:13:07 +00003151 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003152 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003153 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003154 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003155 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003156 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003157 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003158 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003159 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003160 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003161 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003162 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003163 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003164 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003165 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003166 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003167 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003168 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003169 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003170 if (Enabled)
3171 setSSELevel(Features, SSE2, Enabled);
3172 } else if (Name == "pclmul") {
3173 if (Enabled)
3174 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003175 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003176 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003177 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003178 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003179 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003180 setSSELevel(Features, AVX512F, Enabled);
Craig Topperb4f83a02016-02-29 06:51:38 +00003181 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf" ||
3182 Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl" ||
3183 Name == "avx512vbmi" || Name == "avx512ifma") {
Craig Topper679b53a2013-08-21 05:29:10 +00003184 if (Enabled)
3185 setSSELevel(Features, AVX512F, Enabled);
3186 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003187 if (Enabled)
3188 setSSELevel(Features, AVX, Enabled);
3189 } else if (Name == "fma4") {
3190 setXOPLevel(Features, FMA4, Enabled);
3191 } else if (Name == "xop") {
3192 setXOPLevel(Features, XOP, Enabled);
3193 } else if (Name == "sse4a") {
3194 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00003195 } else if (Name == "f16c") {
3196 if (Enabled)
3197 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00003198 } else if (Name == "sha") {
3199 if (Enabled)
3200 setSSELevel(Features, SSE2, Enabled);
Eric Christopher298ac302015-07-01 00:08:32 +00003201 } else if (Name == "sse4") {
3202 // We can get here via the __target__ attribute since that's not controlled
3203 // via the -msse4/-mno-sse4 command line alias. Handle this the same way
3204 // here - turn on the sse4.2 if enabled, turn off the sse4.1 level if
3205 // disabled.
3206 if (Enabled)
3207 setSSELevel(Features, SSE42, Enabled);
3208 else
3209 setSSELevel(Features, SSE41, Enabled);
Craig Topperda9fe562015-10-15 05:23:38 +00003210 } else if (Name == "xsave") {
Craig Topper840927e2016-02-29 06:51:34 +00003211 if (!Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003212 Features["xsaveopt"] = false;
3213 } else if (Name == "xsaveopt" || Name == "xsavec" || Name == "xsaves") {
Craig Topper840927e2016-02-29 06:51:34 +00003214 if (Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003215 Features["xsave"] = true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003216 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003217}
3218
Eric Christopher3ff21b32013-10-16 21:26:26 +00003219/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003220/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00003221bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00003222 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00003223 for (const auto &Feature : Features) {
3224 if (Feature[0] != '+')
Daniel Dunbar979586e2009-11-11 09:38:56 +00003225 continue;
3226
Eric Christopher610fe112015-08-26 08:21:55 +00003227 if (Feature == "+aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00003228 HasAES = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003229 } else if (Feature == "+pclmul") {
Craig Topper3f122a72012-05-31 05:18:48 +00003230 HasPCLMUL = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003231 } else if (Feature == "+lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00003232 HasLZCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003233 } else if (Feature == "+rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00003234 HasRDRND = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003235 } else if (Feature == "+fsgsbase") {
Craig Topper8c7f2512014-11-03 06:51:41 +00003236 HasFSGSBASE = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003237 } else if (Feature == "+bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00003238 HasBMI = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003239 } else if (Feature == "+bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00003240 HasBMI2 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003241 } else if (Feature == "+popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00003242 HasPOPCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003243 } else if (Feature == "+rtm") {
Michael Liao625a8752012-11-10 05:17:46 +00003244 HasRTM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003245 } else if (Feature == "+prfchw") {
Michael Liao74f4eaf2013-03-26 17:52:08 +00003246 HasPRFCHW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003247 } else if (Feature == "+rdseed") {
Michael Liaoffaae352013-03-29 05:17:55 +00003248 HasRDSEED = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003249 } else if (Feature == "+adx") {
Robert Khasanov50e6f582014-09-19 09:53:48 +00003250 HasADX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003251 } else if (Feature == "+tbm") {
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003252 HasTBM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003253 } else if (Feature == "+fma") {
Craig Topperbba778b2012-06-03 21:46:30 +00003254 HasFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003255 } else if (Feature == "+f16c") {
Manman Rena45358c2012-10-11 00:59:55 +00003256 HasF16C = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003257 } else if (Feature == "+avx512cd") {
Craig Topper679b53a2013-08-21 05:29:10 +00003258 HasAVX512CD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003259 } else if (Feature == "+avx512er") {
Craig Topper679b53a2013-08-21 05:29:10 +00003260 HasAVX512ER = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003261 } else if (Feature == "+avx512pf") {
Craig Topper679b53a2013-08-21 05:29:10 +00003262 HasAVX512PF = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003263 } else if (Feature == "+avx512dq") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003264 HasAVX512DQ = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003265 } else if (Feature == "+avx512bw") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003266 HasAVX512BW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003267 } else if (Feature == "+avx512vl") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003268 HasAVX512VL = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003269 } else if (Feature == "+avx512vbmi") {
3270 HasAVX512VBMI = true;
3271 } else if (Feature == "+avx512ifma") {
3272 HasAVX512IFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003273 } else if (Feature == "+sha") {
Ben Langmuir58078d02013-09-19 13:22:04 +00003274 HasSHA = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003275 } else if (Feature == "+mpx") {
3276 HasMPX = true;
3277 } else if (Feature == "+movbe") {
3278 HasMOVBE = true;
3279 } else if (Feature == "+sgx") {
3280 HasSGX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003281 } else if (Feature == "+cx16") {
Nick Lewycky50e8f482013-10-05 20:14:27 +00003282 HasCX16 = true;
Craig Toppere33f51f2015-10-16 06:22:36 +00003283 } else if (Feature == "+fxsr") {
3284 HasFXSR = true;
Craig Topperda9fe562015-10-15 05:23:38 +00003285 } else if (Feature == "+xsave") {
3286 HasXSAVE = true;
3287 } else if (Feature == "+xsaveopt") {
3288 HasXSAVEOPT = true;
3289 } else if (Feature == "+xsavec") {
3290 HasXSAVEC = true;
3291 } else if (Feature == "+xsaves") {
3292 HasXSAVES = true;
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003293 } else if (Feature == "+mwaitx") {
3294 HasMWAITX = true;
Asaf Badouha9d1e182015-12-31 14:14:07 +00003295 } else if (Feature == "+pku") {
3296 HasPKU = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003297 } else if (Feature == "+clflushopt") {
3298 HasCLFLUSHOPT = true;
3299 } else if (Feature == "+pcommit") {
3300 HasPCOMMIT = true;
3301 } else if (Feature == "+clwb") {
3302 HasCLWB = true;
3303 } else if (Feature == "+umip") {
3304 HasUMIP = true;
3305 } else if (Feature == "+prefetchwt1") {
3306 HasPREFETCHWT1 = true;
Nick Lewycky50e8f482013-10-05 20:14:27 +00003307 }
3308
Benjamin Kramer27402c62012-03-05 15:10:44 +00003309 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003310 .Case("+avx512f", AVX512F)
3311 .Case("+avx2", AVX2)
3312 .Case("+avx", AVX)
3313 .Case("+sse4.2", SSE42)
3314 .Case("+sse4.1", SSE41)
3315 .Case("+ssse3", SSSE3)
3316 .Case("+sse3", SSE3)
3317 .Case("+sse2", SSE2)
3318 .Case("+sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00003319 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003320 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003321
Eli Friedman33465822011-07-08 23:31:17 +00003322 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00003323 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003324 .Case("+3dnowa", AMD3DNowAthlon)
3325 .Case("+3dnow", AMD3DNow)
3326 .Case("+mmx", MMX)
Eli Friedman33465822011-07-08 23:31:17 +00003327 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00003328 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003329
3330 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003331 .Case("+xop", XOP)
3332 .Case("+fma4", FMA4)
3333 .Case("+sse4a", SSE4A)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003334 .Default(NoXOP);
3335 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003336 }
Eli Friedman33465822011-07-08 23:31:17 +00003337
Rafael Espindolaeb265472013-08-21 21:59:03 +00003338 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
3339 // matches the selected sse level.
Craig Topperd945d502015-10-20 00:00:17 +00003340 if ((FPMath == FP_SSE && SSELevel < SSE1) ||
3341 (FPMath == FP_387 && SSELevel >= SSE1)) {
3342 Diags.Report(diag::err_target_unsupported_fpmath) <<
3343 (FPMath == FP_SSE ? "sse" : "387");
Rafael Espindolaeb265472013-08-21 21:59:03 +00003344 return false;
3345 }
3346
Alexey Bataev00396512015-07-02 03:40:19 +00003347 SimdDefaultAlign =
Ahmed Bougacha68bf64e2015-08-27 22:24:56 +00003348 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Rafael Espindolaeb265472013-08-21 21:59:03 +00003349 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00003350}
Chris Lattnerecd49032009-03-02 22:27:17 +00003351
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003352/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
3353/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00003354void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003355 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00003356 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00003357 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003358 Builder.defineMacro("__amd64__");
3359 Builder.defineMacro("__amd64");
3360 Builder.defineMacro("__x86_64");
3361 Builder.defineMacro("__x86_64__");
Bob Wilsona2acb1e2014-08-08 23:46:28 +00003362 if (getTriple().getArchName() == "x86_64h") {
3363 Builder.defineMacro("__x86_64h");
3364 Builder.defineMacro("__x86_64h__");
3365 }
Chris Lattnerecd49032009-03-02 22:27:17 +00003366 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003367 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00003368 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003369
Chris Lattnerecd49032009-03-02 22:27:17 +00003370 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003371 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
3372 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00003373 switch (CPU) {
3374 case CK_Generic:
3375 break;
3376 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003377 // The rest are coming from the i386 define above.
3378 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003379 break;
3380 case CK_i486:
3381 case CK_WinChipC6:
3382 case CK_WinChip2:
3383 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003384 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00003385 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003386 case CK_PentiumMMX:
3387 Builder.defineMacro("__pentium_mmx__");
3388 Builder.defineMacro("__tune_pentium_mmx__");
3389 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003390 case CK_i586:
3391 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003392 defineCPUMacros(Builder, "i586");
3393 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00003394 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003395 case CK_Pentium3:
3396 case CK_Pentium3M:
3397 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003398 Builder.defineMacro("__tune_pentium3__");
3399 // Fallthrough
3400 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00003401 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003402 Builder.defineMacro("__tune_pentium2__");
3403 // Fallthrough
3404 case CK_PentiumPro:
3405 Builder.defineMacro("__tune_i686__");
3406 Builder.defineMacro("__tune_pentiumpro__");
3407 // Fallthrough
3408 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003409 Builder.defineMacro("__i686");
3410 Builder.defineMacro("__i686__");
3411 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
3412 Builder.defineMacro("__pentiumpro");
3413 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003414 break;
3415 case CK_Pentium4:
3416 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003417 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00003418 break;
3419 case CK_Yonah:
3420 case CK_Prescott:
3421 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003422 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00003423 break;
3424 case CK_Core2:
3425 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003426 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00003427 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003428 case CK_Bonnell:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003429 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00003430 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00003431 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00003432 defineCPUMacros(Builder, "slm");
3433 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003434 case CK_Nehalem:
3435 case CK_Westmere:
3436 case CK_SandyBridge:
3437 case CK_IvyBridge:
3438 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00003439 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003440 case CK_SkylakeClient:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003441 // FIXME: Historically, we defined this legacy name, it would be nice to
3442 // remove it at some point. We've never exposed fine-grained names for
3443 // recent primary x86 CPUs, and we should keep it that way.
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003444 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00003445 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003446 case CK_SkylakeServer:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003447 defineCPUMacros(Builder, "skx");
3448 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003449 case CK_Cannonlake:
3450 break;
Craig Topper449314e2013-08-20 07:09:39 +00003451 case CK_KNL:
3452 defineCPUMacros(Builder, "knl");
3453 break;
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003454 case CK_Lakemont:
3455 Builder.defineMacro("__tune_lakemont__");
3456 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003457 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003458 Builder.defineMacro("__k6_2__");
3459 Builder.defineMacro("__tune_k6_2__");
3460 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003461 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003462 if (CPU != CK_K6_2) { // In case of fallthrough
3463 // FIXME: GCC may be enabling these in cases where some other k6
3464 // architecture is specified but -m3dnow is explicitly provided. The
3465 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003466 Builder.defineMacro("__k6_3__");
3467 Builder.defineMacro("__tune_k6_3__");
3468 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003469 // Fallthrough
3470 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003471 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00003472 break;
3473 case CK_Athlon:
3474 case CK_AthlonThunderbird:
3475 case CK_Athlon4:
3476 case CK_AthlonXP:
3477 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003478 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003479 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003480 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003481 Builder.defineMacro("__tune_athlon_sse__");
3482 }
Chandler Carruth212334f2011-09-28 08:55:37 +00003483 break;
3484 case CK_K8:
3485 case CK_K8SSE3:
3486 case CK_x86_64:
3487 case CK_Opteron:
3488 case CK_OpteronSSE3:
3489 case CK_Athlon64:
3490 case CK_Athlon64SSE3:
3491 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003492 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00003493 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00003494 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003495 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00003496 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00003497 case CK_BTVER1:
3498 defineCPUMacros(Builder, "btver1");
3499 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003500 case CK_BTVER2:
3501 defineCPUMacros(Builder, "btver2");
3502 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003503 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003504 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003505 break;
3506 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003507 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003508 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003509 case CK_BDVER3:
3510 defineCPUMacros(Builder, "bdver3");
3511 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003512 case CK_BDVER4:
3513 defineCPUMacros(Builder, "bdver4");
3514 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003515 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003516 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00003517 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003518 }
Chris Lattner96e43572009-03-02 22:40:39 +00003519
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003520 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003521 Builder.defineMacro("__REGISTER_PREFIX__", "");
3522
Chris Lattner6df41af2009-04-19 17:32:33 +00003523 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
3524 // functions in glibc header files that use FP Stack inline asm which the
3525 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003526 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003527
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003528 if (HasAES)
3529 Builder.defineMacro("__AES__");
3530
Craig Topper3f122a72012-05-31 05:18:48 +00003531 if (HasPCLMUL)
3532 Builder.defineMacro("__PCLMUL__");
3533
Craig Topper22967d42011-12-25 05:06:45 +00003534 if (HasLZCNT)
3535 Builder.defineMacro("__LZCNT__");
3536
Benjamin Kramer1e250392012-07-07 09:39:18 +00003537 if (HasRDRND)
3538 Builder.defineMacro("__RDRND__");
3539
Craig Topper8c7f2512014-11-03 06:51:41 +00003540 if (HasFSGSBASE)
3541 Builder.defineMacro("__FSGSBASE__");
3542
Craig Topper22967d42011-12-25 05:06:45 +00003543 if (HasBMI)
3544 Builder.defineMacro("__BMI__");
3545
3546 if (HasBMI2)
3547 Builder.defineMacro("__BMI2__");
3548
Craig Topper1de83482011-12-29 16:10:46 +00003549 if (HasPOPCNT)
3550 Builder.defineMacro("__POPCNT__");
3551
Michael Liao625a8752012-11-10 05:17:46 +00003552 if (HasRTM)
3553 Builder.defineMacro("__RTM__");
3554
Michael Liao74f4eaf2013-03-26 17:52:08 +00003555 if (HasPRFCHW)
3556 Builder.defineMacro("__PRFCHW__");
3557
Michael Liaoffaae352013-03-29 05:17:55 +00003558 if (HasRDSEED)
3559 Builder.defineMacro("__RDSEED__");
3560
Robert Khasanov50e6f582014-09-19 09:53:48 +00003561 if (HasADX)
3562 Builder.defineMacro("__ADX__");
3563
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003564 if (HasTBM)
3565 Builder.defineMacro("__TBM__");
3566
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003567 if (HasMWAITX)
3568 Builder.defineMacro("__MWAITX__");
3569
Rafael Espindolae62e2792013-08-20 13:44:29 +00003570 switch (XOPLevel) {
3571 case XOP:
3572 Builder.defineMacro("__XOP__");
3573 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00003574 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00003575 case SSE4A:
3576 Builder.defineMacro("__SSE4A__");
3577 case NoXOP:
3578 break;
3579 }
Craig Topperffdb46c2011-12-30 07:33:42 +00003580
Craig Topperbba778b2012-06-03 21:46:30 +00003581 if (HasFMA)
3582 Builder.defineMacro("__FMA__");
3583
Manman Rena45358c2012-10-11 00:59:55 +00003584 if (HasF16C)
3585 Builder.defineMacro("__F16C__");
3586
Craig Topper679b53a2013-08-21 05:29:10 +00003587 if (HasAVX512CD)
3588 Builder.defineMacro("__AVX512CD__");
3589 if (HasAVX512ER)
3590 Builder.defineMacro("__AVX512ER__");
3591 if (HasAVX512PF)
3592 Builder.defineMacro("__AVX512PF__");
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003593 if (HasAVX512DQ)
3594 Builder.defineMacro("__AVX512DQ__");
3595 if (HasAVX512BW)
3596 Builder.defineMacro("__AVX512BW__");
3597 if (HasAVX512VL)
3598 Builder.defineMacro("__AVX512VL__");
Craig Topperb4f83a02016-02-29 06:51:38 +00003599 if (HasAVX512VBMI)
3600 Builder.defineMacro("__AVX512VBMI__");
3601 if (HasAVX512IFMA)
3602 Builder.defineMacro("__AVX512IFMA__");
Craig Topper679b53a2013-08-21 05:29:10 +00003603
Ben Langmuir58078d02013-09-19 13:22:04 +00003604 if (HasSHA)
3605 Builder.defineMacro("__SHA__");
3606
Craig Toppere33f51f2015-10-16 06:22:36 +00003607 if (HasFXSR)
3608 Builder.defineMacro("__FXSR__");
Craig Topperda9fe562015-10-15 05:23:38 +00003609 if (HasXSAVE)
3610 Builder.defineMacro("__XSAVE__");
3611 if (HasXSAVEOPT)
3612 Builder.defineMacro("__XSAVEOPT__");
3613 if (HasXSAVEC)
3614 Builder.defineMacro("__XSAVEC__");
3615 if (HasXSAVES)
3616 Builder.defineMacro("__XSAVES__");
Asaf Badouha9d1e182015-12-31 14:14:07 +00003617 if (HasPKU)
3618 Builder.defineMacro("__PKU__");
Nick Lewycky50e8f482013-10-05 20:14:27 +00003619 if (HasCX16)
3620 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
3621
Chris Lattner96e43572009-03-02 22:40:39 +00003622 // Each case falls through to the previous one here.
3623 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003624 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00003625 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00003626 case AVX2:
3627 Builder.defineMacro("__AVX2__");
3628 case AVX:
3629 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00003630 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003631 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00003632 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003633 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00003634 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003635 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003636 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003637 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003638 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003639 Builder.defineMacro("__SSE2__");
3640 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00003641 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003642 Builder.defineMacro("__SSE__");
3643 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00003644 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00003645 break;
3646 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003647
Derek Schuffc7dd7222012-10-11 15:52:22 +00003648 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003649 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003650 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00003651 case AVX2:
3652 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003653 case SSE42:
3654 case SSE41:
3655 case SSSE3:
3656 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003657 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003658 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003659 break;
3660 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003661 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003662 break;
3663 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003664 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003665 }
3666 }
3667
Anders Carlssone437c682010-01-27 03:47:49 +00003668 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00003669 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00003670 case AMD3DNowAthlon:
3671 Builder.defineMacro("__3dNOW_A__");
3672 case AMD3DNow:
3673 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00003674 case MMX:
3675 Builder.defineMacro("__MMX__");
3676 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00003677 break;
3678 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00003679
3680 if (CPU >= CK_i486) {
3681 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
3682 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
3683 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
3684 }
3685 if (CPU >= CK_i586)
3686 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00003687}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003688
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003689bool X86TargetInfo::hasFeature(StringRef Feature) const {
3690 return llvm::StringSwitch<bool>(Feature)
3691 .Case("aes", HasAES)
3692 .Case("avx", SSELevel >= AVX)
3693 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00003694 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00003695 .Case("avx512cd", HasAVX512CD)
3696 .Case("avx512er", HasAVX512ER)
3697 .Case("avx512pf", HasAVX512PF)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003698 .Case("avx512dq", HasAVX512DQ)
3699 .Case("avx512bw", HasAVX512BW)
3700 .Case("avx512vl", HasAVX512VL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003701 .Case("avx512vbmi", HasAVX512VBMI)
3702 .Case("avx512ifma", HasAVX512IFMA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003703 .Case("bmi", HasBMI)
3704 .Case("bmi2", HasBMI2)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003705 .Case("clflushopt", HasCLFLUSHOPT)
3706 .Case("clwb", HasCLWB)
Nick Lewycky50e8f482013-10-05 20:14:27 +00003707 .Case("cx16", HasCX16)
3708 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00003709 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003710 .Case("fma4", XOPLevel >= FMA4)
Craig Topper8c7f2512014-11-03 06:51:41 +00003711 .Case("fsgsbase", HasFSGSBASE)
Craig Toppere33f51f2015-10-16 06:22:36 +00003712 .Case("fxsr", HasFXSR)
Craig Topper8dbc5842014-11-03 07:05:26 +00003713 .Case("lzcnt", HasLZCNT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003714 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
3715 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
3716 .Case("mmx", MMX3DNowLevel >= MMX)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003717 .Case("movbe", HasMOVBE)
3718 .Case("mpx", HasMPX)
Craig Topper3f122a72012-05-31 05:18:48 +00003719 .Case("pclmul", HasPCLMUL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003720 .Case("pcommit", HasPCOMMIT)
3721 .Case("pku", HasPKU)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003722 .Case("popcnt", HasPOPCNT)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003723 .Case("prefetchwt1", HasPREFETCHWT1)
Michael Liao74f4eaf2013-03-26 17:52:08 +00003724 .Case("prfchw", HasPRFCHW)
Craig Topper8dbc5842014-11-03 07:05:26 +00003725 .Case("rdrnd", HasRDRND)
Michael Liaoffaae352013-03-29 05:17:55 +00003726 .Case("rdseed", HasRDSEED)
Craig Topper8dbc5842014-11-03 07:05:26 +00003727 .Case("rtm", HasRTM)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003728 .Case("sgx", HasSGX)
Ben Langmuir58078d02013-09-19 13:22:04 +00003729 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003730 .Case("sse", SSELevel >= SSE1)
3731 .Case("sse2", SSELevel >= SSE2)
3732 .Case("sse3", SSELevel >= SSE3)
3733 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00003734 .Case("sse4.1", SSELevel >= SSE41)
3735 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003736 .Case("sse4a", XOPLevel >= SSE4A)
Craig Topper8dbc5842014-11-03 07:05:26 +00003737 .Case("tbm", HasTBM)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003738 .Case("umip", HasUMIP)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003739 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00003740 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
3741 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003742 .Case("xop", XOPLevel >= XOP)
Craig Topperda9fe562015-10-15 05:23:38 +00003743 .Case("xsave", HasXSAVE)
3744 .Case("xsavec", HasXSAVEC)
3745 .Case("xsaves", HasXSAVES)
3746 .Case("xsaveopt", HasXSAVEOPT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003747 .Default(false);
3748}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003749
Eric Christopherd9832702015-06-29 21:00:05 +00003750// We can't use a generic validation scheme for the features accepted here
3751// versus subtarget features accepted in the target attribute because the
3752// bitfield structure that's initialized in the runtime only supports the
3753// below currently rather than the full range of subtarget features. (See
3754// X86TargetInfo::hasFeature for a somewhat comprehensive list).
3755bool X86TargetInfo::validateCpuSupports(StringRef FeatureStr) const {
3756 return llvm::StringSwitch<bool>(FeatureStr)
3757 .Case("cmov", true)
3758 .Case("mmx", true)
3759 .Case("popcnt", true)
3760 .Case("sse", true)
3761 .Case("sse2", true)
3762 .Case("sse3", true)
Benjamin Kramerf4c520d2016-05-20 15:21:08 +00003763 .Case("ssse3", true)
Eric Christopherd9832702015-06-29 21:00:05 +00003764 .Case("sse4.1", true)
3765 .Case("sse4.2", true)
3766 .Case("avx", true)
3767 .Case("avx2", true)
3768 .Case("sse4a", true)
3769 .Case("fma4", true)
3770 .Case("xop", true)
3771 .Case("fma", true)
3772 .Case("avx512f", true)
3773 .Case("bmi", true)
3774 .Case("bmi2", true)
Benjamin Kramerf4c520d2016-05-20 15:21:08 +00003775 .Case("aes", true)
3776 .Case("pclmul", true)
3777 .Case("avx512vl", true)
3778 .Case("avx512bw", true)
3779 .Case("avx512dq", true)
3780 .Case("avx512cd", true)
3781 .Case("avx512er", true)
3782 .Case("avx512pf", true)
3783 .Case("avx512vbmi", true)
3784 .Case("avx512ifma", true)
Eric Christopherd9832702015-06-29 21:00:05 +00003785 .Default(false);
3786}
3787
Eli Friedman3fd920a2008-08-20 02:34:37 +00003788bool
Anders Carlsson58436352009-02-28 17:11:49 +00003789X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00003790 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00003791 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003792 default: return false;
Alexey Bataev91e58602015-07-20 12:08:00 +00003793 // Constant constraints.
3794 case 'e': // 32-bit signed integer constant for use with sign-extending x86_64
3795 // instructions.
3796 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
3797 // x86_64 instructions.
3798 case 's':
3799 Info.setRequiresImmediate();
3800 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003801 case 'I':
3802 Info.setRequiresImmediate(0, 31);
3803 return true;
3804 case 'J':
3805 Info.setRequiresImmediate(0, 63);
3806 return true;
3807 case 'K':
3808 Info.setRequiresImmediate(-128, 127);
3809 return true;
3810 case 'L':
Alexey Bataev91e58602015-07-20 12:08:00 +00003811 Info.setRequiresImmediate({ int(0xff), int(0xffff), int(0xffffffff) });
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003812 return true;
3813 case 'M':
3814 Info.setRequiresImmediate(0, 3);
3815 return true;
3816 case 'N':
3817 Info.setRequiresImmediate(0, 255);
3818 return true;
3819 case 'O':
3820 Info.setRequiresImmediate(0, 127);
3821 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003822 // Register constraints.
3823 case 'Y': // 'Y' is the first character for several 2-character constraints.
3824 // Shift the pointer to the second character of the constraint.
3825 Name++;
3826 switch (*Name) {
3827 default:
3828 return false;
3829 case '0': // First SSE register.
3830 case 't': // Any SSE register, when SSE2 is enabled.
3831 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
3832 case 'm': // Any MMX register, when inter-unit moves enabled.
3833 Info.setAllowsRegister();
3834 return true;
3835 }
3836 case 'f': // Any x87 floating point stack register.
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003837 // Constraint 'f' cannot be used for output operands.
3838 if (Info.ConstraintStr[0] == '=')
3839 return false;
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003840 Info.setAllowsRegister();
3841 return true;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003842 case 'a': // eax.
3843 case 'b': // ebx.
3844 case 'c': // ecx.
3845 case 'd': // edx.
3846 case 'S': // esi.
3847 case 'D': // edi.
3848 case 'A': // edx:eax.
Alexey Bataev91e58602015-07-20 12:08:00 +00003849 case 't': // Top of floating point stack.
3850 case 'u': // Second from top of floating point stack.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003851 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00003852 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00003853 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003854 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00003855 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
3856 case 'l': // "Index" registers: any general register that can be used as an
3857 // index in a base+index memory access.
3858 Info.setAllowsRegister();
3859 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003860 // Floating point constant constraints.
Dale Johannesen46742a42010-08-24 22:33:12 +00003861 case 'C': // SSE floating point constant.
3862 case 'G': // x87 floating point constant.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003863 return true;
3864 }
3865}
3866
Akira Hatanaka974131e2014-09-18 18:17:18 +00003867bool X86TargetInfo::validateOutputSize(StringRef Constraint,
3868 unsigned Size) const {
3869 // Strip off constraint modifiers.
3870 while (Constraint[0] == '=' ||
3871 Constraint[0] == '+' ||
3872 Constraint[0] == '&')
3873 Constraint = Constraint.substr(1);
3874
3875 return validateOperandSize(Constraint, Size);
3876}
3877
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003878bool X86TargetInfo::validateInputSize(StringRef Constraint,
3879 unsigned Size) const {
Akira Hatanaka974131e2014-09-18 18:17:18 +00003880 return validateOperandSize(Constraint, Size);
3881}
3882
3883bool X86TargetInfo::validateOperandSize(StringRef Constraint,
3884 unsigned Size) const {
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003885 switch (Constraint[0]) {
3886 default: break;
3887 case 'y':
3888 return Size <= 64;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003889 case 'f':
3890 case 't':
3891 case 'u':
3892 return Size <= 128;
Hans Wennborg3c619a42014-09-18 20:24:04 +00003893 case 'x':
Alexey Bataev91e58602015-07-20 12:08:00 +00003894 if (SSELevel >= AVX512F)
3895 // 512-bit zmm registers can be used if target supports AVX512F.
3896 return Size <= 512U;
3897 else if (SSELevel >= AVX)
3898 // 256-bit ymm registers can be used if target supports AVX.
3899 return Size <= 256U;
3900 return Size <= 128U;
3901 case 'Y':
3902 // 'Y' is the first character for several 2-character constraints.
3903 switch (Constraint[1]) {
3904 default: break;
3905 case 'm':
3906 // 'Ym' is synonymous with 'y'.
3907 return Size <= 64;
3908 case 'i':
3909 case 't':
3910 // 'Yi' and 'Yt' are synonymous with 'x' when SSE2 is enabled.
3911 if (SSELevel >= AVX512F)
3912 return Size <= 512U;
3913 else if (SSELevel >= AVX)
3914 return Size <= 256U;
3915 return SSELevel >= SSE2 && Size <= 128U;
3916 }
3917
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003918 }
3919
3920 return true;
3921}
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00003922
Eli Friedman3fd920a2008-08-20 02:34:37 +00003923std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003924X86TargetInfo::convertConstraint(const char *&Constraint) const {
3925 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003926 case 'a': return std::string("{ax}");
3927 case 'b': return std::string("{bx}");
3928 case 'c': return std::string("{cx}");
3929 case 'd': return std::string("{dx}");
3930 case 'S': return std::string("{si}");
3931 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00003932 case 'p': // address
3933 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00003934 case 't': // top of floating point stack.
3935 return std::string("{st}");
3936 case 'u': // second from top of floating point stack.
3937 return std::string("{st(1)}"); // second from top of floating point stack.
3938 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003939 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00003940 }
3941}
Chris Lattner5ba61f02006-10-14 07:39:34 +00003942
Eli Friedman3fd920a2008-08-20 02:34:37 +00003943// X86-32 generic target
3944class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00003945public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00003946 X86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
3947 : X86TargetInfo(Triple, Opts) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003948 DoubleAlign = LongLongAlign = 32;
3949 LongDoubleWidth = 96;
3950 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00003951 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00003952 resetDataLayout("e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128");
Eli Friedman32ca82a2009-03-29 20:31:09 +00003953 SizeType = UnsignedInt;
3954 PtrDiffType = SignedInt;
3955 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003956 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003957
3958 // Use fpret for all types.
3959 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
3960 (1 << TargetInfo::Double) |
3961 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003962
3963 // x86-32 has atomics up to 8 bytes
3964 // FIXME: Check that we actually have cmpxchg8b before setting
3965 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
3966 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003967 }
Craig Topper3164f332014-03-11 03:39:26 +00003968 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003969 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003970 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003971
Craig Topper3164f332014-03-11 03:39:26 +00003972 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003973 if (RegNo == 0) return 0;
3974 if (RegNo == 1) return 2;
3975 return -1;
3976 }
Akira Hatanaka974131e2014-09-18 18:17:18 +00003977 bool validateOperandSize(StringRef Constraint,
3978 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00003979 switch (Constraint[0]) {
3980 default: break;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003981 case 'R':
3982 case 'q':
3983 case 'Q':
Bill Wendling887b4852012-11-12 06:42:51 +00003984 case 'a':
3985 case 'b':
3986 case 'c':
3987 case 'd':
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003988 case 'S':
3989 case 'D':
Bill Wendling3c7fed82012-11-12 18:52:32 +00003990 return Size <= 32;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003991 case 'A':
3992 return Size <= 64;
Bill Wendling887b4852012-11-12 06:42:51 +00003993 }
3994
Akira Hatanaka974131e2014-09-18 18:17:18 +00003995 return X86TargetInfo::validateOperandSize(Constraint, Size);
Bill Wendling887b4852012-11-12 06:42:51 +00003996 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003997};
Eli Friedman3fd920a2008-08-20 02:34:37 +00003998
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003999class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
4000public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004001 NetBSDI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4002 : NetBSDTargetInfo<X86_32TargetInfo>(Triple, Opts) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004003
Craig Topper3164f332014-03-11 03:39:26 +00004004 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00004005 unsigned Major, Minor, Micro;
4006 getTriple().getOSVersion(Major, Minor, Micro);
4007 // New NetBSD uses the default rounding mode.
4008 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
4009 return X86_32TargetInfo::getFloatEvalMethod();
4010 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004011 return 1;
4012 }
4013};
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004014
Eli Friedmane3aa4542009-07-05 18:47:56 +00004015class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
4016public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004017 OpenBSDI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4018 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00004019 SizeType = UnsignedLong;
4020 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004021 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00004022 }
4023};
Eli Friedmane3aa4542009-07-05 18:47:56 +00004024
Eli Friedman9fa28852012-08-08 23:57:20 +00004025class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
4026public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004027 BitrigI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4028 : BitrigTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman9fa28852012-08-08 23:57:20 +00004029 SizeType = UnsignedLong;
4030 IntPtrType = SignedLong;
4031 PtrDiffType = SignedLong;
4032 }
4033};
Eli Friedman9fa28852012-08-08 23:57:20 +00004034
Torok Edwinb2b37c62009-06-30 17:10:35 +00004035class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004036public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004037 DarwinI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4038 : DarwinTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004039 LongDoubleWidth = 128;
4040 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004041 SuitableAlign = 128;
Tim Northover5627d392015-10-30 16:30:45 +00004042 MaxVectorAlign = 256;
4043 // The watchOS simulator uses the builtin bool type for Objective-C.
4044 llvm::Triple T = llvm::Triple(Triple);
4045 if (T.isWatchOS())
4046 UseSignedCharForObjCBool = false;
Eli Friedman32ca82a2009-03-29 20:31:09 +00004047 SizeType = UnsignedLong;
4048 IntPtrType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00004049 resetDataLayout("e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128");
Daniel Dunbarbd606522010-05-27 00:35:16 +00004050 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00004051 }
4052
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004053 bool handleTargetFeatures(std::vector<std::string> &Features,
4054 DiagnosticsEngine &Diags) override {
4055 if (!DarwinTargetInfo<X86_32TargetInfo>::handleTargetFeatures(Features,
4056 Diags))
4057 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004058 // We now know the features we have: we can decide how to align vectors.
4059 MaxVectorAlign =
4060 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004061 return true;
4062 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004063};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004064
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004065// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004066class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004067public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004068 WindowsX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4069 : WindowsTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Chris Lattner46be2e12009-06-24 17:12:15 +00004070 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00004071 DoubleAlign = LongLongAlign = 64;
Reid Kleckner7510c092015-04-01 16:45:06 +00004072 bool IsWinCOFF =
4073 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
James Y Knightb214cbc2016-03-04 19:00:41 +00004074 resetDataLayout(IsWinCOFF
4075 ? "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
4076 : "e-m:e-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32");
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004077 }
Craig Topper3164f332014-03-11 03:39:26 +00004078 void getTargetDefines(const LangOptions &Opts,
4079 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004080 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
4081 }
4082};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004083
4084// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004085class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004086public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004087 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple,
4088 const TargetOptions &Opts)
4089 : WindowsX86_32TargetInfo(Triple, Opts) {
Eli Friedman015d6282011-03-22 21:25:11 +00004090 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004091 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
4092 }
Craig Topper3164f332014-03-11 03:39:26 +00004093 void getTargetDefines(const LangOptions &Opts,
4094 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004095 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
4096 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
4097 // The value of the following reflects processor type.
4098 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
4099 // We lost the original triple, so we use the default.
4100 Builder.defineMacro("_M_IX86", "600");
4101 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004102};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004103
David Majnemerae1ed0e2015-05-28 04:36:18 +00004104static void addCygMingDefines(const LangOptions &Opts, MacroBuilder &Builder) {
Eric Christopherb093d692015-10-09 18:39:59 +00004105 // Mingw and cygwin define __declspec(a) to __attribute__((a)). Clang
4106 // supports __declspec natively under -fms-extensions, but we define a no-op
4107 // __declspec macro anyway for pre-processor compatibility.
Reid Kleckner47606832014-04-21 20:58:00 +00004108 if (Opts.MicrosoftExt)
4109 Builder.defineMacro("__declspec", "__declspec");
4110 else
4111 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
4112
4113 if (!Opts.MicrosoftExt) {
4114 // Provide macros for all the calling convention keywords. Provide both
4115 // single and double underscore prefixed variants. These are available on
4116 // x64 as well as x86, even though they have no effect.
4117 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
4118 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00004119 std::string GCCSpelling = "__attribute__((__";
4120 GCCSpelling += CC;
4121 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00004122 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
4123 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
4124 }
4125 }
4126}
4127
David Majnemerae1ed0e2015-05-28 04:36:18 +00004128static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
4129 Builder.defineMacro("__MSVCRT__");
4130 Builder.defineMacro("__MINGW32__");
4131 addCygMingDefines(Opts, Builder);
4132}
4133
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004134// x86-32 MinGW target
4135class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
4136public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004137 MinGWX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4138 : WindowsX86_32TargetInfo(Triple, Opts) {}
Craig Topper3164f332014-03-11 03:39:26 +00004139 void getTargetDefines(const LangOptions &Opts,
4140 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004141 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004142 DefineStd(Builder, "WIN32", Opts);
4143 DefineStd(Builder, "WINNT", Opts);
4144 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00004145 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004146 }
4147};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004148
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004149// x86-32 Cygwin target
4150class CygwinX86_32TargetInfo : public X86_32TargetInfo {
4151public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004152 CygwinX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4153 : X86_32TargetInfo(Triple, Opts) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004154 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004155 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00004156 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 +00004157 }
Craig Topper3164f332014-03-11 03:39:26 +00004158 void getTargetDefines(const LangOptions &Opts,
4159 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004160 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00004161 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004162 Builder.defineMacro("__CYGWIN__");
4163 Builder.defineMacro("__CYGWIN32__");
David Majnemerae1ed0e2015-05-28 04:36:18 +00004164 addCygMingDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004165 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00004166 if (Opts.CPlusPlus)
4167 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00004168 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004169};
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004170
Chris Lattnerb986aba2010-04-11 19:29:39 +00004171// x86-32 Haiku target
Reid Kleckner330fb172016-05-11 16:19:05 +00004172class HaikuX86_32TargetInfo : public HaikuTargetInfo<X86_32TargetInfo> {
Chris Lattnerb986aba2010-04-11 19:29:39 +00004173public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004174 HaikuX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Reid Kleckner330fb172016-05-11 16:19:05 +00004175 : HaikuTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman04831922010-08-22 01:00:03 +00004176 }
Craig Topper3164f332014-03-11 03:39:26 +00004177 void getTargetDefines(const LangOptions &Opts,
4178 MacroBuilder &Builder) const override {
Reid Kleckner330fb172016-05-11 16:19:05 +00004179 HaikuTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
Chris Lattnerb986aba2010-04-11 19:29:39 +00004180 Builder.defineMacro("__INTEL__");
Chris Lattnerb986aba2010-04-11 19:29:39 +00004181 }
4182};
Chris Lattnerb986aba2010-04-11 19:29:39 +00004183
Alexey Bataevc99b0492015-11-25 09:24:26 +00004184// X86-32 MCU target
4185class MCUX86_32TargetInfo : public X86_32TargetInfo {
4186public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004187 MCUX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4188 : X86_32TargetInfo(Triple, Opts) {
Alexey Bataevc99b0492015-11-25 09:24:26 +00004189 LongDoubleWidth = 64;
4190 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
James Y Knightb214cbc2016-03-04 19:00:41 +00004191 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 +00004192 WIntType = UnsignedInt;
Alexey Bataevc99b0492015-11-25 09:24:26 +00004193 }
4194
4195 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
4196 // On MCU we support only C calling convention.
4197 return CC == CC_C ? CCCR_OK : CCCR_Warning;
4198 }
4199
4200 void getTargetDefines(const LangOptions &Opts,
4201 MacroBuilder &Builder) const override {
4202 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4203 Builder.defineMacro("__iamcu");
4204 Builder.defineMacro("__iamcu__");
4205 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00004206
4207 bool allowsLargerPreferedTypeAlignment() const override {
4208 return false;
4209 }
Alexey Bataevc99b0492015-11-25 09:24:26 +00004210};
4211
Douglas Gregor9fabd852011-07-01 22:41:14 +00004212// RTEMS Target
4213template<typename Target>
4214class RTEMSTargetInfo : public OSTargetInfo<Target> {
4215protected:
Craig Topper3164f332014-03-11 03:39:26 +00004216 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4217 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004218 // RTEMS defines; list based off of gcc output
4219
Douglas Gregor9fabd852011-07-01 22:41:14 +00004220 Builder.defineMacro("__rtems__");
4221 Builder.defineMacro("__ELF__");
4222 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004223
Douglas Gregor9fabd852011-07-01 22:41:14 +00004224public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004225 RTEMSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4226 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004227 switch (Triple.getArch()) {
4228 default:
4229 case llvm::Triple::x86:
4230 // this->MCountName = ".mcount";
4231 break;
4232 case llvm::Triple::mips:
4233 case llvm::Triple::mipsel:
4234 case llvm::Triple::ppc:
4235 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00004236 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004237 // this->MCountName = "_mcount";
4238 break;
4239 case llvm::Triple::arm:
4240 // this->MCountName = "__mcount";
4241 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004242 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004243 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00004244};
4245
Douglas Gregor9fabd852011-07-01 22:41:14 +00004246// x86-32 RTEMS target
4247class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
4248public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004249 RTEMSX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4250 : X86_32TargetInfo(Triple, Opts) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004251 SizeType = UnsignedLong;
4252 IntPtrType = SignedLong;
4253 PtrDiffType = SignedLong;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004254 }
Craig Topper3164f332014-03-11 03:39:26 +00004255 void getTargetDefines(const LangOptions &Opts,
4256 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004257 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4258 Builder.defineMacro("__INTEL__");
4259 Builder.defineMacro("__rtems__");
4260 }
4261};
Douglas Gregor9fabd852011-07-01 22:41:14 +00004262
Eli Friedman3fd920a2008-08-20 02:34:37 +00004263// x86-64 generic target
4264class X86_64TargetInfo : public X86TargetInfo {
4265public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004266 X86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4267 : X86TargetInfo(Triple, Opts) {
David Blaikie40f842d2014-07-10 18:46:15 +00004268 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
David Majnemer8fa8c382015-03-17 23:55:00 +00004269 bool IsWinCOFF =
4270 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Zinovy Nis1db95732014-07-10 15:27:19 +00004271 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00004272 LongDoubleWidth = 128;
4273 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00004274 LargeArrayMinWidth = 128;
4275 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004276 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00004277 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
4278 PtrDiffType = IsX32 ? SignedInt : SignedLong;
4279 IntPtrType = IsX32 ? SignedInt : SignedLong;
4280 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00004281 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00004282 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00004283
Eric Christopher917e9522014-11-18 22:36:15 +00004284 // Pointers are 32-bit in x32.
James Y Knightb214cbc2016-03-04 19:00:41 +00004285 resetDataLayout(IsX32
4286 ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128"
4287 : IsWinCOFF ? "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
4288 : "e-m:e-i64:64-f80:128-n8:16:32:64-S128");
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00004289
4290 // Use fpret only for long double.
4291 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004292
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00004293 // Use fp2ret for _Complex long double.
4294 ComplexLongDoubleUsesFP2Ret = true;
4295
Charles Davisc7d5c942015-09-17 20:55:33 +00004296 // Make __builtin_ms_va_list available.
4297 HasBuiltinMSVaList = true;
4298
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004299 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004300 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00004301 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00004302 }
Craig Topper3164f332014-03-11 03:39:26 +00004303 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004304 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00004305 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004306
Craig Topper3164f332014-03-11 03:39:26 +00004307 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00004308 if (RegNo == 0) return 0;
4309 if (RegNo == 1) return 1;
4310 return -1;
4311 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004312
Craig Topper3164f332014-03-11 03:39:26 +00004313 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00004314 switch (CC) {
4315 case CC_C:
4316 case CC_Swift:
4317 case CC_X86VectorCall:
4318 case CC_IntelOclBicc:
4319 case CC_X86_64Win64:
Roman Levenstein35aa5ce2016-03-16 18:00:46 +00004320 case CC_PreserveMost:
4321 case CC_PreserveAll:
John McCall477f2bb2016-03-03 06:39:32 +00004322 return CCCR_OK;
4323 default:
4324 return CCCR_Warning;
4325 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004326 }
4327
Craig Topper3164f332014-03-11 03:39:26 +00004328 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00004329 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004330 }
4331
Pavel Chupinfd223e12014-08-04 12:39:43 +00004332 // for x32 we need it here explicitly
4333 bool hasInt128Type() const override { return true; }
Reid Klecknerf27e7522016-02-01 18:58:24 +00004334 unsigned getUnwindWordWidth() const override { return 64; }
4335 unsigned getRegisterWidth() const override { return 64; }
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00004336
4337 bool validateGlobalRegisterVariable(StringRef RegName,
4338 unsigned RegSize,
4339 bool &HasSizeMismatch) const override {
4340 // rsp and rbp are the only 64-bit registers the x86 backend can currently
4341 // handle.
4342 if (RegName.equals("rsp") || RegName.equals("rbp")) {
4343 // Check that the register size is 64-bit.
4344 HasSizeMismatch = RegSize != 64;
4345 return true;
4346 }
4347
4348 // Check if the register is a 32-bit register the backend can handle.
4349 return X86TargetInfo::validateGlobalRegisterVariable(RegName, RegSize,
4350 HasSizeMismatch);
4351 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004352};
Eli Friedman3fd920a2008-08-20 02:34:37 +00004353
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004354// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004355class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004356public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004357 WindowsX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4358 : WindowsTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004359 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00004360 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004361 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004362 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004363 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00004364 SizeType = UnsignedLongLong;
4365 PtrDiffType = SignedLongLong;
4366 IntPtrType = SignedLongLong;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004367 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004368
Craig Topper3164f332014-03-11 03:39:26 +00004369 void getTargetDefines(const LangOptions &Opts,
4370 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004371 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004372 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004373 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004374
Craig Topper3164f332014-03-11 03:39:26 +00004375 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004376 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00004377 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004378
Craig Topper3164f332014-03-11 03:39:26 +00004379 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004380 switch (CC) {
4381 case CC_X86StdCall:
4382 case CC_X86ThisCall:
4383 case CC_X86FastCall:
4384 return CCCR_Ignore;
4385 case CC_C:
4386 case CC_X86VectorCall:
4387 case CC_IntelOclBicc:
4388 case CC_X86_64SysV:
4389 return CCCR_OK;
4390 default:
4391 return CCCR_Warning;
4392 }
Charles Davisb5a214e2013-08-30 04:39:01 +00004393 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004394};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004395
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004396// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004397class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004398public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004399 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple,
4400 const TargetOptions &Opts)
4401 : WindowsX86_64TargetInfo(Triple, Opts) {
Eli Friedman015d6282011-03-22 21:25:11 +00004402 LongDoubleWidth = LongDoubleAlign = 64;
4403 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004404 }
Craig Topper3164f332014-03-11 03:39:26 +00004405 void getTargetDefines(const LangOptions &Opts,
4406 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004407 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
4408 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
David Majnemerb856e8f2015-07-26 23:17:29 +00004409 Builder.defineMacro("_M_X64", "100");
4410 Builder.defineMacro("_M_AMD64", "100");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004411 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004412};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004413
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004414// x86-64 MinGW target
4415class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
4416public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004417 MinGWX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4418 : WindowsX86_64TargetInfo(Triple, Opts) {
Reid Kleckner11a17192015-10-28 22:29:52 +00004419 // Mingw64 rounds long double size and alignment up to 16 bytes, but sticks
4420 // with x86 FP ops. Weird.
4421 LongDoubleWidth = LongDoubleAlign = 128;
4422 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
4423 }
4424
Craig Topper3164f332014-03-11 03:39:26 +00004425 void getTargetDefines(const LangOptions &Opts,
4426 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004427 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004428 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004429 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00004430 addMinGWDefines(Opts, Builder);
Reid Klecknere070b992014-11-14 02:01:10 +00004431
4432 // GCC defines this macro when it is using __gxx_personality_seh0.
4433 if (!Opts.SjLjExceptions)
4434 Builder.defineMacro("__SEH__");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004435 }
4436};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004437
Yaron Kerend030d112015-07-22 17:38:19 +00004438// x86-64 Cygwin target
4439class CygwinX86_64TargetInfo : public X86_64TargetInfo {
4440public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004441 CygwinX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4442 : X86_64TargetInfo(Triple, Opts) {
Yaron Kerend030d112015-07-22 17:38:19 +00004443 TLSSupported = false;
4444 WCharType = UnsignedShort;
4445 }
4446 void getTargetDefines(const LangOptions &Opts,
4447 MacroBuilder &Builder) const override {
4448 X86_64TargetInfo::getTargetDefines(Opts, Builder);
4449 Builder.defineMacro("__x86_64__");
4450 Builder.defineMacro("__CYGWIN__");
4451 Builder.defineMacro("__CYGWIN64__");
4452 addCygMingDefines(Opts, Builder);
4453 DefineStd(Builder, "unix", Opts);
4454 if (Opts.CPlusPlus)
4455 Builder.defineMacro("_GNU_SOURCE");
4456
4457 // GCC defines this macro when it is using __gxx_personality_seh0.
4458 if (!Opts.SjLjExceptions)
4459 Builder.defineMacro("__SEH__");
4460 }
4461};
4462
Eli Friedman2857ccb2009-07-01 03:36:11 +00004463class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
4464public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004465 DarwinX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4466 : DarwinTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00004467 Int64Type = SignedLongLong;
Tim Northovera2ee4332014-03-29 15:09:45 +00004468 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
4469 llvm::Triple T = llvm::Triple(Triple);
Bob Wilson946c04c2014-10-19 02:19:27 +00004470 if (T.isiOS())
Tim Northovera2ee4332014-03-29 15:09:45 +00004471 UseSignedCharForObjCBool = false;
James Y Knightb214cbc2016-03-04 19:00:41 +00004472 resetDataLayout("e-m:o-i64:64-f80:128-n8:16:32:64-S128");
Eli Friedman2857ccb2009-07-01 03:36:11 +00004473 }
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004474
4475 bool handleTargetFeatures(std::vector<std::string> &Features,
4476 DiagnosticsEngine &Diags) override {
4477 if (!DarwinTargetInfo<X86_64TargetInfo>::handleTargetFeatures(Features,
4478 Diags))
4479 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004480 // We now know the features we have: we can decide how to align vectors.
4481 MaxVectorAlign =
4482 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004483 return true;
4484 }
Eli Friedman2857ccb2009-07-01 03:36:11 +00004485};
Eli Friedman2857ccb2009-07-01 03:36:11 +00004486
Eli Friedman245f2292009-07-05 22:31:18 +00004487class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
4488public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004489 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4490 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Eli Friedman245f2292009-07-05 22:31:18 +00004491 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004492 Int64Type = SignedLongLong;
4493 }
4494};
Eli Friedman245f2292009-07-05 22:31:18 +00004495
Eli Friedman9fa28852012-08-08 23:57:20 +00004496class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
4497public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004498 BitrigX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4499 : BitrigTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004500 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004501 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00004502 }
4503};
Tim Northover9bb857a2013-01-31 12:13:10 +00004504
Eli Friedmanf05b7722008-08-20 07:44:10 +00004505class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004506 // Possible FPU choices.
4507 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004508 VFP2FPU = (1 << 0),
4509 VFP3FPU = (1 << 1),
4510 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00004511 NeonFPU = (1 << 3),
4512 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004513 };
4514
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004515 // Possible HWDiv features.
4516 enum HWDivMode {
4517 HWDivThumb = (1 << 0),
4518 HWDivARM = (1 << 1)
4519 };
4520
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004521 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004522 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004523 }
4524
4525 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4526 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004527
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004528 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004529
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004530 StringRef CPUProfile;
4531 StringRef CPUAttr;
4532
Rafael Espindolaeb265472013-08-21 21:59:03 +00004533 enum {
4534 FP_Default,
4535 FP_VFP,
4536 FP_Neon
4537 } FPMath;
4538
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004539 unsigned ArchISA;
Renato Goline84b0002015-10-08 16:43:26 +00004540 unsigned ArchKind = llvm::ARM::AK_ARMV4T;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004541 unsigned ArchProfile;
4542 unsigned ArchVersion;
4543
Bernard Ogdenda13af32013-10-24 18:32:51 +00004544 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004545
Logan Chien57086ce2012-10-10 06:56:20 +00004546 unsigned IsAAPCS : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004547 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004548
4549 // Initialized via features.
4550 unsigned SoftFloat : 1;
4551 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004552
Bernard Ogden18b57012013-10-29 09:47:51 +00004553 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00004554 unsigned Crypto : 1;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004555 unsigned DSP : 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004556 unsigned Unaligned : 1;
4557
4558 enum {
4559 LDREX_B = (1 << 0), /// byte (8-bit)
4560 LDREX_H = (1 << 1), /// half (16-bit)
4561 LDREX_W = (1 << 2), /// word (32-bit)
4562 LDREX_D = (1 << 3), /// double (64-bit)
4563 };
4564
4565 uint32_t LDREX;
Bernard Ogden18b57012013-10-29 09:47:51 +00004566
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004567 // ACLE 6.5.1 Hardware floating point
4568 enum {
4569 HW_FP_HP = (1 << 1), /// half (16-bit)
4570 HW_FP_SP = (1 << 2), /// single (32-bit)
4571 HW_FP_DP = (1 << 3), /// double (64-bit)
4572 };
4573 uint32_t HW_FP;
4574
Chris Lattner5cc15e02010-03-03 19:03:45 +00004575 static const Builtin::Info BuiltinInfo[];
4576
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004577 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004578 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004579
4580 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00004581 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004582
Renato Golin9ba39232015-02-27 16:35:48 +00004583 // size_t is unsigned long on MachO-derived environments, NetBSD and Bitrig.
4584 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD ||
4585 T.getOS() == llvm::Triple::Bitrig)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004586 SizeType = UnsignedLong;
4587 else
4588 SizeType = UnsignedInt;
4589
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004590 switch (T.getOS()) {
4591 case llvm::Triple::NetBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004592 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004593 break;
4594 case llvm::Triple::Win32:
4595 WCharType = UnsignedShort;
4596 break;
4597 case llvm::Triple::Linux:
4598 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004599 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
4600 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004601 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004602 }
4603
4604 UseBitFieldTypeAlignment = true;
4605
4606 ZeroLengthBitfieldBoundary = 0;
4607
Tim Northover147cd2f2014-10-14 22:12:21 +00004608 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
4609 // so set preferred for small types to 32.
4610 if (T.isOSBinFormatMachO()) {
James Y Knightb214cbc2016-03-04 19:00:41 +00004611 resetDataLayout(BigEndian
4612 ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4613 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Tim Northover147cd2f2014-10-14 22:12:21 +00004614 } else if (T.isOSWindows()) {
Tim Northover147cd2f2014-10-14 22:12:21 +00004615 assert(!BigEndian && "Windows on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004616 resetDataLayout("e"
4617 "-m:w"
4618 "-p:32:32"
4619 "-i64:64"
4620 "-v128:64:128"
4621 "-a:0:32"
4622 "-n32"
4623 "-S64");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00004624 } else if (T.isOSNaCl()) {
4625 assert(!BigEndian && "NaCl on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004626 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004627 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00004628 resetDataLayout(BigEndian
4629 ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4630 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004631 }
4632
4633 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004634 }
4635
Tim Northover5627d392015-10-30 16:30:45 +00004636 void setABIAPCS(bool IsAAPCS16) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00004637 const llvm::Triple &T = getTriple();
4638
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004639 IsAAPCS = false;
4640
Tim Northover5627d392015-10-30 16:30:45 +00004641 if (IsAAPCS16)
4642 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
4643 else
4644 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004645
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004646 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00004647 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004648 SizeType = UnsignedInt;
4649 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004650 SizeType = UnsignedLong;
4651
4652 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
4653 WCharType = SignedInt;
4654
4655 // Do not respect the alignment of bit-field types when laying out
4656 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
4657 UseBitFieldTypeAlignment = false;
4658
4659 /// gcc forces the alignment to 4 bytes, regardless of the type of the
4660 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
4661 /// gcc.
4662 ZeroLengthBitfieldBoundary = 32;
4663
Tim Northover5627d392015-10-30 16:30:45 +00004664 if (T.isOSBinFormatMachO() && IsAAPCS16) {
4665 assert(!BigEndian && "AAPCS16 does not support big-endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004666 resetDataLayout("e-m:o-p:32:32-i64:64-a:0:32-n32-S128");
Tim Northover5627d392015-10-30 16:30:45 +00004667 } else if (T.isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00004668 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00004669 BigEndian
4670 ? "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 +00004671 : "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 +00004672 else
James Y Knightb214cbc2016-03-04 19:00:41 +00004673 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00004674 BigEndian
4675 ? "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 +00004676 : "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 +00004677
4678 // FIXME: Override "preferred align" for double and long long.
4679 }
4680
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004681 void setArchInfo() {
4682 StringRef ArchName = getTriple().getArchName();
4683
Renato Goline84b0002015-10-08 16:43:26 +00004684 ArchISA = llvm::ARM::parseArchISA(ArchName);
4685 CPU = llvm::ARM::getDefaultCPU(ArchName);
4686 unsigned AK = llvm::ARM::parseArch(ArchName);
4687 if (AK != llvm::ARM::AK_INVALID)
4688 ArchKind = AK;
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004689 setArchInfo(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004690 }
4691
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004692 void setArchInfo(unsigned Kind) {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004693 StringRef SubArch;
4694
4695 // cache TargetParser info
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004696 ArchKind = Kind;
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00004697 SubArch = llvm::ARM::getSubArch(ArchKind);
4698 ArchProfile = llvm::ARM::parseArchProfile(SubArch);
4699 ArchVersion = llvm::ARM::parseArchVersion(SubArch);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004700
4701 // cache CPU related strings
4702 CPUAttr = getCPUAttr();
4703 CPUProfile = getCPUProfile();
4704 }
4705
4706 void setAtomic() {
Eric Christopherb093d692015-10-09 18:39:59 +00004707 // when triple does not specify a sub arch,
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004708 // then we are not using inline atomics
Renato Goline84b0002015-10-08 16:43:26 +00004709 bool ShouldUseInlineAtomic =
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004710 (ArchISA == llvm::ARM::IK_ARM && ArchVersion >= 6) ||
4711 (ArchISA == llvm::ARM::IK_THUMB && ArchVersion >= 7);
Eric Christopherb093d692015-10-09 18:39:59 +00004712 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004713 if (ArchProfile == llvm::ARM::PK_M) {
4714 MaxAtomicPromoteWidth = 32;
4715 if (ShouldUseInlineAtomic)
4716 MaxAtomicInlineWidth = 32;
4717 }
4718 else {
4719 MaxAtomicPromoteWidth = 64;
4720 if (ShouldUseInlineAtomic)
4721 MaxAtomicInlineWidth = 64;
Eric Christopherb093d692015-10-09 18:39:59 +00004722 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004723 }
4724
4725 bool isThumb() const {
4726 return (ArchISA == llvm::ARM::IK_THUMB);
4727 }
4728
4729 bool supportsThumb() const {
4730 return CPUAttr.count('T') || ArchVersion >= 6;
4731 }
4732
4733 bool supportsThumb2() const {
Bradley Smithf4affc12016-03-03 13:52:22 +00004734 return CPUAttr.equals("6T2") ||
4735 (ArchVersion >= 7 && !CPUAttr.equals("8M_BASE"));
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004736 }
4737
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004738 StringRef getCPUAttr() const {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004739 // For most sub-arches, the build attribute CPU name is enough.
4740 // For Cortex variants, it's slightly different.
4741 switch(ArchKind) {
4742 default:
Chandler Carruthd96f37a2015-08-30 07:51:18 +00004743 return llvm::ARM::getCPUAttr(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004744 case llvm::ARM::AK_ARMV6M:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004745 return "6M";
Tim Northover525c73c2015-07-21 21:47:33 +00004746 case llvm::ARM::AK_ARMV7S:
4747 return "7S";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004748 case llvm::ARM::AK_ARMV7A:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004749 return "7A";
4750 case llvm::ARM::AK_ARMV7R:
4751 return "7R";
4752 case llvm::ARM::AK_ARMV7M:
4753 return "7M";
4754 case llvm::ARM::AK_ARMV7EM:
4755 return "7EM";
4756 case llvm::ARM::AK_ARMV8A:
4757 return "8A";
4758 case llvm::ARM::AK_ARMV8_1A:
4759 return "8_1A";
Oliver Stannard3086c042016-02-11 16:05:52 +00004760 case llvm::ARM::AK_ARMV8_2A:
4761 return "8_2A";
Bradley Smithf4affc12016-03-03 13:52:22 +00004762 case llvm::ARM::AK_ARMV8MBaseline:
4763 return "8M_BASE";
4764 case llvm::ARM::AK_ARMV8MMainline:
4765 return "8M_MAIN";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004766 }
4767 }
4768
4769 StringRef getCPUProfile() const {
4770 switch(ArchProfile) {
4771 case llvm::ARM::PK_A:
4772 return "A";
4773 case llvm::ARM::PK_R:
4774 return "R";
4775 case llvm::ARM::PK_M:
4776 return "M";
4777 default:
4778 return "";
4779 }
4780 }
4781
Chris Lattner17df24e2008-04-21 18:56:49 +00004782public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004783 ARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts,
4784 bool IsBigEndian)
4785 : TargetInfo(Triple), FPMath(FP_Default), IsAAPCS(true), LDREX(0),
4786 HW_FP(0) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004787 BigEndian = IsBigEndian;
4788
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004789 switch (getTriple().getOS()) {
4790 case llvm::Triple::NetBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004791 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004792 break;
4793 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004794 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004795 break;
4796 }
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004797
Renato Goline84b0002015-10-08 16:43:26 +00004798 // Cache arch related info.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004799 setArchInfo();
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004800
Chris Lattner1a8f3942010-04-23 16:29:58 +00004801 // {} in inline assembly are neon specifiers, not assembly variant
4802 // specifiers.
4803 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004804
Eric Christopher0e261882014-12-05 01:06:59 +00004805 // FIXME: This duplicates code from the driver that sets the -target-abi
4806 // option - this code is used if -target-abi isn't passed and should
4807 // be unified in some way.
4808 if (Triple.isOSBinFormatMachO()) {
4809 // The backend is hardwired to assume AAPCS for M-class processors, ensure
4810 // the frontend matches that.
4811 if (Triple.getEnvironment() == llvm::Triple::EABI ||
4812 Triple.getOS() == llvm::Triple::UnknownOS ||
4813 StringRef(CPU).startswith("cortex-m")) {
4814 setABI("aapcs");
Tim Northoverd88ecb32016-01-27 19:32:40 +00004815 } else if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00004816 setABI("aapcs16");
Eric Christopher0e261882014-12-05 01:06:59 +00004817 } else {
4818 setABI("apcs-gnu");
4819 }
4820 } else if (Triple.isOSWindows()) {
4821 // FIXME: this is invalid for WindowsCE
4822 setABI("aapcs");
4823 } else {
4824 // Select the default based on the platform.
4825 switch (Triple.getEnvironment()) {
4826 case llvm::Triple::Android:
4827 case llvm::Triple::GNUEABI:
4828 case llvm::Triple::GNUEABIHF:
4829 setABI("aapcs-linux");
4830 break;
4831 case llvm::Triple::EABIHF:
4832 case llvm::Triple::EABI:
4833 setABI("aapcs");
4834 break;
Eric Christopher560cc4f2014-12-18 02:08:55 +00004835 case llvm::Triple::GNU:
Renato Goline84b0002015-10-08 16:43:26 +00004836 setABI("apcs-gnu");
4837 break;
Eric Christopher0e261882014-12-05 01:06:59 +00004838 default:
4839 if (Triple.getOS() == llvm::Triple::NetBSD)
4840 setABI("apcs-gnu");
4841 else
4842 setABI("aapcs");
4843 break;
4844 }
4845 }
John McCall86353412010-08-21 22:46:04 +00004846
4847 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00004848 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004849
Renato Golin15b86152015-07-03 16:41:13 +00004850 // ARM has atomics up to 8 bytes
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004851 setAtomic();
Rafael Espindola5ab8e2e2015-07-02 15:14:10 +00004852
James Molloya7139222012-03-12 09:14:10 +00004853 // Do force alignment of members that follow zero length bitfields. If
Eric Christopher917e9522014-11-18 22:36:15 +00004854 // the alignment of the zero-length bitfield is greater than the member
4855 // that follows it, `bar', `bar' will be aligned as the type of the
James Molloya7139222012-03-12 09:14:10 +00004856 // zero length bitfield.
4857 UseZeroLengthBitfieldAlignment = true;
Saleem Abdulrasool9b5ba542016-04-10 03:19:47 +00004858
4859 if (Triple.getOS() == llvm::Triple::Linux ||
4860 Triple.getOS() == llvm::Triple::UnknownOS)
4861 this->MCountName =
4862 Opts.EABIVersion == "gnu" ? "\01__gnu_mcount_nc" : "\01mcount";
Eli Friedmanb5366062008-05-20 14:21:01 +00004863 }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00004864
Alp Toker4925ba72014-06-07 23:30:42 +00004865 StringRef getABI() const override { return ABI; }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00004866
Craig Topper3164f332014-03-11 03:39:26 +00004867 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004868 ABI = Name;
4869
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004870 // The defaults (above) are for AAPCS, check if we need to change them.
4871 //
4872 // FIXME: We need support for -meabi... we could just mangle it into the
4873 // name.
Tim Northover756447a2015-10-30 16:30:36 +00004874 if (Name == "apcs-gnu" || Name == "aapcs16") {
Tim Northover5627d392015-10-30 16:30:45 +00004875 setABIAPCS(Name == "aapcs16");
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004876 return true;
4877 }
4878 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
4879 setABIAAPCS();
4880 return true;
4881 }
4882 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004883 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004884
Renato Golinf5c4dec2015-05-27 13:33:00 +00004885 // FIXME: This should be based on Arch attributes, not CPU names.
Eric Christopher8c47b422015-10-09 18:39:55 +00004886 bool
4887 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
4888 StringRef CPU,
4889 const std::vector<std::string> &FeaturesVec) const override {
4890
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004891 std::vector<const char*> TargetFeatures;
Bradley Smithb3501962015-11-16 11:16:36 +00004892 unsigned Arch = llvm::ARM::parseArch(getTriple().getArchName());
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004893
4894 // get default FPU features
Bradley Smithb3501962015-11-16 11:16:36 +00004895 unsigned FPUKind = llvm::ARM::getDefaultFPU(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004896 llvm::ARM::getFPUFeatures(FPUKind, TargetFeatures);
4897
4898 // get default Extension features
Bradley Smithb3501962015-11-16 11:16:36 +00004899 unsigned Extensions = llvm::ARM::getDefaultExtensions(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004900 llvm::ARM::getExtensionFeatures(Extensions, TargetFeatures);
4901
4902 for (const char *Feature : TargetFeatures)
4903 if (Feature[0] == '+')
Eric Christopherb093d692015-10-09 18:39:59 +00004904 Features[Feature+1] = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004905
Eric Christopher007b0a02015-08-28 22:32:01 +00004906 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004907 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004908
Craig Topper3164f332014-03-11 03:39:26 +00004909 bool handleTargetFeatures(std::vector<std::string> &Features,
4910 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004911 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00004912 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00004913 Crypto = 0;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004914 DSP = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004915 Unaligned = 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004916 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004917 HWDiv = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004918
Ranjeet Singhac08e532015-06-24 23:39:25 +00004919 // This does not diagnose illegal cases like having both
4920 // "+vfpv2" and "+vfpv3" or having "+neon" and "+fp-only-sp".
4921 uint32_t HW_FP_remove = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004922 for (const auto &Feature : Features) {
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004923 if (Feature == "+soft-float") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004924 SoftFloat = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004925 } else if (Feature == "+soft-float-abi") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004926 SoftFloatABI = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004927 } else if (Feature == "+vfp2") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004928 FPU |= VFP2FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004929 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004930 } else if (Feature == "+vfp3") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004931 FPU |= VFP3FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004932 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004933 } else if (Feature == "+vfp4") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004934 FPU |= VFP4FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004935 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004936 } else if (Feature == "+fp-armv8") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004937 FPU |= FPARMV8;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004938 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004939 } else if (Feature == "+neon") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004940 FPU |= NeonFPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004941 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004942 } else if (Feature == "+hwdiv") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004943 HWDiv |= HWDivThumb;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004944 } else if (Feature == "+hwdiv-arm") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004945 HWDiv |= HWDivARM;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004946 } else if (Feature == "+crc") {
Bernard Ogden18b57012013-10-29 09:47:51 +00004947 CRC = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004948 } else if (Feature == "+crypto") {
Tim Northover02e38602014-02-03 17:28:04 +00004949 Crypto = 1;
Artyom Skrobov05d85ae2015-10-23 17:19:02 +00004950 } else if (Feature == "+dsp") {
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004951 DSP = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004952 } else if (Feature == "+fp-only-sp") {
Richard Barton7dacc242015-10-21 10:03:55 +00004953 HW_FP_remove |= HW_FP_DP;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004954 } else if (Feature == "+strict-align") {
4955 Unaligned = 0;
4956 } else if (Feature == "+fp16") {
4957 HW_FP |= HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004958 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004959 }
Ranjeet Singhac08e532015-06-24 23:39:25 +00004960 HW_FP &= ~HW_FP_remove;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004961
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004962 switch (ArchVersion) {
4963 case 6:
4964 if (ArchProfile == llvm::ARM::PK_M)
4965 LDREX = 0;
4966 else if (ArchKind == llvm::ARM::AK_ARMV6K)
4967 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
4968 else
4969 LDREX = LDREX_W;
4970 break;
4971 case 7:
4972 if (ArchProfile == llvm::ARM::PK_M)
4973 LDREX = LDREX_W | LDREX_H | LDREX_B ;
4974 else
4975 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
4976 break;
4977 case 8:
4978 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
4979 }
4980
Rafael Espindolaeb265472013-08-21 21:59:03 +00004981 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
4982 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
4983 return false;
4984 }
4985
4986 if (FPMath == FP_Neon)
4987 Features.push_back("+neonfp");
4988 else if (FPMath == FP_VFP)
4989 Features.push_back("-neonfp");
4990
Daniel Dunbar893d4752009-12-19 04:15:38 +00004991 // Remove front-end specific options which the backend handles differently.
Eric Christopher9e172d22015-05-12 01:26:21 +00004992 auto Feature =
4993 std::find(Features.begin(), Features.end(), "+soft-float-abi");
4994 if (Feature != Features.end())
4995 Features.erase(Feature);
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004996
Rafael Espindolaeb265472013-08-21 21:59:03 +00004997 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004998 }
4999
Craig Topper3164f332014-03-11 03:39:26 +00005000 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005001 return llvm::StringSwitch<bool>(Feature)
5002 .Case("arm", true)
Ben Langmuir587aeaf2015-08-07 01:59:56 +00005003 .Case("aarch32", true)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005004 .Case("softfloat", SoftFloat)
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005005 .Case("thumb", isThumb())
Amara Emerson8c3de542013-09-16 18:07:35 +00005006 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005007 .Case("hwdiv", HWDiv & HWDivThumb)
5008 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005009 .Default(false);
5010 }
Renato Golin15b86152015-07-03 16:41:13 +00005011
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005012 bool setCPU(const std::string &Name) override {
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005013 if (Name != "generic")
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00005014 setArchInfo(llvm::ARM::parseCPUArch(Name));
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005015
Renato Golin15b86152015-07-03 16:41:13 +00005016 if (ArchKind == llvm::ARM::AK_INVALID)
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005017 return false;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005018 setAtomic();
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005019 CPU = Name;
5020 return true;
5021 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005022
Craig Topper3164f332014-03-11 03:39:26 +00005023 bool setFPMath(StringRef Name) override;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005024
Craig Topper3164f332014-03-11 03:39:26 +00005025 void getTargetDefines(const LangOptions &Opts,
5026 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00005027 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005028 Builder.defineMacro("__arm");
5029 Builder.defineMacro("__arm__");
Weiming Zhaob0613132016-04-18 16:25:46 +00005030 // For bare-metal none-eabi.
5031 if (getTriple().getOS() == llvm::Triple::UnknownOS &&
5032 getTriple().getEnvironment() == llvm::Triple::EABI)
5033 Builder.defineMacro("__ELF__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00005034
Chris Lattnerecd49032009-03-02 22:27:17 +00005035 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005036 Builder.defineMacro("__REGISTER_PREFIX__", "");
Tim Northover5627d392015-10-30 16:30:45 +00005037
5038 // Unfortunately, __ARM_ARCH_7K__ is now more of an ABI descriptor. The CPU
5039 // happens to be Cortex-A7 though, so it should still get __ARM_ARCH_7A__.
Tim Northoverd88ecb32016-01-27 19:32:40 +00005040 if (getTriple().isWatchABI())
Tim Northover5627d392015-10-30 16:30:45 +00005041 Builder.defineMacro("__ARM_ARCH_7K__", "2");
5042
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005043 if (!CPUAttr.empty())
5044 Builder.defineMacro("__ARM_ARCH_" + CPUAttr + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005045
5046 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005047 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
Benjamin Kramerb42d9a52015-12-24 10:07:37 +00005048 Builder.defineMacro("__ARM_ARCH", Twine(ArchVersion));
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005049
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005050 if (ArchVersion >= 8) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005051 // ACLE 6.5.7 Crypto Extension
5052 if (Crypto)
5053 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
5054 // ACLE 6.5.8 CRC32 Extension
5055 if (CRC)
5056 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
5057 // ACLE 6.5.10 Numeric Maximum and Minimum
5058 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
5059 // ACLE 6.5.9 Directed Rounding
5060 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
James Molloy0ffb0932014-09-15 11:25:38 +00005061 }
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005062
5063 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
5064 // is not defined for the M-profile.
Bradley Smithf4affc12016-03-03 13:52:22 +00005065 // NOTE that the default profile is assumed to be 'A'
5066 if (CPUProfile.empty() || ArchProfile != llvm::ARM::PK_M)
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005067 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
5068
Bradley Smithf4affc12016-03-03 13:52:22 +00005069 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supports the original
5070 // Thumb ISA (including v6-M and v8-M Baseline). It is set to 2 if the
5071 // core supports the Thumb-2 ISA as found in the v6T2 architecture and all
5072 // v7 and v8 architectures excluding v8-M Baseline.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005073 if (supportsThumb2())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005074 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005075 else if (supportsThumb())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005076 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
5077
5078 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
5079 // instruction set such as ARM or Thumb.
5080 Builder.defineMacro("__ARM_32BIT_STATE", "1");
5081
5082 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
5083
5084 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005085 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005086 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00005087
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005088 // ACLE 6.4.3 Unaligned access supported in hardware
Eric Christopherb093d692015-10-09 18:39:59 +00005089 if (Unaligned)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005090 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Eric Christopherb093d692015-10-09 18:39:59 +00005091
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005092 // ACLE 6.4.4 LDREX/STREX
5093 if (LDREX)
5094 Builder.defineMacro("__ARM_FEATURE_LDREX", "0x" + llvm::utohexstr(LDREX));
5095
5096 // ACLE 6.4.5 CLZ
Eric Christopherb093d692015-10-09 18:39:59 +00005097 if (ArchVersion == 5 ||
5098 (ArchVersion == 6 && CPUProfile != "M") ||
5099 ArchVersion > 6)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005100 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
5101
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005102 // ACLE 6.5.1 Hardware Floating Point
5103 if (HW_FP)
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +00005104 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005105
Yi Konga44c4d72014-06-27 21:25:42 +00005106 // ACLE predefines.
5107 Builder.defineMacro("__ARM_ACLE", "200");
5108
Oliver Stannarddc2854c2015-09-03 12:40:58 +00005109 // FP16 support (we currently only support IEEE format).
5110 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
5111 Builder.defineMacro("__ARM_FP16_ARGS", "1");
5112
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005113 // ACLE 6.5.3 Fused multiply-accumulate (FMA)
Silviu Baranga632fdc52016-04-28 11:29:08 +00005114 if (ArchVersion >= 7 && (FPU & VFP4FPU))
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005115 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
5116
Mike Stump9d54bd72009-04-08 02:07:04 +00005117 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005118
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005119 // FIXME: It's more complicated than this and we don't really support
5120 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005121 // Windows on ARM does not "support" interworking
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005122 if (5 <= ArchVersion && ArchVersion <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005123 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005124
David Tweed8f676532012-10-25 13:33:01 +00005125 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00005126 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005127 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
Tim Northover862eaf82016-05-13 21:26:45 +00005128 if (!getTriple().isOSBinFormatMachO() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00005129 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005130 Builder.defineMacro("__ARM_PCS", "1");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005131 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005132
Tim Northover28fc0e12016-04-28 13:59:55 +00005133 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp" ||
5134 ABI == "aapcs16")
5135 Builder.defineMacro("__ARM_PCS_VFP", "1");
5136
Daniel Dunbar893d4752009-12-19 04:15:38 +00005137 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005138 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005139
5140 if (CPU == "xscale")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005141 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005142
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005143 if (isThumb()) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005144 Builder.defineMacro("__THUMBEL__");
5145 Builder.defineMacro("__thumb__");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005146 if (supportsThumb2())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005147 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005148 }
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005149
5150 // ACLE 6.4.9 32-bit SIMD instructions
5151 if (ArchVersion >= 6 && (CPUProfile != "M" || CPUAttr == "7EM"))
5152 Builder.defineMacro("__ARM_FEATURE_SIMD32", "1");
5153
5154 // ACLE 6.4.10 Hardware Integer Divide
Eric Christopherb093d692015-10-09 18:39:59 +00005155 if (((HWDiv & HWDivThumb) && isThumb()) ||
5156 ((HWDiv & HWDivARM) && !isThumb())) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005157 Builder.defineMacro("__ARM_FEATURE_IDIV", "1");
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005158 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005159 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005160
5161 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005162 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005163
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005164 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005165 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005166 if (FPU & VFP2FPU)
5167 Builder.defineMacro("__ARM_VFPV2__");
5168 if (FPU & VFP3FPU)
5169 Builder.defineMacro("__ARM_VFPV3__");
5170 if (FPU & VFP4FPU)
5171 Builder.defineMacro("__ARM_VFPV4__");
5172 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00005173
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005174 // This only gets set when Neon instructions are actually available, unlike
5175 // the VFP define, hence the soft float and arch check. This is subtly
5176 // different from gcc, we follow the intent which was that it should be set
5177 // when Neon instructions are actually available.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005178 if ((FPU & NeonFPU) && !SoftFloat && ArchVersion >= 7) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005179 Builder.defineMacro("__ARM_NEON", "1");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005180 Builder.defineMacro("__ARM_NEON__");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005181 // current AArch32 NEON implementations do not support double-precision
5182 // floating-point even when it is present in VFP.
Eric Christopherb093d692015-10-09 18:39:59 +00005183 Builder.defineMacro("__ARM_NEON_FP",
5184 "0x" + llvm::utohexstr(HW_FP & ~HW_FP_DP));
Tim Northover5bb34ca2013-11-21 12:36:34 +00005185 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00005186
Bradley Smith0f28f0c2014-01-20 10:52:00 +00005187 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
5188 Opts.ShortWChar ? "2" : "4");
5189
5190 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5191 Opts.ShortEnums ? "1" : "4");
5192
Bradley Smithf4affc12016-03-03 13:52:22 +00005193 if (ArchVersion >= 6 && CPUAttr != "6M" && CPUAttr != "8M_BASE") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00005194 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5195 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5196 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5197 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
5198 }
Sergey Dmitrouk745f5302014-11-25 08:57:36 +00005199
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005200 // ACLE 6.4.7 DSP instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005201 if (DSP) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005202 Builder.defineMacro("__ARM_FEATURE_DSP", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005203 }
5204
5205 // ACLE 6.4.8 Saturation instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005206 bool SAT = false;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005207 if ((ArchVersion == 6 && CPUProfile != "M") || ArchVersion > 6 ) {
5208 Builder.defineMacro("__ARM_FEATURE_SAT", "1");
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005209 SAT = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005210 }
5211
5212 // ACLE 6.4.6 Q (saturation) flag
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005213 if (DSP || SAT)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005214 Builder.defineMacro("__ARM_FEATURE_QBIT", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005215
5216 if (Opts.UnsafeFPMath)
5217 Builder.defineMacro("__ARM_FP_FAST", "1");
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005218
5219 if (ArchKind == llvm::ARM::AK_ARMV8_1A)
5220 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
Chris Lattner17df24e2008-04-21 18:56:49 +00005221 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005222
Craig Topper6c03a542015-10-19 04:51:35 +00005223 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5224 return llvm::makeArrayRef(BuiltinInfo,
5225 clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner17df24e2008-04-21 18:56:49 +00005226 }
Craig Topper3164f332014-03-11 03:39:26 +00005227 bool isCLZForZeroUndef() const override { return false; }
5228 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northover5627d392015-10-30 16:30:45 +00005229 return IsAAPCS
5230 ? AAPCSABIBuiltinVaList
Tim Northoverd88ecb32016-01-27 19:32:40 +00005231 : (getTriple().isWatchABI() ? TargetInfo::CharPtrBuiltinVaList
5232 : TargetInfo::VoidPtrBuiltinVaList);
Chris Lattner17df24e2008-04-21 18:56:49 +00005233 }
Craig Topperf054e3a2015-10-19 03:52:27 +00005234 ArrayRef<const char *> getGCCRegNames() const override;
5235 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00005236 bool validateAsmConstraint(const char *&Name,
5237 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00005238 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00005239 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00005240 case 'l': // r0-r7
5241 case 'h': // r8-r15
JF Bastien750caef2016-02-19 06:54:45 +00005242 case 't': // VFP Floating point register single precision
5243 case 'w': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00005244 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00005245 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005246 case 'I':
5247 case 'J':
5248 case 'K':
5249 case 'L':
5250 case 'M':
5251 // FIXME
5252 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00005253 case 'Q': // A memory address that is a single base register.
5254 Info.setAllowsMemory();
5255 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005256 case 'U': // a memory reference...
5257 switch (Name[1]) {
5258 case 'q': // ...ARMV4 ldrsb
5259 case 'v': // ...VFP load/store (reg+constant offset)
5260 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00005261 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00005262 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00005263 case 'n': // valid address for Neon doubleword vector load/store
5264 case 'm': // valid address for Neon element and structure load/store
5265 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00005266 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005267 Info.setAllowsMemory();
5268 Name++;
5269 return true;
5270 }
Nate Begeman2908fa02008-04-22 05:03:19 +00005271 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005272 return false;
5273 }
Craig Topper3164f332014-03-11 03:39:26 +00005274 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005275 std::string R;
5276 switch (*Constraint) {
5277 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00005278 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005279 Constraint++;
5280 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00005281 case 'p': // 'p' should be translated to 'r' by default.
5282 R = std::string("r");
5283 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005284 default:
5285 return std::string(1, *Constraint);
5286 }
5287 return R;
5288 }
Akira Hatanaka987f1862014-08-22 06:05:21 +00005289 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005290 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005291 std::string &SuggestedModifier) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00005292 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00005293 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00005294
Bill Wendling9d1ee112012-10-25 23:28:48 +00005295 // Strip off constraint modifiers.
5296 while (Constraint[0] == '=' ||
5297 Constraint[0] == '+' ||
5298 Constraint[0] == '&')
5299 Constraint = Constraint.substr(1);
5300
5301 switch (Constraint[0]) {
5302 default: break;
5303 case 'r': {
5304 switch (Modifier) {
5305 default:
Tim Northover8f24b172013-12-08 15:24:55 +00005306 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00005307 case 'q':
5308 // A register of size 32 cannot fit a vector type.
5309 return false;
5310 }
5311 }
5312 }
5313
5314 return true;
5315 }
Craig Topper3164f332014-03-11 03:39:26 +00005316 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00005317 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00005318 return "";
5319 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005320
Craig Topper3164f332014-03-11 03:39:26 +00005321 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00005322 switch (CC) {
5323 case CC_AAPCS:
5324 case CC_AAPCS_VFP:
5325 case CC_Swift:
5326 return CCCR_OK;
5327 default:
5328 return CCCR_Warning;
5329 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005330 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00005331
Craig Topper3164f332014-03-11 03:39:26 +00005332 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00005333 if (RegNo == 0) return 0;
5334 if (RegNo == 1) return 1;
5335 return -1;
5336 }
Matthias Braund1e2fad2015-07-17 00:15:22 +00005337
5338 bool hasSjLjLowering() const override {
5339 return true;
5340 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005341};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005342
Rafael Espindolaeb265472013-08-21 21:59:03 +00005343bool ARMTargetInfo::setFPMath(StringRef Name) {
5344 if (Name == "neon") {
5345 FPMath = FP_Neon;
5346 return true;
5347 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
5348 Name == "vfp4") {
5349 FPMath = FP_VFP;
5350 return true;
5351 }
5352 return false;
5353}
5354
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005355const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005356 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005357 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005358 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
5359
5360 // Float registers
5361 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
5362 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
5363 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005364 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005365
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005366 // Double registers
5367 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
5368 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005369 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
5370 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005371
5372 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005373 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
5374 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005375};
5376
Craig Topperf054e3a2015-10-19 03:52:27 +00005377ArrayRef<const char *> ARMTargetInfo::getGCCRegNames() const {
5378 return llvm::makeArrayRef(GCCRegNames);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005379}
5380
5381const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005382 { { "a1" }, "r0" },
5383 { { "a2" }, "r1" },
5384 { { "a3" }, "r2" },
5385 { { "a4" }, "r3" },
5386 { { "v1" }, "r4" },
5387 { { "v2" }, "r5" },
5388 { { "v3" }, "r6" },
5389 { { "v4" }, "r7" },
5390 { { "v5" }, "r8" },
5391 { { "v6", "rfp" }, "r9" },
5392 { { "sl" }, "r10" },
5393 { { "fp" }, "r11" },
5394 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00005395 { { "r13" }, "sp" },
5396 { { "r14" }, "lr" },
5397 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005398 // The S, D and Q registers overlap, but aren't really aliases; we
5399 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005400};
5401
Craig Topperf054e3a2015-10-19 03:52:27 +00005402ArrayRef<TargetInfo::GCCRegAlias> ARMTargetInfo::getGCCRegAliases() const {
5403 return llvm::makeArrayRef(GCCRegAliases);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005404}
Chris Lattner5cc15e02010-03-03 19:03:45 +00005405
5406const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00005407#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005408 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005409#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5410 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00005411#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00005412
Craig Topper07d3b622015-08-07 05:14:44 +00005413#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005414 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005415#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005416 { #ID, TYPE, ATTRS, nullptr, LANG, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005417#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5418 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5cc15e02010-03-03 19:03:45 +00005419#include "clang/Basic/BuiltinsARM.def"
5420};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005421
5422class ARMleTargetInfo : public ARMTargetInfo {
5423public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005424 ARMleTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5425 : ARMTargetInfo(Triple, Opts, /*BigEndian=*/false) {}
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005426 void getTargetDefines(const LangOptions &Opts,
5427 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005428 Builder.defineMacro("__ARMEL__");
5429 ARMTargetInfo::getTargetDefines(Opts, Builder);
5430 }
5431};
5432
5433class ARMbeTargetInfo : public ARMTargetInfo {
5434public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005435 ARMbeTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5436 : ARMTargetInfo(Triple, Opts, /*BigEndian=*/true) {}
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005437 void getTargetDefines(const LangOptions &Opts,
5438 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005439 Builder.defineMacro("__ARMEB__");
5440 Builder.defineMacro("__ARM_BIG_ENDIAN");
5441 ARMTargetInfo::getTargetDefines(Opts, Builder);
5442 }
5443};
Chris Lattner17df24e2008-04-21 18:56:49 +00005444
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005445class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
5446 const llvm::Triple Triple;
5447public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005448 WindowsARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5449 : WindowsTargetInfo<ARMleTargetInfo>(Triple, Opts), Triple(Triple) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005450 WCharType = UnsignedShort;
5451 SizeType = UnsignedInt;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005452 }
5453 void getVisualStudioDefines(const LangOptions &Opts,
5454 MacroBuilder &Builder) const {
5455 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
5456
5457 // FIXME: this is invalid for WindowsCE
5458 Builder.defineMacro("_M_ARM_NT", "1");
5459 Builder.defineMacro("_M_ARMT", "_M_ARM");
5460 Builder.defineMacro("_M_THUMB", "_M_ARM");
5461
5462 assert((Triple.getArch() == llvm::Triple::arm ||
5463 Triple.getArch() == llvm::Triple::thumb) &&
5464 "invalid architecture for Windows ARM target info");
5465 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
5466 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
5467
5468 // TODO map the complete set of values
5469 // 31: VFPv3 40: VFPv4
5470 Builder.defineMacro("_M_ARM_FP", "31");
5471 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00005472 BuiltinVaListKind getBuiltinVaListKind() const override {
5473 return TargetInfo::CharPtrBuiltinVaList;
5474 }
Martell Malone7ccda3c2015-08-14 18:00:09 +00005475 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5476 switch (CC) {
5477 case CC_X86StdCall:
5478 case CC_X86ThisCall:
5479 case CC_X86FastCall:
5480 case CC_X86VectorCall:
5481 return CCCR_Ignore;
5482 case CC_C:
5483 return CCCR_OK;
5484 default:
5485 return CCCR_Warning;
5486 }
5487 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005488};
5489
5490// Windows ARM + Itanium C++ ABI Target
5491class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
5492public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005493 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple,
5494 const TargetOptions &Opts)
5495 : WindowsARMTargetInfo(Triple, Opts) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005496 TheCXXABI.set(TargetCXXABI::GenericARM);
5497 }
5498
5499 void getTargetDefines(const LangOptions &Opts,
5500 MacroBuilder &Builder) const override {
5501 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5502
5503 if (Opts.MSVCCompat)
5504 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5505 }
5506};
5507
5508// Windows ARM, MS (C++) ABI
5509class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
5510public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005511 MicrosoftARMleTargetInfo(const llvm::Triple &Triple,
5512 const TargetOptions &Opts)
5513 : WindowsARMTargetInfo(Triple, Opts) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005514 TheCXXABI.set(TargetCXXABI::Microsoft);
5515 }
5516
5517 void getTargetDefines(const LangOptions &Opts,
5518 MacroBuilder &Builder) const override {
5519 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5520 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5521 }
5522};
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005523
Yaron Keren321249c2015-07-15 13:32:23 +00005524// ARM MinGW target
5525class MinGWARMTargetInfo : public WindowsARMTargetInfo {
5526public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005527 MinGWARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5528 : WindowsARMTargetInfo(Triple, Opts) {
Yaron Keren321249c2015-07-15 13:32:23 +00005529 TheCXXABI.set(TargetCXXABI::GenericARM);
5530 }
5531
5532 void getTargetDefines(const LangOptions &Opts,
5533 MacroBuilder &Builder) const override {
5534 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5535 DefineStd(Builder, "WIN32", Opts);
5536 DefineStd(Builder, "WINNT", Opts);
5537 Builder.defineMacro("_ARM_");
5538 addMinGWDefines(Opts, Builder);
5539 }
5540};
5541
5542// ARM Cygwin target
5543class CygwinARMTargetInfo : public ARMleTargetInfo {
5544public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005545 CygwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5546 : ARMleTargetInfo(Triple, Opts) {
Yaron Keren321249c2015-07-15 13:32:23 +00005547 TLSSupported = false;
5548 WCharType = UnsignedShort;
5549 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00005550 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Yaron Keren321249c2015-07-15 13:32:23 +00005551 }
5552 void getTargetDefines(const LangOptions &Opts,
5553 MacroBuilder &Builder) const override {
5554 ARMleTargetInfo::getTargetDefines(Opts, Builder);
5555 Builder.defineMacro("_ARM_");
5556 Builder.defineMacro("__CYGWIN__");
5557 Builder.defineMacro("__CYGWIN32__");
5558 DefineStd(Builder, "unix", Opts);
5559 if (Opts.CPlusPlus)
5560 Builder.defineMacro("_GNU_SOURCE");
5561 }
5562};
5563
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005564class DarwinARMTargetInfo : public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00005565protected:
Craig Topper3164f332014-03-11 03:39:26 +00005566 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5567 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00005568 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00005569 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005570
Torok Edwinb2b37c62009-06-30 17:10:35 +00005571public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005572 DarwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5573 : DarwinTargetInfo<ARMleTargetInfo>(Triple, Opts) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005574 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005575 // iOS always has 64-bit atomic instructions.
Eric Christopher917e9522014-11-18 22:36:15 +00005576 // FIXME: This should be based off of the target features in
5577 // ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005578 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00005579
Tim Northoverd88ecb32016-01-27 19:32:40 +00005580 if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00005581 // Darwin on iOS uses a variant of the ARM C++ ABI.
5582 TheCXXABI.set(TargetCXXABI::WatchOS);
5583
5584 // The 32-bit ABI is silent on what ptrdiff_t should be, but given that
5585 // size_t is long, it's a bit weird for it to be int.
5586 PtrDiffType = SignedLong;
5587
5588 // BOOL should be a real boolean on the new ABI
5589 UseSignedCharForObjCBool = false;
5590 } else
5591 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005592 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005593};
Eli Friedmanf05b7722008-08-20 07:44:10 +00005594
Tim Northover573cbee2014-05-24 12:52:07 +00005595class AArch64TargetInfo : public TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00005596 virtual void setDataLayout() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00005597 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5598 static const char *const GCCRegNames[];
5599
James Molloy75f5f9e2014-04-16 15:33:48 +00005600 enum FPUModeEnum {
5601 FPUMode,
5602 NeonMode
5603 };
5604
5605 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00005606 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00005607 unsigned Crypto;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005608 unsigned Unaligned;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005609 unsigned V8_1A;
James Molloy75f5f9e2014-04-16 15:33:48 +00005610
Tim Northovera2ee4332014-03-29 15:09:45 +00005611 static const Builtin::Info BuiltinInfo[];
5612
5613 std::string ABI;
5614
5615public:
Saleem Abdulrasool9b5ba542016-04-10 03:19:47 +00005616 AArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Tim Northovera2ee4332014-03-29 15:09:45 +00005617 : TargetInfo(Triple), ABI("aapcs") {
Tim Northover25e8a672014-05-24 12:51:25 +00005618 if (getTriple().getOS() == llvm::Triple::NetBSD) {
5619 WCharType = SignedInt;
5620
5621 // NetBSD apparently prefers consistency across ARM targets to consistency
5622 // across 64-bit targets.
5623 Int64Type = SignedLongLong;
5624 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005625 } else {
5626 WCharType = UnsignedInt;
5627 Int64Type = SignedLong;
5628 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005629 }
5630
Tim Northovera2ee4332014-03-29 15:09:45 +00005631 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005632 MaxVectorAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005633 MaxAtomicInlineWidth = 128;
5634 MaxAtomicPromoteWidth = 128;
5635
Tim Northovera6a19f12015-02-06 01:25:07 +00005636 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005637 LongDoubleFormat = &llvm::APFloat::IEEEquad;
5638
Tim Northovera2ee4332014-03-29 15:09:45 +00005639 // {} in inline assembly are neon specifiers, not assembly variant
5640 // specifiers.
5641 NoAsmVariants = true;
5642
Tim Northover7ad87af2015-01-16 18:44:04 +00005643 // AAPCS gives rules for bitfields. 7.1.7 says: "The container type
5644 // contributes to the alignment of the containing aggregate in the same way
5645 // a plain (non bit-field) member of that type would, without exception for
5646 // zero-sized or anonymous bit-fields."
Tim Northover5627d392015-10-30 16:30:45 +00005647 assert(UseBitFieldTypeAlignment && "bitfields affect type alignment");
Tim Northover7ad87af2015-01-16 18:44:04 +00005648 UseZeroLengthBitfieldAlignment = true;
5649
Tim Northover573cbee2014-05-24 12:52:07 +00005650 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00005651 TheCXXABI.set(TargetCXXABI::GenericAArch64);
Saleem Abdulrasoolc066d9c2016-04-12 03:05:03 +00005652
5653 if (Triple.getOS() == llvm::Triple::Linux ||
5654 Triple.getOS() == llvm::Triple::UnknownOS)
5655 this->MCountName = Opts.EABIVersion == "gnu" ? "\01_mcount" : "mcount";
Tim Northovera2ee4332014-03-29 15:09:45 +00005656 }
5657
Alp Toker4925ba72014-06-07 23:30:42 +00005658 StringRef getABI() const override { return ABI; }
David Blaikie1cbb9712014-11-14 19:09:44 +00005659 bool setABI(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005660 if (Name != "aapcs" && Name != "darwinpcs")
5661 return false;
5662
5663 ABI = Name;
5664 return true;
5665 }
5666
David Blaikie1cbb9712014-11-14 19:09:44 +00005667 bool setCPU(const std::string &Name) override {
Renato Golin3b8709c2016-05-25 12:36:31 +00005668 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5669 .Case("generic", true)
5670 .Cases("cortex-a53", "cortex-a57", "cortex-a72",
5671 "cortex-a35", "exynos-m1", true)
Sjoerd Meijer90df4a72016-06-02 10:48:37 +00005672 .Case("cortex-a73", true)
Renato Golin3b8709c2016-05-25 12:36:31 +00005673 .Case("cyclone", true)
5674 .Case("kryo", true)
5675 .Default(false);
5676 return CPUKnown;
Tim Northovera2ee4332014-03-29 15:09:45 +00005677 }
5678
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005679 void getTargetDefines(const LangOptions &Opts,
5680 MacroBuilder &Builder) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005681 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00005682 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005683
5684 // Target properties.
5685 Builder.defineMacro("_LP64");
5686 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005687
5688 // ACLE predefines. Many can only have one possible value on v8 AArch64.
5689 Builder.defineMacro("__ARM_ACLE", "200");
5690 Builder.defineMacro("__ARM_ARCH", "8");
5691 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
5692
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005693 Builder.defineMacro("__ARM_64BIT_STATE", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005694 Builder.defineMacro("__ARM_PCS_AAPCS64", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005695 Builder.defineMacro("__ARM_ARCH_ISA_A64", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005696
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005697 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
5698 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
5699 Builder.defineMacro("__ARM_FEATURE_LDREX", "0xF");
5700 Builder.defineMacro("__ARM_FEATURE_IDIV", "1"); // As specified in ACLE
James Molloy0ffb0932014-09-15 11:25:38 +00005701 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005702 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
5703 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005704
5705 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
5706
5707 // 0xe implies support for half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005708 Builder.defineMacro("__ARM_FP", "0xE");
Tim Northovera2ee4332014-03-29 15:09:45 +00005709
5710 // PCS specifies this for SysV variants, which is all we support. Other ABIs
5711 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005712 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
5713 Builder.defineMacro("__ARM_FP16_ARGS", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005714
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005715 if (Opts.UnsafeFPMath)
5716 Builder.defineMacro("__ARM_FP_FAST", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005717
5718 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
5719
5720 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5721 Opts.ShortEnums ? "1" : "4");
5722
James Molloy75f5f9e2014-04-16 15:33:48 +00005723 if (FPU == NeonMode) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005724 Builder.defineMacro("__ARM_NEON", "1");
James Molloy75f5f9e2014-04-16 15:33:48 +00005725 // 64-bit NEON supports half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005726 Builder.defineMacro("__ARM_NEON_FP", "0xE");
James Molloy75f5f9e2014-04-16 15:33:48 +00005727 }
Tim Northovera2ee4332014-03-29 15:09:45 +00005728
Bradley Smith418c5932014-05-02 15:17:51 +00005729 if (CRC)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005730 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
Bradley Smith418c5932014-05-02 15:17:51 +00005731
James Molloy75f5f9e2014-04-16 15:33:48 +00005732 if (Crypto)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005733 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
5734
5735 if (Unaligned)
5736 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Reid Klecknerd167d422015-05-06 15:31:46 +00005737
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005738 if (V8_1A)
5739 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
5740
Reid Klecknerd167d422015-05-06 15:31:46 +00005741 // All of the __sync_(bool|val)_compare_and_swap_(1|2|4|8) builtins work.
5742 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5743 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5744 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5745 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Tim Northovera2ee4332014-03-29 15:09:45 +00005746 }
5747
Craig Topper6c03a542015-10-19 04:51:35 +00005748 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5749 return llvm::makeArrayRef(BuiltinInfo,
5750 clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin);
Tim Northovera2ee4332014-03-29 15:09:45 +00005751 }
5752
David Blaikie1cbb9712014-11-14 19:09:44 +00005753 bool hasFeature(StringRef Feature) const override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005754 return Feature == "aarch64" ||
5755 Feature == "arm64" ||
Ben Langmuir587aeaf2015-08-07 01:59:56 +00005756 Feature == "arm" ||
James Molloy75f5f9e2014-04-16 15:33:48 +00005757 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00005758 }
5759
James Molloy5e73df52014-04-16 15:06:20 +00005760 bool handleTargetFeatures(std::vector<std::string> &Features,
5761 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005762 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00005763 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00005764 Crypto = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005765 Unaligned = 1;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005766 V8_1A = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005767
Eric Christopher610fe112015-08-26 08:21:55 +00005768 for (const auto &Feature : Features) {
5769 if (Feature == "+neon")
James Molloy75f5f9e2014-04-16 15:33:48 +00005770 FPU = NeonMode;
Eric Christopher610fe112015-08-26 08:21:55 +00005771 if (Feature == "+crc")
Bradley Smith418c5932014-05-02 15:17:51 +00005772 CRC = 1;
Eric Christopher610fe112015-08-26 08:21:55 +00005773 if (Feature == "+crypto")
James Molloy75f5f9e2014-04-16 15:33:48 +00005774 Crypto = 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005775 if (Feature == "+strict-align")
5776 Unaligned = 0;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005777 if (Feature == "+v8.1a")
5778 V8_1A = 1;
James Molloy75f5f9e2014-04-16 15:33:48 +00005779 }
5780
James Y Knightb214cbc2016-03-04 19:00:41 +00005781 setDataLayout();
James Molloy5e73df52014-04-16 15:06:20 +00005782
5783 return true;
5784 }
5785
John McCall477f2bb2016-03-03 06:39:32 +00005786 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5787 switch (CC) {
5788 case CC_C:
5789 case CC_Swift:
Roman Levenstein35aa5ce2016-03-16 18:00:46 +00005790 case CC_PreserveMost:
5791 case CC_PreserveAll:
John McCall477f2bb2016-03-03 06:39:32 +00005792 return CCCR_OK;
5793 default:
5794 return CCCR_Warning;
5795 }
5796 }
5797
David Blaikie1cbb9712014-11-14 19:09:44 +00005798 bool isCLZForZeroUndef() const override { return false; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005799
David Blaikie1cbb9712014-11-14 19:09:44 +00005800 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005801 return TargetInfo::AArch64ABIBuiltinVaList;
5802 }
5803
Craig Topperf054e3a2015-10-19 03:52:27 +00005804 ArrayRef<const char *> getGCCRegNames() const override;
5805 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00005806
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005807 bool validateAsmConstraint(const char *&Name,
5808 TargetInfo::ConstraintInfo &Info) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005809 switch (*Name) {
5810 default:
5811 return false;
5812 case 'w': // Floating point and SIMD registers (V0-V31)
5813 Info.setAllowsRegister();
5814 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00005815 case 'I': // Constant that can be used with an ADD instruction
5816 case 'J': // Constant that can be used with a SUB instruction
5817 case 'K': // Constant that can be used with a 32-bit logical instruction
5818 case 'L': // Constant that can be used with a 64-bit logical instruction
5819 case 'M': // Constant that can be used as a 32-bit MOV immediate
5820 case 'N': // Constant that can be used as a 64-bit MOV immediate
5821 case 'Y': // Floating point constant zero
5822 case 'Z': // Integer constant zero
5823 return true;
5824 case 'Q': // A memory reference with base register and no offset
5825 Info.setAllowsMemory();
5826 return true;
5827 case 'S': // A symbolic address
5828 Info.setAllowsRegister();
5829 return true;
5830 case 'U':
Eric Christopher917e9522014-11-18 22:36:15 +00005831 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
5832 // Utf: A memory address suitable for ldp/stp in TF mode.
5833 // Usa: An absolute symbolic address.
5834 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
5835 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
Tim Northovera2ee4332014-03-29 15:09:45 +00005836 case 'z': // Zero register, wzr or xzr
5837 Info.setAllowsRegister();
5838 return true;
5839 case 'x': // Floating point and SIMD registers (V0-V15)
5840 Info.setAllowsRegister();
5841 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00005842 }
5843 return false;
5844 }
5845
Akira Hatanaka987f1862014-08-22 06:05:21 +00005846 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005847 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005848 std::string &SuggestedModifier) const override {
James Molloy8a157bf2014-07-25 10:19:47 +00005849 // Strip off constraint modifiers.
5850 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
5851 Constraint = Constraint.substr(1);
5852
5853 switch (Constraint[0]) {
5854 default:
5855 return true;
5856 case 'z':
5857 case 'r': {
5858 switch (Modifier) {
5859 case 'x':
5860 case 'w':
5861 // For now assume that the person knows what they're
5862 // doing with the modifier.
5863 return true;
5864 default:
5865 // By default an 'r' constraint will be in the 'x'
5866 // registers.
Akira Hatanaka987f1862014-08-22 06:05:21 +00005867 if (Size == 64)
5868 return true;
5869
5870 SuggestedModifier = "w";
5871 return false;
James Molloy8a157bf2014-07-25 10:19:47 +00005872 }
5873 }
5874 }
5875 }
5876
David Blaikie1cbb9712014-11-14 19:09:44 +00005877 const char *getClobbers() const override { return ""; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005878
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00005879 int getEHDataRegisterNumber(unsigned RegNo) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005880 if (RegNo == 0)
5881 return 0;
5882 if (RegNo == 1)
5883 return 1;
5884 return -1;
5885 }
5886};
5887
Tim Northover573cbee2014-05-24 12:52:07 +00005888const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005889 // 32-bit Integer registers
5890 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
5891 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
5892 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
5893
5894 // 64-bit Integer registers
5895 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
5896 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
5897 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
5898
5899 // 32-bit floating point regsisters
5900 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
5901 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
5902 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
5903
5904 // 64-bit floating point regsisters
5905 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
5906 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
5907 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
5908
5909 // Vector registers
5910 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
5911 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
5912 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
5913};
5914
Craig Topperf054e3a2015-10-19 03:52:27 +00005915ArrayRef<const char *> AArch64TargetInfo::getGCCRegNames() const {
5916 return llvm::makeArrayRef(GCCRegNames);
Tim Northovera2ee4332014-03-29 15:09:45 +00005917}
5918
Tim Northover573cbee2014-05-24 12:52:07 +00005919const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005920 { { "w31" }, "wsp" },
5921 { { "x29" }, "fp" },
5922 { { "x30" }, "lr" },
5923 { { "x31" }, "sp" },
5924 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
5925 // don't want to substitute one of these for a different-sized one.
5926};
5927
Craig Topperf054e3a2015-10-19 03:52:27 +00005928ArrayRef<TargetInfo::GCCRegAlias> AArch64TargetInfo::getGCCRegAliases() const {
5929 return llvm::makeArrayRef(GCCRegAliases);
Tim Northovera2ee4332014-03-29 15:09:45 +00005930}
5931
Tim Northover573cbee2014-05-24 12:52:07 +00005932const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005933#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00005934 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00005935#include "clang/Basic/BuiltinsNEON.def"
5936
5937#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00005938 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northover573cbee2014-05-24 12:52:07 +00005939#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00005940};
James Molloy5e73df52014-04-16 15:06:20 +00005941
Tim Northover573cbee2014-05-24 12:52:07 +00005942class AArch64leTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00005943 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00005944 if (getTriple().isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00005945 resetDataLayout("e-m:o-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00005946 else
James Y Knightb214cbc2016-03-04 19:00:41 +00005947 resetDataLayout("e-m:e-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00005948 }
5949
5950public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005951 AArch64leTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5952 : AArch64TargetInfo(Triple, Opts) {
James Molloy5e73df52014-04-16 15:06:20 +00005953 BigEndian = false;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005954 }
James Molloy5e73df52014-04-16 15:06:20 +00005955 void getTargetDefines(const LangOptions &Opts,
5956 MacroBuilder &Builder) const override {
5957 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00005958 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00005959 }
5960};
5961
Tim Northover573cbee2014-05-24 12:52:07 +00005962class AArch64beTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00005963 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00005964 assert(!getTriple().isOSBinFormatMachO());
James Y Knightb214cbc2016-03-04 19:00:41 +00005965 resetDataLayout("E-m:e-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00005966 }
5967
5968public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005969 AArch64beTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5970 : AArch64TargetInfo(Triple, Opts) {}
James Molloy5e73df52014-04-16 15:06:20 +00005971 void getTargetDefines(const LangOptions &Opts,
5972 MacroBuilder &Builder) const override {
5973 Builder.defineMacro("__AARCH64EB__");
5974 Builder.defineMacro("__AARCH_BIG_ENDIAN");
5975 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00005976 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00005977 }
5978};
Tim Northovera2ee4332014-03-29 15:09:45 +00005979
Tim Northover573cbee2014-05-24 12:52:07 +00005980class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00005981protected:
5982 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5983 MacroBuilder &Builder) const override {
5984 Builder.defineMacro("__AARCH64_SIMD__");
5985 Builder.defineMacro("__ARM64_ARCH_8__");
5986 Builder.defineMacro("__ARM_NEON__");
5987 Builder.defineMacro("__LITTLE_ENDIAN__");
5988 Builder.defineMacro("__REGISTER_PREFIX__", "");
5989 Builder.defineMacro("__arm64", "1");
5990 Builder.defineMacro("__arm64__", "1");
5991
5992 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
5993 }
5994
Tim Northovera2ee4332014-03-29 15:09:45 +00005995public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005996 DarwinAArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5997 : DarwinTargetInfo<AArch64leTargetInfo>(Triple, Opts) {
Tim Northovera2ee4332014-03-29 15:09:45 +00005998 Int64Type = SignedLongLong;
5999 WCharType = SignedInt;
6000 UseSignedCharForObjCBool = false;
6001
Tim Northovera6a19f12015-02-06 01:25:07 +00006002 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00006003 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
6004
6005 TheCXXABI.set(TargetCXXABI::iOS64);
6006 }
6007
David Blaikie1cbb9712014-11-14 19:09:44 +00006008 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006009 return TargetInfo::CharPtrBuiltinVaList;
6010 }
6011};
Tim Northovera2ee4332014-03-29 15:09:45 +00006012
Tony Linthicum76329bf2011-12-12 21:14:55 +00006013// Hexagon abstract base class
6014class HexagonTargetInfo : public TargetInfo {
6015 static const Builtin::Info BuiltinInfo[];
6016 static const char * const GCCRegNames[];
6017 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6018 std::string CPU;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006019 bool HasHVX, HasHVXDouble;
6020
Tony Linthicum76329bf2011-12-12 21:14:55 +00006021public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006022 HexagonTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6023 : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006024 BigEndian = false;
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00006025 // Specify the vector alignment explicitly. For v512x1, the calculated
6026 // alignment would be 512*alignment(i1), which is 512 bytes, instead of
6027 // the required minimum of 64 bytes.
James Y Knightb214cbc2016-03-04 19:00:41 +00006028 resetDataLayout("e-m:e-p:32:32:32-a:0-n16:32-"
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00006029 "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 +00006030 "v32:32:32-v64:64:64-v512:512:512-v1024:1024:1024-v2048:2048:2048");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006031 SizeType = UnsignedInt;
6032 PtrDiffType = SignedInt;
6033 IntPtrType = SignedInt;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006034
6035 // {} in inline assembly are packet specifiers, not assembly variant
6036 // specifiers.
6037 NoAsmVariants = true;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006038
6039 LargeArrayMinWidth = 64;
6040 LargeArrayAlign = 64;
6041 UseBitFieldTypeAlignment = true;
6042 ZeroLengthBitfieldBoundary = 32;
6043 HasHVX = HasHVXDouble = false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006044 }
6045
Craig Topper6c03a542015-10-19 04:51:35 +00006046 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6047 return llvm::makeArrayRef(BuiltinInfo,
6048 clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006049 }
6050
Craig Topper3164f332014-03-11 03:39:26 +00006051 bool validateAsmConstraint(const char *&Name,
6052 TargetInfo::ConstraintInfo &Info) const override {
Krzysztof Parzyszeke0026e42016-05-18 14:56:14 +00006053 switch (*Name) {
6054 case 'v':
6055 case 'q':
6056 if (HasHVX) {
6057 Info.setAllowsRegister();
6058 return true;
6059 }
6060 break;
Krzysztof Parzyszek89fb4412016-05-20 13:50:32 +00006061 case 's':
6062 // Relocatable constant.
6063 return true;
Krzysztof Parzyszeke0026e42016-05-18 14:56:14 +00006064 }
6065 return false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006066 }
6067
Craig Topper3164f332014-03-11 03:39:26 +00006068 void getTargetDefines(const LangOptions &Opts,
6069 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006070
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006071 bool isCLZForZeroUndef() const override { return false; }
6072
Craig Topper3164f332014-03-11 03:39:26 +00006073 bool hasFeature(StringRef Feature) const override {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006074 return llvm::StringSwitch<bool>(Feature)
6075 .Case("hexagon", true)
6076 .Case("hvx", HasHVX)
6077 .Case("hvx-double", HasHVXDouble)
6078 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006079 }
Craig Topper3164f332014-03-11 03:39:26 +00006080
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006081 bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6082 StringRef CPU, const std::vector<std::string> &FeaturesVec)
6083 const override;
6084
6085 bool handleTargetFeatures(std::vector<std::string> &Features,
6086 DiagnosticsEngine &Diags) override;
6087
Craig Topper3164f332014-03-11 03:39:26 +00006088 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006089 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006090 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006091 ArrayRef<const char *> getGCCRegNames() const override;
6092 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00006093 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006094 return "";
6095 }
Sebastian Pop86500282012-01-13 20:37:10 +00006096
6097 static const char *getHexagonCPUSuffix(StringRef Name) {
6098 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00006099 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006100 .Case("hexagonv5", "5")
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006101 .Case("hexagonv55", "55")
6102 .Case("hexagonv60", "60")
Craig Topperf1186c52014-05-08 06:41:40 +00006103 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00006104 }
6105
Craig Topper3164f332014-03-11 03:39:26 +00006106 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00006107 if (!getHexagonCPUSuffix(Name))
6108 return false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006109 CPU = Name;
6110 return true;
6111 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006112
6113 int getEHDataRegisterNumber(unsigned RegNo) const override {
6114 return RegNo < 2 ? RegNo : -1;
6115 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006116};
6117
6118void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006119 MacroBuilder &Builder) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006120 Builder.defineMacro("__qdsp6__", "1");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006121 Builder.defineMacro("__hexagon__", "1");
6122
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006123 if (CPU == "hexagonv4") {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006124 Builder.defineMacro("__HEXAGON_V4__");
6125 Builder.defineMacro("__HEXAGON_ARCH__", "4");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006126 if (Opts.HexagonQdsp6Compat) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006127 Builder.defineMacro("__QDSP6_V4__");
6128 Builder.defineMacro("__QDSP6_ARCH__", "4");
6129 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006130 } else if (CPU == "hexagonv5") {
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006131 Builder.defineMacro("__HEXAGON_V5__");
6132 Builder.defineMacro("__HEXAGON_ARCH__", "5");
6133 if(Opts.HexagonQdsp6Compat) {
6134 Builder.defineMacro("__QDSP6_V5__");
6135 Builder.defineMacro("__QDSP6_ARCH__", "5");
6136 }
Krzysztof Parzyszeka58ff512016-04-21 14:30:04 +00006137 } else if (CPU == "hexagonv55") {
6138 Builder.defineMacro("__HEXAGON_V55__");
6139 Builder.defineMacro("__HEXAGON_ARCH__", "55");
6140 Builder.defineMacro("__QDSP6_V55__");
6141 Builder.defineMacro("__QDSP6_ARCH__", "55");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006142 } else if (CPU == "hexagonv60") {
6143 Builder.defineMacro("__HEXAGON_V60__");
6144 Builder.defineMacro("__HEXAGON_ARCH__", "60");
6145 Builder.defineMacro("__QDSP6_V60__");
6146 Builder.defineMacro("__QDSP6_ARCH__", "60");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006147 }
Krzysztof Parzyszek7f0756c2016-04-18 18:38:11 +00006148
6149 if (hasFeature("hvx")) {
6150 Builder.defineMacro("__HVX__");
6151 if (hasFeature("hvx-double"))
6152 Builder.defineMacro("__HVXDBL__");
6153 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006154}
6155
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006156bool HexagonTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
6157 DiagnosticsEngine &Diags) {
6158 for (auto &F : Features) {
6159 if (F == "+hvx")
6160 HasHVX = true;
6161 else if (F == "-hvx")
6162 HasHVX = HasHVXDouble = false;
6163 else if (F == "+hvx-double")
6164 HasHVX = HasHVXDouble = true;
6165 else if (F == "-hvx-double")
6166 HasHVXDouble = false;
6167 }
6168 return true;
6169}
6170
6171bool HexagonTargetInfo::initFeatureMap(llvm::StringMap<bool> &Features,
6172 DiagnosticsEngine &Diags, StringRef CPU,
6173 const std::vector<std::string> &FeaturesVec) const {
6174 // Default for v60: -hvx, -hvx-double.
6175 Features["hvx"] = false;
6176 Features["hvx-double"] = false;
6177
6178 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
6179}
6180
6181
6182const char *const HexagonTargetInfo::GCCRegNames[] = {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006183 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6184 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6185 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6186 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
6187 "p0", "p1", "p2", "p3",
6188 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
6189};
6190
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006191ArrayRef<const char*> HexagonTargetInfo::getGCCRegNames() const {
Craig Topperf054e3a2015-10-19 03:52:27 +00006192 return llvm::makeArrayRef(GCCRegNames);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006193}
6194
Tony Linthicum76329bf2011-12-12 21:14:55 +00006195const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
6196 { { "sp" }, "r29" },
6197 { { "fp" }, "r30" },
6198 { { "lr" }, "r31" },
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006199};
Tony Linthicum76329bf2011-12-12 21:14:55 +00006200
Craig Topperf054e3a2015-10-19 03:52:27 +00006201ArrayRef<TargetInfo::GCCRegAlias> HexagonTargetInfo::getGCCRegAliases() const {
6202 return llvm::makeArrayRef(GCCRegAliases);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006203}
6204
6205
6206const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00006207#define BUILTIN(ID, TYPE, ATTRS) \
6208 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
6209#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
6210 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tony Linthicum76329bf2011-12-12 21:14:55 +00006211#include "clang/Basic/BuiltinsHexagon.def"
6212};
Tony Linthicum76329bf2011-12-12 21:14:55 +00006213
Jacques Pienaard964cc22016-03-28 21:02:54 +00006214class LanaiTargetInfo : public TargetInfo {
6215 // Class for Lanai (32-bit).
6216 // The CPU profiles supported by the Lanai backend
6217 enum CPUKind {
6218 CK_NONE,
6219 CK_V11,
6220 } CPU;
6221
6222 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6223 static const char *const GCCRegNames[];
6224
6225public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006226 LanaiTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6227 : TargetInfo(Triple) {
Jacques Pienaard964cc22016-03-28 21:02:54 +00006228 // Description string has to be kept in sync with backend.
6229 resetDataLayout("E" // Big endian
6230 "-m:e" // ELF name manging
6231 "-p:32:32" // 32 bit pointers, 32 bit aligned
6232 "-i64:64" // 64 bit integers, 64 bit aligned
6233 "-a:0:32" // 32 bit alignment of objects of aggregate type
6234 "-n32" // 32 bit native integer width
6235 "-S64" // 64 bit natural stack alignment
6236 );
6237
6238 // Setting RegParmMax equal to what mregparm was set to in the old
6239 // toolchain
6240 RegParmMax = 4;
6241
6242 // Set the default CPU to V11
6243 CPU = CK_V11;
6244
6245 // Temporary approach to make everything at least word-aligned and allow for
6246 // safely casting between pointers with different alignment requirements.
6247 // TODO: Remove this when there are no more cast align warnings on the
6248 // firmware.
6249 MinGlobalAlign = 32;
6250 }
6251
6252 void getTargetDefines(const LangOptions &Opts,
6253 MacroBuilder &Builder) const override {
6254 // Define __lanai__ when building for target lanai.
6255 Builder.defineMacro("__lanai__");
6256
6257 // Set define for the CPU specified.
6258 switch (CPU) {
6259 case CK_V11:
6260 Builder.defineMacro("__LANAI_V11__");
6261 break;
6262 case CK_NONE:
6263 llvm_unreachable("Unhandled target CPU");
6264 }
6265 }
6266
6267 bool setCPU(const std::string &Name) override {
6268 CPU = llvm::StringSwitch<CPUKind>(Name)
6269 .Case("v11", CK_V11)
6270 .Default(CK_NONE);
6271
6272 return CPU != CK_NONE;
6273 }
6274
6275 bool hasFeature(StringRef Feature) const override {
6276 return llvm::StringSwitch<bool>(Feature).Case("lanai", true).Default(false);
6277 }
6278
6279 ArrayRef<const char *> getGCCRegNames() const override;
6280
6281 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
6282
6283 BuiltinVaListKind getBuiltinVaListKind() const override {
6284 return TargetInfo::VoidPtrBuiltinVaList;
6285 }
6286
6287 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
6288
6289 bool validateAsmConstraint(const char *&Name,
6290 TargetInfo::ConstraintInfo &info) const override {
6291 return false;
6292 }
6293
6294 const char *getClobbers() const override { return ""; }
6295};
6296
6297const char *const LanaiTargetInfo::GCCRegNames[] = {
6298 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10",
6299 "r11", "r12", "r13", "r14", "r15", "r16", "r17", "r18", "r19", "r20", "r21",
6300 "r22", "r23", "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"};
6301
6302ArrayRef<const char *> LanaiTargetInfo::getGCCRegNames() const {
6303 return llvm::makeArrayRef(GCCRegNames);
6304}
6305
6306const TargetInfo::GCCRegAlias LanaiTargetInfo::GCCRegAliases[] = {
6307 {{"pc"}, "r2"},
6308 {{"sp"}, "r4"},
6309 {{"fp"}, "r5"},
6310 {{"rv"}, "r8"},
6311 {{"rr1"}, "r10"},
6312 {{"rr2"}, "r11"},
6313 {{"rca"}, "r15"},
6314};
6315
6316ArrayRef<TargetInfo::GCCRegAlias> LanaiTargetInfo::getGCCRegAliases() const {
6317 return llvm::makeArrayRef(GCCRegAliases);
6318}
6319
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006320// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
6321class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00006322 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6323 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006324 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00006325public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006326 SparcTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
James Y Knighta3518ad2016-01-27 01:04:51 +00006327 : TargetInfo(Triple), SoftFloat(false) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006328
Joerg Sonnenbergerd0be8dc2016-03-07 17:19:15 +00006329 int getEHDataRegisterNumber(unsigned RegNo) const override {
6330 if (RegNo == 0) return 24;
6331 if (RegNo == 1) return 25;
6332 return -1;
6333 }
6334
Craig Topper3164f332014-03-11 03:39:26 +00006335 bool handleTargetFeatures(std::vector<std::string> &Features,
6336 DiagnosticsEngine &Diags) override {
Jacob Baungard Hansen13a49372016-05-24 08:30:08 +00006337 // Check if software floating point is enabled
Eric Christopherfb481a42015-04-29 23:32:17 +00006338 auto Feature = std::find(Features.begin(), Features.end(), "+soft-float");
6339 if (Feature != Features.end()) {
6340 SoftFloat = true;
Eric Christopherfb481a42015-04-29 23:32:17 +00006341 }
Rafael Espindolaeb265472013-08-21 21:59:03 +00006342 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006343 }
Craig Topper3164f332014-03-11 03:39:26 +00006344 void getTargetDefines(const LangOptions &Opts,
6345 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006346 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006347 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006348
6349 if (SoftFloat)
6350 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00006351 }
Craig Topper3164f332014-03-11 03:39:26 +00006352
6353 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006354 return llvm::StringSwitch<bool>(Feature)
6355 .Case("softfloat", SoftFloat)
6356 .Case("sparc", true)
6357 .Default(false);
6358 }
Craig Topper3164f332014-03-11 03:39:26 +00006359
Craig Topper6c03a542015-10-19 04:51:35 +00006360 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006361 // FIXME: Implement!
Craig Topper6c03a542015-10-19 04:51:35 +00006362 return None;
Gabor Greif49991682008-02-21 16:29:08 +00006363 }
Craig Topper3164f332014-03-11 03:39:26 +00006364 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006365 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00006366 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006367 ArrayRef<const char *> getGCCRegNames() const override;
6368 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00006369 bool validateAsmConstraint(const char *&Name,
6370 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006371 // FIXME: Implement!
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00006372 switch (*Name) {
6373 case 'I': // Signed 13-bit constant
6374 case 'J': // Zero
6375 case 'K': // 32-bit constant with the low 12 bits clear
6376 case 'L': // A constant in the range supported by movcc (11-bit signed imm)
6377 case 'M': // A constant in the range supported by movrcc (19-bit signed imm)
6378 case 'N': // Same as 'K' but zext (required for SIMode)
6379 case 'O': // The constant 4096
6380 return true;
6381 }
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006382 return false;
Gabor Greif49991682008-02-21 16:29:08 +00006383 }
Craig Topper3164f332014-03-11 03:39:26 +00006384 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006385 // FIXME: Implement!
6386 return "";
Gabor Greif49991682008-02-21 16:29:08 +00006387 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006388
6389 // No Sparc V7 for now, the backend doesn't support it anyway.
6390 enum CPUKind {
6391 CK_GENERIC,
6392 CK_V8,
6393 CK_SUPERSPARC,
6394 CK_SPARCLITE,
6395 CK_F934,
6396 CK_HYPERSPARC,
6397 CK_SPARCLITE86X,
6398 CK_SPARCLET,
6399 CK_TSC701,
6400 CK_V9,
6401 CK_ULTRASPARC,
6402 CK_ULTRASPARC3,
6403 CK_NIAGARA,
6404 CK_NIAGARA2,
6405 CK_NIAGARA3,
Douglas Katzman6871afc2016-03-15 22:34:02 +00006406 CK_NIAGARA4,
6407 CK_MYRIAD2_1,
6408 CK_MYRIAD2_2
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006409 } CPU = CK_GENERIC;
6410
6411 enum CPUGeneration {
6412 CG_V8,
6413 CG_V9,
6414 };
6415
6416 CPUGeneration getCPUGeneration(CPUKind Kind) const {
6417 switch (Kind) {
6418 case CK_GENERIC:
6419 case CK_V8:
6420 case CK_SUPERSPARC:
6421 case CK_SPARCLITE:
6422 case CK_F934:
6423 case CK_HYPERSPARC:
6424 case CK_SPARCLITE86X:
6425 case CK_SPARCLET:
6426 case CK_TSC701:
Douglas Katzman6871afc2016-03-15 22:34:02 +00006427 case CK_MYRIAD2_1:
6428 case CK_MYRIAD2_2:
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006429 return CG_V8;
6430 case CK_V9:
6431 case CK_ULTRASPARC:
6432 case CK_ULTRASPARC3:
6433 case CK_NIAGARA:
6434 case CK_NIAGARA2:
6435 case CK_NIAGARA3:
6436 case CK_NIAGARA4:
6437 return CG_V9;
6438 }
Aaron Ballmana9a72852015-11-11 13:42:02 +00006439 llvm_unreachable("Unexpected CPU kind");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006440 }
6441
6442 CPUKind getCPUKind(StringRef Name) const {
6443 return llvm::StringSwitch<CPUKind>(Name)
6444 .Case("v8", CK_V8)
6445 .Case("supersparc", CK_SUPERSPARC)
6446 .Case("sparclite", CK_SPARCLITE)
6447 .Case("f934", CK_F934)
6448 .Case("hypersparc", CK_HYPERSPARC)
6449 .Case("sparclite86x", CK_SPARCLITE86X)
6450 .Case("sparclet", CK_SPARCLET)
6451 .Case("tsc701", CK_TSC701)
6452 .Case("v9", CK_V9)
6453 .Case("ultrasparc", CK_ULTRASPARC)
6454 .Case("ultrasparc3", CK_ULTRASPARC3)
6455 .Case("niagara", CK_NIAGARA)
6456 .Case("niagara2", CK_NIAGARA2)
6457 .Case("niagara3", CK_NIAGARA3)
6458 .Case("niagara4", CK_NIAGARA4)
Douglas Katzman6871afc2016-03-15 22:34:02 +00006459 .Case("myriad2", CK_MYRIAD2_1)
6460 .Case("myriad2.1", CK_MYRIAD2_1)
6461 .Case("myriad2.2", CK_MYRIAD2_2)
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006462 .Default(CK_GENERIC);
6463 }
6464
6465 bool setCPU(const std::string &Name) override {
6466 CPU = getCPUKind(Name);
6467 return CPU != CK_GENERIC;
6468 }
Gabor Greif49991682008-02-21 16:29:08 +00006469};
6470
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006471const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00006472 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6473 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6474 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6475 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
6476};
6477
Craig Topperf054e3a2015-10-19 03:52:27 +00006478ArrayRef<const char *> SparcTargetInfo::getGCCRegNames() const {
6479 return llvm::makeArrayRef(GCCRegNames);
Chris Lattner9b415d62009-01-27 01:58:38 +00006480}
6481
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006482const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00006483 { { "g0" }, "r0" },
6484 { { "g1" }, "r1" },
6485 { { "g2" }, "r2" },
6486 { { "g3" }, "r3" },
6487 { { "g4" }, "r4" },
6488 { { "g5" }, "r5" },
6489 { { "g6" }, "r6" },
6490 { { "g7" }, "r7" },
6491 { { "o0" }, "r8" },
6492 { { "o1" }, "r9" },
6493 { { "o2" }, "r10" },
6494 { { "o3" }, "r11" },
6495 { { "o4" }, "r12" },
6496 { { "o5" }, "r13" },
6497 { { "o6", "sp" }, "r14" },
6498 { { "o7" }, "r15" },
6499 { { "l0" }, "r16" },
6500 { { "l1" }, "r17" },
6501 { { "l2" }, "r18" },
6502 { { "l3" }, "r19" },
6503 { { "l4" }, "r20" },
6504 { { "l5" }, "r21" },
6505 { { "l6" }, "r22" },
6506 { { "l7" }, "r23" },
6507 { { "i0" }, "r24" },
6508 { { "i1" }, "r25" },
6509 { { "i2" }, "r26" },
6510 { { "i3" }, "r27" },
6511 { { "i4" }, "r28" },
6512 { { "i5" }, "r29" },
6513 { { "i6", "fp" }, "r30" },
6514 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00006515};
6516
Craig Topperf054e3a2015-10-19 03:52:27 +00006517ArrayRef<TargetInfo::GCCRegAlias> SparcTargetInfo::getGCCRegAliases() const {
6518 return llvm::makeArrayRef(GCCRegAliases);
Chris Lattner9b415d62009-01-27 01:58:38 +00006519}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006520
6521// SPARC v8 is the 32-bit mode selected by Triple::sparc.
6522class SparcV8TargetInfo : public SparcTargetInfo {
6523public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006524 SparcV8TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6525 : SparcTargetInfo(Triple, Opts) {
James Y Knightb214cbc2016-03-04 19:00:41 +00006526 resetDataLayout("E-m:e-p:32:32-i64:64-f128:64-n32-S64");
Brad Smith73859112015-08-13 21:45:57 +00006527 // NetBSD / OpenBSD use long (same as llvm default); everyone else uses int.
6528 switch (getTriple().getOS()) {
6529 default:
James Y Knight4b4d19e2015-06-04 15:36:29 +00006530 SizeType = UnsignedInt;
6531 IntPtrType = SignedInt;
6532 PtrDiffType = SignedInt;
Brad Smith73859112015-08-13 21:45:57 +00006533 break;
6534 case llvm::Triple::NetBSD:
6535 case llvm::Triple::OpenBSD:
6536 SizeType = UnsignedLong;
6537 IntPtrType = SignedLong;
6538 PtrDiffType = SignedLong;
6539 break;
Brad Smith56495d52015-08-13 22:00:53 +00006540 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006541 }
6542
Craig Topper3164f332014-03-11 03:39:26 +00006543 void getTargetDefines(const LangOptions &Opts,
6544 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006545 SparcTargetInfo::getTargetDefines(Opts, Builder);
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006546 switch (getCPUGeneration(CPU)) {
6547 case CG_V8:
6548 Builder.defineMacro("__sparcv8");
6549 if (getTriple().getOS() != llvm::Triple::Solaris)
6550 Builder.defineMacro("__sparcv8__");
6551 break;
6552 case CG_V9:
6553 Builder.defineMacro("__sparcv9");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00006554 if (getTriple().getOS() != llvm::Triple::Solaris) {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006555 Builder.defineMacro("__sparcv9__");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00006556 Builder.defineMacro("__sparc_v9__");
6557 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006558 break;
6559 }
Douglas Katzman6871afc2016-03-15 22:34:02 +00006560 if (getTriple().getVendor() == llvm::Triple::Myriad) {
6561 switch (CPU) {
6562 case CK_MYRIAD2_1:
6563 Builder.defineMacro("__myriad2", "1");
6564 Builder.defineMacro("__myriad2__", "1");
6565 break;
6566 case CK_MYRIAD2_2:
6567 Builder.defineMacro("__myriad2", "2");
6568 Builder.defineMacro("__myriad2__", "2");
6569 break;
6570 default:
6571 break;
6572 }
6573 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006574 }
Chris Dewhurst69fa1922016-05-04 09:33:30 +00006575
6576 bool hasSjLjLowering() const override {
6577 return true;
6578 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006579};
6580
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006581// SPARCV8el is the 32-bit little-endian mode selected by Triple::sparcel.
6582class SparcV8elTargetInfo : public SparcV8TargetInfo {
6583 public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006584 SparcV8elTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6585 : SparcV8TargetInfo(Triple, Opts) {
6586 resetDataLayout("e-m:e-p:32:32-i64:64-f128:64-n32-S64");
6587 BigEndian = false;
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006588 }
6589};
6590
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006591// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
6592class SparcV9TargetInfo : public SparcTargetInfo {
6593public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006594 SparcV9TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6595 : SparcTargetInfo(Triple, Opts) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006596 // FIXME: Support Sparc quad-precision long double?
James Y Knightb214cbc2016-03-04 19:00:41 +00006597 resetDataLayout("E-m:e-i64:64-n32:64-S128");
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00006598 // This is an LP64 platform.
6599 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006600
6601 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00006602 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006603 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00006604 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006605 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006606 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00006607
6608 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
6609 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
6610 LongDoubleWidth = 128;
6611 LongDoubleAlign = 128;
6612 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00006613 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006614 }
6615
Craig Topper3164f332014-03-11 03:39:26 +00006616 void getTargetDefines(const LangOptions &Opts,
6617 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006618 SparcTargetInfo::getTargetDefines(Opts, Builder);
6619 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00006620 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00006621 // Solaris doesn't need these variants, but the BSDs do.
6622 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00006623 Builder.defineMacro("__sparc64__");
6624 Builder.defineMacro("__sparc_v9__");
6625 Builder.defineMacro("__sparcv9__");
6626 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006627 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00006628
Craig Topper3164f332014-03-11 03:39:26 +00006629 bool setCPU(const std::string &Name) override {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006630 if (!SparcTargetInfo::setCPU(Name))
6631 return false;
6632 return getCPUGeneration(CPU) == CG_V9;
Roman Divackyb1ae3d42014-02-25 18:35:30 +00006633 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006634};
6635
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006636class SystemZTargetInfo : public TargetInfo {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006637 static const Builtin::Info BuiltinInfo[];
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006638 static const char *const GCCRegNames[];
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006639 std::string CPU;
6640 bool HasTransactionalExecution;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006641 bool HasVector;
Ulrich Weigand47445072013-05-06 16:26:41 +00006642
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006643public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006644 SystemZTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Eric Christopherb093d692015-10-09 18:39:59 +00006645 : TargetInfo(Triple), CPU("z10"), HasTransactionalExecution(false),
6646 HasVector(false) {
Ulrich Weigand881497a2015-03-30 13:50:21 +00006647 IntMaxType = SignedLong;
6648 Int64Type = SignedLong;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006649 TLSSupported = true;
6650 IntWidth = IntAlign = 32;
6651 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
6652 PointerWidth = PointerAlign = 64;
6653 LongDoubleWidth = 128;
6654 LongDoubleAlign = 64;
6655 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Ulrich Weigandca3cb7f2015-04-21 17:29:35 +00006656 DefaultAlignForAttributeAligned = 64;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006657 MinGlobalAlign = 16;
James Y Knightb214cbc2016-03-04 19:00:41 +00006658 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 +00006659 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
6660 }
6661 void getTargetDefines(const LangOptions &Opts,
6662 MacroBuilder &Builder) const override {
6663 Builder.defineMacro("__s390__");
6664 Builder.defineMacro("__s390x__");
6665 Builder.defineMacro("__zarch__");
6666 Builder.defineMacro("__LONG_DOUBLE_128__");
Ulrich Weigandb038a522016-02-05 21:34:28 +00006667
6668 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
6669 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
6670 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
6671 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
6672
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006673 if (HasTransactionalExecution)
6674 Builder.defineMacro("__HTM__");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00006675 if (Opts.ZVector)
6676 Builder.defineMacro("__VEC__", "10301");
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006677 }
Craig Topper6c03a542015-10-19 04:51:35 +00006678 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6679 return llvm::makeArrayRef(BuiltinInfo,
6680 clang::SystemZ::LastTSBuiltin-Builtin::FirstTSBuiltin);
Ulrich Weigand47445072013-05-06 16:26:41 +00006681 }
6682
Craig Topperf054e3a2015-10-19 03:52:27 +00006683 ArrayRef<const char *> getGCCRegNames() const override;
6684 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006685 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00006686 return None;
Ulrich Weigand47445072013-05-06 16:26:41 +00006687 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006688 bool validateAsmConstraint(const char *&Name,
6689 TargetInfo::ConstraintInfo &info) const override;
6690 const char *getClobbers() const override {
6691 // FIXME: Is this really right?
6692 return "";
6693 }
6694 BuiltinVaListKind getBuiltinVaListKind() const override {
6695 return TargetInfo::SystemZBuiltinVaList;
6696 }
6697 bool setCPU(const std::string &Name) override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006698 CPU = Name;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006699 bool CPUKnown = llvm::StringSwitch<bool>(Name)
6700 .Case("z10", true)
6701 .Case("z196", true)
6702 .Case("zEC12", true)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006703 .Case("z13", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006704 .Default(false);
6705
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006706 return CPUKnown;
6707 }
Eric Christopher8c47b422015-10-09 18:39:55 +00006708 bool
6709 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6710 StringRef CPU,
6711 const std::vector<std::string> &FeaturesVec) const override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006712 if (CPU == "zEC12")
6713 Features["transactional-execution"] = true;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006714 if (CPU == "z13") {
6715 Features["transactional-execution"] = true;
6716 Features["vector"] = true;
6717 }
Eric Christopher007b0a02015-08-28 22:32:01 +00006718 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006719 }
6720
6721 bool handleTargetFeatures(std::vector<std::string> &Features,
6722 DiagnosticsEngine &Diags) override {
6723 HasTransactionalExecution = false;
Eric Christopher610fe112015-08-26 08:21:55 +00006724 for (const auto &Feature : Features) {
6725 if (Feature == "+transactional-execution")
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006726 HasTransactionalExecution = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006727 else if (Feature == "+vector")
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006728 HasVector = true;
6729 }
6730 // If we use the vector ABI, vector types are 64-bit aligned.
6731 if (HasVector) {
6732 MaxVectorAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00006733 resetDataLayout("E-m:e-i1:8:16-i8:8:16-i64:64-f128:64"
6734 "-v128:64-a:8:16-n32:64");
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006735 }
6736 return true;
6737 }
6738
6739 bool hasFeature(StringRef Feature) const override {
6740 return llvm::StringSwitch<bool>(Feature)
Ulrich Weigandcc673442015-04-01 14:15:35 +00006741 .Case("systemz", true)
6742 .Case("htm", HasTransactionalExecution)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006743 .Case("vx", HasVector)
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006744 .Default(false);
6745 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006746
Bryan Chane3f1ed52016-04-28 13:56:43 +00006747 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
6748 switch (CC) {
6749 case CC_C:
6750 case CC_Swift:
6751 return CCCR_OK;
6752 default:
6753 return CCCR_Warning;
6754 }
6755 }
6756
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006757 StringRef getABI() const override {
6758 if (HasVector)
6759 return "vector";
6760 return "";
6761 }
Ulrich Weigand47fd2532015-06-16 15:21:47 +00006762
6763 bool useFloat128ManglingForLongDouble() const override {
6764 return true;
6765 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006766};
6767
6768const Builtin::Info SystemZTargetInfo::BuiltinInfo[] = {
6769#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006770 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Jonas Paulsson3ace74a2016-03-30 15:51:24 +00006771#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
6772 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006773#include "clang/Basic/BuiltinsSystemZ.def"
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006774};
6775
6776const char *const SystemZTargetInfo::GCCRegNames[] = {
6777 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6778 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6779 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
6780 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
6781};
6782
Craig Topperf054e3a2015-10-19 03:52:27 +00006783ArrayRef<const char *> SystemZTargetInfo::getGCCRegNames() const {
6784 return llvm::makeArrayRef(GCCRegNames);
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006785}
6786
6787bool SystemZTargetInfo::
6788validateAsmConstraint(const char *&Name,
6789 TargetInfo::ConstraintInfo &Info) const {
6790 switch (*Name) {
6791 default:
6792 return false;
6793
6794 case 'a': // Address register
6795 case 'd': // Data register (equivalent to 'r')
6796 case 'f': // Floating-point register
6797 Info.setAllowsRegister();
6798 return true;
6799
6800 case 'I': // Unsigned 8-bit constant
6801 case 'J': // Unsigned 12-bit constant
6802 case 'K': // Signed 16-bit constant
6803 case 'L': // Signed 20-bit displacement (on all targets we support)
6804 case 'M': // 0x7fffffff
6805 return true;
6806
6807 case 'Q': // Memory with base and unsigned 12-bit displacement
6808 case 'R': // Likewise, plus an index
6809 case 'S': // Memory with base and signed 20-bit displacement
6810 case 'T': // Likewise, plus an index
6811 Info.setAllowsMemory();
6812 return true;
6813 }
6814}
Ulrich Weigand47445072013-05-06 16:26:41 +00006815
Eric Christopherc48497a2015-09-18 21:26:24 +00006816class MSP430TargetInfo : public TargetInfo {
6817 static const char *const GCCRegNames[];
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006818
Eric Christopherc48497a2015-09-18 21:26:24 +00006819public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006820 MSP430TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6821 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00006822 BigEndian = false;
6823 TLSSupported = false;
6824 IntWidth = 16;
6825 IntAlign = 16;
6826 LongWidth = 32;
6827 LongLongWidth = 64;
6828 LongAlign = LongLongAlign = 16;
6829 PointerWidth = 16;
6830 PointerAlign = 16;
6831 SuitableAlign = 16;
6832 SizeType = UnsignedInt;
6833 IntMaxType = SignedLongLong;
6834 IntPtrType = SignedInt;
6835 PtrDiffType = SignedInt;
6836 SigAtomicType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00006837 resetDataLayout("e-m:e-p:16:16-i32:16:32-a:16-n8:16");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006838 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006839 void getTargetDefines(const LangOptions &Opts,
6840 MacroBuilder &Builder) const override {
6841 Builder.defineMacro("MSP430");
6842 Builder.defineMacro("__MSP430__");
6843 // FIXME: defines for different 'flavours' of MCU
6844 }
Craig Topper6c03a542015-10-19 04:51:35 +00006845 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00006846 // FIXME: Implement.
Craig Topper6c03a542015-10-19 04:51:35 +00006847 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00006848 }
6849 bool hasFeature(StringRef Feature) const override {
6850 return Feature == "msp430";
6851 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006852 ArrayRef<const char *> getGCCRegNames() const override;
6853 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00006854 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00006855 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00006856 }
6857 bool validateAsmConstraint(const char *&Name,
6858 TargetInfo::ConstraintInfo &info) const override {
6859 // FIXME: implement
6860 switch (*Name) {
6861 case 'K': // the constant 1
6862 case 'L': // constant -1^20 .. 1^19
6863 case 'M': // constant 1-4:
Eli Friedmana9c3d712009-08-19 20:47:07 +00006864 return true;
6865 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006866 // No target constraints for now.
6867 return false;
6868 }
6869 const char *getClobbers() const override {
6870 // FIXME: Is this really right?
6871 return "";
6872 }
6873 BuiltinVaListKind getBuiltinVaListKind() const override {
6874 // FIXME: implement
6875 return TargetInfo::CharPtrBuiltinVaList;
6876 }
6877};
6878
6879const char *const MSP430TargetInfo::GCCRegNames[] = {
6880 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6881 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"};
6882
Craig Topperf054e3a2015-10-19 03:52:27 +00006883ArrayRef<const char *> MSP430TargetInfo::getGCCRegNames() const {
6884 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00006885}
6886
6887// LLVM and Clang cannot be used directly to output native binaries for
6888// target, but is used to compile C code to llvm bitcode with correct
6889// type and alignment information.
6890//
6891// TCE uses the llvm bitcode as input and uses it for generating customized
6892// target processor and program binary. TCE co-design environment is
6893// publicly available in http://tce.cs.tut.fi
6894
6895static const unsigned TCEOpenCLAddrSpaceMap[] = {
6896 3, // opencl_global
6897 4, // opencl_local
6898 5, // opencl_constant
6899 // FIXME: generic has to be added to the target
6900 0, // opencl_generic
6901 0, // cuda_device
6902 0, // cuda_constant
6903 0 // cuda_shared
6904};
6905
6906class TCETargetInfo : public TargetInfo {
6907public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006908 TCETargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6909 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00006910 TLSSupported = false;
6911 IntWidth = 32;
6912 LongWidth = LongLongWidth = 32;
6913 PointerWidth = 32;
6914 IntAlign = 32;
6915 LongAlign = LongLongAlign = 32;
6916 PointerAlign = 32;
6917 SuitableAlign = 32;
6918 SizeType = UnsignedInt;
6919 IntMaxType = SignedLong;
6920 IntPtrType = SignedInt;
6921 PtrDiffType = SignedInt;
6922 FloatWidth = 32;
6923 FloatAlign = 32;
6924 DoubleWidth = 32;
6925 DoubleAlign = 32;
6926 LongDoubleWidth = 32;
6927 LongDoubleAlign = 32;
6928 FloatFormat = &llvm::APFloat::IEEEsingle;
6929 DoubleFormat = &llvm::APFloat::IEEEsingle;
6930 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
James Y Knightb214cbc2016-03-04 19:00:41 +00006931 resetDataLayout("E-p:32:32-i8:8:32-i16:16:32-i64:32"
6932 "-f64:32-v64:32-v128:32-a:0:32-n32");
Eric Christopherc48497a2015-09-18 21:26:24 +00006933 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
6934 UseAddrSpaceMapMangling = true;
6935 }
6936
6937 void getTargetDefines(const LangOptions &Opts,
6938 MacroBuilder &Builder) const override {
6939 DefineStd(Builder, "tce", Opts);
6940 Builder.defineMacro("__TCE__");
6941 Builder.defineMacro("__TCE_V1__");
6942 }
6943 bool hasFeature(StringRef Feature) const override { return Feature == "tce"; }
6944
Craig Topper6c03a542015-10-19 04:51:35 +00006945 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00006946 const char *getClobbers() const override { return ""; }
6947 BuiltinVaListKind getBuiltinVaListKind() const override {
6948 return TargetInfo::VoidPtrBuiltinVaList;
6949 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006950 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00006951 bool validateAsmConstraint(const char *&Name,
6952 TargetInfo::ConstraintInfo &info) const override {
6953 return true;
6954 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006955 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
6956 return None;
6957 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006958};
Eli Friedmana9c3d712009-08-19 20:47:07 +00006959
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006960class BPFTargetInfo : public TargetInfo {
6961public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006962 BPFTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6963 : TargetInfo(Triple) {
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006964 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
6965 SizeType = UnsignedLong;
6966 PtrDiffType = SignedLong;
6967 IntPtrType = SignedLong;
6968 IntMaxType = SignedLong;
6969 Int64Type = SignedLong;
6970 RegParmMax = 5;
6971 if (Triple.getArch() == llvm::Triple::bpfeb) {
6972 BigEndian = true;
James Y Knightb214cbc2016-03-04 19:00:41 +00006973 resetDataLayout("E-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006974 } else {
6975 BigEndian = false;
James Y Knightb214cbc2016-03-04 19:00:41 +00006976 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006977 }
6978 MaxAtomicPromoteWidth = 64;
6979 MaxAtomicInlineWidth = 64;
6980 TLSSupported = false;
6981 }
6982 void getTargetDefines(const LangOptions &Opts,
6983 MacroBuilder &Builder) const override {
6984 DefineStd(Builder, "bpf", Opts);
6985 Builder.defineMacro("__BPF__");
6986 }
6987 bool hasFeature(StringRef Feature) const override {
6988 return Feature == "bpf";
6989 }
6990
Craig Topper6c03a542015-10-19 04:51:35 +00006991 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006992 const char *getClobbers() const override {
6993 return "";
6994 }
6995 BuiltinVaListKind getBuiltinVaListKind() const override {
6996 return TargetInfo::VoidPtrBuiltinVaList;
6997 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006998 ArrayRef<const char *> getGCCRegNames() const override {
6999 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007000 }
7001 bool validateAsmConstraint(const char *&Name,
7002 TargetInfo::ConstraintInfo &info) const override {
7003 return true;
7004 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007005 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7006 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007007 }
7008};
7009
Daniel Sanders4672af62016-05-27 11:51:02 +00007010class MipsTargetInfo : public TargetInfo {
7011 void setDataLayout() {
Daniel Sanders55e40692016-06-03 10:11:01 +00007012 StringRef Layout;
7013
7014 if (ABI == "o32")
7015 Layout = "m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
7016 else if (ABI == "n32")
7017 Layout = "m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32:64-S128";
7018 else if (ABI == "n64")
7019 Layout = "m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
7020 else
7021 llvm_unreachable("Invalid ABI");
7022
7023 if (BigEndian)
7024 resetDataLayout(("E-" + Layout).str());
7025 else
7026 resetDataLayout(("e-" + Layout).str());
Daniel Sanders4672af62016-05-27 11:51:02 +00007027 }
7028
Akira Hatanaka9064e362013-10-29 18:30:33 +00007029
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00007030 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007031 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00007032 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00007033 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007034 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00007035 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007036 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00007037 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007038 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007039 enum DspRevEnum {
7040 NoDSP, DSP1, DSP2
7041 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00007042 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007043
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007044protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00007045 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007046 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007047
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007048public:
Daniel Sanders4672af62016-05-27 11:51:02 +00007049 MipsTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007050 : TargetInfo(Triple), IsMips16(false), IsMicromips(false),
7051 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
7052 DspRev(NoDSP), HasMSA(false), HasFP64(false) {
Zoran Jovanovic26a12162015-02-18 15:21:35 +00007053 TheCXXABI.set(TargetCXXABI::GenericMIPS);
Daniel Sanders4672af62016-05-27 11:51:02 +00007054 BigEndian = getTriple().getArch() == llvm::Triple::mips ||
7055 getTriple().getArch() == llvm::Triple::mips64;
7056
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007057 setABI((getTriple().getArch() == llvm::Triple::mips ||
7058 getTriple().getArch() == llvm::Triple::mipsel)
7059 ? "o32"
7060 : "n64");
7061
7062 CPU = ABI == "o32" ? "mips32r2" : "mips64r2";
Zoran Jovanovic26a12162015-02-18 15:21:35 +00007063 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007064
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007065 bool isNaN2008Default() const {
7066 return CPU == "mips32r6" || CPU == "mips64r6";
7067 }
7068
7069 bool isFP64Default() const {
7070 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
7071 }
7072
Petar Jovanovicd55ae6b2015-02-26 18:19:22 +00007073 bool isNan2008() const override {
7074 return IsNan2008;
7075 }
7076
Alp Toker4925ba72014-06-07 23:30:42 +00007077 StringRef getABI() const override { return ABI; }
Daniel Sanders4672af62016-05-27 11:51:02 +00007078 bool setABI(const std::string &Name) override {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007079 // FIXME: The Arch component on the triple actually has no bearing on
7080 // whether the ABI is valid or not. It's features of the CPU that
7081 // matters and the size of the GPR's in particular.
7082 // However, we can't allow O32 on 64-bit processors just yet because
7083 // the backend still checks the Arch component instead of the ABI in
7084 // a few places.
Daniel Sanders4672af62016-05-27 11:51:02 +00007085 if (getTriple().getArch() == llvm::Triple::mips ||
7086 getTriple().getArch() == llvm::Triple::mipsel) {
Daniel Sanders07c86542016-05-27 14:30:23 +00007087 if (Name == "o32") {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007088 setO32ABITypes();
Daniel Sanders4672af62016-05-27 11:51:02 +00007089 ABI = Name;
7090 return true;
7091 }
7092 }
7093 if (getTriple().getArch() == llvm::Triple::mips64 ||
7094 getTriple().getArch() == llvm::Triple::mips64el) {
7095 if (Name == "n32") {
7096 setN32ABITypes();
7097 ABI = Name;
7098 return true;
7099 }
7100 if (Name == "n64") {
7101 setN64ABITypes();
7102 ABI = Name;
7103 return true;
7104 }
7105 }
7106 return false;
7107 }
7108
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007109 void setO32ABITypes() {
7110 Int64Type = SignedLongLong;
7111 IntMaxType = Int64Type;
7112 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
7113 LongDoubleWidth = LongDoubleAlign = 64;
7114 LongWidth = LongAlign = 32;
7115 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
7116 PointerWidth = PointerAlign = 32;
7117 PtrDiffType = SignedInt;
7118 SizeType = UnsignedInt;
7119 SuitableAlign = 64;
7120 }
7121
7122 void setN32N64ABITypes() {
7123 LongDoubleWidth = LongDoubleAlign = 128;
7124 LongDoubleFormat = &llvm::APFloat::IEEEquad;
7125 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
7126 LongDoubleWidth = LongDoubleAlign = 64;
7127 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
7128 }
7129 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
7130 SuitableAlign = 128;
7131 }
7132
Daniel Sanders4672af62016-05-27 11:51:02 +00007133 void setN64ABITypes() {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007134 setN32N64ABITypes();
Daniel Sanders4672af62016-05-27 11:51:02 +00007135 Int64Type = SignedLong;
7136 IntMaxType = Int64Type;
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007137 LongWidth = LongAlign = 64;
7138 PointerWidth = PointerAlign = 64;
7139 PtrDiffType = SignedLong;
7140 SizeType = UnsignedLong;
Daniel Sanders4672af62016-05-27 11:51:02 +00007141 }
7142
7143 void setN32ABITypes() {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007144 setN32N64ABITypes();
Daniel Sanders4672af62016-05-27 11:51:02 +00007145 Int64Type = SignedLongLong;
7146 IntMaxType = Int64Type;
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007147 LongWidth = LongAlign = 32;
7148 PointerWidth = PointerAlign = 32;
7149 PtrDiffType = SignedInt;
7150 SizeType = UnsignedInt;
Daniel Sanders4672af62016-05-27 11:51:02 +00007151 }
7152
Craig Topper3164f332014-03-11 03:39:26 +00007153 bool setCPU(const std::string &Name) override {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007154 bool GPR64Required = ABI == "n32" || ABI == "n64";
Eric Christopher0b26a612010-03-02 02:41:08 +00007155 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007156 return llvm::StringSwitch<bool>(Name)
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007157 .Case("mips1", !GPR64Required)
7158 .Case("mips2", !GPR64Required)
Simon Atanasyan26610c52014-07-04 12:36:56 +00007159 .Case("mips3", true)
7160 .Case("mips4", true)
7161 .Case("mips5", true)
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007162 .Case("mips32", !GPR64Required)
7163 .Case("mips32r2", !GPR64Required)
7164 .Case("mips32r3", !GPR64Required)
7165 .Case("mips32r5", !GPR64Required)
7166 .Case("mips32r6", !GPR64Required)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007167 .Case("mips64", true)
7168 .Case("mips64r2", true)
Simon Atanasyan162feb52015-02-20 23:37:40 +00007169 .Case("mips64r3", true)
7170 .Case("mips64r5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007171 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00007172 .Case("octeon", true)
Daniel Sanders28d86372016-06-06 09:47:32 +00007173 .Case("p5600", !GPR64Required)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007174 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00007175 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00007176 const std::string& getCPU() const { return CPU; }
Eric Christopher8c47b422015-10-09 18:39:55 +00007177 bool
7178 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7179 StringRef CPU,
7180 const std::vector<std::string> &FeaturesVec) const override {
Bhushan D. Attardebacb988732016-03-04 06:56:29 +00007181 if (CPU.empty())
7182 CPU = getCPU();
Simon Atanasyan4e16a422014-07-04 12:37:04 +00007183 if (CPU == "octeon")
7184 Features["mips64r2"] = Features["cnmips"] = true;
7185 else
7186 Features[CPU] = true;
Eric Christopher007b0a02015-08-28 22:32:01 +00007187 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Eric Christopher0b26a612010-03-02 02:41:08 +00007188 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007189
Craig Topper3164f332014-03-11 03:39:26 +00007190 void getTargetDefines(const LangOptions &Opts,
7191 MacroBuilder &Builder) const override {
Daniel Sanders4672af62016-05-27 11:51:02 +00007192 if (BigEndian) {
7193 DefineStd(Builder, "MIPSEB", Opts);
7194 Builder.defineMacro("_MIPSEB");
7195 } else {
7196 DefineStd(Builder, "MIPSEL", Opts);
7197 Builder.defineMacro("_MIPSEL");
7198 }
7199
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007200 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00007201 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007202 if (Opts.GNUMode)
7203 Builder.defineMacro("mips");
7204
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007205 if (ABI == "o32") {
Daniel Sanders4672af62016-05-27 11:51:02 +00007206 Builder.defineMacro("__mips", "32");
7207 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
7208 } else {
7209 Builder.defineMacro("__mips", "64");
7210 Builder.defineMacro("__mips64");
7211 Builder.defineMacro("__mips64__");
7212 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
7213 }
7214
7215 const std::string ISARev = llvm::StringSwitch<std::string>(getCPU())
7216 .Cases("mips32", "mips64", "1")
7217 .Cases("mips32r2", "mips64r2", "2")
7218 .Cases("mips32r3", "mips64r3", "3")
7219 .Cases("mips32r5", "mips64r5", "5")
7220 .Cases("mips32r6", "mips64r6", "6")
7221 .Default("");
7222 if (!ISARev.empty())
7223 Builder.defineMacro("__mips_isa_rev", ISARev);
7224
7225 if (ABI == "o32") {
7226 Builder.defineMacro("__mips_o32");
7227 Builder.defineMacro("_ABIO32", "1");
7228 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
Daniel Sanders07c86542016-05-27 14:30:23 +00007229 } else if (ABI == "n32") {
Daniel Sanders4672af62016-05-27 11:51:02 +00007230 Builder.defineMacro("__mips_n32");
7231 Builder.defineMacro("_ABIN32", "2");
7232 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
7233 } else if (ABI == "n64") {
7234 Builder.defineMacro("__mips_n64");
7235 Builder.defineMacro("_ABI64", "3");
7236 Builder.defineMacro("_MIPS_SIM", "_ABI64");
7237 } else
7238 llvm_unreachable("Invalid ABI.");
7239
Simon Atanasyan683535b2012-08-29 19:14:58 +00007240 Builder.defineMacro("__REGISTER_PREFIX__", "");
7241
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007242 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007243 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00007244 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007245 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007246 case SoftFloat:
7247 Builder.defineMacro("__mips_soft_float", Twine(1));
7248 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00007249 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00007250
Simon Atanasyan16071912013-04-14 14:07:30 +00007251 if (IsSingleFloat)
7252 Builder.defineMacro("__mips_single_float", Twine(1));
7253
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007254 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
7255 Builder.defineMacro("_MIPS_FPSET",
7256 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
7257
Simon Atanasyan72244b62012-07-05 16:06:06 +00007258 if (IsMips16)
7259 Builder.defineMacro("__mips16", Twine(1));
7260
Simon Atanasyan60777612013-04-14 14:07:51 +00007261 if (IsMicromips)
7262 Builder.defineMacro("__mips_micromips", Twine(1));
7263
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007264 if (IsNan2008)
7265 Builder.defineMacro("__mips_nan2008", Twine(1));
7266
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007267 switch (DspRev) {
7268 default:
7269 break;
7270 case DSP1:
7271 Builder.defineMacro("__mips_dsp_rev", Twine(1));
7272 Builder.defineMacro("__mips_dsp", Twine(1));
7273 break;
7274 case DSP2:
7275 Builder.defineMacro("__mips_dsp_rev", Twine(2));
7276 Builder.defineMacro("__mips_dspr2", Twine(1));
7277 Builder.defineMacro("__mips_dsp", Twine(1));
7278 break;
7279 }
7280
Jack Carter44ff1e52013-08-12 17:20:29 +00007281 if (HasMSA)
7282 Builder.defineMacro("__mips_msa", Twine(1));
7283
Simon Atanasyan26f19672012-04-05 19:28:31 +00007284 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
7285 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
7286 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00007287
7288 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
7289 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Daniel Sanders5176f7e2015-12-22 12:59:30 +00007290
7291 // These shouldn't be defined for MIPS-I but there's no need to check
7292 // for that since MIPS-I isn't supported.
7293 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
7294 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
7295 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007296
7297 // 32-bit MIPS processors don't have the necessary lld/scd instructions
7298 // found in 64-bit processors. In the case of O32 on a 64-bit processor,
7299 // the instructions exist but using them violates the ABI since they
7300 // require 64-bit GPRs and O32 only supports 32-bit GPRs.
7301 if (ABI == "n32" || ABI == "n64")
Daniel Sanders4672af62016-05-27 11:51:02 +00007302 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007303 }
7304
Craig Topper6c03a542015-10-19 04:51:35 +00007305 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7306 return llvm::makeArrayRef(BuiltinInfo,
7307 clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin);
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007308 }
Craig Topper3164f332014-03-11 03:39:26 +00007309 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00007310 return llvm::StringSwitch<bool>(Feature)
7311 .Case("mips", true)
7312 .Case("fp64", HasFP64)
7313 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00007314 }
Craig Topper3164f332014-03-11 03:39:26 +00007315 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00007316 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007317 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007318 ArrayRef<const char *> getGCCRegNames() const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00007319 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00007320 // CPU register names
7321 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007322 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
7323 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
7324 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00007325 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
7326 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007327 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
7328 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
7329 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
7330 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00007331 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007332 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Hrvoje Varga14c42ee2016-03-29 12:46:16 +00007333 "$fcc5","$fcc6","$fcc7","$ac1hi","$ac1lo","$ac2hi","$ac2lo",
7334 "$ac3hi","$ac3lo",
Daniel Sanders8b59af12013-11-12 12:56:01 +00007335 // MSA register names
7336 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
7337 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
7338 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
7339 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
7340 // MSA control register names
7341 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
7342 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007343 };
Craig Topperf054e3a2015-10-19 03:52:27 +00007344 return llvm::makeArrayRef(GCCRegNames);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007345 }
Craig Topper3164f332014-03-11 03:39:26 +00007346 bool validateAsmConstraint(const char *&Name,
7347 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007348 switch (*Name) {
7349 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00007350 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007351 case 'r': // CPU registers.
7352 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00007353 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007354 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00007355 case 'c': // $25 for indirect jumps
7356 case 'l': // lo register
7357 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007358 Info.setAllowsRegister();
7359 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00007360 case 'I': // Signed 16-bit constant
7361 case 'J': // Integer 0
7362 case 'K': // Unsigned 16-bit constant
7363 case 'L': // Signed 32-bit constant, lower 16-bit zeros (for lui)
7364 case 'M': // Constants not loadable via lui, addiu, or ori
7365 case 'N': // Constant -1 to -65535
7366 case 'O': // A signed 15-bit constant
7367 case 'P': // A constant between 1 go 65535
7368 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00007369 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00007370 Info.setAllowsMemory();
7371 return true;
Daniel Sanders48fa39e2015-03-30 13:47:23 +00007372 case 'Z':
7373 if (Name[1] == 'C') { // An address usable by ll, and sc.
7374 Info.setAllowsMemory();
7375 Name++; // Skip over 'Z'.
7376 return true;
7377 }
7378 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007379 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007380 }
7381
Daniel Sanders48fa39e2015-03-30 13:47:23 +00007382 std::string convertConstraint(const char *&Constraint) const override {
7383 std::string R;
7384 switch (*Constraint) {
7385 case 'Z': // Two-character constraint; add "^" hint for later parsing.
7386 if (Constraint[1] == 'C') {
7387 R = std::string("^") + std::string(Constraint, 2);
7388 Constraint++;
7389 return R;
7390 }
7391 break;
7392 }
7393 return TargetInfo::convertConstraint(Constraint);
7394 }
7395
Craig Topper3164f332014-03-11 03:39:26 +00007396 const char *getClobbers() const override {
Toma Tabacucfab40f2015-01-12 14:41:30 +00007397 // In GCC, $1 is not widely used in generated code (it's used only in a few
7398 // specific situations), so there is no real need for users to add it to
7399 // the clobbers list if they want to use it in their inline assembly code.
7400 //
7401 // In LLVM, $1 is treated as a normal GPR and is always allocatable during
7402 // code generation, so using it in inline assembly without adding it to the
7403 // clobbers list can cause conflicts between the inline assembly code and
7404 // the surrounding generated code.
7405 //
7406 // Another problem is that LLVM is allowed to choose $1 for inline assembly
7407 // operands, which will conflict with the ".set at" assembler option (which
7408 // we use only for inline assembly, in order to maintain compatibility with
7409 // GCC) and will also conflict with the user's usage of $1.
7410 //
7411 // The easiest way to avoid these conflicts and keep $1 as an allocatable
7412 // register for generated code is to automatically clobber $1 for all inline
7413 // assembly code.
7414 //
7415 // FIXME: We should automatically clobber $1 only for inline assembly code
7416 // which actually uses it. This would allow LLVM to use $1 for inline
7417 // assembly operands if the user's assembly code doesn't use it.
Toma Tabacu99411952014-12-17 12:02:58 +00007418 return "~{$1}";
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007419 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007420
Craig Topper3164f332014-03-11 03:39:26 +00007421 bool handleTargetFeatures(std::vector<std::string> &Features,
7422 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00007423 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00007424 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007425 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00007426 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007427 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007428 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007429 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007430
Eric Christopher610fe112015-08-26 08:21:55 +00007431 for (const auto &Feature : Features) {
7432 if (Feature == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00007433 IsSingleFloat = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007434 else if (Feature == "+soft-float")
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007435 FloatABI = SoftFloat;
Eric Christopher610fe112015-08-26 08:21:55 +00007436 else if (Feature == "+mips16")
Simon Atanasyan72244b62012-07-05 16:06:06 +00007437 IsMips16 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007438 else if (Feature == "+micromips")
Simon Atanasyan60777612013-04-14 14:07:51 +00007439 IsMicromips = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007440 else if (Feature == "+dsp")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007441 DspRev = std::max(DspRev, DSP1);
Eric Christopher610fe112015-08-26 08:21:55 +00007442 else if (Feature == "+dspr2")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007443 DspRev = std::max(DspRev, DSP2);
Eric Christopher610fe112015-08-26 08:21:55 +00007444 else if (Feature == "+msa")
Jack Carter44ff1e52013-08-12 17:20:29 +00007445 HasMSA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007446 else if (Feature == "+fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007447 HasFP64 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007448 else if (Feature == "-fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007449 HasFP64 = false;
Eric Christopher610fe112015-08-26 08:21:55 +00007450 else if (Feature == "+nan2008")
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007451 IsNan2008 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007452 else if (Feature == "-nan2008")
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007453 IsNan2008 = false;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007454 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007455
James Y Knightb214cbc2016-03-04 19:00:41 +00007456 setDataLayout();
Akira Hatanaka9064e362013-10-29 18:30:33 +00007457
Rafael Espindolaeb265472013-08-21 21:59:03 +00007458 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007459 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00007460
Craig Topper3164f332014-03-11 03:39:26 +00007461 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00007462 if (RegNo == 0) return 4;
7463 if (RegNo == 1) return 5;
7464 return -1;
7465 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00007466
7467 bool isCLZForZeroUndef() const override { return false; }
Daniel Sanders4672af62016-05-27 11:51:02 +00007468
7469 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7470 static const TargetInfo::GCCRegAlias O32RegAliases[] = {
7471 {{"at"}, "$1"}, {{"v0"}, "$2"}, {{"v1"}, "$3"},
7472 {{"a0"}, "$4"}, {{"a1"}, "$5"}, {{"a2"}, "$6"},
7473 {{"a3"}, "$7"}, {{"t0"}, "$8"}, {{"t1"}, "$9"},
7474 {{"t2"}, "$10"}, {{"t3"}, "$11"}, {{"t4"}, "$12"},
7475 {{"t5"}, "$13"}, {{"t6"}, "$14"}, {{"t7"}, "$15"},
7476 {{"s0"}, "$16"}, {{"s1"}, "$17"}, {{"s2"}, "$18"},
7477 {{"s3"}, "$19"}, {{"s4"}, "$20"}, {{"s5"}, "$21"},
7478 {{"s6"}, "$22"}, {{"s7"}, "$23"}, {{"t8"}, "$24"},
7479 {{"t9"}, "$25"}, {{"k0"}, "$26"}, {{"k1"}, "$27"},
7480 {{"gp"}, "$28"}, {{"sp", "$sp"}, "$29"}, {{"fp", "$fp"}, "$30"},
7481 {{"ra"}, "$31"}};
7482 static const TargetInfo::GCCRegAlias NewABIRegAliases[] = {
7483 {{"at"}, "$1"}, {{"v0"}, "$2"}, {{"v1"}, "$3"},
7484 {{"a0"}, "$4"}, {{"a1"}, "$5"}, {{"a2"}, "$6"},
7485 {{"a3"}, "$7"}, {{"a4"}, "$8"}, {{"a5"}, "$9"},
7486 {{"a6"}, "$10"}, {{"a7"}, "$11"}, {{"t0"}, "$12"},
7487 {{"t1"}, "$13"}, {{"t2"}, "$14"}, {{"t3"}, "$15"},
7488 {{"s0"}, "$16"}, {{"s1"}, "$17"}, {{"s2"}, "$18"},
7489 {{"s3"}, "$19"}, {{"s4"}, "$20"}, {{"s5"}, "$21"},
7490 {{"s6"}, "$22"}, {{"s7"}, "$23"}, {{"t8"}, "$24"},
7491 {{"t9"}, "$25"}, {{"k0"}, "$26"}, {{"k1"}, "$27"},
7492 {{"gp"}, "$28"}, {{"sp", "$sp"}, "$29"}, {{"fp", "$fp"}, "$30"},
7493 {{"ra"}, "$31"}};
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007494 if (ABI == "o32")
Daniel Sanders4672af62016-05-27 11:51:02 +00007495 return llvm::makeArrayRef(O32RegAliases);
7496 return llvm::makeArrayRef(NewABIRegAliases);
7497 }
7498
7499 bool hasInt128Type() const override {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007500 return ABI == "n32" || ABI == "n64";
Daniel Sanders4672af62016-05-27 11:51:02 +00007501 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007502};
7503
Daniel Sanders4672af62016-05-27 11:51:02 +00007504const Builtin::Info MipsTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00007505#define BUILTIN(ID, TYPE, ATTRS) \
7506 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7507#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7508 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00007509#include "clang/Basic/BuiltinsMips.def"
7510};
7511
Ivan Krasindd7403e2011-08-24 20:22:22 +00007512class PNaClTargetInfo : public TargetInfo {
7513public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007514 PNaClTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7515 : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00007516 BigEndian = false;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007517 this->LongAlign = 32;
7518 this->LongWidth = 32;
7519 this->PointerAlign = 32;
7520 this->PointerWidth = 32;
7521 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007522 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00007523 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00007524 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00007525 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00007526 this->SizeType = TargetInfo::UnsignedInt;
7527 this->PtrDiffType = TargetInfo::SignedInt;
7528 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00007529 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00007530 }
7531
Craig Toppere6f17d02014-03-11 04:07:52 +00007532 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007533 Builder.defineMacro("__le32__");
7534 Builder.defineMacro("__pnacl__");
7535 }
Craig Topper3164f332014-03-11 03:39:26 +00007536 void getTargetDefines(const LangOptions &Opts,
7537 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007538 getArchDefines(Opts, Builder);
7539 }
Craig Topper3164f332014-03-11 03:39:26 +00007540 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00007541 return Feature == "pnacl";
7542 }
Craig Topper6c03a542015-10-19 04:51:35 +00007543 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Craig Topper3164f332014-03-11 03:39:26 +00007544 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00007545 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007546 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007547 ArrayRef<const char *> getGCCRegNames() const override;
7548 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00007549 bool validateAsmConstraint(const char *&Name,
7550 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007551 return false;
7552 }
7553
Craig Topper3164f332014-03-11 03:39:26 +00007554 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007555 return "";
7556 }
7557};
7558
Craig Topperf054e3a2015-10-19 03:52:27 +00007559ArrayRef<const char *> PNaClTargetInfo::getGCCRegNames() const {
7560 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007561}
7562
Craig Topperf054e3a2015-10-19 03:52:27 +00007563ArrayRef<TargetInfo::GCCRegAlias> PNaClTargetInfo::getGCCRegAliases() const {
7564 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007565}
Ivan Krasindd7403e2011-08-24 20:22:22 +00007566
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007567// We attempt to use PNaCl (le32) frontend and Mips32EL backend.
Daniel Sanders4672af62016-05-27 11:51:02 +00007568class NaClMips32TargetInfo : public MipsTargetInfo {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007569public:
Daniel Sanders4672af62016-05-27 11:51:02 +00007570 NaClMips32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7571 : MipsTargetInfo(Triple, Opts) {}
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007572
7573 BuiltinVaListKind getBuiltinVaListKind() const override {
7574 return TargetInfo::PNaClABIBuiltinVaList;
7575 }
7576};
7577
JF Bastien643817d2014-09-12 17:52:47 +00007578class Le64TargetInfo : public TargetInfo {
7579 static const Builtin::Info BuiltinInfo[];
7580
7581public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007582 Le64TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7583 : TargetInfo(Triple) {
JF Bastien643817d2014-09-12 17:52:47 +00007584 BigEndian = false;
7585 NoAsmVariants = true;
7586 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
7587 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00007588 resetDataLayout("e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128");
JF Bastien643817d2014-09-12 17:52:47 +00007589 }
7590
7591 void getTargetDefines(const LangOptions &Opts,
7592 MacroBuilder &Builder) const override {
7593 DefineStd(Builder, "unix", Opts);
7594 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
7595 Builder.defineMacro("__ELF__");
7596 }
Craig Topper6c03a542015-10-19 04:51:35 +00007597 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7598 return llvm::makeArrayRef(BuiltinInfo,
7599 clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin);
JF Bastien643817d2014-09-12 17:52:47 +00007600 }
7601 BuiltinVaListKind getBuiltinVaListKind() const override {
7602 return TargetInfo::PNaClABIBuiltinVaList;
7603 }
7604 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00007605 ArrayRef<const char *> getGCCRegNames() const override {
7606 return None;
JF Bastien643817d2014-09-12 17:52:47 +00007607 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007608 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7609 return None;
JF Bastien643817d2014-09-12 17:52:47 +00007610 }
7611 bool validateAsmConstraint(const char *&Name,
7612 TargetInfo::ConstraintInfo &Info) const override {
7613 return false;
7614 }
7615
7616 bool hasProtectedVisibility() const override { return false; }
JF Bastien643817d2014-09-12 17:52:47 +00007617};
Dan Gohmanc2853072015-09-03 22:51:53 +00007618
7619class WebAssemblyTargetInfo : public TargetInfo {
7620 static const Builtin::Info BuiltinInfo[];
7621
7622 enum SIMDEnum {
7623 NoSIMD,
7624 SIMD128,
7625 } SIMDLevel;
7626
7627public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007628 explicit WebAssemblyTargetInfo(const llvm::Triple &T, const TargetOptions &)
Dan Gohmanc2853072015-09-03 22:51:53 +00007629 : TargetInfo(T), SIMDLevel(NoSIMD) {
7630 BigEndian = false;
7631 NoAsmVariants = true;
7632 SuitableAlign = 128;
7633 LargeArrayMinWidth = 128;
7634 LargeArrayAlign = 128;
7635 SimdDefaultAlign = 128;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007636 SigAtomicType = SignedLong;
Dan Gohman6db46402015-11-10 21:01:46 +00007637 LongDoubleWidth = LongDoubleAlign = 128;
7638 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Dan Gohmanc2853072015-09-03 22:51:53 +00007639 }
7640
7641protected:
7642 void getTargetDefines(const LangOptions &Opts,
7643 MacroBuilder &Builder) const override {
7644 defineCPUMacros(Builder, "wasm", /*Tuning=*/false);
7645 if (SIMDLevel >= SIMD128)
7646 Builder.defineMacro("__wasm_simd128__");
7647 }
7648
7649private:
Eric Christopher8c47b422015-10-09 18:39:55 +00007650 bool
7651 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7652 StringRef CPU,
7653 const std::vector<std::string> &FeaturesVec) const override {
Dan Gohmanc2853072015-09-03 22:51:53 +00007654 if (CPU == "bleeding-edge")
7655 Features["simd128"] = true;
7656 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
7657 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007658 bool hasFeature(StringRef Feature) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007659 return llvm::StringSwitch<bool>(Feature)
7660 .Case("simd128", SIMDLevel >= SIMD128)
7661 .Default(false);
7662 }
7663 bool handleTargetFeatures(std::vector<std::string> &Features,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007664 DiagnosticsEngine &Diags) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007665 for (const auto &Feature : Features) {
7666 if (Feature == "+simd128") {
7667 SIMDLevel = std::max(SIMDLevel, SIMD128);
7668 continue;
7669 }
7670 if (Feature == "-simd128") {
7671 SIMDLevel = std::min(SIMDLevel, SIMDEnum(SIMD128 - 1));
7672 continue;
7673 }
7674
7675 Diags.Report(diag::err_opt_not_valid_with_opt) << Feature
7676 << "-target-feature";
7677 return false;
7678 }
7679 return true;
7680 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007681 bool setCPU(const std::string &Name) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007682 return llvm::StringSwitch<bool>(Name)
7683 .Case("mvp", true)
7684 .Case("bleeding-edge", true)
7685 .Case("generic", true)
7686 .Default(false);
7687 }
Craig Topper6c03a542015-10-19 04:51:35 +00007688 ArrayRef<Builtin::Info> getTargetBuiltins() const final {
7689 return llvm::makeArrayRef(BuiltinInfo,
7690 clang::WebAssembly::LastTSBuiltin - Builtin::FirstTSBuiltin);
Dan Gohmanc2853072015-09-03 22:51:53 +00007691 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007692 BuiltinVaListKind getBuiltinVaListKind() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007693 return VoidPtrBuiltinVaList;
7694 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007695 ArrayRef<const char *> getGCCRegNames() const final {
7696 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00007697 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007698 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const final {
7699 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00007700 }
7701 bool
7702 validateAsmConstraint(const char *&Name,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007703 TargetInfo::ConstraintInfo &Info) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007704 return false;
7705 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007706 const char *getClobbers() const final { return ""; }
7707 bool isCLZForZeroUndef() const final { return false; }
7708 bool hasInt128Type() const final { return true; }
Dan Gohmanab0e31f2015-09-14 21:49:41 +00007709 IntType getIntTypeByWidth(unsigned BitWidth,
7710 bool IsSigned) const final {
7711 // WebAssembly prefers long long for explicitly 64-bit integers.
7712 return BitWidth == 64 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
7713 : TargetInfo::getIntTypeByWidth(BitWidth, IsSigned);
7714 }
7715 IntType getLeastIntTypeByWidth(unsigned BitWidth,
7716 bool IsSigned) const final {
7717 // WebAssembly uses long long for int_least64_t and int_fast64_t.
7718 return BitWidth == 64
7719 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
7720 : TargetInfo::getLeastIntTypeByWidth(BitWidth, IsSigned);
7721 }
Dan Gohmanc2853072015-09-03 22:51:53 +00007722};
7723
7724const Builtin::Info WebAssemblyTargetInfo::BuiltinInfo[] = {
7725#define BUILTIN(ID, TYPE, ATTRS) \
7726 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7727#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7728 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
7729#include "clang/Basic/BuiltinsWebAssembly.def"
7730};
7731
7732class WebAssembly32TargetInfo : public WebAssemblyTargetInfo {
7733public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007734 explicit WebAssembly32TargetInfo(const llvm::Triple &T,
7735 const TargetOptions &Opts)
7736 : WebAssemblyTargetInfo(T, Opts) {
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007737 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
James Y Knightb214cbc2016-03-04 19:00:41 +00007738 resetDataLayout("e-m:e-p:32:32-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00007739 }
7740
7741protected:
7742 void getTargetDefines(const LangOptions &Opts,
7743 MacroBuilder &Builder) const override {
7744 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
7745 defineCPUMacros(Builder, "wasm32", /*Tuning=*/false);
7746 }
7747};
7748
7749class WebAssembly64TargetInfo : public WebAssemblyTargetInfo {
7750public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007751 explicit WebAssembly64TargetInfo(const llvm::Triple &T,
7752 const TargetOptions &Opts)
7753 : WebAssemblyTargetInfo(T, Opts) {
Dan Gohmanc2853072015-09-03 22:51:53 +00007754 LongAlign = LongWidth = 64;
7755 PointerAlign = PointerWidth = 64;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007756 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00007757 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00007758 }
7759
7760protected:
7761 void getTargetDefines(const LangOptions &Opts,
7762 MacroBuilder &Builder) const override {
7763 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
7764 defineCPUMacros(Builder, "wasm64", /*Tuning=*/false);
7765 }
7766};
7767
JF Bastien643817d2014-09-12 17:52:47 +00007768const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
7769#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00007770 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
JF Bastien643817d2014-09-12 17:52:47 +00007771#include "clang/Basic/BuiltinsLe64.def"
7772};
7773
Eric Christopherc48497a2015-09-18 21:26:24 +00007774static const unsigned SPIRAddrSpaceMap[] = {
7775 1, // opencl_global
7776 3, // opencl_local
7777 2, // opencl_constant
7778 4, // opencl_generic
7779 0, // cuda_device
7780 0, // cuda_constant
7781 0 // cuda_shared
7782};
7783class SPIRTargetInfo : public TargetInfo {
7784public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007785 SPIRTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7786 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007787 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
7788 "SPIR target must use unknown OS");
7789 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
7790 "SPIR target must use unknown environment type");
7791 BigEndian = false;
7792 TLSSupported = false;
7793 LongWidth = LongAlign = 64;
7794 AddrSpaceMap = &SPIRAddrSpaceMap;
7795 UseAddrSpaceMapMangling = true;
7796 // Define available target features
7797 // These must be defined in sorted order!
7798 NoAsmVariants = true;
7799 }
7800 void getTargetDefines(const LangOptions &Opts,
7801 MacroBuilder &Builder) const override {
7802 DefineStd(Builder, "SPIR", Opts);
7803 }
7804 bool hasFeature(StringRef Feature) const override {
7805 return Feature == "spir";
7806 }
Craig Topper3164f332014-03-11 03:39:26 +00007807
Craig Topper6c03a542015-10-19 04:51:35 +00007808 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007809 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00007810 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007811 bool validateAsmConstraint(const char *&Name,
7812 TargetInfo::ConstraintInfo &info) const override {
7813 return true;
7814 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007815 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7816 return None;
7817 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007818 BuiltinVaListKind getBuiltinVaListKind() const override {
7819 return TargetInfo::VoidPtrBuiltinVaList;
7820 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00007821
Eric Christopherc48497a2015-09-18 21:26:24 +00007822 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
7823 return (CC == CC_SpirFunction || CC == CC_SpirKernel) ? CCCR_OK
7824 : CCCR_Warning;
7825 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00007826
Eric Christopherc48497a2015-09-18 21:26:24 +00007827 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
7828 return CC_SpirFunction;
7829 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00007830
7831 void setSupportedOpenCLOpts() override {
7832 // Assume all OpenCL extensions and optional core features are supported
7833 // for SPIR since it is a generic target.
7834 getSupportedOpenCLOpts().setAll();
7835 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007836};
Guy Benyeib798fc92012-12-11 21:38:14 +00007837
Eric Christopherc48497a2015-09-18 21:26:24 +00007838class SPIR32TargetInfo : public SPIRTargetInfo {
7839public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007840 SPIR32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7841 : SPIRTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007842 PointerWidth = PointerAlign = 32;
7843 SizeType = TargetInfo::UnsignedInt;
7844 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +00007845 resetDataLayout("e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
7846 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00007847 }
7848 void getTargetDefines(const LangOptions &Opts,
7849 MacroBuilder &Builder) const override {
7850 DefineStd(Builder, "SPIR32", Opts);
7851 }
7852};
Guy Benyeib798fc92012-12-11 21:38:14 +00007853
Eric Christopherc48497a2015-09-18 21:26:24 +00007854class SPIR64TargetInfo : public SPIRTargetInfo {
7855public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007856 SPIR64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7857 : SPIRTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007858 PointerWidth = PointerAlign = 64;
7859 SizeType = TargetInfo::UnsignedLong;
7860 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00007861 resetDataLayout("e-i64:64-v16:16-v24:32-v32:32-v48:64-"
7862 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00007863 }
7864 void getTargetDefines(const LangOptions &Opts,
7865 MacroBuilder &Builder) const override {
7866 DefineStd(Builder, "SPIR64", Opts);
7867 }
7868};
Guy Benyeib798fc92012-12-11 21:38:14 +00007869
Robert Lytton0e076492013-08-13 09:43:10 +00007870class XCoreTargetInfo : public TargetInfo {
7871 static const Builtin::Info BuiltinInfo[];
7872public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007873 XCoreTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7874 : TargetInfo(Triple) {
Robert Lytton0e076492013-08-13 09:43:10 +00007875 BigEndian = false;
7876 NoAsmVariants = true;
7877 LongLongAlign = 32;
7878 SuitableAlign = 32;
7879 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00007880 SizeType = UnsignedInt;
7881 PtrDiffType = SignedInt;
7882 IntPtrType = SignedInt;
7883 WCharType = UnsignedChar;
7884 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00007885 UseZeroLengthBitfieldAlignment = true;
James Y Knightb214cbc2016-03-04 19:00:41 +00007886 resetDataLayout("e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32"
7887 "-f64:32-a:0:32-n32");
Robert Lytton0e076492013-08-13 09:43:10 +00007888 }
Craig Topper3164f332014-03-11 03:39:26 +00007889 void getTargetDefines(const LangOptions &Opts,
7890 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007891 Builder.defineMacro("__XS1B__");
7892 }
Craig Topper6c03a542015-10-19 04:51:35 +00007893 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7894 return llvm::makeArrayRef(BuiltinInfo,
7895 clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin);
Robert Lytton0e076492013-08-13 09:43:10 +00007896 }
Craig Topper3164f332014-03-11 03:39:26 +00007897 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007898 return TargetInfo::VoidPtrBuiltinVaList;
7899 }
Craig Topper3164f332014-03-11 03:39:26 +00007900 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007901 return "";
7902 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007903 ArrayRef<const char *> getGCCRegNames() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007904 static const char * const GCCRegNames[] = {
7905 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
7906 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
7907 };
Craig Topperf054e3a2015-10-19 03:52:27 +00007908 return llvm::makeArrayRef(GCCRegNames);
Robert Lytton0e076492013-08-13 09:43:10 +00007909 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007910 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7911 return None;
Robert Lytton0e076492013-08-13 09:43:10 +00007912 }
Craig Topper3164f332014-03-11 03:39:26 +00007913 bool validateAsmConstraint(const char *&Name,
7914 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007915 return false;
7916 }
Craig Topper3164f332014-03-11 03:39:26 +00007917 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00007918 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
7919 return (RegNo < 2)? RegNo : -1;
7920 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00007921 bool allowsLargerPreferedTypeAlignment() const override {
7922 return false;
7923 }
Robert Lytton0e076492013-08-13 09:43:10 +00007924};
7925
7926const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00007927#define BUILTIN(ID, TYPE, ATTRS) \
7928 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7929#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7930 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Robert Lytton0e076492013-08-13 09:43:10 +00007931#include "clang/Basic/BuiltinsXCore.def"
7932};
Robert Lytton0e076492013-08-13 09:43:10 +00007933
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007934// x86_32 Android target
7935class AndroidX86_32TargetInfo : public LinuxTargetInfo<X86_32TargetInfo> {
7936public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007937 AndroidX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7938 : LinuxTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007939 SuitableAlign = 32;
7940 LongDoubleWidth = 64;
7941 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
7942 }
7943};
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007944
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007945// x86_64 Android target
7946class AndroidX86_64TargetInfo : public LinuxTargetInfo<X86_64TargetInfo> {
7947public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007948 AndroidX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7949 : LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007950 LongDoubleFormat = &llvm::APFloat::IEEEquad;
7951 }
Chih-Hung Hsieh0b0eeaa2015-07-24 18:12:54 +00007952
7953 bool useFloat128ManglingForLongDouble() const override {
7954 return true;
7955 }
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007956};
7957} // end anonymous namespace
7958
Chris Lattner5ba61f02006-10-14 07:39:34 +00007959//===----------------------------------------------------------------------===//
7960// Driver code
7961//===----------------------------------------------------------------------===//
7962
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007963static TargetInfo *AllocateTarget(const llvm::Triple &Triple,
7964 const TargetOptions &Opts) {
Daniel Dunbar52322032009-08-18 05:47:58 +00007965 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00007966
Daniel Dunbar52322032009-08-18 05:47:58 +00007967 switch (Triple.getArch()) {
7968 default:
Craig Topperf1186c52014-05-08 06:41:40 +00007969 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00007970
Tim Northover2a0783d2014-05-30 14:14:07 +00007971 case llvm::Triple::xcore:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007972 return new XCoreTargetInfo(Triple, Opts);
Tim Northover2a0783d2014-05-30 14:14:07 +00007973
7974 case llvm::Triple::hexagon:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007975 return new HexagonTargetInfo(Triple, Opts);
Tim Northover2a0783d2014-05-30 14:14:07 +00007976
Jacques Pienaard964cc22016-03-28 21:02:54 +00007977 case llvm::Triple::lanai:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007978 return new LanaiTargetInfo(Triple, Opts);
Jacques Pienaard964cc22016-03-28 21:02:54 +00007979
Tim Northover2a0783d2014-05-30 14:14:07 +00007980 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00007981 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007982 return new DarwinAArch64TargetInfo(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00007983
7984 switch (os) {
Ed Schoutenea9448e2015-10-15 15:07:07 +00007985 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007986 return new CloudABITargetInfo<AArch64leTargetInfo>(Triple, Opts);
Ed Maste6a9eda52014-11-13 16:55:42 +00007987 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007988 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00007989 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007990 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple, Opts);
James Molloy5e73df52014-04-16 15:06:20 +00007991 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007992 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00007993 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007994 return new AArch64leTargetInfo(Triple, Opts);
James Molloy5e73df52014-04-16 15:06:20 +00007995 }
7996
Christian Pirker9b019ae2014-02-25 13:51:00 +00007997 case llvm::Triple::aarch64_be:
7998 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00007999 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008000 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00008001 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008002 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00008003 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008004 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00008005 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008006 return new AArch64beTargetInfo(Triple, Opts);
Tim Northover9bb857a2013-01-31 12:13:10 +00008007 }
8008
Daniel Dunbar52322032009-08-18 05:47:58 +00008009 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00008010 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00008011 if (Triple.isOSBinFormatMachO())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008012 return new DarwinARMTargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008013
Daniel Dunbar52322032009-08-18 05:47:58 +00008014 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00008015 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008016 return new LinuxTargetInfo<ARMleTargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008017 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008018 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008019 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008020 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008021 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008022 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00008023 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008024 return new BitrigTargetInfo<ARMleTargetInfo>(Triple, Opts);
Douglas Gregor9fabd852011-07-01 22:41:14 +00008025 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008026 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00008027 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008028 return new NaClTargetInfo<ARMleTargetInfo>(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008029 case llvm::Triple::Win32:
8030 switch (Triple.getEnvironment()) {
Yaron Keren321249c2015-07-15 13:32:23 +00008031 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008032 return new CygwinARMTargetInfo(Triple, Opts);
Yaron Keren321249c2015-07-15 13:32:23 +00008033 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008034 return new MinGWARMTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008035 case llvm::Triple::Itanium:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008036 return new ItaniumWindowsARMleTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008037 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008038 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008039 return new MicrosoftARMleTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008040 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008041 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008042 return new ARMleTargetInfo(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008043 }
8044
8045 case llvm::Triple::armeb:
8046 case llvm::Triple::thumbeb:
8047 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008048 return new DarwinARMTargetInfo(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008049
8050 switch (os) {
8051 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008052 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008053 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008054 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008055 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008056 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008057 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008058 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008059 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008060 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008061 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008062 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008063 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008064 return new NaClTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008065 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008066 return new ARMbeTargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008067 }
Eli Friedmanb5366062008-05-20 14:21:01 +00008068
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00008069 case llvm::Triple::bpfeb:
8070 case llvm::Triple::bpfel:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008071 return new BPFTargetInfo(Triple, Opts);
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00008072
Daniel Dunbar52322032009-08-18 05:47:58 +00008073 case llvm::Triple::msp430:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008074 return new MSP430TargetInfo(Triple, Opts);
Eli Friedmanb5366062008-05-20 14:21:01 +00008075
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008076 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008077 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008078 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00008079 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008080 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00008081 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008082 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008083 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008084 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008085 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008086 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00008087 return new MipsTargetInfo(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008088 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008089
8090 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008091 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008092 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00008093 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008094 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00008095 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008096 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008097 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008098 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008099 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00008100 case llvm::Triple::NaCl:
Daniel Sanders4672af62016-05-27 11:51:02 +00008101 return new NaClTargetInfo<NaClMips32TargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008102 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00008103 return new MipsTargetInfo(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008104 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008105
Akira Hatanakabef17452011-09-20 19:21:49 +00008106 case llvm::Triple::mips64:
8107 switch (os) {
8108 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00008109 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008110 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00008111 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008112 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008113 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008114 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008115 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008116 case llvm::Triple::OpenBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008117 return new OpenBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008118 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00008119 return new MipsTargetInfo(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008120 }
8121
8122 case llvm::Triple::mips64el:
8123 switch (os) {
8124 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00008125 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008126 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00008127 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008128 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008129 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008130 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008131 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008132 case llvm::Triple::OpenBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008133 return new OpenBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008134 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00008135 return new MipsTargetInfo(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008136 }
8137
Ivan Krasindd7403e2011-08-24 20:22:22 +00008138 case llvm::Triple::le32:
8139 switch (os) {
Douglas Katzman78d7c542015-05-12 21:18:10 +00008140 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008141 return new NaClTargetInfo<PNaClTargetInfo>(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00008142 default:
8143 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00008144 }
8145
JF Bastien643817d2014-09-12 17:52:47 +00008146 case llvm::Triple::le64:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008147 return new Le64TargetInfo(Triple, Opts);
JF Bastien643817d2014-09-12 17:52:47 +00008148
Daniel Dunbar52322032009-08-18 05:47:58 +00008149 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008150 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008151 return new DarwinPPC32TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008152 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00008153 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008154 return new LinuxTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008155 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008156 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008157 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008158 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008159 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008160 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008161 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008162 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008163 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008164 return new PPC32TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008165 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008166
8167 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008168 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008169 return new DarwinPPC64TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008170 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00008171 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008172 return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008173 case llvm::Triple::Lv2:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008174 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008175 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008176 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008177 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008178 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008179 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008180 return new PPC64TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008181 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008182
Bill Schmidt778d3872013-07-26 01:36:11 +00008183 case llvm::Triple::ppc64le:
8184 switch (os) {
8185 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008186 return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger22a2d992015-04-10 20:53:48 +00008187 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008188 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Bill Schmidt778d3872013-07-26 01:36:11 +00008189 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008190 return new PPC64TargetInfo(Triple, Opts);
Bill Schmidt778d3872013-07-26 01:36:11 +00008191 }
8192
Peter Collingbournec947aae2012-05-20 23:28:41 +00008193 case llvm::Triple::nvptx:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008194 return new NVPTX32TargetInfo(Triple, Opts);
Peter Collingbournec947aae2012-05-20 23:28:41 +00008195 case llvm::Triple::nvptx64:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008196 return new NVPTX64TargetInfo(Triple, Opts);
Peter Collingbournec947aae2012-05-20 23:28:41 +00008197
Tom Stellardd8e38a32015-01-06 20:34:47 +00008198 case llvm::Triple::amdgcn:
Eli Friedmand13b41e2012-10-12 23:32:00 +00008199 case llvm::Triple::r600:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008200 return new AMDGPUTargetInfo(Triple, Opts);
Eli Friedmand13b41e2012-10-12 23:32:00 +00008201
Daniel Dunbar52322032009-08-18 05:47:58 +00008202 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008203 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00008204 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008205 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008206 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008207 return new SolarisTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008208 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008209 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008210 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008211 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008212 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008213 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008214 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008215 return new SparcV8TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008216 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008217
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008218 // The 'sparcel' architecture copies all the above cases except for Solaris.
8219 case llvm::Triple::sparcel:
8220 switch (os) {
8221 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008222 return new LinuxTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008223 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008224 return new NetBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008225 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008226 return new OpenBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008227 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008228 return new RTEMSTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008229 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008230 return new SparcV8elTargetInfo(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008231 }
8232
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008233 case llvm::Triple::sparcv9:
8234 switch (os) {
8235 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008236 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008237 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008238 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008239 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008240 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008241 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008242 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008243 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008244 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008245 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008246 return new SparcV9TargetInfo(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008247 }
8248
Ulrich Weigand47445072013-05-06 16:26:41 +00008249 case llvm::Triple::systemz:
8250 switch (os) {
8251 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008252 return new LinuxTargetInfo<SystemZTargetInfo>(Triple, Opts);
Ulrich Weigand47445072013-05-06 16:26:41 +00008253 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008254 return new SystemZTargetInfo(Triple, Opts);
Ulrich Weigand47445072013-05-06 16:26:41 +00008255 }
8256
Eli Friedmana9c3d712009-08-19 20:47:07 +00008257 case llvm::Triple::tce:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008258 return new TCETargetInfo(Triple, Opts);
Eli Friedmana9c3d712009-08-19 20:47:07 +00008259
Daniel Dunbar52322032009-08-18 05:47:58 +00008260 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008261 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008262 return new DarwinI386TargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008263
Daniel Dunbar52322032009-08-18 05:47:58 +00008264 switch (os) {
Ed Schouten7893e682015-06-13 21:33:49 +00008265 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008266 return new CloudABITargetInfo<X86_32TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008267 case llvm::Triple::Linux: {
8268 switch (Triple.getEnvironment()) {
8269 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008270 return new LinuxTargetInfo<X86_32TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008271 case llvm::Triple::Android:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008272 return new AndroidX86_32TargetInfo(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008273 }
8274 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008275 case llvm::Triple::DragonFly:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008276 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008277 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008278 return new NetBSDI386TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008279 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008280 return new OpenBSDI386TargetInfo(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00008281 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008282 return new BitrigI386TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008283 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008284 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00008285 case llvm::Triple::KFreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008286 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008287 case llvm::Triple::Minix:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008288 return new MinixTargetInfo<X86_32TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008289 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008290 return new SolarisTargetInfo<X86_32TargetInfo>(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008291 case llvm::Triple::Win32: {
8292 switch (Triple.getEnvironment()) {
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008293 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008294 return new CygwinX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008295 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008296 return new MinGWX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00008297 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008298 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008299 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008300 return new MicrosoftX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008301 }
8302 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00008303 case llvm::Triple::Haiku:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008304 return new HaikuX86_32TargetInfo(Triple, Opts);
Douglas Gregor9fabd852011-07-01 22:41:14 +00008305 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008306 return new RTEMSX86_32TargetInfo(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00008307 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008308 return new NaClTargetInfo<X86_32TargetInfo>(Triple, Opts);
Alexey Bataevc99b0492015-11-25 09:24:26 +00008309 case llvm::Triple::ELFIAMCU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008310 return new MCUX86_32TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008311 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008312 return new X86_32TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008313 }
8314
8315 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008316 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008317 return new DarwinX86_64TargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008318
Daniel Dunbar52322032009-08-18 05:47:58 +00008319 switch (os) {
Ed Schoutenf33c6072015-03-11 08:42:46 +00008320 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008321 return new CloudABITargetInfo<X86_64TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008322 case llvm::Triple::Linux: {
8323 switch (Triple.getEnvironment()) {
8324 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008325 return new LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008326 case llvm::Triple::Android:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008327 return new AndroidX86_64TargetInfo(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008328 }
8329 }
Chris Lattner002ba6b2010-01-09 05:41:14 +00008330 case llvm::Triple::DragonFly:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008331 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008332 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008333 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008334 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008335 return new OpenBSDX86_64TargetInfo(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00008336 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008337 return new BitrigX86_64TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008338 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008339 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00008340 case llvm::Triple::KFreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008341 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008342 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008343 return new SolarisTargetInfo<X86_64TargetInfo>(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008344 case llvm::Triple::Win32: {
8345 switch (Triple.getEnvironment()) {
Yaron Kerend030d112015-07-22 17:38:19 +00008346 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008347 return new CygwinX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008348 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008349 return new MinGWX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008350 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008351 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008352 return new MicrosoftX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008353 }
8354 }
Reid Kleckner330fb172016-05-11 16:19:05 +00008355 case llvm::Triple::Haiku:
8356 return new HaikuTargetInfo<X86_64TargetInfo>(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00008357 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008358 return new NaClTargetInfo<X86_64TargetInfo>(Triple, Opts);
Alex Rosenberg12207fa2015-01-27 14:47:44 +00008359 case llvm::Triple::PS4:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008360 return new PS4OSTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008361 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008362 return new X86_64TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008363 }
Guy Benyeib798fc92012-12-11 21:38:14 +00008364
Douglas Katzman78d7c542015-05-12 21:18:10 +00008365 case llvm::Triple::spir: {
8366 if (Triple.getOS() != llvm::Triple::UnknownOS ||
8367 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
8368 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008369 return new SPIR32TargetInfo(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00008370 }
8371 case llvm::Triple::spir64: {
8372 if (Triple.getOS() != llvm::Triple::UnknownOS ||
8373 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
8374 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008375 return new SPIR64TargetInfo(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00008376 }
Dan Gohmanc2853072015-09-03 22:51:53 +00008377 case llvm::Triple::wasm32:
8378 if (!(Triple == llvm::Triple("wasm32-unknown-unknown")))
8379 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008380 return new WebAssemblyOSTargetInfo<WebAssembly32TargetInfo>(Triple, Opts);
Dan Gohmanc2853072015-09-03 22:51:53 +00008381 case llvm::Triple::wasm64:
8382 if (!(Triple == llvm::Triple("wasm64-unknown-unknown")))
8383 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008384 return new WebAssemblyOSTargetInfo<WebAssembly64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008385 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00008386}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008387
8388/// CreateTargetInfo - Return the target info object for the specified target
Eric Christophere4f73b32015-08-07 19:07:08 +00008389/// options.
Alp Toker80758082014-07-06 05:26:44 +00008390TargetInfo *
8391TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
Saleem Abdulrasool10a49722016-04-08 16:52:00 +00008392 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00008393 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008394
8395 // Construct the target
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008396 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple, *Opts));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008397 if (!Target) {
8398 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00008399 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008400 }
Alp Toker80758082014-07-06 05:26:44 +00008401 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008402
Daniel Dunbaracde99e2009-12-18 18:42:37 +00008403 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008404 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
8405 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00008406 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00008407 }
8408
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008409 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008410 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
8411 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00008412 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008413 }
8414
Rafael Espindolaeb265472013-08-21 21:59:03 +00008415 // Set the fp math unit.
8416 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
8417 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00008418 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00008419 }
8420
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008421 // Compute the default target features, we need the target to handle this
8422 // because features may have dependencies on one another.
8423 llvm::StringMap<bool> Features;
Eric Christopher007b0a02015-08-28 22:32:01 +00008424 if (!Target->initFeatureMap(Features, Diags, Opts->CPU,
8425 Opts->FeaturesAsWritten))
Eric Christopher6b454372015-08-25 13:45:24 +00008426 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008427
8428 // Add the features to the compile options.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008429 Opts->Features.clear();
Aaron Ballmanb226d3d2015-08-12 13:38:59 +00008430 for (const auto &F : Features)
8431 Opts->Features.push_back((F.getValue() ? "+" : "-") + F.getKey().str());
8432
Eric Christopher3ff21b32013-10-16 21:26:26 +00008433 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00008434 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008435
Yaxun Liu39cf40f2016-05-16 17:06:34 +00008436 Target->setSupportedOpenCLOpts();
8437
Ahmed Charles9a16beb2014-03-07 19:33:25 +00008438 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008439}