blob: c3ca8c8af5d5c3b35a97bdabb151e4ff930f8baa [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
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000015#include "clang/Basic/Builtins.h"
Justin Lebar62907612016-07-06 21:21:39 +000016#include "clang/Basic/Cuda.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000017#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"
Justin Lebar62907612016-07-06 21:21:39 +000021#include "clang/Basic/TargetInfo.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000022#include "clang/Basic/TargetOptions.h"
Tim Northover756447a2015-10-30 16:30:36 +000023#include "clang/Basic/Version.h"
Eli Friedman7cef49e2008-05-20 14:27:34 +000024#include "llvm/ADT/APFloat.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000025#include "llvm/ADT/STLExtras.h"
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +000026#include "llvm/ADT/StringExtras.h"
Daniel Dunbar58bc48c2009-08-19 20:04:03 +000027#include "llvm/ADT/StringRef.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000028#include "llvm/ADT/StringSwitch.h"
Chris Lattner859c37a2009-08-12 06:24:27 +000029#include "llvm/ADT/Triple.h"
Chris Lattner30ba6742009-08-10 19:03:04 +000030#include "llvm/MC/MCSectionMachO.h"
David Blaikie76bd3c82011-09-23 05:35:21 +000031#include "llvm/Support/ErrorHandling.h"
Renato Golinf5c4dec2015-05-27 13:33:00 +000032#include "llvm/Support/TargetParser.h"
Benjamin Kramerdc2f0062010-01-09 18:20:57 +000033#include <algorithm>
Ahmed Charlesdfca6f92014-03-09 11:36:40 +000034#include <memory>
Hans Wennborg7eb54642015-09-10 17:07:54 +000035
Chris Lattner5ba61f02006-10-14 07:39:34 +000036using namespace clang;
37
Chris Lattner5ba61f02006-10-14 07:39:34 +000038//===----------------------------------------------------------------------===//
Chris Lattner1f5ad112006-10-14 18:32:12 +000039// Common code shared among targets.
Chris Lattner5ba61f02006-10-14 07:39:34 +000040//===----------------------------------------------------------------------===//
41
Chris Lattner1e1c0b92009-03-20 16:06:38 +000042/// DefineStd - Define a macro name and standard variants. For example if
43/// MacroName is "unix", then this will define "__unix", "__unix__", and "unix"
44/// when in GNU mode.
Chris Lattner0e62c1c2011-07-23 10:55:15 +000045static void DefineStd(MacroBuilder &Builder, StringRef MacroName,
Chris Lattner1e1c0b92009-03-20 16:06:38 +000046 const LangOptions &Opts) {
47 assert(MacroName[0] != '_' && "Identifier should be in the user's namespace");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000048
Chris Lattner1e1c0b92009-03-20 16:06:38 +000049 // If in GNU mode (e.g. -std=gnu99 but not -std=c99) define the raw identifier
50 // in the user's namespace.
51 if (Opts.GNUMode)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000052 Builder.defineMacro(MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000053
Chris Lattner1e1c0b92009-03-20 16:06:38 +000054 // Define __unix.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000055 Builder.defineMacro("__" + MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000056
Chris Lattner1e1c0b92009-03-20 16:06:38 +000057 // Define __unix__.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000058 Builder.defineMacro("__" + MacroName + "__");
Chris Lattner1e1c0b92009-03-20 16:06:38 +000059}
60
Benjamin Kramere3b442d2012-01-10 11:50:09 +000061static void defineCPUMacros(MacroBuilder &Builder, StringRef CPUName,
62 bool Tuning = true) {
63 Builder.defineMacro("__" + CPUName);
64 Builder.defineMacro("__" + CPUName + "__");
65 if (Tuning)
66 Builder.defineMacro("__tune_" + CPUName + "__");
67}
68
Justin Lebar76945b22016-04-29 23:05:19 +000069static TargetInfo *AllocateTarget(const llvm::Triple &Triple,
70 const TargetOptions &Opts);
71
Chris Lattner09d98f52008-10-05 21:50:58 +000072//===----------------------------------------------------------------------===//
73// Defines specific to certain operating systems.
74//===----------------------------------------------------------------------===//
Chris Lattner30ba6742009-08-10 19:03:04 +000075
Torok Edwinb2b37c62009-06-30 17:10:35 +000076namespace {
Douglas Gregorc05d2a12009-07-01 15:12:53 +000077template<typename TgtInfo>
78class OSTargetInfo : public TgtInfo {
Torok Edwinb2b37c62009-06-30 17:10:35 +000079protected:
Daniel Dunbar40165182009-08-24 09:10:05 +000080 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000081 MacroBuilder &Builder) const=0;
Torok Edwinb2b37c62009-06-30 17:10:35 +000082public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +000083 OSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
84 : TgtInfo(Triple, Opts) {}
Craig Topper3164f332014-03-11 03:39:26 +000085 void getTargetDefines(const LangOptions &Opts,
86 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000087 TgtInfo::getTargetDefines(Opts, Builder);
88 getOSDefines(Opts, TgtInfo::getTriple(), Builder);
Torok Edwin4e054162009-06-30 17:00:25 +000089 }
Torok Edwinb2b37c62009-06-30 17:10:35 +000090
91};
Chris Lattner30ba6742009-08-10 19:03:04 +000092
Eric Christopher7d0c7252015-09-24 21:17:04 +000093// CloudABI Target
94template <typename Target>
95class CloudABITargetInfo : public OSTargetInfo<Target> {
96protected:
97 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
98 MacroBuilder &Builder) const override {
99 Builder.defineMacro("__CloudABI__");
100 Builder.defineMacro("__ELF__");
101
102 // CloudABI uses ISO/IEC 10646:2012 for wchar_t, char16_t and char32_t.
103 Builder.defineMacro("__STDC_ISO_10646__", "201206L");
104 Builder.defineMacro("__STDC_UTF_16__");
105 Builder.defineMacro("__STDC_UTF_32__");
106 }
107
108public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000109 CloudABITargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
110 : OSTargetInfo<Target>(Triple, Opts) {}
Eric Christopher7d0c7252015-09-24 21:17:04 +0000111};
112
Daniel Dunbard86666f2010-01-26 01:44:04 +0000113static void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000114 const llvm::Triple &Triple,
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000115 StringRef &PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000116 VersionTuple &PlatformMinVersion) {
Bob Wilson834400b2013-08-19 20:23:37 +0000117 Builder.defineMacro("__APPLE_CC__", "6000");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000118 Builder.defineMacro("__APPLE__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000119 Builder.defineMacro("OBJC_NEW_PROPERTIES");
Alexander Potapenkob4f81902012-09-20 10:10:01 +0000120 // AddressSanitizer doesn't play well with source fortification, which is on
121 // by default on Darwin.
Alexey Samsonovedf99a92014-11-07 22:29:38 +0000122 if (Opts.Sanitize.has(SanitizerKind::Address))
123 Builder.defineMacro("_FORTIFY_SOURCE", "0");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000124
John McCall460ce582015-10-22 18:38:17 +0000125 // Darwin defines __weak, __strong, and __unsafe_unretained even in C mode.
126 if (!Opts.ObjC1) {
John McCall31168b02011-06-15 23:02:42 +0000127 // __weak is always defined, for use in blocks and with objc pointers.
128 Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))");
John McCall460ce582015-10-22 18:38:17 +0000129 Builder.defineMacro("__strong", "");
John McCall31168b02011-06-15 23:02:42 +0000130 Builder.defineMacro("__unsafe_unretained", "");
John McCall31168b02011-06-15 23:02:42 +0000131 }
Eric Christopher0c912c52011-07-07 22:55:26 +0000132
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000133 if (Opts.Static)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000134 Builder.defineMacro("__STATIC__");
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000135 else
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000136 Builder.defineMacro("__DYNAMIC__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000137
138 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000139 Builder.defineMacro("_REENTRANT");
Daniel Dunbar497ff132009-04-10 19:52:24 +0000140
Daniel Dunbarecf13562011-04-19 21:40:34 +0000141 // Get the platform type and version number from the triple.
Daniel Dunbar497ff132009-04-10 19:52:24 +0000142 unsigned Maj, Min, Rev;
Bob Wilson8e5acc52012-01-31 23:52:58 +0000143 if (Triple.isMacOSX()) {
144 Triple.getMacOSXVersion(Maj, Min, Rev);
Manman Renccf25bb2016-06-28 20:55:30 +0000145 PlatformName = "macos";
Daniel Dunbarecf13562011-04-19 21:40:34 +0000146 } else {
Bob Wilson8e5acc52012-01-31 23:52:58 +0000147 Triple.getOSVersion(Maj, Min, Rev);
148 PlatformName = llvm::Triple::getOSTypeName(Triple.getOS());
Daniel Dunbarecf13562011-04-19 21:40:34 +0000149 }
Daniel Dunbard86666f2010-01-26 01:44:04 +0000150
Sebastian Pop422377c2012-01-20 22:01:23 +0000151 // If -target arch-pc-win32-macho option specified, we're
Eric Christopherb081ba62011-07-29 21:20:35 +0000152 // generating code for Win32 ABI. No need to emit
Chad Rosierb90e4022011-07-19 20:00:06 +0000153 // __ENVIRONMENT_XX_OS_VERSION_MIN_REQUIRED__.
154 if (PlatformName == "win32") {
155 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
156 return;
157 }
158
Evan Cheng31dd9a62014-01-26 23:12:43 +0000159 // Set the appropriate OS version define.
160 if (Triple.isiOS()) {
161 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
162 char Str[6];
163 Str[0] = '0' + Maj;
164 Str[1] = '0' + (Min / 10);
165 Str[2] = '0' + (Min % 10);
166 Str[3] = '0' + (Rev / 10);
167 Str[4] = '0' + (Rev % 10);
168 Str[5] = '\0';
Tim Northover67465f82015-10-30 16:30:30 +0000169 if (Triple.isTvOS())
170 Builder.defineMacro("__ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__", Str);
171 else
172 Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__",
173 Str);
174
175 } else if (Triple.isWatchOS()) {
176 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
177 char Str[6];
178 Str[0] = '0' + Maj;
179 Str[1] = '0' + (Min / 10);
180 Str[2] = '0' + (Min % 10);
181 Str[3] = '0' + (Rev / 10);
182 Str[4] = '0' + (Rev % 10);
183 Str[5] = '\0';
184 Builder.defineMacro("__ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__", Str);
Evan Cheng31dd9a62014-01-26 23:12:43 +0000185 } else if (Triple.isMacOSX()) {
186 // Note that the Driver allows versions which aren't representable in the
187 // define (because we only get a single digit for the minor and micro
188 // revision numbers). So, we limit them to the maximum representable
189 // version.
190 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
Bob Wilson2a3710e2014-08-08 21:45:53 +0000191 char Str[7];
192 if (Maj < 10 || (Maj == 10 && Min < 10)) {
193 Str[0] = '0' + (Maj / 10);
194 Str[1] = '0' + (Maj % 10);
195 Str[2] = '0' + std::min(Min, 9U);
196 Str[3] = '0' + std::min(Rev, 9U);
197 Str[4] = '\0';
198 } else {
199 // Handle versions > 10.9.
200 Str[0] = '0' + (Maj / 10);
201 Str[1] = '0' + (Maj % 10);
202 Str[2] = '0' + (Min / 10);
203 Str[3] = '0' + (Min % 10);
204 Str[4] = '0' + (Rev / 10);
205 Str[5] = '0' + (Rev % 10);
206 Str[6] = '\0';
207 }
Evan Cheng31dd9a62014-01-26 23:12:43 +0000208 Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
Daniel Dunbar497ff132009-04-10 19:52:24 +0000209 }
Daniel Dunbarecf13562011-04-19 21:40:34 +0000210
Tim Northover157d9112014-01-16 08:48:16 +0000211 // Tell users about the kernel if there is one.
212 if (Triple.isOSDarwin())
213 Builder.defineMacro("__MACH__");
214
Chris Bieneman46977b62016-04-29 17:53:00 +0000215 // The Watch ABI uses Dwarf EH.
216 if(Triple.isWatchABI())
217 Builder.defineMacro("__ARM_DWARF_EH__");
218
Daniel Dunbarecf13562011-04-19 21:40:34 +0000219 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
Eli Friedman3fd920a2008-08-20 02:34:37 +0000220}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000221
Torok Edwinb2b37c62009-06-30 17:10:35 +0000222template<typename Target>
223class DarwinTargetInfo : public OSTargetInfo<Target> {
224protected:
Craig Topper3164f332014-03-11 03:39:26 +0000225 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
226 MacroBuilder &Builder) const override {
Eric Christopher0c912c52011-07-07 22:55:26 +0000227 getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000228 this->PlatformMinVersion);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000229 }
Mike Stump11289f42009-09-09 15:08:12 +0000230
Torok Edwinb2b37c62009-06-30 17:10:35 +0000231public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000232 DarwinTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
233 : OSTargetInfo<Target>(Triple, Opts) {
Tim Northovera12d0a92016-01-07 09:04:46 +0000234 // By default, no TLS, and we whitelist permitted architecture/OS
235 // combinations.
236 this->TLSSupported = false;
237
238 if (Triple.isMacOSX())
239 this->TLSSupported = !Triple.isMacOSXVersionLT(10, 7);
240 else if (Triple.isiOS()) {
241 // 64-bit iOS supported it from 8 onwards, 32-bit from 9 onwards.
242 if (Triple.getArch() == llvm::Triple::x86_64 ||
243 Triple.getArch() == llvm::Triple::aarch64)
244 this->TLSSupported = !Triple.isOSVersionLT(8);
245 else if (Triple.getArch() == llvm::Triple::x86 ||
246 Triple.getArch() == llvm::Triple::arm ||
247 Triple.getArch() == llvm::Triple::thumb)
248 this->TLSSupported = !Triple.isOSVersionLT(9);
249 } else if (Triple.isWatchOS())
250 this->TLSSupported = !Triple.isOSVersionLT(2);
251
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000252 this->MCountName = "\01mcount";
253 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000254
Craig Topper3164f332014-03-11 03:39:26 +0000255 std::string isValidSectionSpecifier(StringRef SR) const override {
Chris Lattner30ba6742009-08-10 19:03:04 +0000256 // Let MCSectionMachO validate this.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000257 StringRef Segment, Section;
Chris Lattner30ba6742009-08-10 19:03:04 +0000258 unsigned TAA, StubSize;
Daniel Dunbar75942372011-03-19 02:06:21 +0000259 bool HasTAA;
Chris Lattner30ba6742009-08-10 19:03:04 +0000260 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
Daniel Dunbar75942372011-03-19 02:06:21 +0000261 TAA, HasTAA, StubSize);
Chris Lattner30ba6742009-08-10 19:03:04 +0000262 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000263
Craig Topper3164f332014-03-11 03:39:26 +0000264 const char *getStaticInitSectionSpecifier() const override {
Anders Carlsson851318a2010-06-08 22:47:50 +0000265 // FIXME: We should return 0 when building kexts.
266 return "__TEXT,__StaticInit,regular,pure_instructions";
267 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000268
John McCalleed64c72012-01-29 01:20:30 +0000269 /// Darwin does not support protected visibility. Darwin's "default"
270 /// is very similar to ELF's "protected"; Darwin requires a "weak"
271 /// attribute on declarations that can be dynamically replaced.
Craig Topper3164f332014-03-11 03:39:26 +0000272 bool hasProtectedVisibility() const override {
John McCalleed64c72012-01-29 01:20:30 +0000273 return false;
274 }
Akira Hatanaka68ab7fe2016-03-31 06:36:07 +0000275
276 unsigned getExnObjectAlignment() const override {
277 // The alignment of an exception object is 8-bytes for darwin since
278 // libc++abi doesn't declare _Unwind_Exception with __attribute__((aligned))
279 // and therefore doesn't guarantee 16-byte alignment.
280 return 64;
281 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000282};
283
Chris Lattner30ba6742009-08-10 19:03:04 +0000284
Torok Edwinb2b37c62009-06-30 17:10:35 +0000285// DragonFlyBSD Target
286template<typename Target>
287class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
288protected:
Craig Topper3164f332014-03-11 03:39:26 +0000289 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
290 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000291 // DragonFly defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000292 Builder.defineMacro("__DragonFly__");
293 Builder.defineMacro("__DragonFly_cc_version", "100001");
294 Builder.defineMacro("__ELF__");
295 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
296 Builder.defineMacro("__tune_i386__");
297 DefineStd(Builder, "unix", Opts);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000298 }
299public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000300 DragonFlyBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
301 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000302 switch (Triple.getArch()) {
303 default:
304 case llvm::Triple::x86:
305 case llvm::Triple::x86_64:
306 this->MCountName = ".mcount";
307 break;
308 }
Eli Friedman4286fba2012-02-10 23:02:29 +0000309 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000310};
311
Dimitry Andricc6d924c2016-05-20 17:27:22 +0000312#ifndef FREEBSD_CC_VERSION
313#define FREEBSD_CC_VERSION 0U
314#endif
315
Torok Edwinb2b37c62009-06-30 17:10:35 +0000316// FreeBSD Target
317template<typename Target>
318class FreeBSDTargetInfo : public OSTargetInfo<Target> {
319protected:
Craig Topper3164f332014-03-11 03:39:26 +0000320 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
321 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000322 // FreeBSD defines; list based off of gcc output
323
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000324 unsigned Release = Triple.getOSMajorVersion();
325 if (Release == 0U)
Dimitry Andricc6d924c2016-05-20 17:27:22 +0000326 Release = 8U;
327 unsigned CCVersion = FREEBSD_CC_VERSION;
328 if (CCVersion == 0U)
329 CCVersion = Release * 100000U + 1U;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000330
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000331 Builder.defineMacro("__FreeBSD__", Twine(Release));
Dimitry Andricc6d924c2016-05-20 17:27:22 +0000332 Builder.defineMacro("__FreeBSD_cc_version", Twine(CCVersion));
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000333 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
334 DefineStd(Builder, "unix", Opts);
335 Builder.defineMacro("__ELF__");
Ed Schoutend0621462013-09-29 07:54:52 +0000336
337 // On FreeBSD, wchar_t contains the number of the code point as
338 // used by the character set of the locale. These character sets are
339 // not necessarily a superset of ASCII.
Richard Smith00a4a852015-01-13 01:47:45 +0000340 //
341 // FIXME: This is wrong; the macro refers to the numerical values
342 // of wchar_t *literals*, which are not locale-dependent. However,
343 // FreeBSD systems apparently depend on us getting this wrong, and
344 // setting this to 1 is conforming even if all the basic source
345 // character literals have the same encoding as char and wchar_t.
Ed Schoutend0621462013-09-29 07:54:52 +0000346 Builder.defineMacro("__STDC_MB_MIGHT_NEQ_WC__", "1");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000347 }
348public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000349 FreeBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
350 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000351 switch (Triple.getArch()) {
352 default:
353 case llvm::Triple::x86:
354 case llvm::Triple::x86_64:
355 this->MCountName = ".mcount";
356 break;
357 case llvm::Triple::mips:
358 case llvm::Triple::mipsel:
359 case llvm::Triple::ppc:
360 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +0000361 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000362 this->MCountName = "_mcount";
363 break;
364 case llvm::Triple::arm:
365 this->MCountName = "__mcount";
366 break;
Duncan Sands9cb27e92009-07-08 13:55:08 +0000367 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000368 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000369};
370
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000371// GNU/kFreeBSD Target
372template<typename Target>
373class KFreeBSDTargetInfo : public OSTargetInfo<Target> {
374protected:
Craig Topper3164f332014-03-11 03:39:26 +0000375 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
376 MacroBuilder &Builder) const override {
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000377 // GNU/kFreeBSD defines; list based off of gcc output
378
379 DefineStd(Builder, "unix", Opts);
380 Builder.defineMacro("__FreeBSD_kernel__");
381 Builder.defineMacro("__GLIBC__");
382 Builder.defineMacro("__ELF__");
383 if (Opts.POSIXThreads)
384 Builder.defineMacro("_REENTRANT");
385 if (Opts.CPlusPlus)
386 Builder.defineMacro("_GNU_SOURCE");
387 }
388public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000389 KFreeBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
390 : OSTargetInfo<Target>(Triple, Opts) {}
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000391};
392
Reid Kleckner330fb172016-05-11 16:19:05 +0000393// Haiku Target
394template<typename Target>
395class HaikuTargetInfo : public OSTargetInfo<Target> {
396protected:
397 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
398 MacroBuilder &Builder) const override {
399 // Haiku defines; list based off of gcc output
400 Builder.defineMacro("__HAIKU__");
401 Builder.defineMacro("__ELF__");
402 DefineStd(Builder, "unix", Opts);
403 }
404public:
405 HaikuTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
406 : OSTargetInfo<Target>(Triple, Opts) {
407 this->SizeType = TargetInfo::UnsignedLong;
408 this->IntPtrType = TargetInfo::SignedLong;
409 this->PtrDiffType = TargetInfo::SignedLong;
410 this->ProcessIDType = TargetInfo::SignedLong;
411 this->TLSSupported = false;
412
413 }
414};
415
Chris Lattner3e2ee142010-07-07 16:01:42 +0000416// Minix Target
417template<typename Target>
418class MinixTargetInfo : public OSTargetInfo<Target> {
419protected:
Craig Topper3164f332014-03-11 03:39:26 +0000420 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
421 MacroBuilder &Builder) const override {
Chris Lattner3e2ee142010-07-07 16:01:42 +0000422 // Minix defines
423
424 Builder.defineMacro("__minix", "3");
425 Builder.defineMacro("_EM_WSIZE", "4");
426 Builder.defineMacro("_EM_PSIZE", "4");
427 Builder.defineMacro("_EM_SSIZE", "2");
428 Builder.defineMacro("_EM_LSIZE", "4");
429 Builder.defineMacro("_EM_FSIZE", "4");
430 Builder.defineMacro("_EM_DSIZE", "8");
Eli Friedman83de5132011-12-08 23:54:21 +0000431 Builder.defineMacro("__ELF__");
Chris Lattner3e2ee142010-07-07 16:01:42 +0000432 DefineStd(Builder, "unix", Opts);
433 }
434public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000435 MinixTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
436 : OSTargetInfo<Target>(Triple, Opts) {}
Chris Lattner3e2ee142010-07-07 16:01:42 +0000437};
438
Torok Edwinb2b37c62009-06-30 17:10:35 +0000439// Linux target
440template<typename Target>
441class LinuxTargetInfo : public OSTargetInfo<Target> {
442protected:
Craig Topper3164f332014-03-11 03:39:26 +0000443 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
444 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000445 // Linux defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000446 DefineStd(Builder, "unix", Opts);
447 DefineStd(Builder, "linux", Opts);
448 Builder.defineMacro("__gnu_linux__");
449 Builder.defineMacro("__ELF__");
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +0000450 if (Triple.isAndroid()) {
Evgeniy Stepanov94dc4c92012-04-26 12:08:09 +0000451 Builder.defineMacro("__ANDROID__", "1");
Dan Albert84aee012015-03-03 18:28:38 +0000452 unsigned Maj, Min, Rev;
David Majnemer5c2589a2015-06-01 23:38:25 +0000453 Triple.getEnvironmentVersion(Maj, Min, Rev);
Dan Albert84aee012015-03-03 18:28:38 +0000454 this->PlatformName = "android";
455 this->PlatformMinVersion = VersionTuple(Maj, Min, Rev);
456 }
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000457 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000458 Builder.defineMacro("_REENTRANT");
Douglas Gregor3ecc6652010-04-21 05:52:38 +0000459 if (Opts.CPlusPlus)
460 Builder.defineMacro("_GNU_SOURCE");
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +0000461 if (this->HasFloat128)
462 Builder.defineMacro("__FLOAT128__");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000463 }
464public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000465 LinuxTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
466 : OSTargetInfo<Target>(Triple, Opts) {
Douglas Gregore6d6e512011-01-12 21:19:25 +0000467 this->WIntType = TargetInfo::UnsignedInt;
Hal Finkelecdb4542014-03-30 13:00:06 +0000468
469 switch (Triple.getArch()) {
470 default:
471 break;
472 case llvm::Triple::ppc:
473 case llvm::Triple::ppc64:
474 case llvm::Triple::ppc64le:
475 this->MCountName = "_mcount";
476 break;
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +0000477 case llvm::Triple::x86:
478 case llvm::Triple::x86_64:
479 case llvm::Triple::systemz:
480 this->HasFloat128 = true;
481 break;
Hal Finkelecdb4542014-03-30 13:00:06 +0000482 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000483 }
Benjamin Kramera518b222011-10-15 17:53:33 +0000484
Craig Topper3164f332014-03-11 03:39:26 +0000485 const char *getStaticInitSectionSpecifier() const override {
Benjamin Kramera518b222011-10-15 17:53:33 +0000486 return ".text.startup";
487 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000488};
489
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000490// NetBSD Target
491template<typename Target>
492class NetBSDTargetInfo : public OSTargetInfo<Target> {
493protected:
Craig Topper3164f332014-03-11 03:39:26 +0000494 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
495 MacroBuilder &Builder) const override {
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000496 // NetBSD defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000497 Builder.defineMacro("__NetBSD__");
498 Builder.defineMacro("__unix__");
499 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000500 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000501 Builder.defineMacro("_POSIX_THREADS");
Joerg Sonnenbergercc1edb52014-05-13 18:58:36 +0000502
503 switch (Triple.getArch()) {
504 default:
505 break;
506 case llvm::Triple::arm:
507 case llvm::Triple::armeb:
508 case llvm::Triple::thumb:
509 case llvm::Triple::thumbeb:
510 Builder.defineMacro("__ARM_DWARF_EH__");
511 break;
512 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000513 }
514public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000515 NetBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
516 : OSTargetInfo<Target>(Triple, Opts) {
Joerg Sonnenberger740f3f42015-04-10 21:02:53 +0000517 this->MCountName = "_mcount";
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000518 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000519};
520
Torok Edwinb2b37c62009-06-30 17:10:35 +0000521// OpenBSD Target
522template<typename Target>
523class OpenBSDTargetInfo : public OSTargetInfo<Target> {
524protected:
Craig Topper3164f332014-03-11 03:39:26 +0000525 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
526 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000527 // OpenBSD defines; list based off of gcc output
528
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000529 Builder.defineMacro("__OpenBSD__");
530 DefineStd(Builder, "unix", Opts);
531 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000532 if (Opts.POSIXThreads)
Chris Lattner024e12d2012-04-25 06:12:24 +0000533 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000534 }
535public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000536 OpenBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
537 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000538 this->TLSSupported = false;
Eli Friedman3715d1f2011-12-15 02:15:56 +0000539
Eli Friedman3715d1f2011-12-15 02:15:56 +0000540 switch (Triple.getArch()) {
541 default:
542 case llvm::Triple::x86:
543 case llvm::Triple::x86_64:
544 case llvm::Triple::arm:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000545 case llvm::Triple::sparc:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000546 this->MCountName = "__mcount";
547 break;
548 case llvm::Triple::mips64:
549 case llvm::Triple::mips64el:
550 case llvm::Triple::ppc:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000551 case llvm::Triple::sparcv9:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000552 this->MCountName = "_mcount";
553 break;
554 }
555 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000556};
557
Eli Friedman9fa28852012-08-08 23:57:20 +0000558// Bitrig Target
559template<typename Target>
560class BitrigTargetInfo : public OSTargetInfo<Target> {
561protected:
Craig Topper3164f332014-03-11 03:39:26 +0000562 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
563 MacroBuilder &Builder) const override {
Eli Friedman9fa28852012-08-08 23:57:20 +0000564 // Bitrig defines; list based off of gcc output
565
566 Builder.defineMacro("__Bitrig__");
567 DefineStd(Builder, "unix", Opts);
568 Builder.defineMacro("__ELF__");
569 if (Opts.POSIXThreads)
570 Builder.defineMacro("_REENTRANT");
Renato Golin9ba39232015-02-27 16:35:48 +0000571
572 switch (Triple.getArch()) {
573 default:
574 break;
575 case llvm::Triple::arm:
576 case llvm::Triple::armeb:
577 case llvm::Triple::thumb:
578 case llvm::Triple::thumbeb:
579 Builder.defineMacro("__ARM_DWARF_EH__");
580 break;
581 }
Eli Friedman9fa28852012-08-08 23:57:20 +0000582 }
583public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000584 BitrigTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
585 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000586 this->MCountName = "__mcount";
Eli Friedman9fa28852012-08-08 23:57:20 +0000587 }
588};
589
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000590// PSP Target
591template<typename Target>
592class PSPTargetInfo : public OSTargetInfo<Target> {
593protected:
Craig Topper3164f332014-03-11 03:39:26 +0000594 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
595 MacroBuilder &Builder) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000596 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000597 Builder.defineMacro("PSP");
598 Builder.defineMacro("_PSP");
599 Builder.defineMacro("__psp__");
600 Builder.defineMacro("__ELF__");
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000601 }
602public:
James Y Knightb214cbc2016-03-04 19:00:41 +0000603 PSPTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {}
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000604};
605
John Thompsone467e192009-11-19 17:18:50 +0000606// PS3 PPU Target
607template<typename Target>
608class PS3PPUTargetInfo : public OSTargetInfo<Target> {
609protected:
Craig Topper3164f332014-03-11 03:39:26 +0000610 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
611 MacroBuilder &Builder) const override {
John Thompsone467e192009-11-19 17:18:50 +0000612 // PS3 PPU defines.
John Thompson957816f2010-03-25 16:18:32 +0000613 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000614 Builder.defineMacro("__PPU__");
615 Builder.defineMacro("__CELLOS_LV2__");
616 Builder.defineMacro("__ELF__");
617 Builder.defineMacro("__LP32__");
John Thompson07a61a42010-06-24 22:44:13 +0000618 Builder.defineMacro("_ARCH_PPC64");
619 Builder.defineMacro("__powerpc64__");
John Thompsone467e192009-11-19 17:18:50 +0000620 }
621public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000622 PS3PPUTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
623 : OSTargetInfo<Target>(Triple, Opts) {
Nick Lewyckyc0a61732011-12-16 22:32:39 +0000624 this->LongWidth = this->LongAlign = 32;
625 this->PointerWidth = this->PointerAlign = 32;
John Thompson07a61a42010-06-24 22:44:13 +0000626 this->IntMaxType = TargetInfo::SignedLongLong;
John Thompson07a61a42010-06-24 22:44:13 +0000627 this->Int64Type = TargetInfo::SignedLongLong;
John Thompson6f8dba72009-12-18 14:21:08 +0000628 this->SizeType = TargetInfo::UnsignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +0000629 this->resetDataLayout("E-m:e-p:32:32-i64:64-n32:64");
John Thompsone467e192009-11-19 17:18:50 +0000630 }
631};
632
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000633template <typename Target>
634class PS4OSTargetInfo : public OSTargetInfo<Target> {
635protected:
636 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
637 MacroBuilder &Builder) const override {
638 Builder.defineMacro("__FreeBSD__", "9");
639 Builder.defineMacro("__FreeBSD_cc_version", "900001");
640 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
641 DefineStd(Builder, "unix", Opts);
642 Builder.defineMacro("__ELF__");
Paul Robinson9d613612016-05-16 17:22:25 +0000643 Builder.defineMacro("__ORBIS__");
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000644 }
645public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000646 PS4OSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
647 : OSTargetInfo<Target>(Triple, Opts) {
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000648 this->WCharType = this->UnsignedShort;
649
Paul Robinsond30e2ee2015-07-14 20:52:32 +0000650 // On PS4, TLS variable cannot be aligned to more than 32 bytes (256 bits).
651 this->MaxTLSAlign = 256;
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000652
Sunil Srivastava0ce2f222016-02-05 20:50:02 +0000653 // On PS4, do not honor explicit bit field alignment,
654 // as in "__attribute__((aligned(2))) int b : 1;".
655 this->UseExplicitBitFieldAlignment = false;
656
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000657 switch (Triple.getArch()) {
658 default:
659 case llvm::Triple::x86_64:
660 this->MCountName = ".mcount";
661 break;
662 }
663 }
664};
665
Torok Edwinb2b37c62009-06-30 17:10:35 +0000666// Solaris target
667template<typename Target>
668class SolarisTargetInfo : public OSTargetInfo<Target> {
669protected:
Craig Topper3164f332014-03-11 03:39:26 +0000670 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
671 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000672 DefineStd(Builder, "sun", Opts);
673 DefineStd(Builder, "unix", Opts);
674 Builder.defineMacro("__ELF__");
675 Builder.defineMacro("__svr4__");
676 Builder.defineMacro("__SVR4");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000677 // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and
678 // newer, but to 500 for everything else. feature_test.h has a check to
679 // ensure that you are not using C99 with an old version of X/Open or C89
Richard Smithab506ad2014-10-20 23:26:58 +0000680 // with a new version.
681 if (Opts.C99)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000682 Builder.defineMacro("_XOPEN_SOURCE", "600");
683 else
684 Builder.defineMacro("_XOPEN_SOURCE", "500");
David Chisnalle04307e2012-03-02 10:49:52 +0000685 if (Opts.CPlusPlus)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000686 Builder.defineMacro("__C99FEATURES__");
David Chisnall0c1941cb2012-02-17 18:35:11 +0000687 Builder.defineMacro("_LARGEFILE_SOURCE");
688 Builder.defineMacro("_LARGEFILE64_SOURCE");
689 Builder.defineMacro("__EXTENSIONS__");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000690 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000691 }
692public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000693 SolarisTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
694 : OSTargetInfo<Target>(Triple, Opts) {
David Chisnallb526e932012-03-28 18:04:14 +0000695 this->WCharType = this->SignedInt;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000696 // FIXME: WIntType should be SignedLong
697 }
698};
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000699
700// Windows target
701template<typename Target>
702class WindowsTargetInfo : public OSTargetInfo<Target> {
703protected:
Craig Topper3164f332014-03-11 03:39:26 +0000704 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
705 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000706 Builder.defineMacro("_WIN32");
707 }
708 void getVisualStudioDefines(const LangOptions &Opts,
709 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000710 if (Opts.CPlusPlus) {
David Majnemerf6072342014-07-01 22:24:56 +0000711 if (Opts.RTTIData)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000712 Builder.defineMacro("_CPPRTTI");
713
Reid Kleckner16514352015-01-30 21:42:55 +0000714 if (Opts.CXXExceptions)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000715 Builder.defineMacro("_CPPUNWIND");
716 }
717
David Majnemer6a658902015-07-22 22:36:26 +0000718 if (Opts.Bool)
719 Builder.defineMacro("__BOOL_DEFINED");
720
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000721 if (!Opts.CharIsSigned)
722 Builder.defineMacro("_CHAR_UNSIGNED");
723
724 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
725 // but it works for now.
726 if (Opts.POSIXThreads)
727 Builder.defineMacro("_MT");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000728
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +0000729 if (Opts.MSCompatibilityVersion) {
730 Builder.defineMacro("_MSC_VER",
731 Twine(Opts.MSCompatibilityVersion / 100000));
732 Builder.defineMacro("_MSC_FULL_VER", Twine(Opts.MSCompatibilityVersion));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000733 // FIXME We cannot encode the revision information into 32-bits
734 Builder.defineMacro("_MSC_BUILD", Twine(1));
David Majnemeraaf2b842015-03-18 07:53:18 +0000735
David Majnemerb710a932015-05-11 03:57:49 +0000736 if (Opts.CPlusPlus11 && Opts.isCompatibleWithMSVC(LangOptions::MSVC2015))
David Majnemeraaf2b842015-03-18 07:53:18 +0000737 Builder.defineMacro("_HAS_CHAR16_T_LANGUAGE_SUPPORT", Twine(1));
David Majnemer017cf352016-06-28 03:13:16 +0000738
739 if (Opts.isCompatibleWithMSVC(LangOptions::MSVC2015)) {
740 if (Opts.CPlusPlus1z)
741 Builder.defineMacro("_MSVC_LANG", "201403L");
742 else if (Opts.CPlusPlus14)
743 Builder.defineMacro("_MSVC_LANG", "201402L");
744 }
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000745 }
Reid Kleckner6f6e76d2014-04-16 20:10:16 +0000746
747 if (Opts.MicrosoftExt) {
748 Builder.defineMacro("_MSC_EXTENSIONS");
749
750 if (Opts.CPlusPlus11) {
751 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
752 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
753 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
754 }
755 }
756
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000757 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000758 }
759
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000760public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000761 WindowsTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
762 : OSTargetInfo<Target>(Triple, Opts) {}
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000763};
764
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000765template <typename Target>
766class NaClTargetInfo : public OSTargetInfo<Target> {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000767protected:
Craig Topper3164f332014-03-11 03:39:26 +0000768 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
769 MacroBuilder &Builder) const override {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000770 if (Opts.POSIXThreads)
771 Builder.defineMacro("_REENTRANT");
772 if (Opts.CPlusPlus)
773 Builder.defineMacro("_GNU_SOURCE");
774
775 DefineStd(Builder, "unix", Opts);
776 Builder.defineMacro("__ELF__");
777 Builder.defineMacro("__native_client__");
778 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000779
780public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000781 NaClTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
782 : OSTargetInfo<Target>(Triple, Opts) {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000783 this->LongAlign = 32;
784 this->LongWidth = 32;
785 this->PointerAlign = 32;
786 this->PointerWidth = 32;
787 this->IntMaxType = TargetInfo::SignedLongLong;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000788 this->Int64Type = TargetInfo::SignedLongLong;
789 this->DoubleAlign = 64;
790 this->LongDoubleWidth = 64;
791 this->LongDoubleAlign = 64;
Jan Wen Voung1f9c4ee2014-01-15 21:42:41 +0000792 this->LongLongWidth = 64;
793 this->LongLongAlign = 64;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000794 this->SizeType = TargetInfo::UnsignedInt;
795 this->PtrDiffType = TargetInfo::SignedInt;
796 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +0000797 // RegParmMax is inherited from the underlying architecture
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000798 this->LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Rafael Espindola1c09b262013-12-18 23:41:04 +0000799 if (Triple.getArch() == llvm::Triple::arm) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +0000800 // Handled in ARM's setABI().
Rafael Espindola1c09b262013-12-18 23:41:04 +0000801 } else if (Triple.getArch() == llvm::Triple::x86) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000802 this->resetDataLayout("e-m:e-p:32:32-i64:64-n8:16:32-S128");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000803 } else if (Triple.getArch() == llvm::Triple::x86_64) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000804 this->resetDataLayout("e-m:e-p:32:32-i64:64-n8:16:32:64-S128");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000805 } else if (Triple.getArch() == llvm::Triple::mipsel) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000806 // Handled on mips' setDataLayout.
Rafael Espindola1c09b262013-12-18 23:41:04 +0000807 } else {
808 assert(Triple.getArch() == llvm::Triple::le32);
James Y Knightb214cbc2016-03-04 19:00:41 +0000809 this->resetDataLayout("e-p:32:32-i64:64");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000810 }
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000811 }
812};
Torok Edwinb2b37c62009-06-30 17:10:35 +0000813
Dan Gohmanc2853072015-09-03 22:51:53 +0000814// WebAssembly target
815template <typename Target>
816class WebAssemblyOSTargetInfo : public OSTargetInfo<Target> {
817 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Hans Wennborg7eb54642015-09-10 17:07:54 +0000818 MacroBuilder &Builder) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +0000819 // A common platform macro.
820 if (Opts.POSIXThreads)
821 Builder.defineMacro("_REENTRANT");
822 // Follow g++ convention and predefine _GNU_SOURCE for C++.
823 if (Opts.CPlusPlus)
824 Builder.defineMacro("_GNU_SOURCE");
825 }
826
827 // As an optimization, group static init code together in a section.
Hans Wennborg7eb54642015-09-10 17:07:54 +0000828 const char *getStaticInitSectionSpecifier() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +0000829 return ".text.__startup";
830 }
831
832public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000833 explicit WebAssemblyOSTargetInfo(const llvm::Triple &Triple,
834 const TargetOptions &Opts)
835 : OSTargetInfo<Target>(Triple, Opts) {
Dan Gohmanc2853072015-09-03 22:51:53 +0000836 this->MCountName = "__mcount";
Dan Gohmanc2853072015-09-03 22:51:53 +0000837 this->TheCXXABI.set(TargetCXXABI::WebAssembly);
838 }
839};
Dan Gohmanc2853072015-09-03 22:51:53 +0000840
Chris Lattner09d98f52008-10-05 21:50:58 +0000841//===----------------------------------------------------------------------===//
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000842// Specific target implementations.
843//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000844
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000845// PPC abstract base class
846class PPCTargetInfo : public TargetInfo {
847 static const Builtin::Info BuiltinInfo[];
848 static const char * const GCCRegNames[];
849 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Hal Finkel8eb59282012-06-11 22:35:19 +0000850 std::string CPU;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000851
852 // Target cpu features.
853 bool HasVSX;
Bill Schmidt8c184e32014-10-10 17:21:23 +0000854 bool HasP8Vector;
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +0000855 bool HasP8Crypto;
Nemanja Ivanovic35458c22015-04-11 10:43:36 +0000856 bool HasDirectMove;
Hal Finkel0d0a1a52015-03-11 19:14:15 +0000857 bool HasQPX;
Kit Barton8246f282015-03-25 19:41:41 +0000858 bool HasHTM;
Nemanja Ivanovic239eec72015-04-09 23:58:16 +0000859 bool HasBPERMD;
860 bool HasExtDiv;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000861
Ulrich Weigand8afad612014-07-28 13:17:52 +0000862protected:
863 std::string ABI;
864
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000865public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000866 PPCTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Saleem Abdulrasool10a49722016-04-08 16:52:00 +0000867 : TargetInfo(Triple), HasVSX(false), HasP8Vector(false),
868 HasP8Crypto(false), HasDirectMove(false), HasQPX(false), HasHTM(false),
Nemanja Ivanovicd7d45bf2016-04-15 18:04:13 +0000869 HasBPERMD(false), HasExtDiv(false) {
Bill Schmidt778d3872013-07-26 01:36:11 +0000870 BigEndian = (Triple.getArch() != llvm::Triple::ppc64le);
Alexey Bataev00396512015-07-02 03:40:19 +0000871 SimdDefaultAlign = 128;
Nico Weber3435ede2012-01-31 02:07:33 +0000872 LongDoubleWidth = LongDoubleAlign = 128;
873 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble;
874 }
Eli Friedman9ffd4a92009-06-05 07:05:05 +0000875
Hal Finkel6b984f02012-07-03 16:51:04 +0000876 /// \brief Flags for architecture specific defines.
877 typedef enum {
878 ArchDefineNone = 0,
879 ArchDefineName = 1 << 0, // <name> is substituted for arch name.
880 ArchDefinePpcgr = 1 << 1,
881 ArchDefinePpcsq = 1 << 2,
882 ArchDefine440 = 1 << 3,
883 ArchDefine603 = 1 << 4,
884 ArchDefine604 = 1 << 5,
885 ArchDefinePwr4 = 1 << 6,
Bill Schmidt38378a02013-02-01 20:23:10 +0000886 ArchDefinePwr5 = 1 << 7,
887 ArchDefinePwr5x = 1 << 8,
888 ArchDefinePwr6 = 1 << 9,
889 ArchDefinePwr6x = 1 << 10,
890 ArchDefinePwr7 = 1 << 11,
Will Schmidtf0487512014-06-26 13:34:10 +0000891 ArchDefinePwr8 = 1 << 12,
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +0000892 ArchDefinePwr9 = 1 << 13,
893 ArchDefineA2 = 1 << 14,
894 ArchDefineA2q = 1 << 15
Hal Finkel6b984f02012-07-03 16:51:04 +0000895 } ArchDefineTypes;
896
Bill Schmidt38378a02013-02-01 20:23:10 +0000897 // Note: GCC recognizes the following additional cpus:
898 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
899 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
900 // titan, rs64.
Craig Topper3164f332014-03-11 03:39:26 +0000901 bool setCPU(const std::string &Name) override {
Hal Finkel8eb59282012-06-11 22:35:19 +0000902 bool CPUKnown = llvm::StringSwitch<bool>(Name)
903 .Case("generic", true)
904 .Case("440", true)
905 .Case("450", true)
906 .Case("601", true)
907 .Case("602", true)
908 .Case("603", true)
909 .Case("603e", true)
910 .Case("603ev", true)
911 .Case("604", true)
912 .Case("604e", true)
913 .Case("620", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000914 .Case("630", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000915 .Case("g3", true)
916 .Case("7400", true)
917 .Case("g4", true)
918 .Case("7450", true)
919 .Case("g4+", true)
920 .Case("750", true)
921 .Case("970", true)
922 .Case("g5", true)
923 .Case("a2", true)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +0000924 .Case("a2q", true)
Hal Finkelf6d6cb02012-09-18 22:25:03 +0000925 .Case("e500mc", true)
926 .Case("e5500", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000927 .Case("power3", true)
928 .Case("pwr3", true)
929 .Case("power4", true)
930 .Case("pwr4", true)
931 .Case("power5", true)
932 .Case("pwr5", true)
933 .Case("power5x", true)
934 .Case("pwr5x", true)
935 .Case("power6", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000936 .Case("pwr6", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000937 .Case("power6x", true)
938 .Case("pwr6x", true)
939 .Case("power7", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000940 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +0000941 .Case("power8", true)
942 .Case("pwr8", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +0000943 .Case("power9", true)
944 .Case("pwr9", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000945 .Case("powerpc", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000946 .Case("ppc", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000947 .Case("powerpc64", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000948 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +0000949 .Case("powerpc64le", true)
950 .Case("ppc64le", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000951 .Default(false);
952
953 if (CPUKnown)
954 CPU = Name;
955
956 return CPUKnown;
957 }
958
Ulrich Weigand8afad612014-07-28 13:17:52 +0000959
960 StringRef getABI() const override { return ABI; }
961
Craig Topper6c03a542015-10-19 04:51:35 +0000962 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
963 return llvm::makeArrayRef(BuiltinInfo,
964 clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner10a5b382007-01-29 05:24:35 +0000965 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000966
Craig Topper3164f332014-03-11 03:39:26 +0000967 bool isCLZForZeroUndef() const override { return false; }
Bob Wilson19a2f2b2012-01-28 18:02:29 +0000968
Craig Topper3164f332014-03-11 03:39:26 +0000969 void getTargetDefines(const LangOptions &Opts,
970 MacroBuilder &Builder) const override;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000971
Eric Christopher8c47b422015-10-09 18:39:55 +0000972 bool
973 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
974 StringRef CPU,
975 const std::vector<std::string> &FeaturesVec) const override;
Bill Schmidt2fe4c672013-02-01 02:14:03 +0000976
Craig Topper3164f332014-03-11 03:39:26 +0000977 bool handleTargetFeatures(std::vector<std::string> &Features,
978 DiagnosticsEngine &Diags) override;
979 bool hasFeature(StringRef Feature) const override;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +0000980 void setFeatureEnabled(llvm::StringMap<bool> &Features, StringRef Name,
981 bool Enabled) const override;
Craig Topper3164f332014-03-11 03:39:26 +0000982
Craig Topperf054e3a2015-10-19 03:52:27 +0000983 ArrayRef<const char *> getGCCRegNames() const override;
984 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +0000985 bool validateAsmConstraint(const char *&Name,
986 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +0000987 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +0000988 default: return false;
989 case 'O': // Zero
John Thompson07a61a42010-06-24 22:44:13 +0000990 break;
Anders Carlssonf511f642007-11-27 04:11:28 +0000991 case 'b': // Base register
992 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +0000993 Info.setAllowsRegister();
John Thompson07a61a42010-06-24 22:44:13 +0000994 break;
995 // FIXME: The following are added to allow parsing.
996 // I just took a guess at what the actions should be.
997 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000998 case 'd': // Floating point register (containing 64-bit value)
John Thompson07a61a42010-06-24 22:44:13 +0000999 case 'v': // Altivec vector register
1000 Info.setAllowsRegister();
1001 break;
1002 case 'w':
1003 switch (Name[1]) {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001004 case 'd':// VSX vector register to hold vector double data
1005 case 'f':// VSX vector register to hold vector float data
1006 case 's':// VSX vector register to hold scalar float data
1007 case 'a':// Any VSX register
Hal Finkelf7a07a52014-03-02 18:24:18 +00001008 case 'c':// An individual CR bit
John Thompson07a61a42010-06-24 22:44:13 +00001009 break;
1010 default:
1011 return false;
1012 }
1013 Info.setAllowsRegister();
1014 Name++; // Skip over 'w'.
1015 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001016 case 'h': // `MQ', `CTR', or `LINK' register
1017 case 'q': // `MQ' register
1018 case 'c': // `CTR' register
1019 case 'l': // `LINK' register
1020 case 'x': // `CR' register (condition register) number 0
1021 case 'y': // `CR' register (condition register)
1022 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson07a61a42010-06-24 22:44:13 +00001023 Info.setAllowsRegister();
1024 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001025 case 'I': // Signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +00001026 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001027 // (use `L' instead for SImode constants)
1028 case 'K': // Unsigned 16-bit constant
1029 case 'L': // Signed 16-bit constant shifted left 16 bits
1030 case 'M': // Constant larger than 31
1031 case 'N': // Exact power of 2
1032 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +00001033 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001034 // register with one instruction per word
John Thompson07a61a42010-06-24 22:44:13 +00001035 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001036 // into a register using three instructions
John Thompson07a61a42010-06-24 22:44:13 +00001037 break;
1038 case 'm': // Memory operand. Note that on PowerPC targets, m can
1039 // include addresses that update the base register. It
1040 // is therefore only safe to use `m' in an asm statement
1041 // if that asm statement accesses the operand exactly once.
1042 // The asm statement must also use `%U<opno>' as a
Sebastian Redldd008712010-08-17 22:42:34 +00001043 // placeholder for the "update" flag in the corresponding
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001044 // load or store instruction. For example:
John Thompson07a61a42010-06-24 22:44:13 +00001045 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001046 // is correct but:
John Thompson07a61a42010-06-24 22:44:13 +00001047 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
1048 // is not. Use es rather than m if you don't want the base
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001049 // register to be updated.
1050 case 'e':
John Thompsonceebdf12010-06-25 00:02:05 +00001051 if (Name[1] != 's')
1052 return false;
Sebastian Redldd008712010-08-17 22:42:34 +00001053 // es: A "stable" memory operand; that is, one which does not
John Thompson07a61a42010-06-24 22:44:13 +00001054 // include any automodification of the base register. Unlike
1055 // `m', this constraint can be used in asm statements that
1056 // might access the operand several times, or that might not
John Thompsonceebdf12010-06-25 00:02:05 +00001057 // access it at all.
John Thompson07a61a42010-06-24 22:44:13 +00001058 Info.setAllowsMemory();
John Thompsonceebdf12010-06-25 00:02:05 +00001059 Name++; // Skip over 'e'.
John Thompson07a61a42010-06-24 22:44:13 +00001060 break;
1061 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001062 // usually better to use `m' or `es' in asm statements)
John Thompson07a61a42010-06-24 22:44:13 +00001063 case 'Z': // Memory operand that is an indexed or indirect from a
1064 // register (it is usually better to use `m' or `es' in
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001065 // asm statements)
John Thompson07a61a42010-06-24 22:44:13 +00001066 Info.setAllowsMemory();
1067 Info.setAllowsRegister();
1068 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001069 case 'R': // AIX TOC entry
John Thompson07a61a42010-06-24 22:44:13 +00001070 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001071 // register (`p' is preferable for asm statements)
1072 case 'S': // Constant suitable as a 64-bit mask operand
1073 case 'T': // Constant suitable as a 32-bit mask operand
1074 case 'U': // System V Release 4 small data area reference
John Thompson07a61a42010-06-24 22:44:13 +00001075 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001076 // instructions
1077 case 'W': // Vector constant that does not require memory
1078 case 'j': // Vector constant that is all zeros.
John Thompson07a61a42010-06-24 22:44:13 +00001079 break;
1080 // End FIXME.
Anders Carlssonf511f642007-11-27 04:11:28 +00001081 }
John Thompson07a61a42010-06-24 22:44:13 +00001082 return true;
Anders Carlssonf511f642007-11-27 04:11:28 +00001083 }
Craig Topper3164f332014-03-11 03:39:26 +00001084 std::string convertConstraint(const char *&Constraint) const override {
Hal Finkelf7a07a52014-03-02 18:24:18 +00001085 std::string R;
1086 switch (*Constraint) {
1087 case 'e':
1088 case 'w':
1089 // Two-character constraint; add "^" hint for later parsing.
1090 R = std::string("^") + std::string(Constraint, 2);
1091 Constraint++;
1092 break;
1093 default:
1094 return TargetInfo::convertConstraint(Constraint);
1095 }
1096 return R;
1097 }
Craig Topper3164f332014-03-11 03:39:26 +00001098 const char *getClobbers() const override {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001099 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +00001100 }
Craig Topper3164f332014-03-11 03:39:26 +00001101 int getEHDataRegisterNumber(unsigned RegNo) const override {
Adhemerval Zanella5d874ae2013-01-22 20:02:45 +00001102 if (RegNo == 0) return 3;
1103 if (RegNo == 1) return 4;
1104 return -1;
1105 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00001106
1107 bool hasSjLjLowering() const override {
1108 return true;
1109 }
David Majnemer2617ea62015-06-09 18:05:33 +00001110
1111 bool useFloat128ManglingForLongDouble() const override {
1112 return LongDoubleWidth == 128 &&
1113 LongDoubleFormat == &llvm::APFloat::PPCDoubleDouble &&
1114 getTriple().isOSBinFormatELF();
1115 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001116};
Anders Carlssonf511f642007-11-27 04:11:28 +00001117
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001118const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00001119#define BUILTIN(ID, TYPE, ATTRS) \
1120 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1121#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1122 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5abdec72009-06-14 01:05:48 +00001123#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001124};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001125
Eric Christopher917e9522014-11-18 22:36:15 +00001126/// handleTargetFeatures - Perform initialization based on the user
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001127/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00001128bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001129 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00001130 for (const auto &Feature : Features) {
1131 if (Feature == "+vsx") {
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001132 HasVSX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001133 } else if (Feature == "+bpermd") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001134 HasBPERMD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001135 } else if (Feature == "+extdiv") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001136 HasExtDiv = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001137 } else if (Feature == "+power8-vector") {
Bill Schmidt8c184e32014-10-10 17:21:23 +00001138 HasP8Vector = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001139 } else if (Feature == "+crypto") {
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001140 HasP8Crypto = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001141 } else if (Feature == "+direct-move") {
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001142 HasDirectMove = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001143 } else if (Feature == "+qpx") {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001144 HasQPX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001145 } else if (Feature == "+htm") {
Kit Barton8246f282015-03-25 19:41:41 +00001146 HasHTM = true;
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001147 } else if (Feature == "+float128") {
1148 HasFloat128 = true;
Kit Barton8246f282015-03-25 19:41:41 +00001149 }
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001150 // TODO: Finish this list and add an assert that we've handled them
1151 // all.
1152 }
Eric Christopher02c33352015-08-25 00:59:11 +00001153
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001154 return true;
1155}
1156
Chris Lattnerecd49032009-03-02 22:27:17 +00001157/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
1158/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001159void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001160 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00001161 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001162 Builder.defineMacro("__ppc__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001163 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001164 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001165 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001166 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001167 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001168 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001169 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001170 Builder.defineMacro("__ppc64__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001171 Builder.defineMacro("__PPC64__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001172 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001173
Chris Lattnerecd49032009-03-02 22:27:17 +00001174 // Target properties.
Bill Schmidt778d3872013-07-26 01:36:11 +00001175 if (getTriple().getArch() == llvm::Triple::ppc64le) {
1176 Builder.defineMacro("_LITTLE_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001177 } else {
1178 if (getTriple().getOS() != llvm::Triple::NetBSD &&
1179 getTriple().getOS() != llvm::Triple::OpenBSD)
1180 Builder.defineMacro("_BIG_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001181 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001182
Ulrich Weigand8afad612014-07-28 13:17:52 +00001183 // ABI options.
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001184 if (ABI == "elfv1" || ABI == "elfv1-qpx")
Ulrich Weigand8afad612014-07-28 13:17:52 +00001185 Builder.defineMacro("_CALL_ELF", "1");
1186 if (ABI == "elfv2")
1187 Builder.defineMacro("_CALL_ELF", "2");
1188
Chris Lattnerecd49032009-03-02 22:27:17 +00001189 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001190 Builder.defineMacro("__NATURAL_ALIGNMENT__");
1191 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001192
Chris Lattnerecd49032009-03-02 22:27:17 +00001193 // FIXME: Should be controlled by command line option.
Roman Divacky13b586f2013-07-03 19:45:54 +00001194 if (LongDoubleWidth == 128)
1195 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001196
John Thompsone467e192009-11-19 17:18:50 +00001197 if (Opts.AltiVec) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001198 Builder.defineMacro("__VEC__", "10206");
1199 Builder.defineMacro("__ALTIVEC__");
John Thompsone467e192009-11-19 17:18:50 +00001200 }
Hal Finkel8eb59282012-06-11 22:35:19 +00001201
1202 // CPU identification.
Hal Finkel6b984f02012-07-03 16:51:04 +00001203 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
1204 .Case("440", ArchDefineName)
1205 .Case("450", ArchDefineName | ArchDefine440)
1206 .Case("601", ArchDefineName)
1207 .Case("602", ArchDefineName | ArchDefinePpcgr)
1208 .Case("603", ArchDefineName | ArchDefinePpcgr)
1209 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1210 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1211 .Case("604", ArchDefineName | ArchDefinePpcgr)
1212 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
1213 .Case("620", ArchDefineName | ArchDefinePpcgr)
Bill Schmidt38378a02013-02-01 20:23:10 +00001214 .Case("630", ArchDefineName | ArchDefinePpcgr)
Hal Finkel6b984f02012-07-03 16:51:04 +00001215 .Case("7400", ArchDefineName | ArchDefinePpcgr)
1216 .Case("7450", ArchDefineName | ArchDefinePpcgr)
1217 .Case("750", ArchDefineName | ArchDefinePpcgr)
1218 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1219 | ArchDefinePpcsq)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001220 .Case("a2", ArchDefineA2)
1221 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
Bill Schmidt38378a02013-02-01 20:23:10 +00001222 .Case("pwr3", ArchDefinePpcgr)
1223 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
1224 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1225 | ArchDefinePpcsq)
1226 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4
1227 | ArchDefinePpcgr | ArchDefinePpcsq)
1228 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5
1229 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1230 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x
1231 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1232 | ArchDefinePpcsq)
1233 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6
1234 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001235 | ArchDefinePpcgr | ArchDefinePpcsq)
1236 .Case("pwr8", ArchDefineName | ArchDefinePwr7 | ArchDefinePwr6x
1237 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1238 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001239 .Case("pwr9", ArchDefineName | ArchDefinePwr8 | ArchDefinePwr7
1240 | ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1241 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1242 | ArchDefinePpcsq)
Bill Schmidt38378a02013-02-01 20:23:10 +00001243 .Case("power3", ArchDefinePpcgr)
1244 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1245 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1246 | ArchDefinePpcsq)
1247 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1248 | ArchDefinePpcgr | ArchDefinePpcsq)
1249 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1250 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1251 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1252 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1253 | ArchDefinePpcsq)
1254 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6
1255 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001256 | ArchDefinePpcgr | ArchDefinePpcsq)
1257 .Case("power8", ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr6x
1258 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1259 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001260 .Case("power9", ArchDefinePwr9 | ArchDefinePwr8 | ArchDefinePwr7
1261 | ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1262 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1263 | ArchDefinePpcsq)
Hal Finkel6b984f02012-07-03 16:51:04 +00001264 .Default(ArchDefineNone);
1265
1266 if (defs & ArchDefineName)
1267 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
1268 if (defs & ArchDefinePpcgr)
1269 Builder.defineMacro("_ARCH_PPCGR");
1270 if (defs & ArchDefinePpcsq)
1271 Builder.defineMacro("_ARCH_PPCSQ");
1272 if (defs & ArchDefine440)
Hal Finkel8eb59282012-06-11 22:35:19 +00001273 Builder.defineMacro("_ARCH_440");
Hal Finkel6b984f02012-07-03 16:51:04 +00001274 if (defs & ArchDefine603)
1275 Builder.defineMacro("_ARCH_603");
1276 if (defs & ArchDefine604)
1277 Builder.defineMacro("_ARCH_604");
Bill Schmidt38378a02013-02-01 20:23:10 +00001278 if (defs & ArchDefinePwr4)
Hal Finkel6b984f02012-07-03 16:51:04 +00001279 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt38378a02013-02-01 20:23:10 +00001280 if (defs & ArchDefinePwr5)
Hal Finkel6b984f02012-07-03 16:51:04 +00001281 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt38378a02013-02-01 20:23:10 +00001282 if (defs & ArchDefinePwr5x)
1283 Builder.defineMacro("_ARCH_PWR5X");
1284 if (defs & ArchDefinePwr6)
Hal Finkel8eb59282012-06-11 22:35:19 +00001285 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt38378a02013-02-01 20:23:10 +00001286 if (defs & ArchDefinePwr6x)
1287 Builder.defineMacro("_ARCH_PWR6X");
1288 if (defs & ArchDefinePwr7)
1289 Builder.defineMacro("_ARCH_PWR7");
Will Schmidtf0487512014-06-26 13:34:10 +00001290 if (defs & ArchDefinePwr8)
1291 Builder.defineMacro("_ARCH_PWR8");
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001292 if (defs & ArchDefinePwr9)
1293 Builder.defineMacro("_ARCH_PWR9");
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001294 if (defs & ArchDefineA2)
1295 Builder.defineMacro("_ARCH_A2");
1296 if (defs & ArchDefineA2q) {
1297 Builder.defineMacro("_ARCH_A2Q");
1298 Builder.defineMacro("_ARCH_QP");
1299 }
1300
1301 if (getTriple().getVendor() == llvm::Triple::BGQ) {
1302 Builder.defineMacro("__bg__");
1303 Builder.defineMacro("__THW_BLUEGENE__");
1304 Builder.defineMacro("__bgq__");
1305 Builder.defineMacro("__TOS_BGQ__");
1306 }
Bill Schmidt38378a02013-02-01 20:23:10 +00001307
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001308 if (HasVSX)
1309 Builder.defineMacro("__VSX__");
Bill Schmidt8c184e32014-10-10 17:21:23 +00001310 if (HasP8Vector)
Bill Schmidt59eb7672014-10-10 15:09:43 +00001311 Builder.defineMacro("__POWER8_VECTOR__");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001312 if (HasP8Crypto)
1313 Builder.defineMacro("__CRYPTO__");
Kit Barton8246f282015-03-25 19:41:41 +00001314 if (HasHTM)
1315 Builder.defineMacro("__HTM__");
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001316 if (HasFloat128)
1317 Builder.defineMacro("__FLOAT128__");
Hal Finkela57b8902015-10-01 13:39:49 +00001318
1319 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
1320 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
1321 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
1322 if (PointerWidth == 64)
1323 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001324
Bill Schmidt38378a02013-02-01 20:23:10 +00001325 // FIXME: The following are not yet generated here by Clang, but are
1326 // generated by GCC:
1327 //
1328 // _SOFT_FLOAT_
1329 // __RECIP_PRECISION__
1330 // __APPLE_ALTIVEC__
Bill Schmidt38378a02013-02-01 20:23:10 +00001331 // __RECIP__
1332 // __RECIPF__
1333 // __RSQRTE__
1334 // __RSQRTEF__
1335 // _SOFT_DOUBLE_
1336 // __NO_LWSYNC__
1337 // __HAVE_BSWAP__
1338 // __LONGDOUBLE128
1339 // __CMODEL_MEDIUM__
1340 // __CMODEL_LARGE__
1341 // _CALL_SYSV
1342 // _CALL_DARWIN
1343 // __NO_FPRS__
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001344}
1345
Eric Christophera8a14c32015-08-31 18:39:16 +00001346// Handle explicit options being passed to the compiler here: if we've
1347// explicitly turned off vsx and turned on power8-vector or direct-move then
1348// go ahead and error since the customer has expressed a somewhat incompatible
1349// set of options.
1350static bool ppcUserFeaturesCheck(DiagnosticsEngine &Diags,
Eric Christopher8c47b422015-10-09 18:39:55 +00001351 const std::vector<std::string> &FeaturesVec) {
Eric Christophera8a14c32015-08-31 18:39:16 +00001352
1353 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "-vsx") !=
1354 FeaturesVec.end()) {
1355 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+power8-vector") !=
1356 FeaturesVec.end()) {
1357 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mpower8-vector"
1358 << "-mno-vsx";
1359 return false;
1360 }
1361
1362 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+direct-move") !=
1363 FeaturesVec.end()) {
1364 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mdirect-move"
1365 << "-mno-vsx";
1366 return false;
1367 }
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001368
1369 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+float128") !=
1370 FeaturesVec.end()) {
1371 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mfloat128"
1372 << "-mno-vsx";
1373 return false;
1374 }
Eric Christophera8a14c32015-08-31 18:39:16 +00001375 }
1376
1377 return true;
1378}
1379
Eric Christopher8c47b422015-10-09 18:39:55 +00001380bool PPCTargetInfo::initFeatureMap(
1381 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
1382 const std::vector<std::string> &FeaturesVec) const {
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001383 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1384 .Case("7400", true)
1385 .Case("g4", true)
1386 .Case("7450", true)
1387 .Case("g4+", true)
1388 .Case("970", true)
1389 .Case("g5", true)
1390 .Case("pwr6", true)
1391 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +00001392 .Case("pwr8", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001393 .Case("pwr9", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001394 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +00001395 .Case("ppc64le", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001396 .Default(false);
Hal Finkelb58ce852013-02-01 18:44:19 +00001397
1398 Features["qpx"] = (CPU == "a2q");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001399 Features["crypto"] = llvm::StringSwitch<bool>(CPU)
1400 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001401 .Case("pwr9", true)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001402 .Case("pwr8", true)
1403 .Default(false);
1404 Features["power8-vector"] = llvm::StringSwitch<bool>(CPU)
1405 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001406 .Case("pwr9", true)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001407 .Case("pwr8", true)
1408 .Default(false);
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001409 Features["bpermd"] = llvm::StringSwitch<bool>(CPU)
1410 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001411 .Case("pwr9", true)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001412 .Case("pwr8", true)
1413 .Case("pwr7", true)
1414 .Default(false);
1415 Features["extdiv"] = llvm::StringSwitch<bool>(CPU)
1416 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001417 .Case("pwr9", true)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001418 .Case("pwr8", true)
1419 .Case("pwr7", true)
1420 .Default(false);
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001421 Features["direct-move"] = llvm::StringSwitch<bool>(CPU)
1422 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001423 .Case("pwr9", true)
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001424 .Case("pwr8", true)
1425 .Default(false);
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001426 Features["vsx"] = llvm::StringSwitch<bool>(CPU)
1427 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001428 .Case("pwr9", true)
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001429 .Case("pwr8", true)
1430 .Case("pwr7", true)
1431 .Default(false);
Eric Christopheref1e2952015-08-28 02:13:58 +00001432
Eric Christophera8a14c32015-08-31 18:39:16 +00001433 if (!ppcUserFeaturesCheck(Diags, FeaturesVec))
1434 return false;
Eric Christopher007b0a02015-08-28 22:32:01 +00001435
Eric Christopher007b0a02015-08-28 22:32:01 +00001436 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001437}
1438
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001439bool PPCTargetInfo::hasFeature(StringRef Feature) const {
Bill Schmidte6e9d152014-11-02 14:56:41 +00001440 return llvm::StringSwitch<bool>(Feature)
1441 .Case("powerpc", true)
1442 .Case("vsx", HasVSX)
1443 .Case("power8-vector", HasP8Vector)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001444 .Case("crypto", HasP8Crypto)
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001445 .Case("direct-move", HasDirectMove)
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001446 .Case("qpx", HasQPX)
Kit Barton8246f282015-03-25 19:41:41 +00001447 .Case("htm", HasHTM)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001448 .Case("bpermd", HasBPERMD)
1449 .Case("extdiv", HasExtDiv)
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001450 .Case("float128", HasFloat128)
Bill Schmidte6e9d152014-11-02 14:56:41 +00001451 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001452}
Chris Lattner17df24e2008-04-21 18:56:49 +00001453
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001454void PPCTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
1455 StringRef Name, bool Enabled) const {
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001456 // If we're enabling direct-move or power8-vector go ahead and enable vsx
1457 // as well. Do the inverse if we're disabling vsx. We'll diagnose any user
1458 // incompatible options.
1459 if (Enabled) {
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001460 if (Name == "direct-move") {
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001461 Features[Name] = Features["vsx"] = true;
1462 } else if (Name == "power8-vector") {
1463 Features[Name] = Features["vsx"] = true;
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001464 } else if (Name == "float128") {
1465 Features[Name] = Features["vsx"] = true;
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001466 } else {
1467 Features[Name] = true;
1468 }
1469 } else {
1470 if (Name == "vsx") {
1471 Features[Name] = Features["direct-move"] = Features["power8-vector"] =
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001472 Features["float128"] = false;
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001473 } else {
1474 Features[Name] = false;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001475 }
1476 }
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001477}
1478
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001479const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001480 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1481 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1482 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1483 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1484 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1485 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1486 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1487 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001488 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001489 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001490 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001491 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1492 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1493 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1494 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001495 "vrsave", "vscr",
1496 "spe_acc", "spefscr",
1497 "sfp"
1498};
Chris Lattner10a5b382007-01-29 05:24:35 +00001499
Craig Topperf054e3a2015-10-19 03:52:27 +00001500ArrayRef<const char*> PPCTargetInfo::getGCCRegNames() const {
1501 return llvm::makeArrayRef(GCCRegNames);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001502}
Chris Lattner5ba61f02006-10-14 07:39:34 +00001503
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001504const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1505 // While some of these aliases do map to different registers
1506 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001507 { { "0" }, "r0" },
1508 { { "1"}, "r1" },
1509 { { "2" }, "r2" },
1510 { { "3" }, "r3" },
1511 { { "4" }, "r4" },
1512 { { "5" }, "r5" },
1513 { { "6" }, "r6" },
1514 { { "7" }, "r7" },
1515 { { "8" }, "r8" },
1516 { { "9" }, "r9" },
1517 { { "10" }, "r10" },
1518 { { "11" }, "r11" },
1519 { { "12" }, "r12" },
1520 { { "13" }, "r13" },
1521 { { "14" }, "r14" },
1522 { { "15" }, "r15" },
1523 { { "16" }, "r16" },
1524 { { "17" }, "r17" },
1525 { { "18" }, "r18" },
1526 { { "19" }, "r19" },
1527 { { "20" }, "r20" },
1528 { { "21" }, "r21" },
1529 { { "22" }, "r22" },
1530 { { "23" }, "r23" },
1531 { { "24" }, "r24" },
1532 { { "25" }, "r25" },
1533 { { "26" }, "r26" },
1534 { { "27" }, "r27" },
1535 { { "28" }, "r28" },
1536 { { "29" }, "r29" },
1537 { { "30" }, "r30" },
1538 { { "31" }, "r31" },
1539 { { "fr0" }, "f0" },
1540 { { "fr1" }, "f1" },
1541 { { "fr2" }, "f2" },
1542 { { "fr3" }, "f3" },
1543 { { "fr4" }, "f4" },
1544 { { "fr5" }, "f5" },
1545 { { "fr6" }, "f6" },
1546 { { "fr7" }, "f7" },
1547 { { "fr8" }, "f8" },
1548 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +00001549 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001550 { { "fr11" }, "f11" },
1551 { { "fr12" }, "f12" },
1552 { { "fr13" }, "f13" },
1553 { { "fr14" }, "f14" },
1554 { { "fr15" }, "f15" },
1555 { { "fr16" }, "f16" },
1556 { { "fr17" }, "f17" },
1557 { { "fr18" }, "f18" },
1558 { { "fr19" }, "f19" },
1559 { { "fr20" }, "f20" },
1560 { { "fr21" }, "f21" },
1561 { { "fr22" }, "f22" },
1562 { { "fr23" }, "f23" },
1563 { { "fr24" }, "f24" },
1564 { { "fr25" }, "f25" },
1565 { { "fr26" }, "f26" },
1566 { { "fr27" }, "f27" },
1567 { { "fr28" }, "f28" },
1568 { { "fr29" }, "f29" },
1569 { { "fr30" }, "f30" },
1570 { { "fr31" }, "f31" },
1571 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001572};
1573
Craig Topperf054e3a2015-10-19 03:52:27 +00001574ArrayRef<TargetInfo::GCCRegAlias> PPCTargetInfo::getGCCRegAliases() const {
1575 return llvm::makeArrayRef(GCCRegAliases);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001576}
Chris Lattner02dffbd2006-10-14 07:50:21 +00001577
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001578class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001579public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001580 PPC32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1581 : PPCTargetInfo(Triple, Opts) {
James Y Knightb214cbc2016-03-04 19:00:41 +00001582 resetDataLayout("E-m:e-p:32:32-i64:64-n32");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001583
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001584 switch (getTriple().getOS()) {
Nico Weber3435ede2012-01-31 02:07:33 +00001585 case llvm::Triple::Linux:
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001586 case llvm::Triple::FreeBSD:
1587 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001588 SizeType = UnsignedInt;
Hal Finkel26908382012-03-02 20:54:36 +00001589 PtrDiffType = SignedInt;
1590 IntPtrType = SignedInt;
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001591 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +00001592 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001593 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001594 }
Roman Divacky816dcd12012-03-13 16:53:54 +00001595
Roman Divacky3ffe7462012-03-13 19:20:17 +00001596 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1597 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001598 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Roman Divacky3ffe7462012-03-13 19:20:17 +00001599 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001600
1601 // PPC32 supports atomics up to 4 bytes.
1602 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divacky965b0b72011-01-06 08:27:10 +00001603 }
1604
Craig Topper3164f332014-03-11 03:39:26 +00001605 BuiltinVaListKind getBuiltinVaListKind() const override {
Roman Divacky965b0b72011-01-06 08:27:10 +00001606 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Inge5d3fb222012-06-16 03:34:49 +00001607 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman873f65a2008-08-21 00:13:15 +00001608 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001609};
Chris Lattner5ba61f02006-10-14 07:39:34 +00001610
Bill Schmidt778d3872013-07-26 01:36:11 +00001611// Note: ABI differences may eventually require us to have a separate
1612// TargetInfo for little endian.
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001613class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001614public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001615 PPC64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1616 : PPCTargetInfo(Triple, Opts) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001617 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001618 IntMaxType = SignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001619 Int64Type = SignedLong;
Roman Divacky816dcd12012-03-13 16:53:54 +00001620
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001621 if ((Triple.getArch() == llvm::Triple::ppc64le)) {
James Y Knightb214cbc2016-03-04 19:00:41 +00001622 resetDataLayout("e-m:e-i64:64-n32:64");
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001623 ABI = "elfv2";
1624 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00001625 resetDataLayout("E-m:e-i64:64-n32:64");
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001626 ABI = "elfv1";
1627 }
1628
1629 switch (getTriple().getOS()) {
1630 case llvm::Triple::FreeBSD:
Roman Divacky3ffe7462012-03-13 19:20:17 +00001631 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001632 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001633 break;
Joerg Sonnenbergeraac82c42014-10-15 19:52:03 +00001634 case llvm::Triple::NetBSD:
1635 IntMaxType = SignedLongLong;
1636 Int64Type = SignedLongLong;
1637 break;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001638 default:
1639 break;
Ulrich Weigand8afad612014-07-28 13:17:52 +00001640 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001641
1642 // PPC64 supports atomics up to 8 bytes.
1643 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001644 }
Craig Topper3164f332014-03-11 03:39:26 +00001645 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001646 return TargetInfo::CharPtrBuiltinVaList;
Roman Divacky965b0b72011-01-06 08:27:10 +00001647 }
Eric Christophere6b7cf42015-07-10 18:25:52 +00001648 // PPC64 Linux-specific ABI options.
Ulrich Weigand8afad612014-07-28 13:17:52 +00001649 bool setABI(const std::string &Name) override {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001650 if (Name == "elfv1" || Name == "elfv1-qpx" || Name == "elfv2") {
Ulrich Weigand8afad612014-07-28 13:17:52 +00001651 ABI = Name;
1652 return true;
1653 }
1654 return false;
1655 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001656};
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001657
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001658class DarwinPPC32TargetInfo : public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001659public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001660 DarwinPPC32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1661 : DarwinTargetInfo<PPC32TargetInfo>(Triple, Opts) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001662 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +00001663 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Eric Christopher917e9522014-11-18 22:36:15 +00001664 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev68d773c2012-01-17 22:40:00 +00001665 LongLongAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001666 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00001667 resetDataLayout("E-m:o-p:32:32-f64:32:64-n32");
Roman Divacky965b0b72011-01-06 08:27:10 +00001668 }
Craig Topper3164f332014-03-11 03:39:26 +00001669 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001670 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001671 }
1672};
1673
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001674class DarwinPPC64TargetInfo : public DarwinTargetInfo<PPC64TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001675public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001676 DarwinPPC64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1677 : DarwinTargetInfo<PPC64TargetInfo>(Triple, Opts) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001678 HasAlignMac68kSupport = true;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001679 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00001680 resetDataLayout("E-m:o-i64:64-n32:64");
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001681 }
1682};
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001683
Eric Christopherc48497a2015-09-18 21:26:24 +00001684static const unsigned NVPTXAddrSpaceMap[] = {
1685 1, // opencl_global
1686 3, // opencl_local
1687 4, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00001688 // FIXME: generic has to be added to the target
Eric Christopherc48497a2015-09-18 21:26:24 +00001689 0, // opencl_generic
1690 1, // cuda_device
1691 4, // cuda_constant
1692 3, // cuda_shared
1693};
1694
1695class NVPTXTargetInfo : public TargetInfo {
1696 static const char *const GCCRegNames[];
1697 static const Builtin::Info BuiltinInfo[];
Justin Lebar62907612016-07-06 21:21:39 +00001698 CudaArch GPU;
Reid Klecknerbbc01782014-12-03 21:53:36 +00001699
Eric Christopherc48497a2015-09-18 21:26:24 +00001700public:
Justin Lebar76945b22016-04-29 23:05:19 +00001701 NVPTXTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001702 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00001703 BigEndian = false;
1704 TLSSupported = false;
1705 LongWidth = LongAlign = 64;
1706 AddrSpaceMap = &NVPTXAddrSpaceMap;
1707 UseAddrSpaceMapMangling = true;
1708 // Define available target features
1709 // These must be defined in sorted order!
1710 NoAsmVariants = true;
Justin Lebar62907612016-07-06 21:21:39 +00001711 GPU = CudaArch::SM_20;
Justin Lebar76945b22016-04-29 23:05:19 +00001712
1713 // If possible, get a TargetInfo for our host triple, so we can match its
1714 // types.
1715 llvm::Triple HostTriple(Opts.HostTriple);
1716 if (HostTriple.isNVPTX())
1717 return;
1718 std::unique_ptr<TargetInfo> HostTarget(
1719 AllocateTarget(llvm::Triple(Opts.HostTriple), Opts));
1720 if (!HostTarget) {
1721 return;
1722 }
1723
1724 PointerWidth = HostTarget->getPointerWidth(/* AddrSpace = */ 0);
1725 PointerAlign = HostTarget->getPointerAlign(/* AddrSpace = */ 0);
1726 BoolWidth = HostTarget->getBoolWidth();
1727 BoolAlign = HostTarget->getBoolAlign();
1728 IntWidth = HostTarget->getIntWidth();
1729 IntAlign = HostTarget->getIntAlign();
1730 HalfWidth = HostTarget->getHalfWidth();
1731 HalfAlign = HostTarget->getHalfAlign();
1732 FloatWidth = HostTarget->getFloatWidth();
1733 FloatAlign = HostTarget->getFloatAlign();
1734 DoubleWidth = HostTarget->getDoubleWidth();
1735 DoubleAlign = HostTarget->getDoubleAlign();
1736 LongWidth = HostTarget->getLongWidth();
1737 LongAlign = HostTarget->getLongAlign();
1738 LongLongWidth = HostTarget->getLongLongWidth();
1739 LongLongAlign = HostTarget->getLongLongAlign();
1740 MinGlobalAlign = HostTarget->getMinGlobalAlign();
1741 DefaultAlignForAttributeAligned =
1742 HostTarget->getDefaultAlignForAttributeAligned();
1743 SizeType = HostTarget->getSizeType();
1744 IntMaxType = HostTarget->getIntMaxType();
1745 PtrDiffType = HostTarget->getPtrDiffType(/* AddrSpace = */ 0);
1746 IntPtrType = HostTarget->getIntPtrType();
1747 WCharType = HostTarget->getWCharType();
1748 WIntType = HostTarget->getWIntType();
1749 Char16Type = HostTarget->getChar16Type();
1750 Char32Type = HostTarget->getChar32Type();
1751 Int64Type = HostTarget->getInt64Type();
1752 SigAtomicType = HostTarget->getSigAtomicType();
1753 ProcessIDType = HostTarget->getProcessIDType();
1754
1755 UseBitFieldTypeAlignment = HostTarget->useBitFieldTypeAlignment();
1756 UseZeroLengthBitfieldAlignment =
1757 HostTarget->useZeroLengthBitfieldAlignment();
1758 UseExplicitBitFieldAlignment = HostTarget->useExplicitBitFieldAlignment();
1759 ZeroLengthBitfieldBoundary = HostTarget->getZeroLengthBitfieldBoundary();
1760
1761 // Properties intentionally not copied from host:
1762 // - LargeArrayMinWidth, LargeArrayAlign: Not visible across the
1763 // host/device boundary.
1764 // - SuitableAlign: Not visible across the host/device boundary, and may
1765 // correctly be different on host/device, e.g. if host has wider vector
1766 // types than device.
1767 // - LongDoubleWidth, LongDoubleAlign: nvptx's long double type is the same
1768 // as its double type, but that's not necessarily true on the host.
1769 // TODO: nvcc emits a warning when using long double on device; we should
1770 // do the same.
Eric Christopherc48497a2015-09-18 21:26:24 +00001771 }
1772 void getTargetDefines(const LangOptions &Opts,
1773 MacroBuilder &Builder) const override {
1774 Builder.defineMacro("__PTX__");
1775 Builder.defineMacro("__NVPTX__");
1776 if (Opts.CUDAIsDevice) {
1777 // Set __CUDA_ARCH__ for the GPU specified.
Justin Lebaref1aaac2016-07-06 21:21:14 +00001778 std::string CUDAArchCode = [this] {
1779 switch (GPU) {
Simon Pilgrim13dff572016-07-07 22:32:26 +00001780 case CudaArch::UNKNOWN:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001781 assert(false && "No GPU arch when compiling CUDA device code.");
1782 return "";
Justin Lebar62907612016-07-06 21:21:39 +00001783 case CudaArch::SM_20:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001784 return "200";
Justin Lebar62907612016-07-06 21:21:39 +00001785 case CudaArch::SM_21:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001786 return "210";
Justin Lebar62907612016-07-06 21:21:39 +00001787 case CudaArch::SM_30:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001788 return "300";
Justin Lebar62907612016-07-06 21:21:39 +00001789 case CudaArch::SM_32:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001790 return "320";
Justin Lebar62907612016-07-06 21:21:39 +00001791 case CudaArch::SM_35:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001792 return "350";
Justin Lebar62907612016-07-06 21:21:39 +00001793 case CudaArch::SM_37:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001794 return "370";
Justin Lebar62907612016-07-06 21:21:39 +00001795 case CudaArch::SM_50:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001796 return "500";
Justin Lebar62907612016-07-06 21:21:39 +00001797 case CudaArch::SM_52:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001798 return "520";
Justin Lebar62907612016-07-06 21:21:39 +00001799 case CudaArch::SM_53:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001800 return "530";
Justin Lebar62907612016-07-06 21:21:39 +00001801 case CudaArch::SM_60:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001802 return "600";
Justin Lebar62907612016-07-06 21:21:39 +00001803 case CudaArch::SM_61:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001804 return "610";
Justin Lebar62907612016-07-06 21:21:39 +00001805 case CudaArch::SM_62:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001806 return "620";
1807 }
Simon Pilgrim13dff572016-07-07 22:32:26 +00001808 llvm_unreachable("unhandled CudaArch");
Justin Lebaref1aaac2016-07-06 21:21:14 +00001809 }();
Eric Christopherc48497a2015-09-18 21:26:24 +00001810 Builder.defineMacro("__CUDA_ARCH__", CUDAArchCode);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001811 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001812 }
Craig Topper6c03a542015-10-19 04:51:35 +00001813 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
1814 return llvm::makeArrayRef(BuiltinInfo,
1815 clang::NVPTX::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eric Christopherc48497a2015-09-18 21:26:24 +00001816 }
1817 bool hasFeature(StringRef Feature) const override {
1818 return Feature == "ptx" || Feature == "nvptx";
Peter Collingbournec947aae2012-05-20 23:28:41 +00001819 }
1820
Craig Topperf054e3a2015-10-19 03:52:27 +00001821 ArrayRef<const char *> getGCCRegNames() const override;
1822 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00001823 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00001824 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00001825 }
1826 bool validateAsmConstraint(const char *&Name,
1827 TargetInfo::ConstraintInfo &Info) const override {
1828 switch (*Name) {
1829 default:
1830 return false;
1831 case 'c':
1832 case 'h':
1833 case 'r':
1834 case 'l':
1835 case 'f':
1836 case 'd':
1837 Info.setAllowsRegister();
1838 return true;
Eli Bendersky13467172015-04-01 20:29:18 +00001839 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001840 }
1841 const char *getClobbers() const override {
1842 // FIXME: Is this really right?
1843 return "";
1844 }
1845 BuiltinVaListKind getBuiltinVaListKind() const override {
1846 // FIXME: implement
1847 return TargetInfo::CharPtrBuiltinVaList;
1848 }
1849 bool setCPU(const std::string &Name) override {
Justin Lebar62907612016-07-06 21:21:39 +00001850 GPU = StringToCudaArch(Name);
1851 return GPU != CudaArch::UNKNOWN;
Eric Christopherc48497a2015-09-18 21:26:24 +00001852 }
Jan Vesely9674bd42016-06-17 19:02:14 +00001853 void setSupportedOpenCLOpts() override {
1854 auto &Opts = getSupportedOpenCLOpts();
1855 Opts.cl_clang_storage_class_specifiers = 1;
1856 Opts.cl_khr_gl_sharing = 1;
1857 Opts.cl_khr_icd = 1;
1858
1859 Opts.cl_khr_fp64 = 1;
1860 Opts.cl_khr_byte_addressable_store = 1;
1861 Opts.cl_khr_global_int32_base_atomics = 1;
1862 Opts.cl_khr_global_int32_extended_atomics = 1;
1863 Opts.cl_khr_local_int32_base_atomics = 1;
1864 Opts.cl_khr_local_int32_extended_atomics = 1;
1865 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001866};
1867
1868const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1869#define BUILTIN(ID, TYPE, ATTRS) \
1870 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1871#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1872 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
1873#include "clang/Basic/BuiltinsNVPTX.def"
1874};
1875
1876const char *const NVPTXTargetInfo::GCCRegNames[] = {"r0"};
1877
Craig Topperf054e3a2015-10-19 03:52:27 +00001878ArrayRef<const char *> NVPTXTargetInfo::getGCCRegNames() const {
1879 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00001880}
1881
1882class NVPTX32TargetInfo : public NVPTXTargetInfo {
1883public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001884 NVPTX32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1885 : NVPTXTargetInfo(Triple, Opts) {
Artem Belevich236cfdc2015-09-28 22:54:08 +00001886 LongWidth = LongAlign = 32;
Eric Christopherc48497a2015-09-18 21:26:24 +00001887 PointerWidth = PointerAlign = 32;
1888 SizeType = TargetInfo::UnsignedInt;
1889 PtrDiffType = TargetInfo::SignedInt;
1890 IntPtrType = TargetInfo::SignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +00001891 resetDataLayout("e-p:32:32-i64:64-v16:16-v32:32-n16:32:64");
Eric Christopherc48497a2015-09-18 21:26:24 +00001892 }
1893};
1894
1895class NVPTX64TargetInfo : public NVPTXTargetInfo {
1896public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001897 NVPTX64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1898 : NVPTXTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00001899 PointerWidth = PointerAlign = 64;
1900 SizeType = TargetInfo::UnsignedLong;
1901 PtrDiffType = TargetInfo::SignedLong;
1902 IntPtrType = TargetInfo::SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00001903 resetDataLayout("e-i64:64-v16:16-v32:32-n16:32:64");
Eric Christopherc48497a2015-09-18 21:26:24 +00001904 }
1905};
Eli Friedmand13b41e2012-10-12 23:32:00 +00001906
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001907static const unsigned AMDGPUAddrSpaceMap[] = {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001908 1, // opencl_global
1909 3, // opencl_local
1910 2, // opencl_constant
Matt Arsenaultbfe25b22014-12-01 16:46:03 +00001911 4, // opencl_generic
Eli Friedmand13b41e2012-10-12 23:32:00 +00001912 1, // cuda_device
1913 2, // cuda_constant
1914 3 // cuda_shared
1915};
1916
Tom Stellarda96344b2014-08-21 13:58:40 +00001917// If you edit the description strings, make sure you update
1918// getPointerWidthV().
1919
Craig Topper273dbc62015-10-18 05:29:26 +00001920static const char *const DataLayoutStringR600 =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001921 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1922 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001923
Craig Topper273dbc62015-10-18 05:29:26 +00001924static const char *const DataLayoutStringSI =
Matt Arsenault6dc455f2016-05-31 16:58:18 +00001925 "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 +00001926 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1927 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001928
Matt Arsenault250024f2016-06-08 01:56:42 +00001929class AMDGPUTargetInfo final : public TargetInfo {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001930 static const Builtin::Info BuiltinInfo[];
Tom Stellard7b1059b2015-04-14 14:36:56 +00001931 static const char * const GCCRegNames[];
Matt Arsenault56f008d2014-06-24 20:45:01 +00001932
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001933 /// \brief The GPU profiles supported by the AMDGPU target.
Tom Stellardc74b1e02013-03-04 17:40:53 +00001934 enum GPUKind {
1935 GK_NONE,
1936 GK_R600,
1937 GK_R600_DOUBLE_OPS,
1938 GK_R700,
1939 GK_R700_DOUBLE_OPS,
1940 GK_EVERGREEN,
1941 GK_EVERGREEN_DOUBLE_OPS,
1942 GK_NORTHERN_ISLANDS,
1943 GK_CAYMAN,
Tom Stellard08ded122013-10-29 16:38:29 +00001944 GK_SOUTHERN_ISLANDS,
Tom Stellard5c384402015-06-18 19:14:15 +00001945 GK_SEA_ISLANDS,
1946 GK_VOLCANIC_ISLANDS
Tom Stellardc74b1e02013-03-04 17:40:53 +00001947 } GPU;
1948
Jan Veselyeebeaea2015-05-04 19:53:36 +00001949 bool hasFP64:1;
1950 bool hasFMAF:1;
1951 bool hasLDEXPF:1;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001952
Matt Arsenault250024f2016-06-08 01:56:42 +00001953 static bool isAMDGCN(const llvm::Triple &TT) {
1954 return TT.getArch() == llvm::Triple::amdgcn;
1955 }
1956
Eli Friedmand13b41e2012-10-12 23:32:00 +00001957public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001958 AMDGPUTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Matt Arsenault250024f2016-06-08 01:56:42 +00001959 : TargetInfo(Triple) ,
1960 GPU(isAMDGCN(Triple) ? GK_SOUTHERN_ISLANDS : GK_R600),
1961 hasFP64(false),
1962 hasFMAF(false),
1963 hasLDEXPF(false) {
1964 if (getTriple().getArch() == llvm::Triple::amdgcn) {
Jan Veselya3abd6d2015-05-01 17:38:13 +00001965 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001966 hasFMAF = true;
1967 hasLDEXPF = true;
Tom Stellardd99fb952015-01-28 15:38:44 +00001968 }
Matt Arsenault250024f2016-06-08 01:56:42 +00001969
1970 resetDataLayout(getTriple().getArch() == llvm::Triple::amdgcn ?
1971 DataLayoutStringSI : DataLayoutStringR600);
1972
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001973 AddrSpaceMap = &AMDGPUAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001974 UseAddrSpaceMapMangling = true;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001975 }
1976
Tom Stellarda96344b2014-08-21 13:58:40 +00001977 uint64_t getPointerWidthV(unsigned AddrSpace) const override {
1978 if (GPU <= GK_CAYMAN)
1979 return 32;
1980
1981 switch(AddrSpace) {
1982 default:
1983 return 64;
1984 case 0:
1985 case 3:
1986 case 5:
1987 return 32;
1988 }
1989 }
1990
Craig Topper3164f332014-03-11 03:39:26 +00001991 const char * getClobbers() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001992 return "";
1993 }
1994
Craig Topperf054e3a2015-10-19 03:52:27 +00001995 ArrayRef<const char *> getGCCRegNames() const override;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001996
Craig Topperf054e3a2015-10-19 03:52:27 +00001997 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
1998 return None;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001999 }
2000
Craig Topper3164f332014-03-11 03:39:26 +00002001 bool validateAsmConstraint(const char *&Name,
Tom Stellardd097e942015-11-19 22:11:58 +00002002 TargetInfo::ConstraintInfo &Info) const override {
2003 switch (*Name) {
2004 default: break;
2005 case 'v': // vgpr
2006 case 's': // sgpr
2007 Info.setAllowsRegister();
2008 return true;
2009 }
2010 return false;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002011 }
2012
Matt Arsenault250024f2016-06-08 01:56:42 +00002013 bool initFeatureMap(llvm::StringMap<bool> &Features,
2014 DiagnosticsEngine &Diags, StringRef CPU,
2015 const std::vector<std::string> &FeatureVec) const override;
2016
Craig Topper6c03a542015-10-19 04:51:35 +00002017 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
2018 return llvm::makeArrayRef(BuiltinInfo,
2019 clang::AMDGPU::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eli Friedmand13b41e2012-10-12 23:32:00 +00002020 }
2021
Craig Topper3164f332014-03-11 03:39:26 +00002022 void getTargetDefines(const LangOptions &Opts,
2023 MacroBuilder &Builder) const override {
Matt Arsenault5e020b22016-02-27 09:06:26 +00002024 if (getTriple().getArch() == llvm::Triple::amdgcn)
2025 Builder.defineMacro("__AMDGCN__");
2026 else
2027 Builder.defineMacro("__R600__");
2028
Jan Veselyeebeaea2015-05-04 19:53:36 +00002029 if (hasFMAF)
2030 Builder.defineMacro("__HAS_FMAF__");
2031 if (hasLDEXPF)
2032 Builder.defineMacro("__HAS_LDEXPF__");
Jan Vesely211ba782016-06-17 02:25:03 +00002033 if (hasFP64)
2034 Builder.defineMacro("__HAS_FP64__");
Eli Friedmand13b41e2012-10-12 23:32:00 +00002035 }
2036
Craig Topper3164f332014-03-11 03:39:26 +00002037 BuiltinVaListKind getBuiltinVaListKind() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00002038 return TargetInfo::CharPtrBuiltinVaList;
2039 }
2040
Matt Arsenault250024f2016-06-08 01:56:42 +00002041 static GPUKind parseR600Name(StringRef Name) {
2042 return llvm::StringSwitch<GPUKind>(Name)
Tom Stellardc74b1e02013-03-04 17:40:53 +00002043 .Case("r600" , GK_R600)
2044 .Case("rv610", GK_R600)
2045 .Case("rv620", GK_R600)
2046 .Case("rv630", GK_R600)
2047 .Case("rv635", GK_R600)
2048 .Case("rs780", GK_R600)
2049 .Case("rs880", GK_R600)
2050 .Case("rv670", GK_R600_DOUBLE_OPS)
2051 .Case("rv710", GK_R700)
2052 .Case("rv730", GK_R700)
2053 .Case("rv740", GK_R700_DOUBLE_OPS)
2054 .Case("rv770", GK_R700_DOUBLE_OPS)
2055 .Case("palm", GK_EVERGREEN)
2056 .Case("cedar", GK_EVERGREEN)
2057 .Case("sumo", GK_EVERGREEN)
2058 .Case("sumo2", GK_EVERGREEN)
2059 .Case("redwood", GK_EVERGREEN)
2060 .Case("juniper", GK_EVERGREEN)
2061 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
2062 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
2063 .Case("barts", GK_NORTHERN_ISLANDS)
2064 .Case("turks", GK_NORTHERN_ISLANDS)
2065 .Case("caicos", GK_NORTHERN_ISLANDS)
2066 .Case("cayman", GK_CAYMAN)
2067 .Case("aruba", GK_CAYMAN)
Matt Arsenault250024f2016-06-08 01:56:42 +00002068 .Default(GK_NONE);
2069 }
2070
2071 static GPUKind parseAMDGCNName(StringRef Name) {
2072 return llvm::StringSwitch<GPUKind>(Name)
Tom Stellard785699322013-04-01 20:56:49 +00002073 .Case("tahiti", GK_SOUTHERN_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00002074 .Case("pitcairn", GK_SOUTHERN_ISLANDS)
2075 .Case("verde", GK_SOUTHERN_ISLANDS)
2076 .Case("oland", GK_SOUTHERN_ISLANDS)
Tom Stellard9affba42014-08-21 13:58:38 +00002077 .Case("hainan", GK_SOUTHERN_ISLANDS)
Tom Stellard08ded122013-10-29 16:38:29 +00002078 .Case("bonaire", GK_SEA_ISLANDS)
2079 .Case("kabini", GK_SEA_ISLANDS)
2080 .Case("kaveri", GK_SEA_ISLANDS)
Tom Stellard55583042013-11-14 23:45:53 +00002081 .Case("hawaii", GK_SEA_ISLANDS)
Tom Stellard14e03962014-07-26 01:05:20 +00002082 .Case("mullins", GK_SEA_ISLANDS)
Tom Stellard5c384402015-06-18 19:14:15 +00002083 .Case("tonga", GK_VOLCANIC_ISLANDS)
2084 .Case("iceland", GK_VOLCANIC_ISLANDS)
2085 .Case("carrizo", GK_VOLCANIC_ISLANDS)
Tom Stellard2c7cdd22016-02-29 15:08:56 +00002086 .Case("fiji", GK_VOLCANIC_ISLANDS)
2087 .Case("stoney", GK_VOLCANIC_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00002088 .Default(GK_NONE);
Matt Arsenault250024f2016-06-08 01:56:42 +00002089 }
Tom Stellardc74b1e02013-03-04 17:40:53 +00002090
Matt Arsenault250024f2016-06-08 01:56:42 +00002091 bool setCPU(const std::string &Name) override {
2092 if (getTriple().getArch() == llvm::Triple::amdgcn)
2093 GPU = parseAMDGCNName(Name);
2094 else
2095 GPU = parseR600Name(Name);
Tom Stellardc74b1e02013-03-04 17:40:53 +00002096
Matt Arsenault250024f2016-06-08 01:56:42 +00002097 return GPU != GK_NONE;
Tom Stellardc74b1e02013-03-04 17:40:53 +00002098 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002099
Jan Vesely211ba782016-06-17 02:25:03 +00002100 void setSupportedOpenCLOpts() override {
2101 auto &Opts = getSupportedOpenCLOpts();
2102 Opts.cl_clang_storage_class_specifiers = 1;
2103 Opts.cl_khr_icd = 1;
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002104
Jan Vesely211ba782016-06-17 02:25:03 +00002105 if (hasFP64)
2106 Opts.cl_khr_fp64 = 1;
2107 if (GPU >= GK_EVERGREEN) {
2108 Opts.cl_khr_byte_addressable_store = 1;
2109 Opts.cl_khr_global_int32_base_atomics = 1;
2110 Opts.cl_khr_global_int32_extended_atomics = 1;
2111 Opts.cl_khr_local_int32_base_atomics = 1;
2112 Opts.cl_khr_local_int32_extended_atomics = 1;
2113 }
2114 if (GPU >= GK_SOUTHERN_ISLANDS) {
2115 Opts.cl_khr_fp16 = 1;
2116 Opts.cl_khr_int64_base_atomics = 1;
2117 Opts.cl_khr_int64_extended_atomics = 1;
2118 Opts.cl_khr_3d_image_writes = 1;
2119 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002120 }
Nikolay Haustov8c6538b2016-06-30 09:06:33 +00002121
2122 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
2123 switch (CC) {
2124 default:
2125 return CCCR_Warning;
2126 case CC_C:
2127 case CC_OpenCLKernel:
2128 return CCCR_OK;
2129 }
2130 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00002131};
2132
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002133const Builtin::Info AMDGPUTargetInfo::BuiltinInfo[] = {
Matt Arsenault56f008d2014-06-24 20:45:01 +00002134#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00002135 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Matt Arsenault250024f2016-06-08 01:56:42 +00002136#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
2137 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002138#include "clang/Basic/BuiltinsAMDGPU.def"
Matt Arsenault56f008d2014-06-24 20:45:01 +00002139};
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002140const char * const AMDGPUTargetInfo::GCCRegNames[] = {
Tom Stellard7b1059b2015-04-14 14:36:56 +00002141 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
2142 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
2143 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
2144 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
2145 "v32", "v33", "v34", "v35", "v36", "v37", "v38", "v39",
2146 "v40", "v41", "v42", "v43", "v44", "v45", "v46", "v47",
2147 "v48", "v49", "v50", "v51", "v52", "v53", "v54", "v55",
2148 "v56", "v57", "v58", "v59", "v60", "v61", "v62", "v63",
2149 "v64", "v65", "v66", "v67", "v68", "v69", "v70", "v71",
2150 "v72", "v73", "v74", "v75", "v76", "v77", "v78", "v79",
2151 "v80", "v81", "v82", "v83", "v84", "v85", "v86", "v87",
2152 "v88", "v89", "v90", "v91", "v92", "v93", "v94", "v95",
2153 "v96", "v97", "v98", "v99", "v100", "v101", "v102", "v103",
2154 "v104", "v105", "v106", "v107", "v108", "v109", "v110", "v111",
2155 "v112", "v113", "v114", "v115", "v116", "v117", "v118", "v119",
2156 "v120", "v121", "v122", "v123", "v124", "v125", "v126", "v127",
2157 "v128", "v129", "v130", "v131", "v132", "v133", "v134", "v135",
2158 "v136", "v137", "v138", "v139", "v140", "v141", "v142", "v143",
2159 "v144", "v145", "v146", "v147", "v148", "v149", "v150", "v151",
2160 "v152", "v153", "v154", "v155", "v156", "v157", "v158", "v159",
2161 "v160", "v161", "v162", "v163", "v164", "v165", "v166", "v167",
2162 "v168", "v169", "v170", "v171", "v172", "v173", "v174", "v175",
2163 "v176", "v177", "v178", "v179", "v180", "v181", "v182", "v183",
2164 "v184", "v185", "v186", "v187", "v188", "v189", "v190", "v191",
2165 "v192", "v193", "v194", "v195", "v196", "v197", "v198", "v199",
2166 "v200", "v201", "v202", "v203", "v204", "v205", "v206", "v207",
2167 "v208", "v209", "v210", "v211", "v212", "v213", "v214", "v215",
2168 "v216", "v217", "v218", "v219", "v220", "v221", "v222", "v223",
2169 "v224", "v225", "v226", "v227", "v228", "v229", "v230", "v231",
2170 "v232", "v233", "v234", "v235", "v236", "v237", "v238", "v239",
2171 "v240", "v241", "v242", "v243", "v244", "v245", "v246", "v247",
2172 "v248", "v249", "v250", "v251", "v252", "v253", "v254", "v255",
2173 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
2174 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
2175 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
2176 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
2177 "s32", "s33", "s34", "s35", "s36", "s37", "s38", "s39",
2178 "s40", "s41", "s42", "s43", "s44", "s45", "s46", "s47",
2179 "s48", "s49", "s50", "s51", "s52", "s53", "s54", "s55",
2180 "s56", "s57", "s58", "s59", "s60", "s61", "s62", "s63",
2181 "s64", "s65", "s66", "s67", "s68", "s69", "s70", "s71",
2182 "s72", "s73", "s74", "s75", "s76", "s77", "s78", "s79",
2183 "s80", "s81", "s82", "s83", "s84", "s85", "s86", "s87",
2184 "s88", "s89", "s90", "s91", "s92", "s93", "s94", "s95",
2185 "s96", "s97", "s98", "s99", "s100", "s101", "s102", "s103",
2186 "s104", "s105", "s106", "s107", "s108", "s109", "s110", "s111",
2187 "s112", "s113", "s114", "s115", "s116", "s117", "s118", "s119",
Etienne Bergerone8ae26f2016-03-24 18:29:24 +00002188 "s120", "s121", "s122", "s123", "s124", "s125", "s126", "s127",
Matt Arsenaultb015d622016-02-27 09:06:22 +00002189 "exec", "vcc", "scc", "m0", "flat_scratch", "exec_lo", "exec_hi",
2190 "vcc_lo", "vcc_hi", "flat_scratch_lo", "flat_scratch_hi"
Tom Stellard7b1059b2015-04-14 14:36:56 +00002191};
2192
Craig Topperf054e3a2015-10-19 03:52:27 +00002193ArrayRef<const char *> AMDGPUTargetInfo::getGCCRegNames() const {
2194 return llvm::makeArrayRef(GCCRegNames);
Tom Stellard7b1059b2015-04-14 14:36:56 +00002195}
Matt Arsenault56f008d2014-06-24 20:45:01 +00002196
Matt Arsenault250024f2016-06-08 01:56:42 +00002197bool AMDGPUTargetInfo::initFeatureMap(
2198 llvm::StringMap<bool> &Features,
2199 DiagnosticsEngine &Diags, StringRef CPU,
2200 const std::vector<std::string> &FeatureVec) const {
2201
2202 // XXX - What does the member GPU mean if device name string passed here?
2203 if (getTriple().getArch() == llvm::Triple::amdgcn) {
2204 if (CPU.empty())
2205 CPU = "tahiti";
2206
2207 switch (parseAMDGCNName(CPU)) {
2208 case GK_SOUTHERN_ISLANDS:
2209 case GK_SEA_ISLANDS:
2210 break;
2211
2212 case GK_VOLCANIC_ISLANDS:
2213 Features["s-memrealtime"] = true;
2214 Features["16-bit-insts"] = true;
2215 break;
2216
2217 case GK_NONE:
2218 return false;
2219 default:
2220 llvm_unreachable("unhandled subtarget");
2221 }
2222 } else {
2223 if (CPU.empty())
2224 CPU = "r600";
2225
2226 switch (parseR600Name(CPU)) {
2227 case GK_R600:
2228 case GK_R700:
2229 case GK_EVERGREEN:
2230 case GK_NORTHERN_ISLANDS:
2231 break;
2232 case GK_R600_DOUBLE_OPS:
2233 case GK_R700_DOUBLE_OPS:
2234 case GK_EVERGREEN_DOUBLE_OPS:
2235 case GK_CAYMAN:
2236 Features["fp64"] = true;
2237 break;
2238 case GK_NONE:
2239 return false;
2240 default:
2241 llvm_unreachable("unhandled subtarget");
2242 }
2243 }
2244
2245 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeatureVec);
2246}
2247
Eli Friedman3fd920a2008-08-20 02:34:37 +00002248// Namespace for x86 abstract base class
2249const Builtin::Info BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00002250#define BUILTIN(ID, TYPE, ATTRS) \
2251 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002252#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
Craig Topper07d3b622015-08-07 05:14:44 +00002253 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002254#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
Craig Topper07d3b622015-08-07 05:14:44 +00002255 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Chris Lattner5abdec72009-06-14 01:05:48 +00002256#include "clang/Basic/BuiltinsX86.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00002257};
Eli Friedmanb5366062008-05-20 14:21:01 +00002258
Nuno Lopescfca1f02009-12-23 17:49:57 +00002259static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002260 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
2261 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00002262 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002263 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
2264 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
2265 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00002266 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00002267 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
2268 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Marina Yatsina41c45fa2016-02-03 11:32:08 +00002269 "xmm16", "xmm17", "xmm18", "xmm19", "xmm20", "xmm21", "xmm22", "xmm23",
2270 "xmm24", "xmm25", "xmm26", "xmm27", "xmm28", "xmm29", "xmm30", "xmm31",
2271 "ymm16", "ymm17", "ymm18", "ymm19", "ymm20", "ymm21", "ymm22", "ymm23",
2272 "ymm24", "ymm25", "ymm26", "ymm27", "ymm28", "ymm29", "ymm30", "ymm31",
2273 "zmm0", "zmm1", "zmm2", "zmm3", "zmm4", "zmm5", "zmm6", "zmm7",
2274 "zmm8", "zmm9", "zmm10", "zmm11", "zmm12", "zmm13", "zmm14", "zmm15",
2275 "zmm16", "zmm17", "zmm18", "zmm19", "zmm20", "zmm21", "zmm22", "zmm23",
2276 "zmm24", "zmm25", "zmm26", "zmm27", "zmm28", "zmm29", "zmm30", "zmm31",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002277};
2278
Eric Christophercdd36352011-06-21 00:05:20 +00002279const TargetInfo::AddlRegName AddlRegNames[] = {
2280 { { "al", "ah", "eax", "rax" }, 0 },
2281 { { "bl", "bh", "ebx", "rbx" }, 3 },
2282 { { "cl", "ch", "ecx", "rcx" }, 2 },
2283 { { "dl", "dh", "edx", "rdx" }, 1 },
2284 { { "esi", "rsi" }, 4 },
2285 { { "edi", "rdi" }, 5 },
2286 { { "esp", "rsp" }, 7 },
2287 { { "ebp", "rbp" }, 6 },
Alexey Bataeva7ab1b42015-09-04 03:42:23 +00002288 { { "r8d", "r8w", "r8b" }, 38 },
2289 { { "r9d", "r9w", "r9b" }, 39 },
2290 { { "r10d", "r10w", "r10b" }, 40 },
2291 { { "r11d", "r11w", "r11b" }, 41 },
2292 { { "r12d", "r12w", "r12b" }, 42 },
2293 { { "r13d", "r13w", "r13b" }, 43 },
2294 { { "r14d", "r14w", "r14b" }, 44 },
2295 { { "r15d", "r15w", "r15b" }, 45 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00002296};
2297
2298// X86 target abstract base class; x86-32 and x86-64 are very close, so
2299// most of the implementation can be shared.
2300class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00002301 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002302 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Craig Topper543f3bd2015-10-14 23:47:57 +00002303 } SSELevel = NoSSE;
Eli Friedman33465822011-07-08 23:31:17 +00002304 enum MMX3DNowEnum {
2305 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
Craig Topper543f3bd2015-10-14 23:47:57 +00002306 } MMX3DNowLevel = NoMMX3DNow;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002307 enum XOPEnum {
2308 NoXOP,
2309 SSE4A,
2310 FMA4,
2311 XOP
Craig Topper543f3bd2015-10-14 23:47:57 +00002312 } XOPLevel = NoXOP;
Anders Carlssone437c682010-01-27 03:47:49 +00002313
Craig Topper543f3bd2015-10-14 23:47:57 +00002314 bool HasAES = false;
2315 bool HasPCLMUL = false;
2316 bool HasLZCNT = false;
2317 bool HasRDRND = false;
2318 bool HasFSGSBASE = false;
2319 bool HasBMI = false;
2320 bool HasBMI2 = false;
2321 bool HasPOPCNT = false;
2322 bool HasRTM = false;
2323 bool HasPRFCHW = false;
2324 bool HasRDSEED = false;
2325 bool HasADX = false;
2326 bool HasTBM = false;
2327 bool HasFMA = false;
2328 bool HasF16C = false;
2329 bool HasAVX512CD = false;
2330 bool HasAVX512ER = false;
2331 bool HasAVX512PF = false;
2332 bool HasAVX512DQ = false;
2333 bool HasAVX512BW = false;
2334 bool HasAVX512VL = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002335 bool HasAVX512VBMI = false;
2336 bool HasAVX512IFMA = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002337 bool HasSHA = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002338 bool HasMPX = false;
2339 bool HasSGX = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002340 bool HasCX16 = false;
Craig Toppere33f51f2015-10-16 06:22:36 +00002341 bool HasFXSR = false;
Craig Topperda9fe562015-10-15 05:23:38 +00002342 bool HasXSAVE = false;
2343 bool HasXSAVEOPT = false;
2344 bool HasXSAVEC = false;
2345 bool HasXSAVES = false;
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00002346 bool HasMWAITX = false;
Asaf Badouha9d1e182015-12-31 14:14:07 +00002347 bool HasPKU = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002348 bool HasCLFLUSHOPT = false;
2349 bool HasPCOMMIT = false;
2350 bool HasCLWB = false;
2351 bool HasUMIP = false;
2352 bool HasMOVBE = false;
2353 bool HasPREFETCHWT1 = false;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00002354
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002355 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
2356 ///
2357 /// Each enumeration represents a particular CPU supported by Clang. These
2358 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
2359 enum CPUKind {
2360 CK_Generic,
2361
2362 /// \name i386
2363 /// i386-generation processors.
2364 //@{
2365 CK_i386,
2366 //@}
2367
2368 /// \name i486
2369 /// i486-generation processors.
2370 //@{
2371 CK_i486,
2372 CK_WinChipC6,
2373 CK_WinChip2,
2374 CK_C3,
2375 //@}
2376
2377 /// \name i586
2378 /// i586-generation processors, P5 microarchitecture based.
2379 //@{
2380 CK_i586,
2381 CK_Pentium,
2382 CK_PentiumMMX,
2383 //@}
2384
2385 /// \name i686
2386 /// i686-generation processors, P6 / Pentium M microarchitecture based.
2387 //@{
2388 CK_i686,
2389 CK_PentiumPro,
2390 CK_Pentium2,
2391 CK_Pentium3,
2392 CK_Pentium3M,
2393 CK_PentiumM,
2394 CK_C3_2,
2395
2396 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
2397 /// Clang however has some logic to suport this.
2398 // FIXME: Warn, deprecate, and potentially remove this.
2399 CK_Yonah,
2400 //@}
2401
2402 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00002403 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002404 //@{
2405 CK_Pentium4,
2406 CK_Pentium4M,
2407 CK_Prescott,
2408 CK_Nocona,
2409 //@}
2410
2411 /// \name Core
2412 /// Core microarchitecture based processors.
2413 //@{
2414 CK_Core2,
2415
2416 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
2417 /// codename which GCC no longer accepts as an option to -march, but Clang
2418 /// has some logic for recognizing it.
2419 // FIXME: Warn, deprecate, and potentially remove this.
2420 CK_Penryn,
2421 //@}
2422
2423 /// \name Atom
2424 /// Atom processors
2425 //@{
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002426 CK_Bonnell,
Preston Gurda3c58c02013-09-13 19:27:17 +00002427 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002428 //@}
2429
2430 /// \name Nehalem
2431 /// Nehalem microarchitecture based processors.
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002432 CK_Nehalem,
2433
2434 /// \name Westmere
2435 /// Westmere microarchitecture based processors.
2436 CK_Westmere,
2437
2438 /// \name Sandy Bridge
2439 /// Sandy Bridge microarchitecture based processors.
2440 CK_SandyBridge,
2441
2442 /// \name Ivy Bridge
2443 /// Ivy Bridge microarchitecture based processors.
2444 CK_IvyBridge,
2445
2446 /// \name Haswell
2447 /// Haswell microarchitecture based processors.
2448 CK_Haswell,
2449
2450 /// \name Broadwell
2451 /// Broadwell microarchitecture based processors.
Robert Khasanov50e6f582014-09-19 09:53:48 +00002452 CK_Broadwell,
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002453
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002454 /// \name Skylake Client
2455 /// Skylake client microarchitecture based processors.
2456 CK_SkylakeClient,
2457
2458 /// \name Skylake Server
2459 /// Skylake server microarchitecture based processors.
2460 CK_SkylakeServer,
2461
2462 /// \name Cannonlake Client
2463 /// Cannonlake client microarchitecture based processors.
2464 CK_Cannonlake,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002465
Craig Topper449314e2013-08-20 07:09:39 +00002466 /// \name Knights Landing
2467 /// Knights Landing processor.
2468 CK_KNL,
2469
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002470 /// \name Lakemont
2471 /// Lakemont microarchitecture based processors.
2472 CK_Lakemont,
2473
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002474 /// \name K6
2475 /// K6 architecture processors.
2476 //@{
2477 CK_K6,
2478 CK_K6_2,
2479 CK_K6_3,
2480 //@}
2481
2482 /// \name K7
2483 /// K7 architecture processors.
2484 //@{
2485 CK_Athlon,
2486 CK_AthlonThunderbird,
2487 CK_Athlon4,
2488 CK_AthlonXP,
2489 CK_AthlonMP,
2490 //@}
2491
2492 /// \name K8
2493 /// K8 architecture processors.
2494 //@{
2495 CK_Athlon64,
2496 CK_Athlon64SSE3,
2497 CK_AthlonFX,
2498 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00002499 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002500 CK_Opteron,
2501 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00002502 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002503 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002504
Benjamin Kramer569f2152012-01-10 11:50:18 +00002505 /// \name Bobcat
2506 /// Bobcat architecture processors.
2507 //@{
2508 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002509 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002510 //@}
2511
2512 /// \name Bulldozer
2513 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002514 //@{
2515 CK_BDVER1,
2516 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002517 CK_BDVER3,
Benjamin Kramer56c58222014-05-02 15:47:51 +00002518 CK_BDVER4,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002519 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002520
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002521 /// This specification is deprecated and will be removed in the future.
2522 /// Users should prefer \see CK_K8.
2523 // FIXME: Warn on this when the CPU is set to it.
Saleem Abdulrasoolcb29c1a2014-11-17 18:40:15 +00002524 //@{
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002525 CK_x86_64,
2526 //@}
2527
2528 /// \name Geode
2529 /// Geode processors.
2530 //@{
2531 CK_Geode
2532 //@}
Craig Topper543f3bd2015-10-14 23:47:57 +00002533 } CPU = CK_Generic;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002534
Eric Christopherc50738f2015-08-27 00:05:50 +00002535 CPUKind getCPUKind(StringRef CPU) const {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002536 return llvm::StringSwitch<CPUKind>(CPU)
2537 .Case("i386", CK_i386)
2538 .Case("i486", CK_i486)
2539 .Case("winchip-c6", CK_WinChipC6)
2540 .Case("winchip2", CK_WinChip2)
2541 .Case("c3", CK_C3)
2542 .Case("i586", CK_i586)
2543 .Case("pentium", CK_Pentium)
2544 .Case("pentium-mmx", CK_PentiumMMX)
2545 .Case("i686", CK_i686)
2546 .Case("pentiumpro", CK_PentiumPro)
2547 .Case("pentium2", CK_Pentium2)
2548 .Case("pentium3", CK_Pentium3)
2549 .Case("pentium3m", CK_Pentium3M)
2550 .Case("pentium-m", CK_PentiumM)
2551 .Case("c3-2", CK_C3_2)
2552 .Case("yonah", CK_Yonah)
2553 .Case("pentium4", CK_Pentium4)
2554 .Case("pentium4m", CK_Pentium4M)
2555 .Case("prescott", CK_Prescott)
2556 .Case("nocona", CK_Nocona)
2557 .Case("core2", CK_Core2)
2558 .Case("penryn", CK_Penryn)
2559 .Case("bonnell", CK_Bonnell)
2560 .Case("atom", CK_Bonnell) // Legacy name.
2561 .Case("silvermont", CK_Silvermont)
2562 .Case("slm", CK_Silvermont) // Legacy name.
2563 .Case("nehalem", CK_Nehalem)
2564 .Case("corei7", CK_Nehalem) // Legacy name.
2565 .Case("westmere", CK_Westmere)
2566 .Case("sandybridge", CK_SandyBridge)
2567 .Case("corei7-avx", CK_SandyBridge) // Legacy name.
2568 .Case("ivybridge", CK_IvyBridge)
2569 .Case("core-avx-i", CK_IvyBridge) // Legacy name.
2570 .Case("haswell", CK_Haswell)
2571 .Case("core-avx2", CK_Haswell) // Legacy name.
2572 .Case("broadwell", CK_Broadwell)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002573 .Case("skylake", CK_SkylakeClient)
2574 .Case("skylake-avx512", CK_SkylakeServer)
2575 .Case("skx", CK_SkylakeServer) // Legacy name.
2576 .Case("cannonlake", CK_Cannonlake)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002577 .Case("knl", CK_KNL)
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002578 .Case("lakemont", CK_Lakemont)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002579 .Case("k6", CK_K6)
2580 .Case("k6-2", CK_K6_2)
2581 .Case("k6-3", CK_K6_3)
2582 .Case("athlon", CK_Athlon)
2583 .Case("athlon-tbird", CK_AthlonThunderbird)
2584 .Case("athlon-4", CK_Athlon4)
2585 .Case("athlon-xp", CK_AthlonXP)
2586 .Case("athlon-mp", CK_AthlonMP)
2587 .Case("athlon64", CK_Athlon64)
2588 .Case("athlon64-sse3", CK_Athlon64SSE3)
2589 .Case("athlon-fx", CK_AthlonFX)
2590 .Case("k8", CK_K8)
2591 .Case("k8-sse3", CK_K8SSE3)
2592 .Case("opteron", CK_Opteron)
2593 .Case("opteron-sse3", CK_OpteronSSE3)
2594 .Case("barcelona", CK_AMDFAM10)
2595 .Case("amdfam10", CK_AMDFAM10)
2596 .Case("btver1", CK_BTVER1)
2597 .Case("btver2", CK_BTVER2)
2598 .Case("bdver1", CK_BDVER1)
2599 .Case("bdver2", CK_BDVER2)
2600 .Case("bdver3", CK_BDVER3)
2601 .Case("bdver4", CK_BDVER4)
2602 .Case("x86-64", CK_x86_64)
2603 .Case("geode", CK_Geode)
2604 .Default(CK_Generic);
2605 }
2606
Rafael Espindolaeb265472013-08-21 21:59:03 +00002607 enum FPMathKind {
2608 FP_Default,
2609 FP_SSE,
2610 FP_387
Craig Topper543f3bd2015-10-14 23:47:57 +00002611 } FPMath = FP_Default;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002612
Eli Friedman3fd920a2008-08-20 02:34:37 +00002613public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00002614 X86TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
2615 : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00002616 BigEndian = false;
Andrey Bokhanko94e1d582015-11-05 12:43:09 +00002617 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00002618 }
Craig Topper3164f332014-03-11 03:39:26 +00002619 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00002620 // X87 evaluates with 80 bits "long double" precision.
2621 return SSELevel == NoSSE ? 2 : 0;
2622 }
Craig Topper6c03a542015-10-19 04:51:35 +00002623 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
2624 return llvm::makeArrayRef(BuiltinInfo,
2625 clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner10a5b382007-01-29 05:24:35 +00002626 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002627 ArrayRef<const char *> getGCCRegNames() const override {
2628 return llvm::makeArrayRef(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00002629 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002630 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
2631 return None;
Eric Christophercdd36352011-06-21 00:05:20 +00002632 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002633 ArrayRef<TargetInfo::AddlRegName> getGCCAddlRegNames() const override {
2634 return llvm::makeArrayRef(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00002635 }
Eric Christopherd9832702015-06-29 21:00:05 +00002636 bool validateCpuSupports(StringRef Name) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002637 bool validateAsmConstraint(const char *&Name,
Eric Christopher917e9522014-11-18 22:36:15 +00002638 TargetInfo::ConstraintInfo &info) const override;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002639
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00002640 bool validateGlobalRegisterVariable(StringRef RegName,
2641 unsigned RegSize,
2642 bool &HasSizeMismatch) const override {
2643 // esp and ebp are the only 32-bit registers the x86 backend can currently
2644 // handle.
2645 if (RegName.equals("esp") || RegName.equals("ebp")) {
2646 // Check that the register size is 32-bit.
2647 HasSizeMismatch = RegSize != 32;
2648 return true;
2649 }
2650
2651 return false;
2652 }
2653
Akira Hatanaka974131e2014-09-18 18:17:18 +00002654 bool validateOutputSize(StringRef Constraint, unsigned Size) const override;
2655
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002656 bool validateInputSize(StringRef Constraint, unsigned Size) const override;
2657
Akira Hatanaka974131e2014-09-18 18:17:18 +00002658 virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const;
2659
Craig Topper3164f332014-03-11 03:39:26 +00002660 std::string convertConstraint(const char *&Constraint) const override;
2661 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002662 return "~{dirflag},~{fpsr},~{flags}";
2663 }
Craig Topper3164f332014-03-11 03:39:26 +00002664 void getTargetDefines(const LangOptions &Opts,
2665 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00002666 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
2667 bool Enabled);
2668 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
2669 bool Enabled);
2670 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
2671 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002672 void setFeatureEnabled(llvm::StringMap<bool> &Features,
2673 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00002674 setFeatureEnabledImpl(Features, Name, Enabled);
2675 }
2676 // This exists purely to cut down on the number of virtual calls in
Eric Christopheref1e2952015-08-28 02:13:58 +00002677 // initFeatureMap which calls this repeatedly.
Craig Topper86d79ef2013-09-17 04:51:29 +00002678 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2679 StringRef Name, bool Enabled);
Eric Christopher8c47b422015-10-09 18:39:55 +00002680 bool
2681 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
2682 StringRef CPU,
2683 const std::vector<std::string> &FeaturesVec) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002684 bool hasFeature(StringRef Feature) const override;
2685 bool handleTargetFeatures(std::vector<std::string> &Features,
2686 DiagnosticsEngine &Diags) override;
Alp Toker4925ba72014-06-07 23:30:42 +00002687 StringRef getABI() const override {
Ahmed Bougacha0b938282015-06-22 21:31:43 +00002688 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX512F)
2689 return "avx512";
Craig Topperd945d502015-10-20 00:00:17 +00002690 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002691 return "avx";
Craig Topperd945d502015-10-20 00:00:17 +00002692 if (getTriple().getArch() == llvm::Triple::x86 &&
Derek Schuffc7dd7222012-10-11 15:52:22 +00002693 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002694 return "no-mmx";
2695 return "";
Eli Friedman33465822011-07-08 23:31:17 +00002696 }
Craig Topper3164f332014-03-11 03:39:26 +00002697 bool setCPU(const std::string &Name) override {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002698 CPU = getCPUKind(Name);
Chandler Carruth212334f2011-09-28 08:55:37 +00002699
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002700 // Perform any per-CPU checks necessary to determine if this CPU is
2701 // acceptable.
2702 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
2703 // invalid without explaining *why*.
2704 switch (CPU) {
2705 case CK_Generic:
2706 // No processor selected!
2707 return false;
2708
2709 case CK_i386:
2710 case CK_i486:
2711 case CK_WinChipC6:
2712 case CK_WinChip2:
2713 case CK_C3:
2714 case CK_i586:
2715 case CK_Pentium:
2716 case CK_PentiumMMX:
2717 case CK_i686:
2718 case CK_PentiumPro:
2719 case CK_Pentium2:
2720 case CK_Pentium3:
2721 case CK_Pentium3M:
2722 case CK_PentiumM:
2723 case CK_Yonah:
2724 case CK_C3_2:
2725 case CK_Pentium4:
2726 case CK_Pentium4M:
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002727 case CK_Lakemont:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002728 case CK_Prescott:
2729 case CK_K6:
2730 case CK_K6_2:
2731 case CK_K6_3:
2732 case CK_Athlon:
2733 case CK_AthlonThunderbird:
2734 case CK_Athlon4:
2735 case CK_AthlonXP:
2736 case CK_AthlonMP:
2737 case CK_Geode:
2738 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002739 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002740 return false;
2741
2742 // Fallthrough
2743 case CK_Nocona:
2744 case CK_Core2:
2745 case CK_Penryn:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002746 case CK_Bonnell:
Preston Gurda3c58c02013-09-13 19:27:17 +00002747 case CK_Silvermont:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002748 case CK_Nehalem:
2749 case CK_Westmere:
2750 case CK_SandyBridge:
2751 case CK_IvyBridge:
2752 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002753 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002754 case CK_SkylakeClient:
2755 case CK_SkylakeServer:
2756 case CK_Cannonlake:
Craig Topper449314e2013-08-20 07:09:39 +00002757 case CK_KNL:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002758 case CK_Athlon64:
2759 case CK_Athlon64SSE3:
2760 case CK_AthlonFX:
2761 case CK_K8:
2762 case CK_K8SSE3:
2763 case CK_Opteron:
2764 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00002765 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00002766 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002767 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002768 case CK_BDVER1:
2769 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002770 case CK_BDVER3:
Benjamin Kramer56c58222014-05-02 15:47:51 +00002771 case CK_BDVER4:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002772 case CK_x86_64:
2773 return true;
2774 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00002775 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002776 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002777
Craig Topper3164f332014-03-11 03:39:26 +00002778 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002779
Craig Topper3164f332014-03-11 03:39:26 +00002780 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00002781 // Most of the non-ARM calling conventions are i386 conventions.
2782 switch (CC) {
2783 case CC_X86ThisCall:
2784 case CC_X86FastCall:
2785 case CC_X86StdCall:
2786 case CC_X86VectorCall:
2787 case CC_C:
2788 case CC_Swift:
2789 case CC_X86Pascal:
2790 case CC_IntelOclBicc:
2791 return CCCR_OK;
2792 default:
2793 return CCCR_Warning;
2794 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002795 }
2796
Craig Topper3164f332014-03-11 03:39:26 +00002797 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00002798 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002799 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00002800
2801 bool hasSjLjLowering() const override {
2802 return true;
2803 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002804
2805 void setSupportedOpenCLOpts() override {
2806 getSupportedOpenCLOpts().setAll();
2807 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00002808};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002809
Rafael Espindolaeb265472013-08-21 21:59:03 +00002810bool X86TargetInfo::setFPMath(StringRef Name) {
2811 if (Name == "387") {
2812 FPMath = FP_387;
2813 return true;
2814 }
2815 if (Name == "sse") {
2816 FPMath = FP_SSE;
2817 return true;
2818 }
2819 return false;
2820}
2821
Eric Christopher007b0a02015-08-28 22:32:01 +00002822bool X86TargetInfo::initFeatureMap(
2823 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
Eric Christopher8c47b422015-10-09 18:39:55 +00002824 const std::vector<std::string> &FeaturesVec) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002825 // FIXME: This *really* should not be here.
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002826 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002827 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00002828 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002829
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002830 const CPUKind Kind = getCPUKind(CPU);
Andrey Turetskiy5f1cf5f2016-03-23 11:15:10 +00002831
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002832 // Enable X87 for all X86 processors but Lakemont.
2833 if (Kind != CK_Lakemont)
2834 setFeatureEnabledImpl(Features, "x87", true);
2835
2836 switch (Kind) {
Chandler Carruth212334f2011-09-28 08:55:37 +00002837 case CK_Generic:
2838 case CK_i386:
2839 case CK_i486:
2840 case CK_i586:
2841 case CK_Pentium:
2842 case CK_i686:
2843 case CK_PentiumPro:
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002844 case CK_Lakemont:
Chandler Carruth212334f2011-09-28 08:55:37 +00002845 break;
2846 case CK_PentiumMMX:
2847 case CK_Pentium2:
Craig Topperdb4dc082014-11-06 05:52:19 +00002848 case CK_K6:
2849 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00002850 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002851 break;
2852 case CK_Pentium3:
2853 case CK_Pentium3M:
Craig Topperdb4dc082014-11-06 05:52:19 +00002854 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002855 setFeatureEnabledImpl(Features, "sse", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002856 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002857 break;
2858 case CK_PentiumM:
2859 case CK_Pentium4:
2860 case CK_Pentium4M:
2861 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00002862 setFeatureEnabledImpl(Features, "sse2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002863 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002864 break;
2865 case CK_Yonah:
2866 case CK_Prescott:
2867 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00002868 setFeatureEnabledImpl(Features, "sse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002869 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002870 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002871 break;
2872 case CK_Core2:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002873 case CK_Bonnell:
Craig Topper86d79ef2013-09-17 04:51:29 +00002874 setFeatureEnabledImpl(Features, "ssse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002875 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002876 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002877 break;
2878 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00002879 setFeatureEnabledImpl(Features, "sse4.1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002880 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002881 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002882 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002883 case CK_Cannonlake:
2884 setFeatureEnabledImpl(Features, "avx512ifma", true);
2885 setFeatureEnabledImpl(Features, "avx512vbmi", true);
2886 setFeatureEnabledImpl(Features, "sha", true);
2887 setFeatureEnabledImpl(Features, "umip", true);
2888 // FALLTHROUGH
2889 case CK_SkylakeServer:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002890 setFeatureEnabledImpl(Features, "avx512f", true);
2891 setFeatureEnabledImpl(Features, "avx512cd", true);
2892 setFeatureEnabledImpl(Features, "avx512dq", true);
2893 setFeatureEnabledImpl(Features, "avx512bw", true);
2894 setFeatureEnabledImpl(Features, "avx512vl", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002895 setFeatureEnabledImpl(Features, "pku", true);
2896 setFeatureEnabledImpl(Features, "pcommit", true);
2897 setFeatureEnabledImpl(Features, "clwb", true);
2898 // FALLTHROUGH
2899 case CK_SkylakeClient:
Craig Topperda9fe562015-10-15 05:23:38 +00002900 setFeatureEnabledImpl(Features, "xsavec", true);
2901 setFeatureEnabledImpl(Features, "xsaves", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002902 setFeatureEnabledImpl(Features, "mpx", true);
2903 setFeatureEnabledImpl(Features, "sgx", true);
2904 setFeatureEnabledImpl(Features, "clflushopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002905 // FALLTHROUGH
2906 case CK_Broadwell:
2907 setFeatureEnabledImpl(Features, "rdseed", true);
2908 setFeatureEnabledImpl(Features, "adx", true);
2909 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002910 case CK_Haswell:
Craig Topperdb4dc082014-11-06 05:52:19 +00002911 setFeatureEnabledImpl(Features, "avx2", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002912 setFeatureEnabledImpl(Features, "lzcnt", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002913 setFeatureEnabledImpl(Features, "bmi", true);
2914 setFeatureEnabledImpl(Features, "bmi2", true);
2915 setFeatureEnabledImpl(Features, "rtm", true);
2916 setFeatureEnabledImpl(Features, "fma", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002917 setFeatureEnabledImpl(Features, "movbe", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002918 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002919 case CK_IvyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002920 setFeatureEnabledImpl(Features, "rdrnd", true);
2921 setFeatureEnabledImpl(Features, "f16c", true);
2922 setFeatureEnabledImpl(Features, "fsgsbase", true);
2923 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002924 case CK_SandyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002925 setFeatureEnabledImpl(Features, "avx", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002926 setFeatureEnabledImpl(Features, "xsave", true);
2927 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002928 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002929 case CK_Westmere:
Craig Topperdb4dc082014-11-06 05:52:19 +00002930 case CK_Silvermont:
2931 setFeatureEnabledImpl(Features, "aes", true);
2932 setFeatureEnabledImpl(Features, "pclmul", true);
2933 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002934 case CK_Nehalem:
Craig Topperdb4dc082014-11-06 05:52:19 +00002935 setFeatureEnabledImpl(Features, "sse4.2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002936 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002937 setFeatureEnabledImpl(Features, "cx16", true);
2938 break;
2939 case CK_KNL:
2940 setFeatureEnabledImpl(Features, "avx512f", true);
2941 setFeatureEnabledImpl(Features, "avx512cd", true);
2942 setFeatureEnabledImpl(Features, "avx512er", true);
2943 setFeatureEnabledImpl(Features, "avx512pf", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002944 setFeatureEnabledImpl(Features, "prefetchwt1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002945 setFeatureEnabledImpl(Features, "fxsr", true);
Robert Khasanov50e6f582014-09-19 09:53:48 +00002946 setFeatureEnabledImpl(Features, "rdseed", true);
2947 setFeatureEnabledImpl(Features, "adx", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002948 setFeatureEnabledImpl(Features, "lzcnt", true);
2949 setFeatureEnabledImpl(Features, "bmi", true);
2950 setFeatureEnabledImpl(Features, "bmi2", true);
2951 setFeatureEnabledImpl(Features, "rtm", true);
2952 setFeatureEnabledImpl(Features, "fma", true);
2953 setFeatureEnabledImpl(Features, "rdrnd", true);
2954 setFeatureEnabledImpl(Features, "f16c", true);
2955 setFeatureEnabledImpl(Features, "fsgsbase", true);
2956 setFeatureEnabledImpl(Features, "aes", true);
2957 setFeatureEnabledImpl(Features, "pclmul", true);
2958 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002959 setFeatureEnabledImpl(Features, "xsaveopt", true);
2960 setFeatureEnabledImpl(Features, "xsave", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002961 setFeatureEnabledImpl(Features, "movbe", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002962 break;
2963 case CK_K6_2:
2964 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00002965 case CK_WinChip2:
2966 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002967 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002968 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002969 case CK_Athlon:
2970 case CK_AthlonThunderbird:
2971 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00002972 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002973 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002974 case CK_Athlon4:
2975 case CK_AthlonXP:
2976 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00002977 setFeatureEnabledImpl(Features, "sse", true);
2978 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002979 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002980 break;
2981 case CK_K8:
2982 case CK_Opteron:
2983 case CK_Athlon64:
2984 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00002985 setFeatureEnabledImpl(Features, "sse2", true);
2986 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002987 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002988 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002989 case CK_AMDFAM10:
2990 setFeatureEnabledImpl(Features, "sse4a", true);
2991 setFeatureEnabledImpl(Features, "lzcnt", true);
2992 setFeatureEnabledImpl(Features, "popcnt", true);
2993 // FALLTHROUGH
Chandler Carruth212334f2011-09-28 08:55:37 +00002994 case CK_K8SSE3:
2995 case CK_OpteronSSE3:
2996 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002997 setFeatureEnabledImpl(Features, "sse3", true);
2998 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002999 setFeatureEnabledImpl(Features, "fxsr", true);
Roman Divackyce253d82011-10-30 13:47:56 +00003000 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00003001 case CK_BTVER2:
3002 setFeatureEnabledImpl(Features, "avx", true);
3003 setFeatureEnabledImpl(Features, "aes", true);
3004 setFeatureEnabledImpl(Features, "pclmul", true);
3005 setFeatureEnabledImpl(Features, "bmi", true);
3006 setFeatureEnabledImpl(Features, "f16c", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003007 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00003008 // FALLTHROUGH
Benjamin Kramer569f2152012-01-10 11:50:18 +00003009 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00003010 setFeatureEnabledImpl(Features, "ssse3", true);
3011 setFeatureEnabledImpl(Features, "sse4a", true);
3012 setFeatureEnabledImpl(Features, "lzcnt", true);
3013 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00003014 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003015 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003016 setFeatureEnabledImpl(Features, "fxsr", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003017 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003018 case CK_BDVER4:
3019 setFeatureEnabledImpl(Features, "avx2", true);
3020 setFeatureEnabledImpl(Features, "bmi2", true);
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003021 setFeatureEnabledImpl(Features, "mwaitx", true);
Benjamin Kramer56c58222014-05-02 15:47:51 +00003022 // FALLTHROUGH
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003023 case CK_BDVER3:
Craig Topper8c7f2512014-11-03 06:51:41 +00003024 setFeatureEnabledImpl(Features, "fsgsbase", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003025 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topper8c7f2512014-11-03 06:51:41 +00003026 // FALLTHROUGH
3027 case CK_BDVER2:
Andrea Di Biagio9760a442014-11-06 12:08:57 +00003028 setFeatureEnabledImpl(Features, "bmi", true);
3029 setFeatureEnabledImpl(Features, "fma", true);
3030 setFeatureEnabledImpl(Features, "f16c", true);
3031 setFeatureEnabledImpl(Features, "tbm", true);
3032 // FALLTHROUGH
3033 case CK_BDVER1:
3034 // xop implies avx, sse4a and fma4.
Craig Topper86d79ef2013-09-17 04:51:29 +00003035 setFeatureEnabledImpl(Features, "xop", true);
3036 setFeatureEnabledImpl(Features, "lzcnt", true);
3037 setFeatureEnabledImpl(Features, "aes", true);
3038 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00003039 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003040 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003041 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003042 setFeatureEnabledImpl(Features, "xsave", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003043 break;
Eli Friedman33465822011-07-08 23:31:17 +00003044 }
Eric Christopherbbd746d2015-10-08 20:10:14 +00003045 if (!TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec))
3046 return false;
3047
3048 // Can't do this earlier because we need to be able to explicitly enable
3049 // or disable these features and the things that they depend upon.
3050
3051 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
3052 auto I = Features.find("sse4.2");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003053 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00003054 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-popcnt") ==
3055 FeaturesVec.end())
3056 Features["popcnt"] = true;
3057
3058 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
3059 I = Features.find("3dnow");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003060 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00003061 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-prfchw") ==
3062 FeaturesVec.end())
3063 Features["prfchw"] = true;
3064
Eric Christophera7260af2015-10-08 20:10:18 +00003065 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
3066 // then enable MMX.
3067 I = Features.find("sse");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003068 if (I != Features.end() && I->getValue() &&
Eric Christophera7260af2015-10-08 20:10:18 +00003069 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-mmx") ==
3070 FeaturesVec.end())
3071 Features["mmx"] = true;
3072
Eric Christopherbbd746d2015-10-08 20:10:14 +00003073 return true;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003074}
3075
Rafael Espindolae62e2792013-08-20 13:44:29 +00003076void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00003077 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003078 if (Enabled) {
3079 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003080 case AVX512F:
3081 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003082 case AVX2:
3083 Features["avx2"] = true;
3084 case AVX:
3085 Features["avx"] = true;
Craig Topperda9fe562015-10-15 05:23:38 +00003086 Features["xsave"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003087 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00003088 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003089 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00003090 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003091 case SSSE3:
3092 Features["ssse3"] = true;
3093 case SSE3:
3094 Features["sse3"] = true;
3095 case SSE2:
3096 Features["sse2"] = true;
3097 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00003098 Features["sse"] = true;
3099 case NoSSE:
3100 break;
3101 }
3102 return;
3103 }
3104
3105 switch (Level) {
3106 case NoSSE:
3107 case SSE1:
3108 Features["sse"] = false;
3109 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00003110 Features["sse2"] = Features["pclmul"] = Features["aes"] =
3111 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003112 case SSE3:
3113 Features["sse3"] = false;
3114 setXOPLevel(Features, NoXOP, false);
3115 case SSSE3:
3116 Features["ssse3"] = false;
3117 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00003118 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003119 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00003120 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003121 case AVX:
Craig Topperda9fe562015-10-15 05:23:38 +00003122 Features["fma"] = Features["avx"] = Features["f16c"] = Features["xsave"] =
3123 Features["xsaveopt"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00003124 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003125 case AVX2:
3126 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00003127 case AVX512F:
Eric Christopher917e9522014-11-18 22:36:15 +00003128 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
Craig Toppera31a5da2014-12-27 06:59:37 +00003129 Features["avx512pf"] = Features["avx512dq"] = Features["avx512bw"] =
Craig Topperb4f83a02016-02-29 06:51:38 +00003130 Features["avx512vl"] = Features["avx512vbmi"] =
3131 Features["avx512ifma"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003132 }
3133}
3134
3135void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00003136 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003137 if (Enabled) {
3138 switch (Level) {
3139 case AMD3DNowAthlon:
3140 Features["3dnowa"] = true;
3141 case AMD3DNow:
3142 Features["3dnow"] = true;
3143 case MMX:
3144 Features["mmx"] = true;
3145 case NoMMX3DNow:
3146 break;
3147 }
3148 return;
3149 }
3150
3151 switch (Level) {
3152 case NoMMX3DNow:
3153 case MMX:
3154 Features["mmx"] = false;
3155 case AMD3DNow:
3156 Features["3dnow"] = false;
3157 case AMD3DNowAthlon:
3158 Features["3dnowa"] = false;
3159 }
3160}
3161
3162void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00003163 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003164 if (Enabled) {
3165 switch (Level) {
3166 case XOP:
3167 Features["xop"] = true;
3168 case FMA4:
3169 Features["fma4"] = true;
3170 setSSELevel(Features, AVX, true);
3171 case SSE4A:
3172 Features["sse4a"] = true;
3173 setSSELevel(Features, SSE3, true);
3174 case NoXOP:
3175 break;
3176 }
3177 return;
3178 }
3179
3180 switch (Level) {
3181 case NoXOP:
3182 case SSE4A:
3183 Features["sse4a"] = false;
3184 case FMA4:
3185 Features["fma4"] = false;
3186 case XOP:
3187 Features["xop"] = false;
3188 }
3189}
3190
Craig Topper86d79ef2013-09-17 04:51:29 +00003191void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
3192 StringRef Name, bool Enabled) {
Eric Christopher298ac302015-07-01 00:08:32 +00003193 // This is a bit of a hack to deal with the sse4 target feature when used
3194 // as part of the target attribute. We handle sse4 correctly everywhere
3195 // else. See below for more information on how we handle the sse4 options.
3196 if (Name != "sse4")
3197 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00003198
Craig Topper29561122013-09-19 01:13:07 +00003199 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003200 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003201 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003202 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003203 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003204 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003205 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003206 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003207 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003208 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003209 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003210 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003211 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003212 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003213 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003214 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003215 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003216 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003217 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003218 if (Enabled)
3219 setSSELevel(Features, SSE2, Enabled);
3220 } else if (Name == "pclmul") {
3221 if (Enabled)
3222 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003223 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003224 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003225 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003226 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003227 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003228 setSSELevel(Features, AVX512F, Enabled);
Craig Topperb4f83a02016-02-29 06:51:38 +00003229 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf" ||
3230 Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl" ||
3231 Name == "avx512vbmi" || Name == "avx512ifma") {
Craig Topper679b53a2013-08-21 05:29:10 +00003232 if (Enabled)
3233 setSSELevel(Features, AVX512F, Enabled);
3234 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003235 if (Enabled)
3236 setSSELevel(Features, AVX, Enabled);
3237 } else if (Name == "fma4") {
3238 setXOPLevel(Features, FMA4, Enabled);
3239 } else if (Name == "xop") {
3240 setXOPLevel(Features, XOP, Enabled);
3241 } else if (Name == "sse4a") {
3242 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00003243 } else if (Name == "f16c") {
3244 if (Enabled)
3245 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00003246 } else if (Name == "sha") {
3247 if (Enabled)
3248 setSSELevel(Features, SSE2, Enabled);
Eric Christopher298ac302015-07-01 00:08:32 +00003249 } else if (Name == "sse4") {
3250 // We can get here via the __target__ attribute since that's not controlled
3251 // via the -msse4/-mno-sse4 command line alias. Handle this the same way
3252 // here - turn on the sse4.2 if enabled, turn off the sse4.1 level if
3253 // disabled.
3254 if (Enabled)
3255 setSSELevel(Features, SSE42, Enabled);
3256 else
3257 setSSELevel(Features, SSE41, Enabled);
Craig Topperda9fe562015-10-15 05:23:38 +00003258 } else if (Name == "xsave") {
Craig Topper840927e2016-02-29 06:51:34 +00003259 if (!Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003260 Features["xsaveopt"] = false;
3261 } else if (Name == "xsaveopt" || Name == "xsavec" || Name == "xsaves") {
Craig Topper840927e2016-02-29 06:51:34 +00003262 if (Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003263 Features["xsave"] = true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003264 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003265}
3266
Eric Christopher3ff21b32013-10-16 21:26:26 +00003267/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003268/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00003269bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00003270 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00003271 for (const auto &Feature : Features) {
3272 if (Feature[0] != '+')
Daniel Dunbar979586e2009-11-11 09:38:56 +00003273 continue;
3274
Eric Christopher610fe112015-08-26 08:21:55 +00003275 if (Feature == "+aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00003276 HasAES = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003277 } else if (Feature == "+pclmul") {
Craig Topper3f122a72012-05-31 05:18:48 +00003278 HasPCLMUL = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003279 } else if (Feature == "+lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00003280 HasLZCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003281 } else if (Feature == "+rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00003282 HasRDRND = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003283 } else if (Feature == "+fsgsbase") {
Craig Topper8c7f2512014-11-03 06:51:41 +00003284 HasFSGSBASE = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003285 } else if (Feature == "+bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00003286 HasBMI = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003287 } else if (Feature == "+bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00003288 HasBMI2 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003289 } else if (Feature == "+popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00003290 HasPOPCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003291 } else if (Feature == "+rtm") {
Michael Liao625a8752012-11-10 05:17:46 +00003292 HasRTM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003293 } else if (Feature == "+prfchw") {
Michael Liao74f4eaf2013-03-26 17:52:08 +00003294 HasPRFCHW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003295 } else if (Feature == "+rdseed") {
Michael Liaoffaae352013-03-29 05:17:55 +00003296 HasRDSEED = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003297 } else if (Feature == "+adx") {
Robert Khasanov50e6f582014-09-19 09:53:48 +00003298 HasADX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003299 } else if (Feature == "+tbm") {
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003300 HasTBM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003301 } else if (Feature == "+fma") {
Craig Topperbba778b2012-06-03 21:46:30 +00003302 HasFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003303 } else if (Feature == "+f16c") {
Manman Rena45358c2012-10-11 00:59:55 +00003304 HasF16C = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003305 } else if (Feature == "+avx512cd") {
Craig Topper679b53a2013-08-21 05:29:10 +00003306 HasAVX512CD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003307 } else if (Feature == "+avx512er") {
Craig Topper679b53a2013-08-21 05:29:10 +00003308 HasAVX512ER = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003309 } else if (Feature == "+avx512pf") {
Craig Topper679b53a2013-08-21 05:29:10 +00003310 HasAVX512PF = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003311 } else if (Feature == "+avx512dq") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003312 HasAVX512DQ = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003313 } else if (Feature == "+avx512bw") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003314 HasAVX512BW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003315 } else if (Feature == "+avx512vl") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003316 HasAVX512VL = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003317 } else if (Feature == "+avx512vbmi") {
3318 HasAVX512VBMI = true;
3319 } else if (Feature == "+avx512ifma") {
3320 HasAVX512IFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003321 } else if (Feature == "+sha") {
Ben Langmuir58078d02013-09-19 13:22:04 +00003322 HasSHA = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003323 } else if (Feature == "+mpx") {
3324 HasMPX = true;
3325 } else if (Feature == "+movbe") {
3326 HasMOVBE = true;
3327 } else if (Feature == "+sgx") {
3328 HasSGX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003329 } else if (Feature == "+cx16") {
Nick Lewycky50e8f482013-10-05 20:14:27 +00003330 HasCX16 = true;
Craig Toppere33f51f2015-10-16 06:22:36 +00003331 } else if (Feature == "+fxsr") {
3332 HasFXSR = true;
Craig Topperda9fe562015-10-15 05:23:38 +00003333 } else if (Feature == "+xsave") {
3334 HasXSAVE = true;
3335 } else if (Feature == "+xsaveopt") {
3336 HasXSAVEOPT = true;
3337 } else if (Feature == "+xsavec") {
3338 HasXSAVEC = true;
3339 } else if (Feature == "+xsaves") {
3340 HasXSAVES = true;
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003341 } else if (Feature == "+mwaitx") {
3342 HasMWAITX = true;
Asaf Badouha9d1e182015-12-31 14:14:07 +00003343 } else if (Feature == "+pku") {
3344 HasPKU = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003345 } else if (Feature == "+clflushopt") {
3346 HasCLFLUSHOPT = true;
3347 } else if (Feature == "+pcommit") {
3348 HasPCOMMIT = true;
3349 } else if (Feature == "+clwb") {
3350 HasCLWB = true;
3351 } else if (Feature == "+umip") {
3352 HasUMIP = true;
3353 } else if (Feature == "+prefetchwt1") {
3354 HasPREFETCHWT1 = true;
Nick Lewycky50e8f482013-10-05 20:14:27 +00003355 }
3356
Benjamin Kramer27402c62012-03-05 15:10:44 +00003357 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003358 .Case("+avx512f", AVX512F)
3359 .Case("+avx2", AVX2)
3360 .Case("+avx", AVX)
3361 .Case("+sse4.2", SSE42)
3362 .Case("+sse4.1", SSE41)
3363 .Case("+ssse3", SSSE3)
3364 .Case("+sse3", SSE3)
3365 .Case("+sse2", SSE2)
3366 .Case("+sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00003367 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003368 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003369
Eli Friedman33465822011-07-08 23:31:17 +00003370 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00003371 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003372 .Case("+3dnowa", AMD3DNowAthlon)
3373 .Case("+3dnow", AMD3DNow)
3374 .Case("+mmx", MMX)
Eli Friedman33465822011-07-08 23:31:17 +00003375 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00003376 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003377
3378 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003379 .Case("+xop", XOP)
3380 .Case("+fma4", FMA4)
3381 .Case("+sse4a", SSE4A)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003382 .Default(NoXOP);
3383 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003384 }
Eli Friedman33465822011-07-08 23:31:17 +00003385
Rafael Espindolaeb265472013-08-21 21:59:03 +00003386 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
3387 // matches the selected sse level.
Craig Topperd945d502015-10-20 00:00:17 +00003388 if ((FPMath == FP_SSE && SSELevel < SSE1) ||
3389 (FPMath == FP_387 && SSELevel >= SSE1)) {
3390 Diags.Report(diag::err_target_unsupported_fpmath) <<
3391 (FPMath == FP_SSE ? "sse" : "387");
Rafael Espindolaeb265472013-08-21 21:59:03 +00003392 return false;
3393 }
3394
Alexey Bataev00396512015-07-02 03:40:19 +00003395 SimdDefaultAlign =
Ahmed Bougacha68bf64e2015-08-27 22:24:56 +00003396 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Rafael Espindolaeb265472013-08-21 21:59:03 +00003397 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00003398}
Chris Lattnerecd49032009-03-02 22:27:17 +00003399
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003400/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
3401/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00003402void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003403 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00003404 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00003405 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003406 Builder.defineMacro("__amd64__");
3407 Builder.defineMacro("__amd64");
3408 Builder.defineMacro("__x86_64");
3409 Builder.defineMacro("__x86_64__");
Bob Wilsona2acb1e2014-08-08 23:46:28 +00003410 if (getTriple().getArchName() == "x86_64h") {
3411 Builder.defineMacro("__x86_64h");
3412 Builder.defineMacro("__x86_64h__");
3413 }
Chris Lattnerecd49032009-03-02 22:27:17 +00003414 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003415 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00003416 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003417
Chris Lattnerecd49032009-03-02 22:27:17 +00003418 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003419 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
3420 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00003421 switch (CPU) {
3422 case CK_Generic:
3423 break;
3424 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003425 // The rest are coming from the i386 define above.
3426 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003427 break;
3428 case CK_i486:
3429 case CK_WinChipC6:
3430 case CK_WinChip2:
3431 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003432 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00003433 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003434 case CK_PentiumMMX:
3435 Builder.defineMacro("__pentium_mmx__");
3436 Builder.defineMacro("__tune_pentium_mmx__");
3437 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003438 case CK_i586:
3439 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003440 defineCPUMacros(Builder, "i586");
3441 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00003442 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003443 case CK_Pentium3:
3444 case CK_Pentium3M:
3445 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003446 Builder.defineMacro("__tune_pentium3__");
3447 // Fallthrough
3448 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00003449 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003450 Builder.defineMacro("__tune_pentium2__");
3451 // Fallthrough
3452 case CK_PentiumPro:
3453 Builder.defineMacro("__tune_i686__");
3454 Builder.defineMacro("__tune_pentiumpro__");
3455 // Fallthrough
3456 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003457 Builder.defineMacro("__i686");
3458 Builder.defineMacro("__i686__");
3459 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
3460 Builder.defineMacro("__pentiumpro");
3461 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003462 break;
3463 case CK_Pentium4:
3464 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003465 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00003466 break;
3467 case CK_Yonah:
3468 case CK_Prescott:
3469 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003470 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00003471 break;
3472 case CK_Core2:
3473 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003474 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00003475 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003476 case CK_Bonnell:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003477 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00003478 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00003479 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00003480 defineCPUMacros(Builder, "slm");
3481 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003482 case CK_Nehalem:
3483 case CK_Westmere:
3484 case CK_SandyBridge:
3485 case CK_IvyBridge:
3486 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00003487 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003488 case CK_SkylakeClient:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003489 // FIXME: Historically, we defined this legacy name, it would be nice to
3490 // remove it at some point. We've never exposed fine-grained names for
3491 // recent primary x86 CPUs, and we should keep it that way.
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003492 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00003493 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003494 case CK_SkylakeServer:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003495 defineCPUMacros(Builder, "skx");
3496 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003497 case CK_Cannonlake:
3498 break;
Craig Topper449314e2013-08-20 07:09:39 +00003499 case CK_KNL:
3500 defineCPUMacros(Builder, "knl");
3501 break;
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003502 case CK_Lakemont:
3503 Builder.defineMacro("__tune_lakemont__");
3504 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003505 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003506 Builder.defineMacro("__k6_2__");
3507 Builder.defineMacro("__tune_k6_2__");
3508 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003509 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003510 if (CPU != CK_K6_2) { // In case of fallthrough
3511 // FIXME: GCC may be enabling these in cases where some other k6
3512 // architecture is specified but -m3dnow is explicitly provided. The
3513 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003514 Builder.defineMacro("__k6_3__");
3515 Builder.defineMacro("__tune_k6_3__");
3516 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003517 // Fallthrough
3518 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003519 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00003520 break;
3521 case CK_Athlon:
3522 case CK_AthlonThunderbird:
3523 case CK_Athlon4:
3524 case CK_AthlonXP:
3525 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003526 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003527 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003528 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003529 Builder.defineMacro("__tune_athlon_sse__");
3530 }
Chandler Carruth212334f2011-09-28 08:55:37 +00003531 break;
3532 case CK_K8:
3533 case CK_K8SSE3:
3534 case CK_x86_64:
3535 case CK_Opteron:
3536 case CK_OpteronSSE3:
3537 case CK_Athlon64:
3538 case CK_Athlon64SSE3:
3539 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003540 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00003541 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00003542 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003543 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00003544 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00003545 case CK_BTVER1:
3546 defineCPUMacros(Builder, "btver1");
3547 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003548 case CK_BTVER2:
3549 defineCPUMacros(Builder, "btver2");
3550 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003551 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003552 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003553 break;
3554 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003555 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003556 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003557 case CK_BDVER3:
3558 defineCPUMacros(Builder, "bdver3");
3559 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003560 case CK_BDVER4:
3561 defineCPUMacros(Builder, "bdver4");
3562 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003563 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003564 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00003565 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003566 }
Chris Lattner96e43572009-03-02 22:40:39 +00003567
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003568 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003569 Builder.defineMacro("__REGISTER_PREFIX__", "");
3570
Chris Lattner6df41af2009-04-19 17:32:33 +00003571 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
3572 // functions in glibc header files that use FP Stack inline asm which the
3573 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003574 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003575
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003576 if (HasAES)
3577 Builder.defineMacro("__AES__");
3578
Craig Topper3f122a72012-05-31 05:18:48 +00003579 if (HasPCLMUL)
3580 Builder.defineMacro("__PCLMUL__");
3581
Craig Topper22967d42011-12-25 05:06:45 +00003582 if (HasLZCNT)
3583 Builder.defineMacro("__LZCNT__");
3584
Benjamin Kramer1e250392012-07-07 09:39:18 +00003585 if (HasRDRND)
3586 Builder.defineMacro("__RDRND__");
3587
Craig Topper8c7f2512014-11-03 06:51:41 +00003588 if (HasFSGSBASE)
3589 Builder.defineMacro("__FSGSBASE__");
3590
Craig Topper22967d42011-12-25 05:06:45 +00003591 if (HasBMI)
3592 Builder.defineMacro("__BMI__");
3593
3594 if (HasBMI2)
3595 Builder.defineMacro("__BMI2__");
3596
Craig Topper1de83482011-12-29 16:10:46 +00003597 if (HasPOPCNT)
3598 Builder.defineMacro("__POPCNT__");
3599
Michael Liao625a8752012-11-10 05:17:46 +00003600 if (HasRTM)
3601 Builder.defineMacro("__RTM__");
3602
Michael Liao74f4eaf2013-03-26 17:52:08 +00003603 if (HasPRFCHW)
3604 Builder.defineMacro("__PRFCHW__");
3605
Michael Liaoffaae352013-03-29 05:17:55 +00003606 if (HasRDSEED)
3607 Builder.defineMacro("__RDSEED__");
3608
Robert Khasanov50e6f582014-09-19 09:53:48 +00003609 if (HasADX)
3610 Builder.defineMacro("__ADX__");
3611
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003612 if (HasTBM)
3613 Builder.defineMacro("__TBM__");
3614
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003615 if (HasMWAITX)
3616 Builder.defineMacro("__MWAITX__");
3617
Rafael Espindolae62e2792013-08-20 13:44:29 +00003618 switch (XOPLevel) {
3619 case XOP:
3620 Builder.defineMacro("__XOP__");
3621 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00003622 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00003623 case SSE4A:
3624 Builder.defineMacro("__SSE4A__");
3625 case NoXOP:
3626 break;
3627 }
Craig Topperffdb46c2011-12-30 07:33:42 +00003628
Craig Topperbba778b2012-06-03 21:46:30 +00003629 if (HasFMA)
3630 Builder.defineMacro("__FMA__");
3631
Manman Rena45358c2012-10-11 00:59:55 +00003632 if (HasF16C)
3633 Builder.defineMacro("__F16C__");
3634
Craig Topper679b53a2013-08-21 05:29:10 +00003635 if (HasAVX512CD)
3636 Builder.defineMacro("__AVX512CD__");
3637 if (HasAVX512ER)
3638 Builder.defineMacro("__AVX512ER__");
3639 if (HasAVX512PF)
3640 Builder.defineMacro("__AVX512PF__");
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003641 if (HasAVX512DQ)
3642 Builder.defineMacro("__AVX512DQ__");
3643 if (HasAVX512BW)
3644 Builder.defineMacro("__AVX512BW__");
3645 if (HasAVX512VL)
3646 Builder.defineMacro("__AVX512VL__");
Craig Topperb4f83a02016-02-29 06:51:38 +00003647 if (HasAVX512VBMI)
3648 Builder.defineMacro("__AVX512VBMI__");
3649 if (HasAVX512IFMA)
3650 Builder.defineMacro("__AVX512IFMA__");
Craig Topper679b53a2013-08-21 05:29:10 +00003651
Ben Langmuir58078d02013-09-19 13:22:04 +00003652 if (HasSHA)
3653 Builder.defineMacro("__SHA__");
3654
Craig Toppere33f51f2015-10-16 06:22:36 +00003655 if (HasFXSR)
3656 Builder.defineMacro("__FXSR__");
Craig Topperda9fe562015-10-15 05:23:38 +00003657 if (HasXSAVE)
3658 Builder.defineMacro("__XSAVE__");
3659 if (HasXSAVEOPT)
3660 Builder.defineMacro("__XSAVEOPT__");
3661 if (HasXSAVEC)
3662 Builder.defineMacro("__XSAVEC__");
3663 if (HasXSAVES)
3664 Builder.defineMacro("__XSAVES__");
Asaf Badouha9d1e182015-12-31 14:14:07 +00003665 if (HasPKU)
3666 Builder.defineMacro("__PKU__");
Nick Lewycky50e8f482013-10-05 20:14:27 +00003667 if (HasCX16)
3668 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
3669
Chris Lattner96e43572009-03-02 22:40:39 +00003670 // Each case falls through to the previous one here.
3671 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003672 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00003673 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00003674 case AVX2:
3675 Builder.defineMacro("__AVX2__");
3676 case AVX:
3677 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00003678 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003679 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00003680 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003681 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00003682 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003683 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003684 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003685 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003686 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003687 Builder.defineMacro("__SSE2__");
3688 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00003689 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003690 Builder.defineMacro("__SSE__");
3691 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00003692 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00003693 break;
3694 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003695
Derek Schuffc7dd7222012-10-11 15:52:22 +00003696 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003697 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003698 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00003699 case AVX2:
3700 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003701 case SSE42:
3702 case SSE41:
3703 case SSSE3:
3704 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003705 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003706 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003707 break;
3708 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003709 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003710 break;
3711 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003712 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003713 }
3714 }
3715
Anders Carlssone437c682010-01-27 03:47:49 +00003716 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00003717 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00003718 case AMD3DNowAthlon:
3719 Builder.defineMacro("__3dNOW_A__");
3720 case AMD3DNow:
3721 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00003722 case MMX:
3723 Builder.defineMacro("__MMX__");
3724 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00003725 break;
3726 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00003727
3728 if (CPU >= CK_i486) {
3729 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
3730 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
3731 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
3732 }
3733 if (CPU >= CK_i586)
3734 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00003735}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003736
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003737bool X86TargetInfo::hasFeature(StringRef Feature) const {
3738 return llvm::StringSwitch<bool>(Feature)
3739 .Case("aes", HasAES)
3740 .Case("avx", SSELevel >= AVX)
3741 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00003742 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00003743 .Case("avx512cd", HasAVX512CD)
3744 .Case("avx512er", HasAVX512ER)
3745 .Case("avx512pf", HasAVX512PF)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003746 .Case("avx512dq", HasAVX512DQ)
3747 .Case("avx512bw", HasAVX512BW)
3748 .Case("avx512vl", HasAVX512VL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003749 .Case("avx512vbmi", HasAVX512VBMI)
3750 .Case("avx512ifma", HasAVX512IFMA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003751 .Case("bmi", HasBMI)
3752 .Case("bmi2", HasBMI2)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003753 .Case("clflushopt", HasCLFLUSHOPT)
3754 .Case("clwb", HasCLWB)
Nick Lewycky50e8f482013-10-05 20:14:27 +00003755 .Case("cx16", HasCX16)
3756 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00003757 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003758 .Case("fma4", XOPLevel >= FMA4)
Craig Topper8c7f2512014-11-03 06:51:41 +00003759 .Case("fsgsbase", HasFSGSBASE)
Craig Toppere33f51f2015-10-16 06:22:36 +00003760 .Case("fxsr", HasFXSR)
Craig Topper8dbc5842014-11-03 07:05:26 +00003761 .Case("lzcnt", HasLZCNT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003762 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
3763 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
3764 .Case("mmx", MMX3DNowLevel >= MMX)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003765 .Case("movbe", HasMOVBE)
3766 .Case("mpx", HasMPX)
Craig Topper3f122a72012-05-31 05:18:48 +00003767 .Case("pclmul", HasPCLMUL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003768 .Case("pcommit", HasPCOMMIT)
3769 .Case("pku", HasPKU)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003770 .Case("popcnt", HasPOPCNT)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003771 .Case("prefetchwt1", HasPREFETCHWT1)
Michael Liao74f4eaf2013-03-26 17:52:08 +00003772 .Case("prfchw", HasPRFCHW)
Craig Topper8dbc5842014-11-03 07:05:26 +00003773 .Case("rdrnd", HasRDRND)
Michael Liaoffaae352013-03-29 05:17:55 +00003774 .Case("rdseed", HasRDSEED)
Craig Topper8dbc5842014-11-03 07:05:26 +00003775 .Case("rtm", HasRTM)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003776 .Case("sgx", HasSGX)
Ben Langmuir58078d02013-09-19 13:22:04 +00003777 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003778 .Case("sse", SSELevel >= SSE1)
3779 .Case("sse2", SSELevel >= SSE2)
3780 .Case("sse3", SSELevel >= SSE3)
3781 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00003782 .Case("sse4.1", SSELevel >= SSE41)
3783 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003784 .Case("sse4a", XOPLevel >= SSE4A)
Craig Topper8dbc5842014-11-03 07:05:26 +00003785 .Case("tbm", HasTBM)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003786 .Case("umip", HasUMIP)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003787 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00003788 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
3789 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003790 .Case("xop", XOPLevel >= XOP)
Craig Topperda9fe562015-10-15 05:23:38 +00003791 .Case("xsave", HasXSAVE)
3792 .Case("xsavec", HasXSAVEC)
3793 .Case("xsaves", HasXSAVES)
3794 .Case("xsaveopt", HasXSAVEOPT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003795 .Default(false);
3796}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003797
Eric Christopherd9832702015-06-29 21:00:05 +00003798// We can't use a generic validation scheme for the features accepted here
3799// versus subtarget features accepted in the target attribute because the
3800// bitfield structure that's initialized in the runtime only supports the
3801// below currently rather than the full range of subtarget features. (See
3802// X86TargetInfo::hasFeature for a somewhat comprehensive list).
3803bool X86TargetInfo::validateCpuSupports(StringRef FeatureStr) const {
3804 return llvm::StringSwitch<bool>(FeatureStr)
3805 .Case("cmov", true)
3806 .Case("mmx", true)
3807 .Case("popcnt", true)
3808 .Case("sse", true)
3809 .Case("sse2", true)
3810 .Case("sse3", true)
Benjamin Kramerf4c520d2016-05-20 15:21:08 +00003811 .Case("ssse3", true)
Eric Christopherd9832702015-06-29 21:00:05 +00003812 .Case("sse4.1", true)
3813 .Case("sse4.2", true)
3814 .Case("avx", true)
3815 .Case("avx2", true)
3816 .Case("sse4a", true)
3817 .Case("fma4", true)
3818 .Case("xop", true)
3819 .Case("fma", true)
3820 .Case("avx512f", true)
3821 .Case("bmi", true)
3822 .Case("bmi2", true)
Benjamin Kramerf4c520d2016-05-20 15:21:08 +00003823 .Case("aes", true)
3824 .Case("pclmul", true)
3825 .Case("avx512vl", true)
3826 .Case("avx512bw", true)
3827 .Case("avx512dq", true)
3828 .Case("avx512cd", true)
3829 .Case("avx512er", true)
3830 .Case("avx512pf", true)
3831 .Case("avx512vbmi", true)
3832 .Case("avx512ifma", true)
Eric Christopherd9832702015-06-29 21:00:05 +00003833 .Default(false);
3834}
3835
Eli Friedman3fd920a2008-08-20 02:34:37 +00003836bool
Anders Carlsson58436352009-02-28 17:11:49 +00003837X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00003838 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00003839 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003840 default: return false;
Alexey Bataev91e58602015-07-20 12:08:00 +00003841 // Constant constraints.
3842 case 'e': // 32-bit signed integer constant for use with sign-extending x86_64
3843 // instructions.
3844 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
3845 // x86_64 instructions.
3846 case 's':
3847 Info.setRequiresImmediate();
3848 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003849 case 'I':
3850 Info.setRequiresImmediate(0, 31);
3851 return true;
3852 case 'J':
3853 Info.setRequiresImmediate(0, 63);
3854 return true;
3855 case 'K':
3856 Info.setRequiresImmediate(-128, 127);
3857 return true;
3858 case 'L':
Alexey Bataev91e58602015-07-20 12:08:00 +00003859 Info.setRequiresImmediate({ int(0xff), int(0xffff), int(0xffffffff) });
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003860 return true;
3861 case 'M':
3862 Info.setRequiresImmediate(0, 3);
3863 return true;
3864 case 'N':
3865 Info.setRequiresImmediate(0, 255);
3866 return true;
3867 case 'O':
3868 Info.setRequiresImmediate(0, 127);
3869 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003870 // Register constraints.
3871 case 'Y': // 'Y' is the first character for several 2-character constraints.
3872 // Shift the pointer to the second character of the constraint.
3873 Name++;
3874 switch (*Name) {
3875 default:
3876 return false;
3877 case '0': // First SSE register.
3878 case 't': // Any SSE register, when SSE2 is enabled.
3879 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
3880 case 'm': // Any MMX register, when inter-unit moves enabled.
3881 Info.setAllowsRegister();
3882 return true;
3883 }
3884 case 'f': // Any x87 floating point stack register.
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003885 // Constraint 'f' cannot be used for output operands.
3886 if (Info.ConstraintStr[0] == '=')
3887 return false;
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003888 Info.setAllowsRegister();
3889 return true;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003890 case 'a': // eax.
3891 case 'b': // ebx.
3892 case 'c': // ecx.
3893 case 'd': // edx.
3894 case 'S': // esi.
3895 case 'D': // edi.
3896 case 'A': // edx:eax.
Alexey Bataev91e58602015-07-20 12:08:00 +00003897 case 't': // Top of floating point stack.
3898 case 'u': // Second from top of floating point stack.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003899 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00003900 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00003901 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003902 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00003903 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
3904 case 'l': // "Index" registers: any general register that can be used as an
3905 // index in a base+index memory access.
3906 Info.setAllowsRegister();
3907 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003908 // Floating point constant constraints.
Dale Johannesen46742a42010-08-24 22:33:12 +00003909 case 'C': // SSE floating point constant.
3910 case 'G': // x87 floating point constant.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003911 return true;
3912 }
3913}
3914
Akira Hatanaka974131e2014-09-18 18:17:18 +00003915bool X86TargetInfo::validateOutputSize(StringRef Constraint,
3916 unsigned Size) const {
3917 // Strip off constraint modifiers.
3918 while (Constraint[0] == '=' ||
3919 Constraint[0] == '+' ||
3920 Constraint[0] == '&')
3921 Constraint = Constraint.substr(1);
3922
3923 return validateOperandSize(Constraint, Size);
3924}
3925
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003926bool X86TargetInfo::validateInputSize(StringRef Constraint,
3927 unsigned Size) const {
Akira Hatanaka974131e2014-09-18 18:17:18 +00003928 return validateOperandSize(Constraint, Size);
3929}
3930
3931bool X86TargetInfo::validateOperandSize(StringRef Constraint,
3932 unsigned Size) const {
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003933 switch (Constraint[0]) {
3934 default: break;
3935 case 'y':
3936 return Size <= 64;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003937 case 'f':
3938 case 't':
3939 case 'u':
3940 return Size <= 128;
Hans Wennborg3c619a42014-09-18 20:24:04 +00003941 case 'x':
Alexey Bataev91e58602015-07-20 12:08:00 +00003942 if (SSELevel >= AVX512F)
3943 // 512-bit zmm registers can be used if target supports AVX512F.
3944 return Size <= 512U;
3945 else if (SSELevel >= AVX)
3946 // 256-bit ymm registers can be used if target supports AVX.
3947 return Size <= 256U;
3948 return Size <= 128U;
3949 case 'Y':
3950 // 'Y' is the first character for several 2-character constraints.
3951 switch (Constraint[1]) {
3952 default: break;
3953 case 'm':
3954 // 'Ym' is synonymous with 'y'.
3955 return Size <= 64;
3956 case 'i':
3957 case 't':
3958 // 'Yi' and 'Yt' are synonymous with 'x' when SSE2 is enabled.
3959 if (SSELevel >= AVX512F)
3960 return Size <= 512U;
3961 else if (SSELevel >= AVX)
3962 return Size <= 256U;
3963 return SSELevel >= SSE2 && Size <= 128U;
3964 }
3965
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003966 }
3967
3968 return true;
3969}
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00003970
Eli Friedman3fd920a2008-08-20 02:34:37 +00003971std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003972X86TargetInfo::convertConstraint(const char *&Constraint) const {
3973 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003974 case 'a': return std::string("{ax}");
3975 case 'b': return std::string("{bx}");
3976 case 'c': return std::string("{cx}");
3977 case 'd': return std::string("{dx}");
3978 case 'S': return std::string("{si}");
3979 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00003980 case 'p': // address
3981 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00003982 case 't': // top of floating point stack.
3983 return std::string("{st}");
3984 case 'u': // second from top of floating point stack.
3985 return std::string("{st(1)}"); // second from top of floating point stack.
3986 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003987 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00003988 }
3989}
Chris Lattner5ba61f02006-10-14 07:39:34 +00003990
Eli Friedman3fd920a2008-08-20 02:34:37 +00003991// X86-32 generic target
3992class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00003993public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00003994 X86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
3995 : X86TargetInfo(Triple, Opts) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003996 DoubleAlign = LongLongAlign = 32;
3997 LongDoubleWidth = 96;
3998 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00003999 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00004000 resetDataLayout("e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128");
Eli Friedman32ca82a2009-03-29 20:31:09 +00004001 SizeType = UnsignedInt;
4002 PtrDiffType = SignedInt;
4003 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00004004 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00004005
4006 // Use fpret for all types.
4007 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
4008 (1 << TargetInfo::Double) |
4009 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004010
4011 // x86-32 has atomics up to 8 bytes
4012 // FIXME: Check that we actually have cmpxchg8b before setting
4013 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
4014 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004015 }
Craig Topper3164f332014-03-11 03:39:26 +00004016 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004017 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004018 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004019
Craig Topper3164f332014-03-11 03:39:26 +00004020 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00004021 if (RegNo == 0) return 0;
4022 if (RegNo == 1) return 2;
4023 return -1;
4024 }
Akira Hatanaka974131e2014-09-18 18:17:18 +00004025 bool validateOperandSize(StringRef Constraint,
4026 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00004027 switch (Constraint[0]) {
4028 default: break;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004029 case 'R':
4030 case 'q':
4031 case 'Q':
Bill Wendling887b4852012-11-12 06:42:51 +00004032 case 'a':
4033 case 'b':
4034 case 'c':
4035 case 'd':
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004036 case 'S':
4037 case 'D':
Bill Wendling3c7fed82012-11-12 18:52:32 +00004038 return Size <= 32;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004039 case 'A':
4040 return Size <= 64;
Bill Wendling887b4852012-11-12 06:42:51 +00004041 }
4042
Akira Hatanaka974131e2014-09-18 18:17:18 +00004043 return X86TargetInfo::validateOperandSize(Constraint, Size);
Bill Wendling887b4852012-11-12 06:42:51 +00004044 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004045};
Eli Friedman3fd920a2008-08-20 02:34:37 +00004046
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004047class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
4048public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004049 NetBSDI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4050 : NetBSDTargetInfo<X86_32TargetInfo>(Triple, Opts) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004051
Craig Topper3164f332014-03-11 03:39:26 +00004052 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00004053 unsigned Major, Minor, Micro;
4054 getTriple().getOSVersion(Major, Minor, Micro);
4055 // New NetBSD uses the default rounding mode.
4056 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
4057 return X86_32TargetInfo::getFloatEvalMethod();
4058 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004059 return 1;
4060 }
4061};
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004062
Eli Friedmane3aa4542009-07-05 18:47:56 +00004063class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
4064public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004065 OpenBSDI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4066 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00004067 SizeType = UnsignedLong;
4068 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004069 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00004070 }
4071};
Eli Friedmane3aa4542009-07-05 18:47:56 +00004072
Eli Friedman9fa28852012-08-08 23:57:20 +00004073class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
4074public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004075 BitrigI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4076 : BitrigTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman9fa28852012-08-08 23:57:20 +00004077 SizeType = UnsignedLong;
4078 IntPtrType = SignedLong;
4079 PtrDiffType = SignedLong;
4080 }
4081};
Eli Friedman9fa28852012-08-08 23:57:20 +00004082
Torok Edwinb2b37c62009-06-30 17:10:35 +00004083class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004084public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004085 DarwinI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4086 : DarwinTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004087 LongDoubleWidth = 128;
4088 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004089 SuitableAlign = 128;
Tim Northover5627d392015-10-30 16:30:45 +00004090 MaxVectorAlign = 256;
4091 // The watchOS simulator uses the builtin bool type for Objective-C.
4092 llvm::Triple T = llvm::Triple(Triple);
4093 if (T.isWatchOS())
4094 UseSignedCharForObjCBool = false;
Eli Friedman32ca82a2009-03-29 20:31:09 +00004095 SizeType = UnsignedLong;
4096 IntPtrType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00004097 resetDataLayout("e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128");
Daniel Dunbarbd606522010-05-27 00:35:16 +00004098 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00004099 }
4100
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004101 bool handleTargetFeatures(std::vector<std::string> &Features,
4102 DiagnosticsEngine &Diags) override {
4103 if (!DarwinTargetInfo<X86_32TargetInfo>::handleTargetFeatures(Features,
4104 Diags))
4105 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004106 // We now know the features we have: we can decide how to align vectors.
4107 MaxVectorAlign =
4108 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004109 return true;
4110 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004111};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004112
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004113// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004114class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004115public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004116 WindowsX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4117 : WindowsTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Chris Lattner46be2e12009-06-24 17:12:15 +00004118 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00004119 DoubleAlign = LongLongAlign = 64;
Reid Kleckner7510c092015-04-01 16:45:06 +00004120 bool IsWinCOFF =
4121 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
James Y Knightb214cbc2016-03-04 19:00:41 +00004122 resetDataLayout(IsWinCOFF
4123 ? "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
4124 : "e-m:e-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32");
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004125 }
Craig Topper3164f332014-03-11 03:39:26 +00004126 void getTargetDefines(const LangOptions &Opts,
4127 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004128 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
4129 }
4130};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004131
4132// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004133class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004134public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004135 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple,
4136 const TargetOptions &Opts)
4137 : WindowsX86_32TargetInfo(Triple, Opts) {
Eli Friedman015d6282011-03-22 21:25:11 +00004138 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004139 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
4140 }
Craig Topper3164f332014-03-11 03:39:26 +00004141 void getTargetDefines(const LangOptions &Opts,
4142 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004143 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
4144 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
4145 // The value of the following reflects processor type.
4146 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
4147 // We lost the original triple, so we use the default.
4148 Builder.defineMacro("_M_IX86", "600");
4149 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004150};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004151
David Majnemerae1ed0e2015-05-28 04:36:18 +00004152static void addCygMingDefines(const LangOptions &Opts, MacroBuilder &Builder) {
Eric Christopherb093d692015-10-09 18:39:59 +00004153 // Mingw and cygwin define __declspec(a) to __attribute__((a)). Clang
4154 // supports __declspec natively under -fms-extensions, but we define a no-op
4155 // __declspec macro anyway for pre-processor compatibility.
Reid Kleckner47606832014-04-21 20:58:00 +00004156 if (Opts.MicrosoftExt)
4157 Builder.defineMacro("__declspec", "__declspec");
4158 else
4159 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
4160
4161 if (!Opts.MicrosoftExt) {
4162 // Provide macros for all the calling convention keywords. Provide both
4163 // single and double underscore prefixed variants. These are available on
4164 // x64 as well as x86, even though they have no effect.
4165 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
4166 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00004167 std::string GCCSpelling = "__attribute__((__";
4168 GCCSpelling += CC;
4169 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00004170 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
4171 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
4172 }
4173 }
4174}
4175
David Majnemerae1ed0e2015-05-28 04:36:18 +00004176static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
4177 Builder.defineMacro("__MSVCRT__");
4178 Builder.defineMacro("__MINGW32__");
4179 addCygMingDefines(Opts, Builder);
4180}
4181
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004182// x86-32 MinGW target
4183class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
4184public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004185 MinGWX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4186 : WindowsX86_32TargetInfo(Triple, Opts) {}
Craig Topper3164f332014-03-11 03:39:26 +00004187 void getTargetDefines(const LangOptions &Opts,
4188 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004189 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004190 DefineStd(Builder, "WIN32", Opts);
4191 DefineStd(Builder, "WINNT", Opts);
4192 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00004193 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004194 }
4195};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004196
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004197// x86-32 Cygwin target
4198class CygwinX86_32TargetInfo : public X86_32TargetInfo {
4199public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004200 CygwinX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4201 : X86_32TargetInfo(Triple, Opts) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004202 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004203 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00004204 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 +00004205 }
Craig Topper3164f332014-03-11 03:39:26 +00004206 void getTargetDefines(const LangOptions &Opts,
4207 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004208 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00004209 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004210 Builder.defineMacro("__CYGWIN__");
4211 Builder.defineMacro("__CYGWIN32__");
David Majnemerae1ed0e2015-05-28 04:36:18 +00004212 addCygMingDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004213 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00004214 if (Opts.CPlusPlus)
4215 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00004216 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004217};
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004218
Chris Lattnerb986aba2010-04-11 19:29:39 +00004219// x86-32 Haiku target
Reid Kleckner330fb172016-05-11 16:19:05 +00004220class HaikuX86_32TargetInfo : public HaikuTargetInfo<X86_32TargetInfo> {
Chris Lattnerb986aba2010-04-11 19:29:39 +00004221public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004222 HaikuX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Reid Kleckner330fb172016-05-11 16:19:05 +00004223 : HaikuTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman04831922010-08-22 01:00:03 +00004224 }
Craig Topper3164f332014-03-11 03:39:26 +00004225 void getTargetDefines(const LangOptions &Opts,
4226 MacroBuilder &Builder) const override {
Reid Kleckner330fb172016-05-11 16:19:05 +00004227 HaikuTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
Chris Lattnerb986aba2010-04-11 19:29:39 +00004228 Builder.defineMacro("__INTEL__");
Chris Lattnerb986aba2010-04-11 19:29:39 +00004229 }
4230};
Chris Lattnerb986aba2010-04-11 19:29:39 +00004231
Alexey Bataevc99b0492015-11-25 09:24:26 +00004232// X86-32 MCU target
4233class MCUX86_32TargetInfo : public X86_32TargetInfo {
4234public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004235 MCUX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4236 : X86_32TargetInfo(Triple, Opts) {
Alexey Bataevc99b0492015-11-25 09:24:26 +00004237 LongDoubleWidth = 64;
4238 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
James Y Knightb214cbc2016-03-04 19:00:41 +00004239 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 +00004240 WIntType = UnsignedInt;
Alexey Bataevc99b0492015-11-25 09:24:26 +00004241 }
4242
4243 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
4244 // On MCU we support only C calling convention.
4245 return CC == CC_C ? CCCR_OK : CCCR_Warning;
4246 }
4247
4248 void getTargetDefines(const LangOptions &Opts,
4249 MacroBuilder &Builder) const override {
4250 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4251 Builder.defineMacro("__iamcu");
4252 Builder.defineMacro("__iamcu__");
4253 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00004254
4255 bool allowsLargerPreferedTypeAlignment() const override {
4256 return false;
4257 }
Alexey Bataevc99b0492015-11-25 09:24:26 +00004258};
4259
Douglas Gregor9fabd852011-07-01 22:41:14 +00004260// RTEMS Target
4261template<typename Target>
4262class RTEMSTargetInfo : public OSTargetInfo<Target> {
4263protected:
Craig Topper3164f332014-03-11 03:39:26 +00004264 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4265 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004266 // RTEMS defines; list based off of gcc output
4267
Douglas Gregor9fabd852011-07-01 22:41:14 +00004268 Builder.defineMacro("__rtems__");
4269 Builder.defineMacro("__ELF__");
4270 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004271
Douglas Gregor9fabd852011-07-01 22:41:14 +00004272public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004273 RTEMSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4274 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004275 switch (Triple.getArch()) {
4276 default:
4277 case llvm::Triple::x86:
4278 // this->MCountName = ".mcount";
4279 break;
4280 case llvm::Triple::mips:
4281 case llvm::Triple::mipsel:
4282 case llvm::Triple::ppc:
4283 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00004284 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004285 // this->MCountName = "_mcount";
4286 break;
4287 case llvm::Triple::arm:
4288 // this->MCountName = "__mcount";
4289 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004290 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004291 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00004292};
4293
Douglas Gregor9fabd852011-07-01 22:41:14 +00004294// x86-32 RTEMS target
4295class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
4296public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004297 RTEMSX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4298 : X86_32TargetInfo(Triple, Opts) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004299 SizeType = UnsignedLong;
4300 IntPtrType = SignedLong;
4301 PtrDiffType = SignedLong;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004302 }
Craig Topper3164f332014-03-11 03:39:26 +00004303 void getTargetDefines(const LangOptions &Opts,
4304 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004305 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4306 Builder.defineMacro("__INTEL__");
4307 Builder.defineMacro("__rtems__");
4308 }
4309};
Douglas Gregor9fabd852011-07-01 22:41:14 +00004310
Eli Friedman3fd920a2008-08-20 02:34:37 +00004311// x86-64 generic target
4312class X86_64TargetInfo : public X86TargetInfo {
4313public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004314 X86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4315 : X86TargetInfo(Triple, Opts) {
David Blaikie40f842d2014-07-10 18:46:15 +00004316 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
David Majnemer8fa8c382015-03-17 23:55:00 +00004317 bool IsWinCOFF =
4318 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Zinovy Nis1db95732014-07-10 15:27:19 +00004319 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00004320 LongDoubleWidth = 128;
4321 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00004322 LargeArrayMinWidth = 128;
4323 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004324 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00004325 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
4326 PtrDiffType = IsX32 ? SignedInt : SignedLong;
4327 IntPtrType = IsX32 ? SignedInt : SignedLong;
4328 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00004329 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00004330 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00004331
Eric Christopher917e9522014-11-18 22:36:15 +00004332 // Pointers are 32-bit in x32.
James Y Knightb214cbc2016-03-04 19:00:41 +00004333 resetDataLayout(IsX32
4334 ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128"
4335 : IsWinCOFF ? "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
4336 : "e-m:e-i64:64-f80:128-n8:16:32:64-S128");
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00004337
4338 // Use fpret only for long double.
4339 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004340
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00004341 // Use fp2ret for _Complex long double.
4342 ComplexLongDoubleUsesFP2Ret = true;
4343
Charles Davisc7d5c942015-09-17 20:55:33 +00004344 // Make __builtin_ms_va_list available.
4345 HasBuiltinMSVaList = true;
4346
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004347 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004348 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00004349 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00004350 }
Craig Topper3164f332014-03-11 03:39:26 +00004351 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004352 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00004353 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004354
Craig Topper3164f332014-03-11 03:39:26 +00004355 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00004356 if (RegNo == 0) return 0;
4357 if (RegNo == 1) return 1;
4358 return -1;
4359 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004360
Craig Topper3164f332014-03-11 03:39:26 +00004361 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00004362 switch (CC) {
4363 case CC_C:
4364 case CC_Swift:
4365 case CC_X86VectorCall:
4366 case CC_IntelOclBicc:
4367 case CC_X86_64Win64:
Roman Levenstein35aa5ce2016-03-16 18:00:46 +00004368 case CC_PreserveMost:
4369 case CC_PreserveAll:
John McCall477f2bb2016-03-03 06:39:32 +00004370 return CCCR_OK;
4371 default:
4372 return CCCR_Warning;
4373 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004374 }
4375
Craig Topper3164f332014-03-11 03:39:26 +00004376 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00004377 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004378 }
4379
Pavel Chupinfd223e12014-08-04 12:39:43 +00004380 // for x32 we need it here explicitly
4381 bool hasInt128Type() const override { return true; }
Reid Klecknerf27e7522016-02-01 18:58:24 +00004382 unsigned getUnwindWordWidth() const override { return 64; }
4383 unsigned getRegisterWidth() const override { return 64; }
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00004384
4385 bool validateGlobalRegisterVariable(StringRef RegName,
4386 unsigned RegSize,
4387 bool &HasSizeMismatch) const override {
4388 // rsp and rbp are the only 64-bit registers the x86 backend can currently
4389 // handle.
4390 if (RegName.equals("rsp") || RegName.equals("rbp")) {
4391 // Check that the register size is 64-bit.
4392 HasSizeMismatch = RegSize != 64;
4393 return true;
4394 }
4395
4396 // Check if the register is a 32-bit register the backend can handle.
4397 return X86TargetInfo::validateGlobalRegisterVariable(RegName, RegSize,
4398 HasSizeMismatch);
4399 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004400};
Eli Friedman3fd920a2008-08-20 02:34:37 +00004401
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004402// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004403class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004404public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004405 WindowsX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4406 : WindowsTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004407 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00004408 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004409 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004410 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004411 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00004412 SizeType = UnsignedLongLong;
4413 PtrDiffType = SignedLongLong;
4414 IntPtrType = SignedLongLong;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004415 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004416
Craig Topper3164f332014-03-11 03:39:26 +00004417 void getTargetDefines(const LangOptions &Opts,
4418 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004419 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004420 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004421 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004422
Craig Topper3164f332014-03-11 03:39:26 +00004423 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004424 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00004425 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004426
Craig Topper3164f332014-03-11 03:39:26 +00004427 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004428 switch (CC) {
4429 case CC_X86StdCall:
4430 case CC_X86ThisCall:
4431 case CC_X86FastCall:
4432 return CCCR_Ignore;
4433 case CC_C:
4434 case CC_X86VectorCall:
4435 case CC_IntelOclBicc:
4436 case CC_X86_64SysV:
4437 return CCCR_OK;
4438 default:
4439 return CCCR_Warning;
4440 }
Charles Davisb5a214e2013-08-30 04:39:01 +00004441 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004442};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004443
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004444// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004445class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004446public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004447 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple,
4448 const TargetOptions &Opts)
4449 : WindowsX86_64TargetInfo(Triple, Opts) {
Eli Friedman015d6282011-03-22 21:25:11 +00004450 LongDoubleWidth = LongDoubleAlign = 64;
4451 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004452 }
Craig Topper3164f332014-03-11 03:39:26 +00004453 void getTargetDefines(const LangOptions &Opts,
4454 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004455 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
4456 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
David Majnemerb856e8f2015-07-26 23:17:29 +00004457 Builder.defineMacro("_M_X64", "100");
4458 Builder.defineMacro("_M_AMD64", "100");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004459 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004460};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004461
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004462// x86-64 MinGW target
4463class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
4464public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004465 MinGWX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4466 : WindowsX86_64TargetInfo(Triple, Opts) {
Reid Kleckner11a17192015-10-28 22:29:52 +00004467 // Mingw64 rounds long double size and alignment up to 16 bytes, but sticks
4468 // with x86 FP ops. Weird.
4469 LongDoubleWidth = LongDoubleAlign = 128;
4470 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
4471 }
4472
Craig Topper3164f332014-03-11 03:39:26 +00004473 void getTargetDefines(const LangOptions &Opts,
4474 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004475 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004476 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004477 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00004478 addMinGWDefines(Opts, Builder);
Reid Klecknere070b992014-11-14 02:01:10 +00004479
4480 // GCC defines this macro when it is using __gxx_personality_seh0.
4481 if (!Opts.SjLjExceptions)
4482 Builder.defineMacro("__SEH__");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004483 }
4484};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004485
Yaron Kerend030d112015-07-22 17:38:19 +00004486// x86-64 Cygwin target
4487class CygwinX86_64TargetInfo : public X86_64TargetInfo {
4488public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004489 CygwinX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4490 : X86_64TargetInfo(Triple, Opts) {
Yaron Kerend030d112015-07-22 17:38:19 +00004491 TLSSupported = false;
4492 WCharType = UnsignedShort;
4493 }
4494 void getTargetDefines(const LangOptions &Opts,
4495 MacroBuilder &Builder) const override {
4496 X86_64TargetInfo::getTargetDefines(Opts, Builder);
4497 Builder.defineMacro("__x86_64__");
4498 Builder.defineMacro("__CYGWIN__");
4499 Builder.defineMacro("__CYGWIN64__");
4500 addCygMingDefines(Opts, Builder);
4501 DefineStd(Builder, "unix", Opts);
4502 if (Opts.CPlusPlus)
4503 Builder.defineMacro("_GNU_SOURCE");
4504
4505 // GCC defines this macro when it is using __gxx_personality_seh0.
4506 if (!Opts.SjLjExceptions)
4507 Builder.defineMacro("__SEH__");
4508 }
4509};
4510
Eli Friedman2857ccb2009-07-01 03:36:11 +00004511class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
4512public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004513 DarwinX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4514 : DarwinTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00004515 Int64Type = SignedLongLong;
Tim Northovera2ee4332014-03-29 15:09:45 +00004516 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
4517 llvm::Triple T = llvm::Triple(Triple);
Bob Wilson946c04c2014-10-19 02:19:27 +00004518 if (T.isiOS())
Tim Northovera2ee4332014-03-29 15:09:45 +00004519 UseSignedCharForObjCBool = false;
James Y Knightb214cbc2016-03-04 19:00:41 +00004520 resetDataLayout("e-m:o-i64:64-f80:128-n8:16:32:64-S128");
Eli Friedman2857ccb2009-07-01 03:36:11 +00004521 }
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004522
4523 bool handleTargetFeatures(std::vector<std::string> &Features,
4524 DiagnosticsEngine &Diags) override {
4525 if (!DarwinTargetInfo<X86_64TargetInfo>::handleTargetFeatures(Features,
4526 Diags))
4527 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004528 // We now know the features we have: we can decide how to align vectors.
4529 MaxVectorAlign =
4530 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004531 return true;
4532 }
Eli Friedman2857ccb2009-07-01 03:36:11 +00004533};
Eli Friedman2857ccb2009-07-01 03:36:11 +00004534
Eli Friedman245f2292009-07-05 22:31:18 +00004535class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
4536public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004537 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4538 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Eli Friedman245f2292009-07-05 22:31:18 +00004539 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004540 Int64Type = SignedLongLong;
4541 }
4542};
Eli Friedman245f2292009-07-05 22:31:18 +00004543
Eli Friedman9fa28852012-08-08 23:57:20 +00004544class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
4545public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004546 BitrigX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4547 : BitrigTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004548 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004549 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00004550 }
4551};
Tim Northover9bb857a2013-01-31 12:13:10 +00004552
Eli Friedmanf05b7722008-08-20 07:44:10 +00004553class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004554 // Possible FPU choices.
4555 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004556 VFP2FPU = (1 << 0),
4557 VFP3FPU = (1 << 1),
4558 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00004559 NeonFPU = (1 << 3),
4560 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004561 };
4562
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004563 // Possible HWDiv features.
4564 enum HWDivMode {
4565 HWDivThumb = (1 << 0),
4566 HWDivARM = (1 << 1)
4567 };
4568
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004569 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004570 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004571 }
4572
4573 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4574 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004575
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004576 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004577
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004578 StringRef CPUProfile;
4579 StringRef CPUAttr;
4580
Rafael Espindolaeb265472013-08-21 21:59:03 +00004581 enum {
4582 FP_Default,
4583 FP_VFP,
4584 FP_Neon
4585 } FPMath;
4586
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004587 unsigned ArchISA;
Renato Goline84b0002015-10-08 16:43:26 +00004588 unsigned ArchKind = llvm::ARM::AK_ARMV4T;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004589 unsigned ArchProfile;
4590 unsigned ArchVersion;
4591
Bernard Ogdenda13af32013-10-24 18:32:51 +00004592 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004593
Logan Chien57086ce2012-10-10 06:56:20 +00004594 unsigned IsAAPCS : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004595 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004596
4597 // Initialized via features.
4598 unsigned SoftFloat : 1;
4599 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004600
Bernard Ogden18b57012013-10-29 09:47:51 +00004601 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00004602 unsigned Crypto : 1;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004603 unsigned DSP : 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004604 unsigned Unaligned : 1;
4605
4606 enum {
4607 LDREX_B = (1 << 0), /// byte (8-bit)
4608 LDREX_H = (1 << 1), /// half (16-bit)
4609 LDREX_W = (1 << 2), /// word (32-bit)
4610 LDREX_D = (1 << 3), /// double (64-bit)
4611 };
4612
4613 uint32_t LDREX;
Bernard Ogden18b57012013-10-29 09:47:51 +00004614
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004615 // ACLE 6.5.1 Hardware floating point
4616 enum {
4617 HW_FP_HP = (1 << 1), /// half (16-bit)
4618 HW_FP_SP = (1 << 2), /// single (32-bit)
4619 HW_FP_DP = (1 << 3), /// double (64-bit)
4620 };
4621 uint32_t HW_FP;
4622
Chris Lattner5cc15e02010-03-03 19:03:45 +00004623 static const Builtin::Info BuiltinInfo[];
4624
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004625 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004626 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004627
4628 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00004629 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004630
Renato Golin9ba39232015-02-27 16:35:48 +00004631 // size_t is unsigned long on MachO-derived environments, NetBSD and Bitrig.
4632 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD ||
4633 T.getOS() == llvm::Triple::Bitrig)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004634 SizeType = UnsignedLong;
4635 else
4636 SizeType = UnsignedInt;
4637
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004638 switch (T.getOS()) {
4639 case llvm::Triple::NetBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004640 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004641 break;
4642 case llvm::Triple::Win32:
4643 WCharType = UnsignedShort;
4644 break;
4645 case llvm::Triple::Linux:
4646 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004647 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
4648 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004649 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004650 }
4651
4652 UseBitFieldTypeAlignment = true;
4653
4654 ZeroLengthBitfieldBoundary = 0;
4655
Tim Northover147cd2f2014-10-14 22:12:21 +00004656 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
4657 // so set preferred for small types to 32.
4658 if (T.isOSBinFormatMachO()) {
James Y Knightb214cbc2016-03-04 19:00:41 +00004659 resetDataLayout(BigEndian
4660 ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4661 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Tim Northover147cd2f2014-10-14 22:12:21 +00004662 } else if (T.isOSWindows()) {
Tim Northover147cd2f2014-10-14 22:12:21 +00004663 assert(!BigEndian && "Windows on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004664 resetDataLayout("e"
4665 "-m:w"
4666 "-p:32:32"
4667 "-i64:64"
4668 "-v128:64:128"
4669 "-a:0:32"
4670 "-n32"
4671 "-S64");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00004672 } else if (T.isOSNaCl()) {
4673 assert(!BigEndian && "NaCl on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004674 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004675 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00004676 resetDataLayout(BigEndian
4677 ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4678 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004679 }
4680
4681 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004682 }
4683
Tim Northover5627d392015-10-30 16:30:45 +00004684 void setABIAPCS(bool IsAAPCS16) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00004685 const llvm::Triple &T = getTriple();
4686
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004687 IsAAPCS = false;
4688
Tim Northover5627d392015-10-30 16:30:45 +00004689 if (IsAAPCS16)
4690 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
4691 else
4692 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004693
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004694 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00004695 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004696 SizeType = UnsignedInt;
4697 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004698 SizeType = UnsignedLong;
4699
4700 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
4701 WCharType = SignedInt;
4702
4703 // Do not respect the alignment of bit-field types when laying out
4704 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
4705 UseBitFieldTypeAlignment = false;
4706
4707 /// gcc forces the alignment to 4 bytes, regardless of the type of the
4708 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
4709 /// gcc.
4710 ZeroLengthBitfieldBoundary = 32;
4711
Tim Northover5627d392015-10-30 16:30:45 +00004712 if (T.isOSBinFormatMachO() && IsAAPCS16) {
4713 assert(!BigEndian && "AAPCS16 does not support big-endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004714 resetDataLayout("e-m:o-p:32:32-i64:64-a:0:32-n32-S128");
Tim Northover5627d392015-10-30 16:30:45 +00004715 } else if (T.isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00004716 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00004717 BigEndian
4718 ? "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 +00004719 : "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 +00004720 else
James Y Knightb214cbc2016-03-04 19:00:41 +00004721 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00004722 BigEndian
4723 ? "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 +00004724 : "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 +00004725
4726 // FIXME: Override "preferred align" for double and long long.
4727 }
4728
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004729 void setArchInfo() {
4730 StringRef ArchName = getTriple().getArchName();
4731
Renato Goline84b0002015-10-08 16:43:26 +00004732 ArchISA = llvm::ARM::parseArchISA(ArchName);
4733 CPU = llvm::ARM::getDefaultCPU(ArchName);
4734 unsigned AK = llvm::ARM::parseArch(ArchName);
4735 if (AK != llvm::ARM::AK_INVALID)
4736 ArchKind = AK;
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004737 setArchInfo(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004738 }
4739
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004740 void setArchInfo(unsigned Kind) {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004741 StringRef SubArch;
4742
4743 // cache TargetParser info
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004744 ArchKind = Kind;
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00004745 SubArch = llvm::ARM::getSubArch(ArchKind);
4746 ArchProfile = llvm::ARM::parseArchProfile(SubArch);
4747 ArchVersion = llvm::ARM::parseArchVersion(SubArch);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004748
4749 // cache CPU related strings
4750 CPUAttr = getCPUAttr();
4751 CPUProfile = getCPUProfile();
4752 }
4753
4754 void setAtomic() {
Eric Christopherb093d692015-10-09 18:39:59 +00004755 // when triple does not specify a sub arch,
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004756 // then we are not using inline atomics
Renato Goline84b0002015-10-08 16:43:26 +00004757 bool ShouldUseInlineAtomic =
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004758 (ArchISA == llvm::ARM::IK_ARM && ArchVersion >= 6) ||
4759 (ArchISA == llvm::ARM::IK_THUMB && ArchVersion >= 7);
Eric Christopherb093d692015-10-09 18:39:59 +00004760 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004761 if (ArchProfile == llvm::ARM::PK_M) {
4762 MaxAtomicPromoteWidth = 32;
4763 if (ShouldUseInlineAtomic)
4764 MaxAtomicInlineWidth = 32;
4765 }
4766 else {
4767 MaxAtomicPromoteWidth = 64;
4768 if (ShouldUseInlineAtomic)
4769 MaxAtomicInlineWidth = 64;
Eric Christopherb093d692015-10-09 18:39:59 +00004770 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004771 }
4772
4773 bool isThumb() const {
4774 return (ArchISA == llvm::ARM::IK_THUMB);
4775 }
4776
4777 bool supportsThumb() const {
4778 return CPUAttr.count('T') || ArchVersion >= 6;
4779 }
4780
4781 bool supportsThumb2() const {
Bradley Smithf4affc12016-03-03 13:52:22 +00004782 return CPUAttr.equals("6T2") ||
4783 (ArchVersion >= 7 && !CPUAttr.equals("8M_BASE"));
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004784 }
4785
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004786 StringRef getCPUAttr() const {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004787 // For most sub-arches, the build attribute CPU name is enough.
4788 // For Cortex variants, it's slightly different.
4789 switch(ArchKind) {
4790 default:
Chandler Carruthd96f37a2015-08-30 07:51:18 +00004791 return llvm::ARM::getCPUAttr(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004792 case llvm::ARM::AK_ARMV6M:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004793 return "6M";
Tim Northover525c73c2015-07-21 21:47:33 +00004794 case llvm::ARM::AK_ARMV7S:
4795 return "7S";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004796 case llvm::ARM::AK_ARMV7A:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004797 return "7A";
4798 case llvm::ARM::AK_ARMV7R:
4799 return "7R";
4800 case llvm::ARM::AK_ARMV7M:
4801 return "7M";
4802 case llvm::ARM::AK_ARMV7EM:
4803 return "7EM";
4804 case llvm::ARM::AK_ARMV8A:
4805 return "8A";
4806 case llvm::ARM::AK_ARMV8_1A:
4807 return "8_1A";
Oliver Stannard3086c042016-02-11 16:05:52 +00004808 case llvm::ARM::AK_ARMV8_2A:
4809 return "8_2A";
Bradley Smithf4affc12016-03-03 13:52:22 +00004810 case llvm::ARM::AK_ARMV8MBaseline:
4811 return "8M_BASE";
4812 case llvm::ARM::AK_ARMV8MMainline:
4813 return "8M_MAIN";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004814 }
4815 }
4816
4817 StringRef getCPUProfile() const {
4818 switch(ArchProfile) {
4819 case llvm::ARM::PK_A:
4820 return "A";
4821 case llvm::ARM::PK_R:
4822 return "R";
4823 case llvm::ARM::PK_M:
4824 return "M";
4825 default:
4826 return "";
4827 }
4828 }
4829
Chris Lattner17df24e2008-04-21 18:56:49 +00004830public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004831 ARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts,
4832 bool IsBigEndian)
4833 : TargetInfo(Triple), FPMath(FP_Default), IsAAPCS(true), LDREX(0),
4834 HW_FP(0) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004835 BigEndian = IsBigEndian;
4836
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004837 switch (getTriple().getOS()) {
4838 case llvm::Triple::NetBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004839 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004840 break;
4841 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004842 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004843 break;
4844 }
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004845
Renato Goline84b0002015-10-08 16:43:26 +00004846 // Cache arch related info.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004847 setArchInfo();
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004848
Chris Lattner1a8f3942010-04-23 16:29:58 +00004849 // {} in inline assembly are neon specifiers, not assembly variant
4850 // specifiers.
4851 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004852
Eric Christopher0e261882014-12-05 01:06:59 +00004853 // FIXME: This duplicates code from the driver that sets the -target-abi
4854 // option - this code is used if -target-abi isn't passed and should
4855 // be unified in some way.
4856 if (Triple.isOSBinFormatMachO()) {
4857 // The backend is hardwired to assume AAPCS for M-class processors, ensure
4858 // the frontend matches that.
4859 if (Triple.getEnvironment() == llvm::Triple::EABI ||
4860 Triple.getOS() == llvm::Triple::UnknownOS ||
4861 StringRef(CPU).startswith("cortex-m")) {
4862 setABI("aapcs");
Tim Northoverd88ecb32016-01-27 19:32:40 +00004863 } else if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00004864 setABI("aapcs16");
Eric Christopher0e261882014-12-05 01:06:59 +00004865 } else {
4866 setABI("apcs-gnu");
4867 }
4868 } else if (Triple.isOSWindows()) {
4869 // FIXME: this is invalid for WindowsCE
4870 setABI("aapcs");
4871 } else {
4872 // Select the default based on the platform.
4873 switch (Triple.getEnvironment()) {
4874 case llvm::Triple::Android:
4875 case llvm::Triple::GNUEABI:
4876 case llvm::Triple::GNUEABIHF:
Rafael Espindola0fa66802016-06-24 21:35:06 +00004877 case llvm::Triple::MuslEABI:
4878 case llvm::Triple::MuslEABIHF:
Eric Christopher0e261882014-12-05 01:06:59 +00004879 setABI("aapcs-linux");
4880 break;
4881 case llvm::Triple::EABIHF:
4882 case llvm::Triple::EABI:
4883 setABI("aapcs");
4884 break;
Eric Christopher560cc4f2014-12-18 02:08:55 +00004885 case llvm::Triple::GNU:
Renato Goline84b0002015-10-08 16:43:26 +00004886 setABI("apcs-gnu");
4887 break;
Eric Christopher0e261882014-12-05 01:06:59 +00004888 default:
4889 if (Triple.getOS() == llvm::Triple::NetBSD)
4890 setABI("apcs-gnu");
4891 else
4892 setABI("aapcs");
4893 break;
4894 }
4895 }
John McCall86353412010-08-21 22:46:04 +00004896
4897 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00004898 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004899
Renato Golin15b86152015-07-03 16:41:13 +00004900 // ARM has atomics up to 8 bytes
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004901 setAtomic();
Rafael Espindola5ab8e2e2015-07-02 15:14:10 +00004902
James Molloya7139222012-03-12 09:14:10 +00004903 // Do force alignment of members that follow zero length bitfields. If
Eric Christopher917e9522014-11-18 22:36:15 +00004904 // the alignment of the zero-length bitfield is greater than the member
4905 // that follows it, `bar', `bar' will be aligned as the type of the
James Molloya7139222012-03-12 09:14:10 +00004906 // zero length bitfield.
4907 UseZeroLengthBitfieldAlignment = true;
Saleem Abdulrasool9b5ba542016-04-10 03:19:47 +00004908
4909 if (Triple.getOS() == llvm::Triple::Linux ||
4910 Triple.getOS() == llvm::Triple::UnknownOS)
4911 this->MCountName =
4912 Opts.EABIVersion == "gnu" ? "\01__gnu_mcount_nc" : "\01mcount";
Eli Friedmanb5366062008-05-20 14:21:01 +00004913 }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00004914
Alp Toker4925ba72014-06-07 23:30:42 +00004915 StringRef getABI() const override { return ABI; }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00004916
Craig Topper3164f332014-03-11 03:39:26 +00004917 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004918 ABI = Name;
4919
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004920 // The defaults (above) are for AAPCS, check if we need to change them.
4921 //
4922 // FIXME: We need support for -meabi... we could just mangle it into the
4923 // name.
Tim Northover756447a2015-10-30 16:30:36 +00004924 if (Name == "apcs-gnu" || Name == "aapcs16") {
Tim Northover5627d392015-10-30 16:30:45 +00004925 setABIAPCS(Name == "aapcs16");
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004926 return true;
4927 }
4928 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
4929 setABIAAPCS();
4930 return true;
4931 }
4932 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004933 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004934
Renato Golinf5c4dec2015-05-27 13:33:00 +00004935 // FIXME: This should be based on Arch attributes, not CPU names.
Eric Christopher8c47b422015-10-09 18:39:55 +00004936 bool
4937 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
4938 StringRef CPU,
4939 const std::vector<std::string> &FeaturesVec) const override {
4940
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004941 std::vector<const char*> TargetFeatures;
Bradley Smithb3501962015-11-16 11:16:36 +00004942 unsigned Arch = llvm::ARM::parseArch(getTriple().getArchName());
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004943
4944 // get default FPU features
Bradley Smithb3501962015-11-16 11:16:36 +00004945 unsigned FPUKind = llvm::ARM::getDefaultFPU(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004946 llvm::ARM::getFPUFeatures(FPUKind, TargetFeatures);
4947
4948 // get default Extension features
Bradley Smithb3501962015-11-16 11:16:36 +00004949 unsigned Extensions = llvm::ARM::getDefaultExtensions(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004950 llvm::ARM::getExtensionFeatures(Extensions, TargetFeatures);
4951
4952 for (const char *Feature : TargetFeatures)
4953 if (Feature[0] == '+')
Eric Christopherb093d692015-10-09 18:39:59 +00004954 Features[Feature+1] = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004955
Eric Christopher007b0a02015-08-28 22:32:01 +00004956 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004957 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004958
Craig Topper3164f332014-03-11 03:39:26 +00004959 bool handleTargetFeatures(std::vector<std::string> &Features,
4960 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004961 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00004962 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00004963 Crypto = 0;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004964 DSP = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004965 Unaligned = 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004966 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004967 HWDiv = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004968
Ranjeet Singhac08e532015-06-24 23:39:25 +00004969 // This does not diagnose illegal cases like having both
4970 // "+vfpv2" and "+vfpv3" or having "+neon" and "+fp-only-sp".
4971 uint32_t HW_FP_remove = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004972 for (const auto &Feature : Features) {
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004973 if (Feature == "+soft-float") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004974 SoftFloat = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004975 } else if (Feature == "+soft-float-abi") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004976 SoftFloatABI = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004977 } else if (Feature == "+vfp2") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004978 FPU |= VFP2FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004979 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004980 } else if (Feature == "+vfp3") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004981 FPU |= VFP3FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004982 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004983 } else if (Feature == "+vfp4") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004984 FPU |= VFP4FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004985 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004986 } else if (Feature == "+fp-armv8") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004987 FPU |= FPARMV8;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004988 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004989 } else if (Feature == "+neon") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004990 FPU |= NeonFPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004991 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004992 } else if (Feature == "+hwdiv") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004993 HWDiv |= HWDivThumb;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004994 } else if (Feature == "+hwdiv-arm") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004995 HWDiv |= HWDivARM;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004996 } else if (Feature == "+crc") {
Bernard Ogden18b57012013-10-29 09:47:51 +00004997 CRC = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004998 } else if (Feature == "+crypto") {
Tim Northover02e38602014-02-03 17:28:04 +00004999 Crypto = 1;
Artyom Skrobov05d85ae2015-10-23 17:19:02 +00005000 } else if (Feature == "+dsp") {
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005001 DSP = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005002 } else if (Feature == "+fp-only-sp") {
Matt Arsenault250024f2016-06-08 01:56:42 +00005003 HW_FP_remove |= HW_FP_DP;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005004 } else if (Feature == "+strict-align") {
5005 Unaligned = 0;
5006 } else if (Feature == "+fp16") {
5007 HW_FP |= HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005008 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00005009 }
Ranjeet Singhac08e532015-06-24 23:39:25 +00005010 HW_FP &= ~HW_FP_remove;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005011
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005012 switch (ArchVersion) {
5013 case 6:
5014 if (ArchProfile == llvm::ARM::PK_M)
5015 LDREX = 0;
5016 else if (ArchKind == llvm::ARM::AK_ARMV6K)
5017 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5018 else
5019 LDREX = LDREX_W;
5020 break;
5021 case 7:
5022 if (ArchProfile == llvm::ARM::PK_M)
5023 LDREX = LDREX_W | LDREX_H | LDREX_B ;
5024 else
5025 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5026 break;
5027 case 8:
5028 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5029 }
5030
Rafael Espindolaeb265472013-08-21 21:59:03 +00005031 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
5032 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
5033 return false;
5034 }
5035
5036 if (FPMath == FP_Neon)
5037 Features.push_back("+neonfp");
5038 else if (FPMath == FP_VFP)
5039 Features.push_back("-neonfp");
5040
Daniel Dunbar893d4752009-12-19 04:15:38 +00005041 // Remove front-end specific options which the backend handles differently.
Eric Christopher9e172d22015-05-12 01:26:21 +00005042 auto Feature =
5043 std::find(Features.begin(), Features.end(), "+soft-float-abi");
5044 if (Feature != Features.end())
5045 Features.erase(Feature);
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005046
Rafael Espindolaeb265472013-08-21 21:59:03 +00005047 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005048 }
5049
Craig Topper3164f332014-03-11 03:39:26 +00005050 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005051 return llvm::StringSwitch<bool>(Feature)
5052 .Case("arm", true)
Ben Langmuir587aeaf2015-08-07 01:59:56 +00005053 .Case("aarch32", true)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005054 .Case("softfloat", SoftFloat)
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005055 .Case("thumb", isThumb())
Amara Emerson8c3de542013-09-16 18:07:35 +00005056 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005057 .Case("hwdiv", HWDiv & HWDivThumb)
5058 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005059 .Default(false);
5060 }
Renato Golin15b86152015-07-03 16:41:13 +00005061
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005062 bool setCPU(const std::string &Name) override {
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005063 if (Name != "generic")
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00005064 setArchInfo(llvm::ARM::parseCPUArch(Name));
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005065
Renato Golin15b86152015-07-03 16:41:13 +00005066 if (ArchKind == llvm::ARM::AK_INVALID)
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005067 return false;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005068 setAtomic();
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005069 CPU = Name;
5070 return true;
5071 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005072
Craig Topper3164f332014-03-11 03:39:26 +00005073 bool setFPMath(StringRef Name) override;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005074
Craig Topper3164f332014-03-11 03:39:26 +00005075 void getTargetDefines(const LangOptions &Opts,
5076 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00005077 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005078 Builder.defineMacro("__arm");
5079 Builder.defineMacro("__arm__");
Weiming Zhaob0613132016-04-18 16:25:46 +00005080 // For bare-metal none-eabi.
5081 if (getTriple().getOS() == llvm::Triple::UnknownOS &&
5082 getTriple().getEnvironment() == llvm::Triple::EABI)
5083 Builder.defineMacro("__ELF__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00005084
Chris Lattnerecd49032009-03-02 22:27:17 +00005085 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005086 Builder.defineMacro("__REGISTER_PREFIX__", "");
Tim Northover5627d392015-10-30 16:30:45 +00005087
5088 // Unfortunately, __ARM_ARCH_7K__ is now more of an ABI descriptor. The CPU
5089 // happens to be Cortex-A7 though, so it should still get __ARM_ARCH_7A__.
Tim Northoverd88ecb32016-01-27 19:32:40 +00005090 if (getTriple().isWatchABI())
Tim Northover5627d392015-10-30 16:30:45 +00005091 Builder.defineMacro("__ARM_ARCH_7K__", "2");
5092
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005093 if (!CPUAttr.empty())
5094 Builder.defineMacro("__ARM_ARCH_" + CPUAttr + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005095
5096 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005097 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
Benjamin Kramerb42d9a52015-12-24 10:07:37 +00005098 Builder.defineMacro("__ARM_ARCH", Twine(ArchVersion));
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005099
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005100 if (ArchVersion >= 8) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005101 // ACLE 6.5.7 Crypto Extension
5102 if (Crypto)
5103 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
5104 // ACLE 6.5.8 CRC32 Extension
5105 if (CRC)
5106 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
5107 // ACLE 6.5.10 Numeric Maximum and Minimum
5108 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
5109 // ACLE 6.5.9 Directed Rounding
5110 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
James Molloy0ffb0932014-09-15 11:25:38 +00005111 }
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005112
5113 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
5114 // is not defined for the M-profile.
Bradley Smithf4affc12016-03-03 13:52:22 +00005115 // NOTE that the default profile is assumed to be 'A'
5116 if (CPUProfile.empty() || ArchProfile != llvm::ARM::PK_M)
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005117 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
5118
Bradley Smithf4affc12016-03-03 13:52:22 +00005119 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supports the original
5120 // Thumb ISA (including v6-M and v8-M Baseline). It is set to 2 if the
5121 // core supports the Thumb-2 ISA as found in the v6T2 architecture and all
5122 // v7 and v8 architectures excluding v8-M Baseline.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005123 if (supportsThumb2())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005124 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005125 else if (supportsThumb())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005126 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
5127
5128 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
5129 // instruction set such as ARM or Thumb.
5130 Builder.defineMacro("__ARM_32BIT_STATE", "1");
5131
5132 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
5133
5134 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005135 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005136 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00005137
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005138 // ACLE 6.4.3 Unaligned access supported in hardware
Eric Christopherb093d692015-10-09 18:39:59 +00005139 if (Unaligned)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005140 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Eric Christopherb093d692015-10-09 18:39:59 +00005141
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005142 // ACLE 6.4.4 LDREX/STREX
5143 if (LDREX)
5144 Builder.defineMacro("__ARM_FEATURE_LDREX", "0x" + llvm::utohexstr(LDREX));
5145
5146 // ACLE 6.4.5 CLZ
Eric Christopherb093d692015-10-09 18:39:59 +00005147 if (ArchVersion == 5 ||
5148 (ArchVersion == 6 && CPUProfile != "M") ||
5149 ArchVersion > 6)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005150 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
5151
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005152 // ACLE 6.5.1 Hardware Floating Point
5153 if (HW_FP)
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +00005154 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005155
Yi Konga44c4d72014-06-27 21:25:42 +00005156 // ACLE predefines.
5157 Builder.defineMacro("__ARM_ACLE", "200");
5158
Oliver Stannarddc2854c2015-09-03 12:40:58 +00005159 // FP16 support (we currently only support IEEE format).
5160 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
5161 Builder.defineMacro("__ARM_FP16_ARGS", "1");
5162
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005163 // ACLE 6.5.3 Fused multiply-accumulate (FMA)
Silviu Baranga632fdc52016-04-28 11:29:08 +00005164 if (ArchVersion >= 7 && (FPU & VFP4FPU))
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005165 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
5166
Mike Stump9d54bd72009-04-08 02:07:04 +00005167 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005168
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005169 // FIXME: It's more complicated than this and we don't really support
5170 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005171 // Windows on ARM does not "support" interworking
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005172 if (5 <= ArchVersion && ArchVersion <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005173 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005174
David Tweed8f676532012-10-25 13:33:01 +00005175 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00005176 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005177 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
Tim Northover862eaf82016-05-13 21:26:45 +00005178 if (!getTriple().isOSBinFormatMachO() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00005179 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005180 Builder.defineMacro("__ARM_PCS", "1");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005181 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005182
Tim Northover28fc0e12016-04-28 13:59:55 +00005183 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp" ||
5184 ABI == "aapcs16")
5185 Builder.defineMacro("__ARM_PCS_VFP", "1");
5186
Daniel Dunbar893d4752009-12-19 04:15:38 +00005187 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005188 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005189
5190 if (CPU == "xscale")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005191 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005192
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005193 if (isThumb()) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005194 Builder.defineMacro("__THUMBEL__");
5195 Builder.defineMacro("__thumb__");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005196 if (supportsThumb2())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005197 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005198 }
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005199
5200 // ACLE 6.4.9 32-bit SIMD instructions
5201 if (ArchVersion >= 6 && (CPUProfile != "M" || CPUAttr == "7EM"))
5202 Builder.defineMacro("__ARM_FEATURE_SIMD32", "1");
5203
5204 // ACLE 6.4.10 Hardware Integer Divide
Eric Christopherb093d692015-10-09 18:39:59 +00005205 if (((HWDiv & HWDivThumb) && isThumb()) ||
5206 ((HWDiv & HWDivARM) && !isThumb())) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005207 Builder.defineMacro("__ARM_FEATURE_IDIV", "1");
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005208 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005209 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005210
5211 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005212 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005213
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005214 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005215 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005216 if (FPU & VFP2FPU)
5217 Builder.defineMacro("__ARM_VFPV2__");
5218 if (FPU & VFP3FPU)
5219 Builder.defineMacro("__ARM_VFPV3__");
5220 if (FPU & VFP4FPU)
5221 Builder.defineMacro("__ARM_VFPV4__");
5222 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00005223
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005224 // This only gets set when Neon instructions are actually available, unlike
5225 // the VFP define, hence the soft float and arch check. This is subtly
5226 // different from gcc, we follow the intent which was that it should be set
5227 // when Neon instructions are actually available.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005228 if ((FPU & NeonFPU) && !SoftFloat && ArchVersion >= 7) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005229 Builder.defineMacro("__ARM_NEON", "1");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005230 Builder.defineMacro("__ARM_NEON__");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005231 // current AArch32 NEON implementations do not support double-precision
5232 // floating-point even when it is present in VFP.
Eric Christopherb093d692015-10-09 18:39:59 +00005233 Builder.defineMacro("__ARM_NEON_FP",
5234 "0x" + llvm::utohexstr(HW_FP & ~HW_FP_DP));
Tim Northover5bb34ca2013-11-21 12:36:34 +00005235 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00005236
Bradley Smith0f28f0c2014-01-20 10:52:00 +00005237 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
5238 Opts.ShortWChar ? "2" : "4");
5239
5240 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5241 Opts.ShortEnums ? "1" : "4");
5242
Bradley Smithf4affc12016-03-03 13:52:22 +00005243 if (ArchVersion >= 6 && CPUAttr != "6M" && CPUAttr != "8M_BASE") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00005244 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5245 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5246 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5247 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
5248 }
Sergey Dmitrouk745f5302014-11-25 08:57:36 +00005249
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005250 // ACLE 6.4.7 DSP instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005251 if (DSP) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005252 Builder.defineMacro("__ARM_FEATURE_DSP", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005253 }
5254
5255 // ACLE 6.4.8 Saturation instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005256 bool SAT = false;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005257 if ((ArchVersion == 6 && CPUProfile != "M") || ArchVersion > 6 ) {
5258 Builder.defineMacro("__ARM_FEATURE_SAT", "1");
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005259 SAT = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005260 }
5261
5262 // ACLE 6.4.6 Q (saturation) flag
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005263 if (DSP || SAT)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005264 Builder.defineMacro("__ARM_FEATURE_QBIT", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005265
5266 if (Opts.UnsafeFPMath)
5267 Builder.defineMacro("__ARM_FP_FAST", "1");
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005268
5269 if (ArchKind == llvm::ARM::AK_ARMV8_1A)
5270 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
Chris Lattner17df24e2008-04-21 18:56:49 +00005271 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005272
Craig Topper6c03a542015-10-19 04:51:35 +00005273 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5274 return llvm::makeArrayRef(BuiltinInfo,
5275 clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner17df24e2008-04-21 18:56:49 +00005276 }
Craig Topper3164f332014-03-11 03:39:26 +00005277 bool isCLZForZeroUndef() const override { return false; }
5278 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northover5627d392015-10-30 16:30:45 +00005279 return IsAAPCS
5280 ? AAPCSABIBuiltinVaList
Tim Northoverd88ecb32016-01-27 19:32:40 +00005281 : (getTriple().isWatchABI() ? TargetInfo::CharPtrBuiltinVaList
5282 : TargetInfo::VoidPtrBuiltinVaList);
Chris Lattner17df24e2008-04-21 18:56:49 +00005283 }
Craig Topperf054e3a2015-10-19 03:52:27 +00005284 ArrayRef<const char *> getGCCRegNames() const override;
5285 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00005286 bool validateAsmConstraint(const char *&Name,
5287 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00005288 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00005289 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00005290 case 'l': // r0-r7
5291 case 'h': // r8-r15
JF Bastien750caef2016-02-19 06:54:45 +00005292 case 't': // VFP Floating point register single precision
5293 case 'w': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00005294 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00005295 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005296 case 'I':
5297 case 'J':
5298 case 'K':
5299 case 'L':
5300 case 'M':
5301 // FIXME
5302 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00005303 case 'Q': // A memory address that is a single base register.
5304 Info.setAllowsMemory();
5305 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005306 case 'U': // a memory reference...
5307 switch (Name[1]) {
5308 case 'q': // ...ARMV4 ldrsb
5309 case 'v': // ...VFP load/store (reg+constant offset)
5310 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00005311 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00005312 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00005313 case 'n': // valid address for Neon doubleword vector load/store
5314 case 'm': // valid address for Neon element and structure load/store
5315 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00005316 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005317 Info.setAllowsMemory();
5318 Name++;
5319 return true;
5320 }
Nate Begeman2908fa02008-04-22 05:03:19 +00005321 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005322 return false;
5323 }
Craig Topper3164f332014-03-11 03:39:26 +00005324 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005325 std::string R;
5326 switch (*Constraint) {
5327 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00005328 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005329 Constraint++;
5330 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00005331 case 'p': // 'p' should be translated to 'r' by default.
5332 R = std::string("r");
5333 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005334 default:
5335 return std::string(1, *Constraint);
5336 }
5337 return R;
5338 }
Akira Hatanaka987f1862014-08-22 06:05:21 +00005339 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005340 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005341 std::string &SuggestedModifier) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00005342 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00005343 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00005344
Bill Wendling9d1ee112012-10-25 23:28:48 +00005345 // Strip off constraint modifiers.
5346 while (Constraint[0] == '=' ||
5347 Constraint[0] == '+' ||
5348 Constraint[0] == '&')
5349 Constraint = Constraint.substr(1);
5350
5351 switch (Constraint[0]) {
5352 default: break;
5353 case 'r': {
5354 switch (Modifier) {
5355 default:
Tim Northover8f24b172013-12-08 15:24:55 +00005356 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00005357 case 'q':
5358 // A register of size 32 cannot fit a vector type.
5359 return false;
5360 }
5361 }
5362 }
5363
5364 return true;
5365 }
Craig Topper3164f332014-03-11 03:39:26 +00005366 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00005367 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00005368 return "";
5369 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005370
Craig Topper3164f332014-03-11 03:39:26 +00005371 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00005372 switch (CC) {
5373 case CC_AAPCS:
5374 case CC_AAPCS_VFP:
5375 case CC_Swift:
5376 return CCCR_OK;
5377 default:
5378 return CCCR_Warning;
5379 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005380 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00005381
Craig Topper3164f332014-03-11 03:39:26 +00005382 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00005383 if (RegNo == 0) return 0;
5384 if (RegNo == 1) return 1;
5385 return -1;
5386 }
Matthias Braund1e2fad2015-07-17 00:15:22 +00005387
5388 bool hasSjLjLowering() const override {
5389 return true;
5390 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005391};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005392
Rafael Espindolaeb265472013-08-21 21:59:03 +00005393bool ARMTargetInfo::setFPMath(StringRef Name) {
5394 if (Name == "neon") {
5395 FPMath = FP_Neon;
5396 return true;
5397 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
5398 Name == "vfp4") {
5399 FPMath = FP_VFP;
5400 return true;
5401 }
5402 return false;
5403}
5404
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005405const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005406 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005407 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005408 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
5409
5410 // Float registers
5411 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
5412 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
5413 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005414 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005415
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005416 // Double registers
5417 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
5418 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005419 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
5420 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005421
5422 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005423 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
5424 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005425};
5426
Craig Topperf054e3a2015-10-19 03:52:27 +00005427ArrayRef<const char *> ARMTargetInfo::getGCCRegNames() const {
5428 return llvm::makeArrayRef(GCCRegNames);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005429}
5430
5431const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005432 { { "a1" }, "r0" },
5433 { { "a2" }, "r1" },
5434 { { "a3" }, "r2" },
5435 { { "a4" }, "r3" },
5436 { { "v1" }, "r4" },
5437 { { "v2" }, "r5" },
5438 { { "v3" }, "r6" },
5439 { { "v4" }, "r7" },
5440 { { "v5" }, "r8" },
5441 { { "v6", "rfp" }, "r9" },
5442 { { "sl" }, "r10" },
5443 { { "fp" }, "r11" },
5444 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00005445 { { "r13" }, "sp" },
5446 { { "r14" }, "lr" },
5447 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005448 // The S, D and Q registers overlap, but aren't really aliases; we
5449 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005450};
5451
Craig Topperf054e3a2015-10-19 03:52:27 +00005452ArrayRef<TargetInfo::GCCRegAlias> ARMTargetInfo::getGCCRegAliases() const {
5453 return llvm::makeArrayRef(GCCRegAliases);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005454}
Chris Lattner5cc15e02010-03-03 19:03:45 +00005455
5456const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00005457#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005458 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005459#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5460 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00005461#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00005462
Craig Topper07d3b622015-08-07 05:14:44 +00005463#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005464 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005465#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005466 { #ID, TYPE, ATTRS, nullptr, LANG, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005467#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5468 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5cc15e02010-03-03 19:03:45 +00005469#include "clang/Basic/BuiltinsARM.def"
5470};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005471
5472class ARMleTargetInfo : public ARMTargetInfo {
5473public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005474 ARMleTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5475 : ARMTargetInfo(Triple, Opts, /*BigEndian=*/false) {}
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005476 void getTargetDefines(const LangOptions &Opts,
5477 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005478 Builder.defineMacro("__ARMEL__");
5479 ARMTargetInfo::getTargetDefines(Opts, Builder);
5480 }
5481};
5482
5483class ARMbeTargetInfo : public ARMTargetInfo {
5484public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005485 ARMbeTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5486 : ARMTargetInfo(Triple, Opts, /*BigEndian=*/true) {}
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005487 void getTargetDefines(const LangOptions &Opts,
5488 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005489 Builder.defineMacro("__ARMEB__");
5490 Builder.defineMacro("__ARM_BIG_ENDIAN");
5491 ARMTargetInfo::getTargetDefines(Opts, Builder);
5492 }
5493};
Chris Lattner17df24e2008-04-21 18:56:49 +00005494
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005495class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
5496 const llvm::Triple Triple;
5497public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005498 WindowsARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5499 : WindowsTargetInfo<ARMleTargetInfo>(Triple, Opts), Triple(Triple) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005500 WCharType = UnsignedShort;
5501 SizeType = UnsignedInt;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005502 }
5503 void getVisualStudioDefines(const LangOptions &Opts,
5504 MacroBuilder &Builder) const {
5505 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
5506
5507 // FIXME: this is invalid for WindowsCE
5508 Builder.defineMacro("_M_ARM_NT", "1");
5509 Builder.defineMacro("_M_ARMT", "_M_ARM");
5510 Builder.defineMacro("_M_THUMB", "_M_ARM");
5511
5512 assert((Triple.getArch() == llvm::Triple::arm ||
5513 Triple.getArch() == llvm::Triple::thumb) &&
5514 "invalid architecture for Windows ARM target info");
5515 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
5516 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
5517
5518 // TODO map the complete set of values
5519 // 31: VFPv3 40: VFPv4
5520 Builder.defineMacro("_M_ARM_FP", "31");
5521 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00005522 BuiltinVaListKind getBuiltinVaListKind() const override {
5523 return TargetInfo::CharPtrBuiltinVaList;
5524 }
Martell Malone7ccda3c2015-08-14 18:00:09 +00005525 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5526 switch (CC) {
5527 case CC_X86StdCall:
5528 case CC_X86ThisCall:
5529 case CC_X86FastCall:
5530 case CC_X86VectorCall:
5531 return CCCR_Ignore;
5532 case CC_C:
5533 return CCCR_OK;
5534 default:
5535 return CCCR_Warning;
5536 }
5537 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005538};
5539
5540// Windows ARM + Itanium C++ ABI Target
5541class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
5542public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005543 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple,
5544 const TargetOptions &Opts)
5545 : WindowsARMTargetInfo(Triple, Opts) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005546 TheCXXABI.set(TargetCXXABI::GenericARM);
5547 }
5548
5549 void getTargetDefines(const LangOptions &Opts,
5550 MacroBuilder &Builder) const override {
5551 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5552
5553 if (Opts.MSVCCompat)
5554 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5555 }
5556};
5557
5558// Windows ARM, MS (C++) ABI
5559class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
5560public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005561 MicrosoftARMleTargetInfo(const llvm::Triple &Triple,
5562 const TargetOptions &Opts)
5563 : WindowsARMTargetInfo(Triple, Opts) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005564 TheCXXABI.set(TargetCXXABI::Microsoft);
5565 }
5566
5567 void getTargetDefines(const LangOptions &Opts,
5568 MacroBuilder &Builder) const override {
5569 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5570 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5571 }
5572};
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005573
Yaron Keren321249c2015-07-15 13:32:23 +00005574// ARM MinGW target
5575class MinGWARMTargetInfo : public WindowsARMTargetInfo {
5576public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005577 MinGWARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5578 : WindowsARMTargetInfo(Triple, Opts) {
Yaron Keren321249c2015-07-15 13:32:23 +00005579 TheCXXABI.set(TargetCXXABI::GenericARM);
5580 }
5581
5582 void getTargetDefines(const LangOptions &Opts,
5583 MacroBuilder &Builder) const override {
5584 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5585 DefineStd(Builder, "WIN32", Opts);
5586 DefineStd(Builder, "WINNT", Opts);
5587 Builder.defineMacro("_ARM_");
5588 addMinGWDefines(Opts, Builder);
5589 }
5590};
5591
5592// ARM Cygwin target
5593class CygwinARMTargetInfo : public ARMleTargetInfo {
5594public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005595 CygwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5596 : ARMleTargetInfo(Triple, Opts) {
Yaron Keren321249c2015-07-15 13:32:23 +00005597 TLSSupported = false;
5598 WCharType = UnsignedShort;
5599 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00005600 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Yaron Keren321249c2015-07-15 13:32:23 +00005601 }
5602 void getTargetDefines(const LangOptions &Opts,
5603 MacroBuilder &Builder) const override {
5604 ARMleTargetInfo::getTargetDefines(Opts, Builder);
5605 Builder.defineMacro("_ARM_");
5606 Builder.defineMacro("__CYGWIN__");
5607 Builder.defineMacro("__CYGWIN32__");
5608 DefineStd(Builder, "unix", Opts);
5609 if (Opts.CPlusPlus)
5610 Builder.defineMacro("_GNU_SOURCE");
5611 }
5612};
5613
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005614class DarwinARMTargetInfo : public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00005615protected:
Craig Topper3164f332014-03-11 03:39:26 +00005616 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5617 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00005618 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00005619 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005620
Torok Edwinb2b37c62009-06-30 17:10:35 +00005621public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005622 DarwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5623 : DarwinTargetInfo<ARMleTargetInfo>(Triple, Opts) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005624 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005625 // iOS always has 64-bit atomic instructions.
Eric Christopher917e9522014-11-18 22:36:15 +00005626 // FIXME: This should be based off of the target features in
5627 // ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005628 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00005629
Tim Northoverd88ecb32016-01-27 19:32:40 +00005630 if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00005631 // Darwin on iOS uses a variant of the ARM C++ ABI.
5632 TheCXXABI.set(TargetCXXABI::WatchOS);
5633
5634 // The 32-bit ABI is silent on what ptrdiff_t should be, but given that
5635 // size_t is long, it's a bit weird for it to be int.
5636 PtrDiffType = SignedLong;
5637
5638 // BOOL should be a real boolean on the new ABI
5639 UseSignedCharForObjCBool = false;
5640 } else
5641 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005642 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005643};
Eli Friedmanf05b7722008-08-20 07:44:10 +00005644
Tim Northover573cbee2014-05-24 12:52:07 +00005645class AArch64TargetInfo : public TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00005646 virtual void setDataLayout() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00005647 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5648 static const char *const GCCRegNames[];
5649
James Molloy75f5f9e2014-04-16 15:33:48 +00005650 enum FPUModeEnum {
5651 FPUMode,
5652 NeonMode
5653 };
5654
5655 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00005656 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00005657 unsigned Crypto;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005658 unsigned Unaligned;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005659 unsigned V8_1A;
James Molloy75f5f9e2014-04-16 15:33:48 +00005660
Tim Northovera2ee4332014-03-29 15:09:45 +00005661 static const Builtin::Info BuiltinInfo[];
5662
5663 std::string ABI;
5664
5665public:
Saleem Abdulrasool9b5ba542016-04-10 03:19:47 +00005666 AArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Tim Northovera2ee4332014-03-29 15:09:45 +00005667 : TargetInfo(Triple), ABI("aapcs") {
Tim Northover25e8a672014-05-24 12:51:25 +00005668 if (getTriple().getOS() == llvm::Triple::NetBSD) {
5669 WCharType = SignedInt;
5670
5671 // NetBSD apparently prefers consistency across ARM targets to consistency
5672 // across 64-bit targets.
5673 Int64Type = SignedLongLong;
5674 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005675 } else {
5676 WCharType = UnsignedInt;
5677 Int64Type = SignedLong;
5678 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005679 }
5680
Tim Northovera2ee4332014-03-29 15:09:45 +00005681 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005682 MaxVectorAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005683 MaxAtomicInlineWidth = 128;
5684 MaxAtomicPromoteWidth = 128;
5685
Tim Northovera6a19f12015-02-06 01:25:07 +00005686 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005687 LongDoubleFormat = &llvm::APFloat::IEEEquad;
5688
Tim Northovera2ee4332014-03-29 15:09:45 +00005689 // {} in inline assembly are neon specifiers, not assembly variant
5690 // specifiers.
5691 NoAsmVariants = true;
5692
Tim Northover7ad87af2015-01-16 18:44:04 +00005693 // AAPCS gives rules for bitfields. 7.1.7 says: "The container type
5694 // contributes to the alignment of the containing aggregate in the same way
5695 // a plain (non bit-field) member of that type would, without exception for
5696 // zero-sized or anonymous bit-fields."
Tim Northover5627d392015-10-30 16:30:45 +00005697 assert(UseBitFieldTypeAlignment && "bitfields affect type alignment");
Tim Northover7ad87af2015-01-16 18:44:04 +00005698 UseZeroLengthBitfieldAlignment = true;
5699
Tim Northover573cbee2014-05-24 12:52:07 +00005700 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00005701 TheCXXABI.set(TargetCXXABI::GenericAArch64);
Saleem Abdulrasoolc066d9c2016-04-12 03:05:03 +00005702
5703 if (Triple.getOS() == llvm::Triple::Linux ||
5704 Triple.getOS() == llvm::Triple::UnknownOS)
5705 this->MCountName = Opts.EABIVersion == "gnu" ? "\01_mcount" : "mcount";
Tim Northovera2ee4332014-03-29 15:09:45 +00005706 }
5707
Alp Toker4925ba72014-06-07 23:30:42 +00005708 StringRef getABI() const override { return ABI; }
David Blaikie1cbb9712014-11-14 19:09:44 +00005709 bool setABI(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005710 if (Name != "aapcs" && Name != "darwinpcs")
5711 return false;
5712
5713 ABI = Name;
5714 return true;
5715 }
5716
David Blaikie1cbb9712014-11-14 19:09:44 +00005717 bool setCPU(const std::string &Name) override {
Renato Golin3b8709c2016-05-25 12:36:31 +00005718 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5719 .Case("generic", true)
5720 .Cases("cortex-a53", "cortex-a57", "cortex-a72",
5721 "cortex-a35", "exynos-m1", true)
Sjoerd Meijer90df4a72016-06-02 10:48:37 +00005722 .Case("cortex-a73", true)
Renato Golin3b8709c2016-05-25 12:36:31 +00005723 .Case("cyclone", true)
5724 .Case("kryo", true)
Pankaj Gode3267e842016-06-29 10:00:31 +00005725 .Case("vulcan", true)
Renato Golin3b8709c2016-05-25 12:36:31 +00005726 .Default(false);
5727 return CPUKnown;
Tim Northovera2ee4332014-03-29 15:09:45 +00005728 }
5729
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005730 void getTargetDefines(const LangOptions &Opts,
5731 MacroBuilder &Builder) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005732 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00005733 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005734
5735 // Target properties.
5736 Builder.defineMacro("_LP64");
5737 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005738
5739 // ACLE predefines. Many can only have one possible value on v8 AArch64.
5740 Builder.defineMacro("__ARM_ACLE", "200");
5741 Builder.defineMacro("__ARM_ARCH", "8");
5742 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
5743
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005744 Builder.defineMacro("__ARM_64BIT_STATE", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005745 Builder.defineMacro("__ARM_PCS_AAPCS64", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005746 Builder.defineMacro("__ARM_ARCH_ISA_A64", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005747
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005748 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
5749 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
5750 Builder.defineMacro("__ARM_FEATURE_LDREX", "0xF");
5751 Builder.defineMacro("__ARM_FEATURE_IDIV", "1"); // As specified in ACLE
James Molloy0ffb0932014-09-15 11:25:38 +00005752 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005753 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
5754 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005755
5756 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
5757
5758 // 0xe implies support for half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005759 Builder.defineMacro("__ARM_FP", "0xE");
Tim Northovera2ee4332014-03-29 15:09:45 +00005760
5761 // PCS specifies this for SysV variants, which is all we support. Other ABIs
5762 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005763 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
5764 Builder.defineMacro("__ARM_FP16_ARGS", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005765
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005766 if (Opts.UnsafeFPMath)
5767 Builder.defineMacro("__ARM_FP_FAST", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005768
5769 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
5770
5771 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5772 Opts.ShortEnums ? "1" : "4");
5773
James Molloy75f5f9e2014-04-16 15:33:48 +00005774 if (FPU == NeonMode) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005775 Builder.defineMacro("__ARM_NEON", "1");
James Molloy75f5f9e2014-04-16 15:33:48 +00005776 // 64-bit NEON supports half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005777 Builder.defineMacro("__ARM_NEON_FP", "0xE");
James Molloy75f5f9e2014-04-16 15:33:48 +00005778 }
Tim Northovera2ee4332014-03-29 15:09:45 +00005779
Bradley Smith418c5932014-05-02 15:17:51 +00005780 if (CRC)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005781 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
Bradley Smith418c5932014-05-02 15:17:51 +00005782
James Molloy75f5f9e2014-04-16 15:33:48 +00005783 if (Crypto)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005784 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
5785
5786 if (Unaligned)
5787 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Reid Klecknerd167d422015-05-06 15:31:46 +00005788
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005789 if (V8_1A)
5790 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
5791
Reid Klecknerd167d422015-05-06 15:31:46 +00005792 // All of the __sync_(bool|val)_compare_and_swap_(1|2|4|8) builtins work.
5793 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5794 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5795 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5796 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Tim Northovera2ee4332014-03-29 15:09:45 +00005797 }
5798
Craig Topper6c03a542015-10-19 04:51:35 +00005799 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5800 return llvm::makeArrayRef(BuiltinInfo,
5801 clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin);
Tim Northovera2ee4332014-03-29 15:09:45 +00005802 }
5803
David Blaikie1cbb9712014-11-14 19:09:44 +00005804 bool hasFeature(StringRef Feature) const override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005805 return Feature == "aarch64" ||
5806 Feature == "arm64" ||
Ben Langmuir587aeaf2015-08-07 01:59:56 +00005807 Feature == "arm" ||
James Molloy75f5f9e2014-04-16 15:33:48 +00005808 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00005809 }
5810
James Molloy5e73df52014-04-16 15:06:20 +00005811 bool handleTargetFeatures(std::vector<std::string> &Features,
5812 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005813 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00005814 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00005815 Crypto = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005816 Unaligned = 1;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005817 V8_1A = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005818
Eric Christopher610fe112015-08-26 08:21:55 +00005819 for (const auto &Feature : Features) {
5820 if (Feature == "+neon")
James Molloy75f5f9e2014-04-16 15:33:48 +00005821 FPU = NeonMode;
Eric Christopher610fe112015-08-26 08:21:55 +00005822 if (Feature == "+crc")
Bradley Smith418c5932014-05-02 15:17:51 +00005823 CRC = 1;
Eric Christopher610fe112015-08-26 08:21:55 +00005824 if (Feature == "+crypto")
James Molloy75f5f9e2014-04-16 15:33:48 +00005825 Crypto = 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005826 if (Feature == "+strict-align")
5827 Unaligned = 0;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005828 if (Feature == "+v8.1a")
5829 V8_1A = 1;
James Molloy75f5f9e2014-04-16 15:33:48 +00005830 }
5831
James Y Knightb214cbc2016-03-04 19:00:41 +00005832 setDataLayout();
James Molloy5e73df52014-04-16 15:06:20 +00005833
5834 return true;
5835 }
5836
John McCall477f2bb2016-03-03 06:39:32 +00005837 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5838 switch (CC) {
5839 case CC_C:
5840 case CC_Swift:
Roman Levenstein35aa5ce2016-03-16 18:00:46 +00005841 case CC_PreserveMost:
5842 case CC_PreserveAll:
John McCall477f2bb2016-03-03 06:39:32 +00005843 return CCCR_OK;
5844 default:
5845 return CCCR_Warning;
5846 }
5847 }
5848
David Blaikie1cbb9712014-11-14 19:09:44 +00005849 bool isCLZForZeroUndef() const override { return false; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005850
David Blaikie1cbb9712014-11-14 19:09:44 +00005851 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005852 return TargetInfo::AArch64ABIBuiltinVaList;
5853 }
5854
Craig Topperf054e3a2015-10-19 03:52:27 +00005855 ArrayRef<const char *> getGCCRegNames() const override;
5856 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00005857
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005858 bool validateAsmConstraint(const char *&Name,
5859 TargetInfo::ConstraintInfo &Info) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005860 switch (*Name) {
5861 default:
5862 return false;
5863 case 'w': // Floating point and SIMD registers (V0-V31)
5864 Info.setAllowsRegister();
5865 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00005866 case 'I': // Constant that can be used with an ADD instruction
5867 case 'J': // Constant that can be used with a SUB instruction
5868 case 'K': // Constant that can be used with a 32-bit logical instruction
5869 case 'L': // Constant that can be used with a 64-bit logical instruction
5870 case 'M': // Constant that can be used as a 32-bit MOV immediate
5871 case 'N': // Constant that can be used as a 64-bit MOV immediate
5872 case 'Y': // Floating point constant zero
5873 case 'Z': // Integer constant zero
5874 return true;
5875 case 'Q': // A memory reference with base register and no offset
5876 Info.setAllowsMemory();
5877 return true;
5878 case 'S': // A symbolic address
5879 Info.setAllowsRegister();
5880 return true;
5881 case 'U':
Eric Christopher917e9522014-11-18 22:36:15 +00005882 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
5883 // Utf: A memory address suitable for ldp/stp in TF mode.
5884 // Usa: An absolute symbolic address.
5885 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
5886 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
Tim Northovera2ee4332014-03-29 15:09:45 +00005887 case 'z': // Zero register, wzr or xzr
5888 Info.setAllowsRegister();
5889 return true;
5890 case 'x': // Floating point and SIMD registers (V0-V15)
5891 Info.setAllowsRegister();
5892 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00005893 }
5894 return false;
5895 }
5896
Akira Hatanaka987f1862014-08-22 06:05:21 +00005897 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005898 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005899 std::string &SuggestedModifier) const override {
James Molloy8a157bf2014-07-25 10:19:47 +00005900 // Strip off constraint modifiers.
5901 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
5902 Constraint = Constraint.substr(1);
5903
5904 switch (Constraint[0]) {
5905 default:
5906 return true;
5907 case 'z':
5908 case 'r': {
5909 switch (Modifier) {
5910 case 'x':
5911 case 'w':
5912 // For now assume that the person knows what they're
5913 // doing with the modifier.
5914 return true;
5915 default:
5916 // By default an 'r' constraint will be in the 'x'
5917 // registers.
Akira Hatanaka987f1862014-08-22 06:05:21 +00005918 if (Size == 64)
5919 return true;
5920
5921 SuggestedModifier = "w";
5922 return false;
James Molloy8a157bf2014-07-25 10:19:47 +00005923 }
5924 }
5925 }
5926 }
5927
David Blaikie1cbb9712014-11-14 19:09:44 +00005928 const char *getClobbers() const override { return ""; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005929
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00005930 int getEHDataRegisterNumber(unsigned RegNo) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005931 if (RegNo == 0)
5932 return 0;
5933 if (RegNo == 1)
5934 return 1;
5935 return -1;
5936 }
5937};
5938
Tim Northover573cbee2014-05-24 12:52:07 +00005939const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005940 // 32-bit Integer registers
5941 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
5942 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
5943 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
5944
5945 // 64-bit Integer registers
5946 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
5947 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
5948 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
5949
5950 // 32-bit floating point regsisters
5951 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
5952 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
5953 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
5954
5955 // 64-bit floating point regsisters
5956 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
5957 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
5958 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
5959
5960 // Vector registers
5961 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
5962 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
5963 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
5964};
5965
Craig Topperf054e3a2015-10-19 03:52:27 +00005966ArrayRef<const char *> AArch64TargetInfo::getGCCRegNames() const {
5967 return llvm::makeArrayRef(GCCRegNames);
Tim Northovera2ee4332014-03-29 15:09:45 +00005968}
5969
Tim Northover573cbee2014-05-24 12:52:07 +00005970const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005971 { { "w31" }, "wsp" },
5972 { { "x29" }, "fp" },
5973 { { "x30" }, "lr" },
5974 { { "x31" }, "sp" },
5975 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
5976 // don't want to substitute one of these for a different-sized one.
5977};
5978
Craig Topperf054e3a2015-10-19 03:52:27 +00005979ArrayRef<TargetInfo::GCCRegAlias> AArch64TargetInfo::getGCCRegAliases() const {
5980 return llvm::makeArrayRef(GCCRegAliases);
Tim Northovera2ee4332014-03-29 15:09:45 +00005981}
5982
Tim Northover573cbee2014-05-24 12:52:07 +00005983const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005984#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00005985 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00005986#include "clang/Basic/BuiltinsNEON.def"
5987
5988#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00005989 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northover573cbee2014-05-24 12:52:07 +00005990#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00005991};
James Molloy5e73df52014-04-16 15:06:20 +00005992
Tim Northover573cbee2014-05-24 12:52:07 +00005993class AArch64leTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00005994 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00005995 if (getTriple().isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00005996 resetDataLayout("e-m:o-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00005997 else
Chad Rosier4c077aa2016-07-07 20:02:25 +00005998 resetDataLayout("e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00005999 }
6000
6001public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006002 AArch64leTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6003 : AArch64TargetInfo(Triple, Opts) {
James Molloy5e73df52014-04-16 15:06:20 +00006004 BigEndian = false;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006005 }
James Molloy5e73df52014-04-16 15:06:20 +00006006 void getTargetDefines(const LangOptions &Opts,
6007 MacroBuilder &Builder) const override {
6008 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00006009 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00006010 }
6011};
6012
Tim Northover573cbee2014-05-24 12:52:07 +00006013class AArch64beTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00006014 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00006015 assert(!getTriple().isOSBinFormatMachO());
Chad Rosier4c077aa2016-07-07 20:02:25 +00006016 resetDataLayout("E-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006017 }
6018
6019public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006020 AArch64beTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6021 : AArch64TargetInfo(Triple, Opts) {}
James Molloy5e73df52014-04-16 15:06:20 +00006022 void getTargetDefines(const LangOptions &Opts,
6023 MacroBuilder &Builder) const override {
6024 Builder.defineMacro("__AARCH64EB__");
6025 Builder.defineMacro("__AARCH_BIG_ENDIAN");
6026 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00006027 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00006028 }
6029};
Tim Northovera2ee4332014-03-29 15:09:45 +00006030
Tim Northover573cbee2014-05-24 12:52:07 +00006031class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00006032protected:
6033 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
6034 MacroBuilder &Builder) const override {
6035 Builder.defineMacro("__AARCH64_SIMD__");
6036 Builder.defineMacro("__ARM64_ARCH_8__");
6037 Builder.defineMacro("__ARM_NEON__");
6038 Builder.defineMacro("__LITTLE_ENDIAN__");
6039 Builder.defineMacro("__REGISTER_PREFIX__", "");
6040 Builder.defineMacro("__arm64", "1");
6041 Builder.defineMacro("__arm64__", "1");
6042
6043 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
6044 }
6045
Tim Northovera2ee4332014-03-29 15:09:45 +00006046public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006047 DarwinAArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6048 : DarwinTargetInfo<AArch64leTargetInfo>(Triple, Opts) {
Tim Northovera2ee4332014-03-29 15:09:45 +00006049 Int64Type = SignedLongLong;
6050 WCharType = SignedInt;
6051 UseSignedCharForObjCBool = false;
6052
Tim Northovera6a19f12015-02-06 01:25:07 +00006053 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00006054 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
6055
6056 TheCXXABI.set(TargetCXXABI::iOS64);
6057 }
6058
David Blaikie1cbb9712014-11-14 19:09:44 +00006059 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006060 return TargetInfo::CharPtrBuiltinVaList;
6061 }
6062};
Tim Northovera2ee4332014-03-29 15:09:45 +00006063
Tony Linthicum76329bf2011-12-12 21:14:55 +00006064// Hexagon abstract base class
6065class HexagonTargetInfo : public TargetInfo {
6066 static const Builtin::Info BuiltinInfo[];
6067 static const char * const GCCRegNames[];
6068 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6069 std::string CPU;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006070 bool HasHVX, HasHVXDouble;
6071
Tony Linthicum76329bf2011-12-12 21:14:55 +00006072public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006073 HexagonTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6074 : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006075 BigEndian = false;
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00006076 // Specify the vector alignment explicitly. For v512x1, the calculated
6077 // alignment would be 512*alignment(i1), which is 512 bytes, instead of
6078 // the required minimum of 64 bytes.
James Y Knightb214cbc2016-03-04 19:00:41 +00006079 resetDataLayout("e-m:e-p:32:32:32-a:0-n16:32-"
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00006080 "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 +00006081 "v32:32:32-v64:64:64-v512:512:512-v1024:1024:1024-v2048:2048:2048");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006082 SizeType = UnsignedInt;
6083 PtrDiffType = SignedInt;
6084 IntPtrType = SignedInt;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006085
6086 // {} in inline assembly are packet specifiers, not assembly variant
6087 // specifiers.
6088 NoAsmVariants = true;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006089
6090 LargeArrayMinWidth = 64;
6091 LargeArrayAlign = 64;
6092 UseBitFieldTypeAlignment = true;
6093 ZeroLengthBitfieldBoundary = 32;
6094 HasHVX = HasHVXDouble = false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006095 }
6096
Craig Topper6c03a542015-10-19 04:51:35 +00006097 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6098 return llvm::makeArrayRef(BuiltinInfo,
6099 clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006100 }
6101
Craig Topper3164f332014-03-11 03:39:26 +00006102 bool validateAsmConstraint(const char *&Name,
6103 TargetInfo::ConstraintInfo &Info) const override {
Krzysztof Parzyszeke0026e42016-05-18 14:56:14 +00006104 switch (*Name) {
6105 case 'v':
6106 case 'q':
6107 if (HasHVX) {
6108 Info.setAllowsRegister();
6109 return true;
6110 }
6111 break;
Krzysztof Parzyszek89fb4412016-05-20 13:50:32 +00006112 case 's':
6113 // Relocatable constant.
6114 return true;
Krzysztof Parzyszeke0026e42016-05-18 14:56:14 +00006115 }
6116 return false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006117 }
6118
Craig Topper3164f332014-03-11 03:39:26 +00006119 void getTargetDefines(const LangOptions &Opts,
6120 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006121
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006122 bool isCLZForZeroUndef() const override { return false; }
6123
Craig Topper3164f332014-03-11 03:39:26 +00006124 bool hasFeature(StringRef Feature) const override {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006125 return llvm::StringSwitch<bool>(Feature)
6126 .Case("hexagon", true)
6127 .Case("hvx", HasHVX)
6128 .Case("hvx-double", HasHVXDouble)
6129 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006130 }
Craig Topper3164f332014-03-11 03:39:26 +00006131
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006132 bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6133 StringRef CPU, const std::vector<std::string> &FeaturesVec)
6134 const override;
6135
6136 bool handleTargetFeatures(std::vector<std::string> &Features,
6137 DiagnosticsEngine &Diags) override;
6138
Craig Topper3164f332014-03-11 03:39:26 +00006139 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006140 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006141 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006142 ArrayRef<const char *> getGCCRegNames() const override;
6143 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00006144 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006145 return "";
6146 }
Sebastian Pop86500282012-01-13 20:37:10 +00006147
6148 static const char *getHexagonCPUSuffix(StringRef Name) {
6149 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00006150 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006151 .Case("hexagonv5", "5")
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006152 .Case("hexagonv55", "55")
6153 .Case("hexagonv60", "60")
Craig Topperf1186c52014-05-08 06:41:40 +00006154 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00006155 }
6156
Craig Topper3164f332014-03-11 03:39:26 +00006157 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00006158 if (!getHexagonCPUSuffix(Name))
6159 return false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006160 CPU = Name;
6161 return true;
6162 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006163
6164 int getEHDataRegisterNumber(unsigned RegNo) const override {
6165 return RegNo < 2 ? RegNo : -1;
6166 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006167};
6168
6169void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006170 MacroBuilder &Builder) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006171 Builder.defineMacro("__qdsp6__", "1");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006172 Builder.defineMacro("__hexagon__", "1");
6173
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006174 if (CPU == "hexagonv4") {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006175 Builder.defineMacro("__HEXAGON_V4__");
6176 Builder.defineMacro("__HEXAGON_ARCH__", "4");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006177 if (Opts.HexagonQdsp6Compat) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006178 Builder.defineMacro("__QDSP6_V4__");
6179 Builder.defineMacro("__QDSP6_ARCH__", "4");
6180 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006181 } else if (CPU == "hexagonv5") {
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006182 Builder.defineMacro("__HEXAGON_V5__");
6183 Builder.defineMacro("__HEXAGON_ARCH__", "5");
6184 if(Opts.HexagonQdsp6Compat) {
6185 Builder.defineMacro("__QDSP6_V5__");
6186 Builder.defineMacro("__QDSP6_ARCH__", "5");
6187 }
Krzysztof Parzyszeka58ff512016-04-21 14:30:04 +00006188 } else if (CPU == "hexagonv55") {
6189 Builder.defineMacro("__HEXAGON_V55__");
6190 Builder.defineMacro("__HEXAGON_ARCH__", "55");
6191 Builder.defineMacro("__QDSP6_V55__");
6192 Builder.defineMacro("__QDSP6_ARCH__", "55");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006193 } else if (CPU == "hexagonv60") {
6194 Builder.defineMacro("__HEXAGON_V60__");
6195 Builder.defineMacro("__HEXAGON_ARCH__", "60");
6196 Builder.defineMacro("__QDSP6_V60__");
6197 Builder.defineMacro("__QDSP6_ARCH__", "60");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006198 }
Krzysztof Parzyszek7f0756c2016-04-18 18:38:11 +00006199
6200 if (hasFeature("hvx")) {
6201 Builder.defineMacro("__HVX__");
6202 if (hasFeature("hvx-double"))
6203 Builder.defineMacro("__HVXDBL__");
6204 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006205}
6206
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006207bool HexagonTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
6208 DiagnosticsEngine &Diags) {
6209 for (auto &F : Features) {
6210 if (F == "+hvx")
6211 HasHVX = true;
6212 else if (F == "-hvx")
6213 HasHVX = HasHVXDouble = false;
6214 else if (F == "+hvx-double")
6215 HasHVX = HasHVXDouble = true;
6216 else if (F == "-hvx-double")
6217 HasHVXDouble = false;
6218 }
6219 return true;
6220}
6221
6222bool HexagonTargetInfo::initFeatureMap(llvm::StringMap<bool> &Features,
6223 DiagnosticsEngine &Diags, StringRef CPU,
6224 const std::vector<std::string> &FeaturesVec) const {
6225 // Default for v60: -hvx, -hvx-double.
6226 Features["hvx"] = false;
6227 Features["hvx-double"] = false;
6228
6229 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
6230}
6231
6232
6233const char *const HexagonTargetInfo::GCCRegNames[] = {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006234 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6235 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6236 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6237 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
6238 "p0", "p1", "p2", "p3",
6239 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
6240};
6241
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006242ArrayRef<const char*> HexagonTargetInfo::getGCCRegNames() const {
Craig Topperf054e3a2015-10-19 03:52:27 +00006243 return llvm::makeArrayRef(GCCRegNames);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006244}
6245
Tony Linthicum76329bf2011-12-12 21:14:55 +00006246const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
6247 { { "sp" }, "r29" },
6248 { { "fp" }, "r30" },
6249 { { "lr" }, "r31" },
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006250};
Tony Linthicum76329bf2011-12-12 21:14:55 +00006251
Craig Topperf054e3a2015-10-19 03:52:27 +00006252ArrayRef<TargetInfo::GCCRegAlias> HexagonTargetInfo::getGCCRegAliases() const {
6253 return llvm::makeArrayRef(GCCRegAliases);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006254}
6255
6256
6257const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00006258#define BUILTIN(ID, TYPE, ATTRS) \
6259 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
6260#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
6261 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tony Linthicum76329bf2011-12-12 21:14:55 +00006262#include "clang/Basic/BuiltinsHexagon.def"
6263};
Tony Linthicum76329bf2011-12-12 21:14:55 +00006264
Jacques Pienaard964cc22016-03-28 21:02:54 +00006265class LanaiTargetInfo : public TargetInfo {
6266 // Class for Lanai (32-bit).
6267 // The CPU profiles supported by the Lanai backend
6268 enum CPUKind {
6269 CK_NONE,
6270 CK_V11,
6271 } CPU;
6272
6273 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6274 static const char *const GCCRegNames[];
6275
6276public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006277 LanaiTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6278 : TargetInfo(Triple) {
Jacques Pienaard964cc22016-03-28 21:02:54 +00006279 // Description string has to be kept in sync with backend.
6280 resetDataLayout("E" // Big endian
6281 "-m:e" // ELF name manging
6282 "-p:32:32" // 32 bit pointers, 32 bit aligned
6283 "-i64:64" // 64 bit integers, 64 bit aligned
6284 "-a:0:32" // 32 bit alignment of objects of aggregate type
6285 "-n32" // 32 bit native integer width
6286 "-S64" // 64 bit natural stack alignment
6287 );
6288
6289 // Setting RegParmMax equal to what mregparm was set to in the old
6290 // toolchain
6291 RegParmMax = 4;
6292
6293 // Set the default CPU to V11
6294 CPU = CK_V11;
6295
6296 // Temporary approach to make everything at least word-aligned and allow for
6297 // safely casting between pointers with different alignment requirements.
6298 // TODO: Remove this when there are no more cast align warnings on the
6299 // firmware.
6300 MinGlobalAlign = 32;
6301 }
6302
6303 void getTargetDefines(const LangOptions &Opts,
6304 MacroBuilder &Builder) const override {
6305 // Define __lanai__ when building for target lanai.
6306 Builder.defineMacro("__lanai__");
6307
6308 // Set define for the CPU specified.
6309 switch (CPU) {
6310 case CK_V11:
6311 Builder.defineMacro("__LANAI_V11__");
6312 break;
6313 case CK_NONE:
6314 llvm_unreachable("Unhandled target CPU");
6315 }
6316 }
6317
6318 bool setCPU(const std::string &Name) override {
6319 CPU = llvm::StringSwitch<CPUKind>(Name)
6320 .Case("v11", CK_V11)
6321 .Default(CK_NONE);
6322
6323 return CPU != CK_NONE;
6324 }
6325
6326 bool hasFeature(StringRef Feature) const override {
6327 return llvm::StringSwitch<bool>(Feature).Case("lanai", true).Default(false);
6328 }
6329
6330 ArrayRef<const char *> getGCCRegNames() const override;
6331
6332 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
6333
6334 BuiltinVaListKind getBuiltinVaListKind() const override {
6335 return TargetInfo::VoidPtrBuiltinVaList;
6336 }
6337
6338 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
6339
6340 bool validateAsmConstraint(const char *&Name,
6341 TargetInfo::ConstraintInfo &info) const override {
6342 return false;
6343 }
6344
6345 const char *getClobbers() const override { return ""; }
6346};
6347
6348const char *const LanaiTargetInfo::GCCRegNames[] = {
6349 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10",
6350 "r11", "r12", "r13", "r14", "r15", "r16", "r17", "r18", "r19", "r20", "r21",
6351 "r22", "r23", "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"};
6352
6353ArrayRef<const char *> LanaiTargetInfo::getGCCRegNames() const {
6354 return llvm::makeArrayRef(GCCRegNames);
6355}
6356
6357const TargetInfo::GCCRegAlias LanaiTargetInfo::GCCRegAliases[] = {
6358 {{"pc"}, "r2"},
6359 {{"sp"}, "r4"},
6360 {{"fp"}, "r5"},
6361 {{"rv"}, "r8"},
6362 {{"rr1"}, "r10"},
6363 {{"rr2"}, "r11"},
6364 {{"rca"}, "r15"},
6365};
6366
6367ArrayRef<TargetInfo::GCCRegAlias> LanaiTargetInfo::getGCCRegAliases() const {
6368 return llvm::makeArrayRef(GCCRegAliases);
6369}
6370
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006371// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
6372class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00006373 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6374 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006375 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00006376public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006377 SparcTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
James Y Knighta3518ad2016-01-27 01:04:51 +00006378 : TargetInfo(Triple), SoftFloat(false) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006379
Joerg Sonnenbergerd0be8dc2016-03-07 17:19:15 +00006380 int getEHDataRegisterNumber(unsigned RegNo) const override {
6381 if (RegNo == 0) return 24;
6382 if (RegNo == 1) return 25;
6383 return -1;
6384 }
6385
Craig Topper3164f332014-03-11 03:39:26 +00006386 bool handleTargetFeatures(std::vector<std::string> &Features,
6387 DiagnosticsEngine &Diags) override {
Jacob Baungard Hansen13a49372016-05-24 08:30:08 +00006388 // Check if software floating point is enabled
Eric Christopherfb481a42015-04-29 23:32:17 +00006389 auto Feature = std::find(Features.begin(), Features.end(), "+soft-float");
6390 if (Feature != Features.end()) {
6391 SoftFloat = true;
Eric Christopherfb481a42015-04-29 23:32:17 +00006392 }
Rafael Espindolaeb265472013-08-21 21:59:03 +00006393 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006394 }
Craig Topper3164f332014-03-11 03:39:26 +00006395 void getTargetDefines(const LangOptions &Opts,
6396 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006397 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006398 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006399
6400 if (SoftFloat)
6401 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00006402 }
Craig Topper3164f332014-03-11 03:39:26 +00006403
6404 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006405 return llvm::StringSwitch<bool>(Feature)
6406 .Case("softfloat", SoftFloat)
6407 .Case("sparc", true)
6408 .Default(false);
6409 }
Craig Topper3164f332014-03-11 03:39:26 +00006410
Chris Dewhurst0381cd72016-06-15 12:44:47 +00006411 bool hasSjLjLowering() const override {
6412 return true;
6413 }
6414
Craig Topper6c03a542015-10-19 04:51:35 +00006415 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006416 // FIXME: Implement!
Craig Topper6c03a542015-10-19 04:51:35 +00006417 return None;
Gabor Greif49991682008-02-21 16:29:08 +00006418 }
Craig Topper3164f332014-03-11 03:39:26 +00006419 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006420 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00006421 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006422 ArrayRef<const char *> getGCCRegNames() const override;
6423 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00006424 bool validateAsmConstraint(const char *&Name,
6425 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006426 // FIXME: Implement!
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00006427 switch (*Name) {
6428 case 'I': // Signed 13-bit constant
6429 case 'J': // Zero
6430 case 'K': // 32-bit constant with the low 12 bits clear
6431 case 'L': // A constant in the range supported by movcc (11-bit signed imm)
6432 case 'M': // A constant in the range supported by movrcc (19-bit signed imm)
6433 case 'N': // Same as 'K' but zext (required for SIMode)
6434 case 'O': // The constant 4096
6435 return true;
6436 }
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006437 return false;
Gabor Greif49991682008-02-21 16:29:08 +00006438 }
Craig Topper3164f332014-03-11 03:39:26 +00006439 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006440 // FIXME: Implement!
6441 return "";
Gabor Greif49991682008-02-21 16:29:08 +00006442 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006443
6444 // No Sparc V7 for now, the backend doesn't support it anyway.
6445 enum CPUKind {
6446 CK_GENERIC,
6447 CK_V8,
6448 CK_SUPERSPARC,
6449 CK_SPARCLITE,
6450 CK_F934,
6451 CK_HYPERSPARC,
6452 CK_SPARCLITE86X,
6453 CK_SPARCLET,
6454 CK_TSC701,
6455 CK_V9,
6456 CK_ULTRASPARC,
6457 CK_ULTRASPARC3,
6458 CK_NIAGARA,
6459 CK_NIAGARA2,
6460 CK_NIAGARA3,
Douglas Katzman6871afc2016-03-15 22:34:02 +00006461 CK_NIAGARA4,
6462 CK_MYRIAD2_1,
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006463 CK_MYRIAD2_2,
6464 CK_LEON2,
6465 CK_LEON2_AT697E,
6466 CK_LEON2_AT697F,
6467 CK_LEON3,
6468 CK_LEON3_UT699,
6469 CK_LEON3_GR712RC,
6470 CK_LEON4,
6471 CK_LEON4_GR740
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006472 } CPU = CK_GENERIC;
6473
6474 enum CPUGeneration {
6475 CG_V8,
6476 CG_V9,
6477 };
6478
6479 CPUGeneration getCPUGeneration(CPUKind Kind) const {
6480 switch (Kind) {
6481 case CK_GENERIC:
6482 case CK_V8:
6483 case CK_SUPERSPARC:
6484 case CK_SPARCLITE:
6485 case CK_F934:
6486 case CK_HYPERSPARC:
6487 case CK_SPARCLITE86X:
6488 case CK_SPARCLET:
6489 case CK_TSC701:
Douglas Katzman6871afc2016-03-15 22:34:02 +00006490 case CK_MYRIAD2_1:
6491 case CK_MYRIAD2_2:
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006492 case CK_LEON2:
6493 case CK_LEON2_AT697E:
6494 case CK_LEON2_AT697F:
6495 case CK_LEON3:
6496 case CK_LEON3_UT699:
6497 case CK_LEON3_GR712RC:
6498 case CK_LEON4:
6499 case CK_LEON4_GR740:
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006500 return CG_V8;
6501 case CK_V9:
6502 case CK_ULTRASPARC:
6503 case CK_ULTRASPARC3:
6504 case CK_NIAGARA:
6505 case CK_NIAGARA2:
6506 case CK_NIAGARA3:
6507 case CK_NIAGARA4:
6508 return CG_V9;
6509 }
Aaron Ballmana9a72852015-11-11 13:42:02 +00006510 llvm_unreachable("Unexpected CPU kind");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006511 }
6512
6513 CPUKind getCPUKind(StringRef Name) const {
6514 return llvm::StringSwitch<CPUKind>(Name)
6515 .Case("v8", CK_V8)
6516 .Case("supersparc", CK_SUPERSPARC)
6517 .Case("sparclite", CK_SPARCLITE)
6518 .Case("f934", CK_F934)
6519 .Case("hypersparc", CK_HYPERSPARC)
6520 .Case("sparclite86x", CK_SPARCLITE86X)
6521 .Case("sparclet", CK_SPARCLET)
6522 .Case("tsc701", CK_TSC701)
6523 .Case("v9", CK_V9)
6524 .Case("ultrasparc", CK_ULTRASPARC)
6525 .Case("ultrasparc3", CK_ULTRASPARC3)
6526 .Case("niagara", CK_NIAGARA)
6527 .Case("niagara2", CK_NIAGARA2)
6528 .Case("niagara3", CK_NIAGARA3)
6529 .Case("niagara4", CK_NIAGARA4)
Douglas Katzman6871afc2016-03-15 22:34:02 +00006530 .Case("myriad2", CK_MYRIAD2_1)
6531 .Case("myriad2.1", CK_MYRIAD2_1)
6532 .Case("myriad2.2", CK_MYRIAD2_2)
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006533 .Case("leon2", CK_LEON2)
6534 .Case("at697e", CK_LEON2_AT697E)
6535 .Case("at697f", CK_LEON2_AT697F)
6536 .Case("leon3", CK_LEON3)
6537 .Case("ut699", CK_LEON3_UT699)
6538 .Case("gr712rc", CK_LEON3_GR712RC)
6539 .Case("leon4", CK_LEON4)
6540 .Case("gr740", CK_LEON4_GR740)
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006541 .Default(CK_GENERIC);
6542 }
6543
6544 bool setCPU(const std::string &Name) override {
6545 CPU = getCPUKind(Name);
6546 return CPU != CK_GENERIC;
6547 }
Gabor Greif49991682008-02-21 16:29:08 +00006548};
6549
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006550const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00006551 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6552 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6553 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6554 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
6555};
6556
Craig Topperf054e3a2015-10-19 03:52:27 +00006557ArrayRef<const char *> SparcTargetInfo::getGCCRegNames() const {
6558 return llvm::makeArrayRef(GCCRegNames);
Chris Lattner9b415d62009-01-27 01:58:38 +00006559}
6560
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006561const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00006562 { { "g0" }, "r0" },
6563 { { "g1" }, "r1" },
6564 { { "g2" }, "r2" },
6565 { { "g3" }, "r3" },
6566 { { "g4" }, "r4" },
6567 { { "g5" }, "r5" },
6568 { { "g6" }, "r6" },
6569 { { "g7" }, "r7" },
6570 { { "o0" }, "r8" },
6571 { { "o1" }, "r9" },
6572 { { "o2" }, "r10" },
6573 { { "o3" }, "r11" },
6574 { { "o4" }, "r12" },
6575 { { "o5" }, "r13" },
6576 { { "o6", "sp" }, "r14" },
6577 { { "o7" }, "r15" },
6578 { { "l0" }, "r16" },
6579 { { "l1" }, "r17" },
6580 { { "l2" }, "r18" },
6581 { { "l3" }, "r19" },
6582 { { "l4" }, "r20" },
6583 { { "l5" }, "r21" },
6584 { { "l6" }, "r22" },
6585 { { "l7" }, "r23" },
6586 { { "i0" }, "r24" },
6587 { { "i1" }, "r25" },
6588 { { "i2" }, "r26" },
6589 { { "i3" }, "r27" },
6590 { { "i4" }, "r28" },
6591 { { "i5" }, "r29" },
6592 { { "i6", "fp" }, "r30" },
6593 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00006594};
6595
Craig Topperf054e3a2015-10-19 03:52:27 +00006596ArrayRef<TargetInfo::GCCRegAlias> SparcTargetInfo::getGCCRegAliases() const {
6597 return llvm::makeArrayRef(GCCRegAliases);
Chris Lattner9b415d62009-01-27 01:58:38 +00006598}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006599
6600// SPARC v8 is the 32-bit mode selected by Triple::sparc.
6601class SparcV8TargetInfo : public SparcTargetInfo {
6602public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006603 SparcV8TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6604 : SparcTargetInfo(Triple, Opts) {
James Y Knightb214cbc2016-03-04 19:00:41 +00006605 resetDataLayout("E-m:e-p:32:32-i64:64-f128:64-n32-S64");
Brad Smith73859112015-08-13 21:45:57 +00006606 // NetBSD / OpenBSD use long (same as llvm default); everyone else uses int.
6607 switch (getTriple().getOS()) {
6608 default:
James Y Knight4b4d19e2015-06-04 15:36:29 +00006609 SizeType = UnsignedInt;
6610 IntPtrType = SignedInt;
6611 PtrDiffType = SignedInt;
Brad Smith73859112015-08-13 21:45:57 +00006612 break;
6613 case llvm::Triple::NetBSD:
6614 case llvm::Triple::OpenBSD:
6615 SizeType = UnsignedLong;
6616 IntPtrType = SignedLong;
6617 PtrDiffType = SignedLong;
6618 break;
Brad Smith56495d52015-08-13 22:00:53 +00006619 }
Chris Dewhurst7cc4cfe2016-06-28 12:55:55 +00006620 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006621 }
6622
Craig Topper3164f332014-03-11 03:39:26 +00006623 void getTargetDefines(const LangOptions &Opts,
6624 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006625 SparcTargetInfo::getTargetDefines(Opts, Builder);
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006626 switch (getCPUGeneration(CPU)) {
6627 case CG_V8:
6628 Builder.defineMacro("__sparcv8");
6629 if (getTriple().getOS() != llvm::Triple::Solaris)
6630 Builder.defineMacro("__sparcv8__");
6631 break;
6632 case CG_V9:
6633 Builder.defineMacro("__sparcv9");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00006634 if (getTriple().getOS() != llvm::Triple::Solaris) {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006635 Builder.defineMacro("__sparcv9__");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00006636 Builder.defineMacro("__sparc_v9__");
6637 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006638 break;
6639 }
Douglas Katzman6871afc2016-03-15 22:34:02 +00006640 if (getTriple().getVendor() == llvm::Triple::Myriad) {
6641 switch (CPU) {
6642 case CK_MYRIAD2_1:
6643 Builder.defineMacro("__myriad2", "1");
6644 Builder.defineMacro("__myriad2__", "1");
6645 break;
6646 case CK_MYRIAD2_2:
6647 Builder.defineMacro("__myriad2", "2");
6648 Builder.defineMacro("__myriad2__", "2");
6649 break;
6650 default:
6651 break;
6652 }
6653 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006654 }
Chris Dewhurst69fa1922016-05-04 09:33:30 +00006655
6656 bool hasSjLjLowering() const override {
6657 return true;
6658 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006659};
6660
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006661// SPARCV8el is the 32-bit little-endian mode selected by Triple::sparcel.
6662class SparcV8elTargetInfo : public SparcV8TargetInfo {
6663 public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006664 SparcV8elTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6665 : SparcV8TargetInfo(Triple, Opts) {
6666 resetDataLayout("e-m:e-p:32:32-i64:64-f128:64-n32-S64");
6667 BigEndian = false;
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006668 }
6669};
6670
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006671// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
6672class SparcV9TargetInfo : public SparcTargetInfo {
6673public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006674 SparcV9TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6675 : SparcTargetInfo(Triple, Opts) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006676 // FIXME: Support Sparc quad-precision long double?
James Y Knightb214cbc2016-03-04 19:00:41 +00006677 resetDataLayout("E-m:e-i64:64-n32:64-S128");
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00006678 // This is an LP64 platform.
6679 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006680
6681 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00006682 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006683 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00006684 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006685 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006686 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00006687
6688 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
6689 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
6690 LongDoubleWidth = 128;
6691 LongDoubleAlign = 128;
6692 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00006693 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006694 }
6695
Craig Topper3164f332014-03-11 03:39:26 +00006696 void getTargetDefines(const LangOptions &Opts,
6697 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006698 SparcTargetInfo::getTargetDefines(Opts, Builder);
6699 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00006700 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00006701 // Solaris doesn't need these variants, but the BSDs do.
6702 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00006703 Builder.defineMacro("__sparc64__");
6704 Builder.defineMacro("__sparc_v9__");
6705 Builder.defineMacro("__sparcv9__");
6706 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006707 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00006708
Craig Topper3164f332014-03-11 03:39:26 +00006709 bool setCPU(const std::string &Name) override {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006710 if (!SparcTargetInfo::setCPU(Name))
6711 return false;
6712 return getCPUGeneration(CPU) == CG_V9;
Roman Divackyb1ae3d42014-02-25 18:35:30 +00006713 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006714};
6715
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006716class SystemZTargetInfo : public TargetInfo {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006717 static const Builtin::Info BuiltinInfo[];
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006718 static const char *const GCCRegNames[];
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006719 std::string CPU;
6720 bool HasTransactionalExecution;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006721 bool HasVector;
Ulrich Weigand47445072013-05-06 16:26:41 +00006722
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006723public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006724 SystemZTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Eric Christopherb093d692015-10-09 18:39:59 +00006725 : TargetInfo(Triple), CPU("z10"), HasTransactionalExecution(false),
6726 HasVector(false) {
Ulrich Weigand881497a2015-03-30 13:50:21 +00006727 IntMaxType = SignedLong;
6728 Int64Type = SignedLong;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006729 TLSSupported = true;
6730 IntWidth = IntAlign = 32;
6731 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
6732 PointerWidth = PointerAlign = 64;
6733 LongDoubleWidth = 128;
6734 LongDoubleAlign = 64;
6735 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Ulrich Weigandca3cb7f2015-04-21 17:29:35 +00006736 DefaultAlignForAttributeAligned = 64;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006737 MinGlobalAlign = 16;
James Y Knightb214cbc2016-03-04 19:00:41 +00006738 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 +00006739 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
6740 }
6741 void getTargetDefines(const LangOptions &Opts,
6742 MacroBuilder &Builder) const override {
6743 Builder.defineMacro("__s390__");
6744 Builder.defineMacro("__s390x__");
6745 Builder.defineMacro("__zarch__");
6746 Builder.defineMacro("__LONG_DOUBLE_128__");
Ulrich Weigandb038a522016-02-05 21:34:28 +00006747
6748 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
6749 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
6750 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
6751 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
6752
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006753 if (HasTransactionalExecution)
6754 Builder.defineMacro("__HTM__");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00006755 if (Opts.ZVector)
6756 Builder.defineMacro("__VEC__", "10301");
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006757 }
Craig Topper6c03a542015-10-19 04:51:35 +00006758 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6759 return llvm::makeArrayRef(BuiltinInfo,
6760 clang::SystemZ::LastTSBuiltin-Builtin::FirstTSBuiltin);
Ulrich Weigand47445072013-05-06 16:26:41 +00006761 }
6762
Craig Topperf054e3a2015-10-19 03:52:27 +00006763 ArrayRef<const char *> getGCCRegNames() const override;
6764 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006765 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00006766 return None;
Ulrich Weigand47445072013-05-06 16:26:41 +00006767 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006768 bool validateAsmConstraint(const char *&Name,
6769 TargetInfo::ConstraintInfo &info) const override;
6770 const char *getClobbers() const override {
6771 // FIXME: Is this really right?
6772 return "";
6773 }
6774 BuiltinVaListKind getBuiltinVaListKind() const override {
6775 return TargetInfo::SystemZBuiltinVaList;
6776 }
6777 bool setCPU(const std::string &Name) override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006778 CPU = Name;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006779 bool CPUKnown = llvm::StringSwitch<bool>(Name)
6780 .Case("z10", true)
6781 .Case("z196", true)
6782 .Case("zEC12", true)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006783 .Case("z13", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006784 .Default(false);
6785
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006786 return CPUKnown;
6787 }
Eric Christopher8c47b422015-10-09 18:39:55 +00006788 bool
6789 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6790 StringRef CPU,
6791 const std::vector<std::string> &FeaturesVec) const override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006792 if (CPU == "zEC12")
6793 Features["transactional-execution"] = true;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006794 if (CPU == "z13") {
6795 Features["transactional-execution"] = true;
6796 Features["vector"] = true;
6797 }
Eric Christopher007b0a02015-08-28 22:32:01 +00006798 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006799 }
6800
6801 bool handleTargetFeatures(std::vector<std::string> &Features,
6802 DiagnosticsEngine &Diags) override {
6803 HasTransactionalExecution = false;
Eric Christopher610fe112015-08-26 08:21:55 +00006804 for (const auto &Feature : Features) {
6805 if (Feature == "+transactional-execution")
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006806 HasTransactionalExecution = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006807 else if (Feature == "+vector")
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006808 HasVector = true;
6809 }
6810 // If we use the vector ABI, vector types are 64-bit aligned.
6811 if (HasVector) {
6812 MaxVectorAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00006813 resetDataLayout("E-m:e-i1:8:16-i8:8:16-i64:64-f128:64"
6814 "-v128:64-a:8:16-n32:64");
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006815 }
6816 return true;
6817 }
6818
6819 bool hasFeature(StringRef Feature) const override {
6820 return llvm::StringSwitch<bool>(Feature)
Ulrich Weigandcc673442015-04-01 14:15:35 +00006821 .Case("systemz", true)
6822 .Case("htm", HasTransactionalExecution)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006823 .Case("vx", HasVector)
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006824 .Default(false);
6825 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006826
Bryan Chane3f1ed52016-04-28 13:56:43 +00006827 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
6828 switch (CC) {
6829 case CC_C:
6830 case CC_Swift:
6831 return CCCR_OK;
6832 default:
6833 return CCCR_Warning;
6834 }
6835 }
6836
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006837 StringRef getABI() const override {
6838 if (HasVector)
6839 return "vector";
6840 return "";
6841 }
Ulrich Weigand47fd2532015-06-16 15:21:47 +00006842
6843 bool useFloat128ManglingForLongDouble() const override {
6844 return true;
6845 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006846};
6847
6848const Builtin::Info SystemZTargetInfo::BuiltinInfo[] = {
6849#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006850 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Jonas Paulsson3ace74a2016-03-30 15:51:24 +00006851#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
6852 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006853#include "clang/Basic/BuiltinsSystemZ.def"
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006854};
6855
6856const char *const SystemZTargetInfo::GCCRegNames[] = {
6857 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6858 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6859 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
6860 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
6861};
6862
Craig Topperf054e3a2015-10-19 03:52:27 +00006863ArrayRef<const char *> SystemZTargetInfo::getGCCRegNames() const {
6864 return llvm::makeArrayRef(GCCRegNames);
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006865}
6866
6867bool SystemZTargetInfo::
6868validateAsmConstraint(const char *&Name,
6869 TargetInfo::ConstraintInfo &Info) const {
6870 switch (*Name) {
6871 default:
6872 return false;
6873
6874 case 'a': // Address register
6875 case 'd': // Data register (equivalent to 'r')
6876 case 'f': // Floating-point register
6877 Info.setAllowsRegister();
6878 return true;
6879
6880 case 'I': // Unsigned 8-bit constant
6881 case 'J': // Unsigned 12-bit constant
6882 case 'K': // Signed 16-bit constant
6883 case 'L': // Signed 20-bit displacement (on all targets we support)
6884 case 'M': // 0x7fffffff
6885 return true;
6886
6887 case 'Q': // Memory with base and unsigned 12-bit displacement
6888 case 'R': // Likewise, plus an index
6889 case 'S': // Memory with base and signed 20-bit displacement
6890 case 'T': // Likewise, plus an index
6891 Info.setAllowsMemory();
6892 return true;
6893 }
6894}
Ulrich Weigand47445072013-05-06 16:26:41 +00006895
Eric Christopherc48497a2015-09-18 21:26:24 +00006896class MSP430TargetInfo : public TargetInfo {
6897 static const char *const GCCRegNames[];
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006898
Eric Christopherc48497a2015-09-18 21:26:24 +00006899public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006900 MSP430TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6901 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00006902 BigEndian = false;
6903 TLSSupported = false;
6904 IntWidth = 16;
6905 IntAlign = 16;
6906 LongWidth = 32;
6907 LongLongWidth = 64;
6908 LongAlign = LongLongAlign = 16;
6909 PointerWidth = 16;
6910 PointerAlign = 16;
6911 SuitableAlign = 16;
6912 SizeType = UnsignedInt;
6913 IntMaxType = SignedLongLong;
6914 IntPtrType = SignedInt;
6915 PtrDiffType = SignedInt;
6916 SigAtomicType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00006917 resetDataLayout("e-m:e-p:16:16-i32:16:32-a:16-n8:16");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006918 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006919 void getTargetDefines(const LangOptions &Opts,
6920 MacroBuilder &Builder) const override {
6921 Builder.defineMacro("MSP430");
6922 Builder.defineMacro("__MSP430__");
6923 // FIXME: defines for different 'flavours' of MCU
6924 }
Craig Topper6c03a542015-10-19 04:51:35 +00006925 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00006926 // FIXME: Implement.
Craig Topper6c03a542015-10-19 04:51:35 +00006927 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00006928 }
6929 bool hasFeature(StringRef Feature) const override {
6930 return Feature == "msp430";
6931 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006932 ArrayRef<const char *> getGCCRegNames() const override;
6933 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00006934 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00006935 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00006936 }
6937 bool validateAsmConstraint(const char *&Name,
6938 TargetInfo::ConstraintInfo &info) const override {
6939 // FIXME: implement
6940 switch (*Name) {
6941 case 'K': // the constant 1
6942 case 'L': // constant -1^20 .. 1^19
6943 case 'M': // constant 1-4:
Eli Friedmana9c3d712009-08-19 20:47:07 +00006944 return true;
6945 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006946 // No target constraints for now.
6947 return false;
6948 }
6949 const char *getClobbers() const override {
6950 // FIXME: Is this really right?
6951 return "";
6952 }
6953 BuiltinVaListKind getBuiltinVaListKind() const override {
6954 // FIXME: implement
6955 return TargetInfo::CharPtrBuiltinVaList;
6956 }
6957};
6958
6959const char *const MSP430TargetInfo::GCCRegNames[] = {
6960 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6961 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"};
6962
Craig Topperf054e3a2015-10-19 03:52:27 +00006963ArrayRef<const char *> MSP430TargetInfo::getGCCRegNames() const {
6964 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00006965}
6966
6967// LLVM and Clang cannot be used directly to output native binaries for
6968// target, but is used to compile C code to llvm bitcode with correct
6969// type and alignment information.
6970//
6971// TCE uses the llvm bitcode as input and uses it for generating customized
6972// target processor and program binary. TCE co-design environment is
6973// publicly available in http://tce.cs.tut.fi
6974
6975static const unsigned TCEOpenCLAddrSpaceMap[] = {
6976 3, // opencl_global
6977 4, // opencl_local
6978 5, // opencl_constant
6979 // FIXME: generic has to be added to the target
6980 0, // opencl_generic
6981 0, // cuda_device
6982 0, // cuda_constant
6983 0 // cuda_shared
6984};
6985
6986class TCETargetInfo : public TargetInfo {
6987public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006988 TCETargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6989 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00006990 TLSSupported = false;
6991 IntWidth = 32;
6992 LongWidth = LongLongWidth = 32;
6993 PointerWidth = 32;
6994 IntAlign = 32;
6995 LongAlign = LongLongAlign = 32;
6996 PointerAlign = 32;
6997 SuitableAlign = 32;
6998 SizeType = UnsignedInt;
6999 IntMaxType = SignedLong;
7000 IntPtrType = SignedInt;
7001 PtrDiffType = SignedInt;
7002 FloatWidth = 32;
7003 FloatAlign = 32;
7004 DoubleWidth = 32;
7005 DoubleAlign = 32;
7006 LongDoubleWidth = 32;
7007 LongDoubleAlign = 32;
7008 FloatFormat = &llvm::APFloat::IEEEsingle;
7009 DoubleFormat = &llvm::APFloat::IEEEsingle;
7010 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
James Y Knightb214cbc2016-03-04 19:00:41 +00007011 resetDataLayout("E-p:32:32-i8:8:32-i16:16:32-i64:32"
7012 "-f64:32-v64:32-v128:32-a:0:32-n32");
Eric Christopherc48497a2015-09-18 21:26:24 +00007013 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
7014 UseAddrSpaceMapMangling = true;
7015 }
7016
7017 void getTargetDefines(const LangOptions &Opts,
7018 MacroBuilder &Builder) const override {
7019 DefineStd(Builder, "tce", Opts);
7020 Builder.defineMacro("__TCE__");
7021 Builder.defineMacro("__TCE_V1__");
7022 }
7023 bool hasFeature(StringRef Feature) const override { return Feature == "tce"; }
7024
Craig Topper6c03a542015-10-19 04:51:35 +00007025 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007026 const char *getClobbers() const override { return ""; }
7027 BuiltinVaListKind getBuiltinVaListKind() const override {
7028 return TargetInfo::VoidPtrBuiltinVaList;
7029 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007030 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007031 bool validateAsmConstraint(const char *&Name,
7032 TargetInfo::ConstraintInfo &info) const override {
7033 return true;
7034 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007035 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7036 return None;
7037 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007038};
Eli Friedmana9c3d712009-08-19 20:47:07 +00007039
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007040class BPFTargetInfo : public TargetInfo {
7041public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007042 BPFTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7043 : TargetInfo(Triple) {
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007044 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
7045 SizeType = UnsignedLong;
7046 PtrDiffType = SignedLong;
7047 IntPtrType = SignedLong;
7048 IntMaxType = SignedLong;
7049 Int64Type = SignedLong;
7050 RegParmMax = 5;
7051 if (Triple.getArch() == llvm::Triple::bpfeb) {
7052 BigEndian = true;
James Y Knightb214cbc2016-03-04 19:00:41 +00007053 resetDataLayout("E-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007054 } else {
7055 BigEndian = false;
James Y Knightb214cbc2016-03-04 19:00:41 +00007056 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007057 }
7058 MaxAtomicPromoteWidth = 64;
7059 MaxAtomicInlineWidth = 64;
7060 TLSSupported = false;
7061 }
7062 void getTargetDefines(const LangOptions &Opts,
7063 MacroBuilder &Builder) const override {
7064 DefineStd(Builder, "bpf", Opts);
7065 Builder.defineMacro("__BPF__");
7066 }
7067 bool hasFeature(StringRef Feature) const override {
7068 return Feature == "bpf";
7069 }
7070
Craig Topper6c03a542015-10-19 04:51:35 +00007071 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007072 const char *getClobbers() const override {
7073 return "";
7074 }
7075 BuiltinVaListKind getBuiltinVaListKind() const override {
7076 return TargetInfo::VoidPtrBuiltinVaList;
7077 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007078 ArrayRef<const char *> getGCCRegNames() const override {
7079 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007080 }
7081 bool validateAsmConstraint(const char *&Name,
7082 TargetInfo::ConstraintInfo &info) const override {
7083 return true;
7084 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007085 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7086 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007087 }
7088};
7089
Daniel Sanders4672af62016-05-27 11:51:02 +00007090class MipsTargetInfo : public TargetInfo {
7091 void setDataLayout() {
Daniel Sanders55e40692016-06-03 10:11:01 +00007092 StringRef Layout;
7093
7094 if (ABI == "o32")
7095 Layout = "m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
7096 else if (ABI == "n32")
7097 Layout = "m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32:64-S128";
7098 else if (ABI == "n64")
7099 Layout = "m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
7100 else
7101 llvm_unreachable("Invalid ABI");
7102
7103 if (BigEndian)
7104 resetDataLayout(("E-" + Layout).str());
7105 else
7106 resetDataLayout(("e-" + Layout).str());
Daniel Sanders4672af62016-05-27 11:51:02 +00007107 }
7108
Akira Hatanaka9064e362013-10-29 18:30:33 +00007109
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00007110 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007111 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00007112 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00007113 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007114 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00007115 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007116 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00007117 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007118 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007119 enum DspRevEnum {
7120 NoDSP, DSP1, DSP2
7121 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00007122 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007123
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007124protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00007125 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007126 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007127
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007128public:
Daniel Sanders4672af62016-05-27 11:51:02 +00007129 MipsTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007130 : TargetInfo(Triple), IsMips16(false), IsMicromips(false),
7131 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
7132 DspRev(NoDSP), HasMSA(false), HasFP64(false) {
Zoran Jovanovic26a12162015-02-18 15:21:35 +00007133 TheCXXABI.set(TargetCXXABI::GenericMIPS);
Daniel Sanders4672af62016-05-27 11:51:02 +00007134 BigEndian = getTriple().getArch() == llvm::Triple::mips ||
7135 getTriple().getArch() == llvm::Triple::mips64;
7136
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007137 setABI((getTriple().getArch() == llvm::Triple::mips ||
7138 getTriple().getArch() == llvm::Triple::mipsel)
7139 ? "o32"
7140 : "n64");
7141
7142 CPU = ABI == "o32" ? "mips32r2" : "mips64r2";
Zoran Jovanovic26a12162015-02-18 15:21:35 +00007143 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007144
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007145 bool isNaN2008Default() const {
7146 return CPU == "mips32r6" || CPU == "mips64r6";
7147 }
7148
7149 bool isFP64Default() const {
7150 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
7151 }
7152
Petar Jovanovicd55ae6b2015-02-26 18:19:22 +00007153 bool isNan2008() const override {
7154 return IsNan2008;
7155 }
7156
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007157 bool processorSupportsGPR64() const {
7158 return llvm::StringSwitch<bool>(CPU)
7159 .Case("mips3", true)
7160 .Case("mips4", true)
7161 .Case("mips5", true)
7162 .Case("mips64", true)
7163 .Case("mips64r2", true)
7164 .Case("mips64r3", true)
7165 .Case("mips64r5", true)
7166 .Case("mips64r6", true)
7167 .Case("octeon", true)
7168 .Default(false);
7169 return false;
7170 }
7171
Alp Toker4925ba72014-06-07 23:30:42 +00007172 StringRef getABI() const override { return ABI; }
Daniel Sanders4672af62016-05-27 11:51:02 +00007173 bool setABI(const std::string &Name) override {
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007174 if (Name == "o32") {
7175 setO32ABITypes();
7176 ABI = Name;
7177 return true;
Daniel Sanders4672af62016-05-27 11:51:02 +00007178 }
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007179
7180 if (Name == "n32") {
7181 setN32ABITypes();
7182 ABI = Name;
7183 return true;
7184 }
7185 if (Name == "n64") {
7186 setN64ABITypes();
7187 ABI = Name;
7188 return true;
Daniel Sanders4672af62016-05-27 11:51:02 +00007189 }
7190 return false;
7191 }
7192
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007193 void setO32ABITypes() {
7194 Int64Type = SignedLongLong;
7195 IntMaxType = Int64Type;
7196 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
7197 LongDoubleWidth = LongDoubleAlign = 64;
7198 LongWidth = LongAlign = 32;
7199 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
7200 PointerWidth = PointerAlign = 32;
7201 PtrDiffType = SignedInt;
7202 SizeType = UnsignedInt;
7203 SuitableAlign = 64;
7204 }
7205
7206 void setN32N64ABITypes() {
7207 LongDoubleWidth = LongDoubleAlign = 128;
7208 LongDoubleFormat = &llvm::APFloat::IEEEquad;
7209 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
7210 LongDoubleWidth = LongDoubleAlign = 64;
7211 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
7212 }
7213 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
7214 SuitableAlign = 128;
7215 }
7216
Daniel Sanders4672af62016-05-27 11:51:02 +00007217 void setN64ABITypes() {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007218 setN32N64ABITypes();
Daniel Sanders4672af62016-05-27 11:51:02 +00007219 Int64Type = SignedLong;
7220 IntMaxType = Int64Type;
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007221 LongWidth = LongAlign = 64;
7222 PointerWidth = PointerAlign = 64;
7223 PtrDiffType = SignedLong;
7224 SizeType = UnsignedLong;
Daniel Sanders4672af62016-05-27 11:51:02 +00007225 }
7226
7227 void setN32ABITypes() {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007228 setN32N64ABITypes();
Daniel Sanders4672af62016-05-27 11:51:02 +00007229 Int64Type = SignedLongLong;
7230 IntMaxType = Int64Type;
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007231 LongWidth = LongAlign = 32;
7232 PointerWidth = PointerAlign = 32;
7233 PtrDiffType = SignedInt;
7234 SizeType = UnsignedInt;
Daniel Sanders4672af62016-05-27 11:51:02 +00007235 }
7236
Craig Topper3164f332014-03-11 03:39:26 +00007237 bool setCPU(const std::string &Name) override {
Eric Christopher0b26a612010-03-02 02:41:08 +00007238 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007239 return llvm::StringSwitch<bool>(Name)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007240 .Case("mips1", true)
7241 .Case("mips2", true)
Simon Atanasyan26610c52014-07-04 12:36:56 +00007242 .Case("mips3", true)
7243 .Case("mips4", true)
7244 .Case("mips5", true)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007245 .Case("mips32", true)
7246 .Case("mips32r2", true)
7247 .Case("mips32r3", true)
7248 .Case("mips32r5", true)
7249 .Case("mips32r6", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007250 .Case("mips64", true)
7251 .Case("mips64r2", true)
Simon Atanasyan162feb52015-02-20 23:37:40 +00007252 .Case("mips64r3", true)
7253 .Case("mips64r5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007254 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00007255 .Case("octeon", true)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007256 .Case("p5600", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007257 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00007258 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00007259 const std::string& getCPU() const { return CPU; }
Eric Christopher8c47b422015-10-09 18:39:55 +00007260 bool
7261 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7262 StringRef CPU,
7263 const std::vector<std::string> &FeaturesVec) const override {
Bhushan D. Attardebacb988732016-03-04 06:56:29 +00007264 if (CPU.empty())
7265 CPU = getCPU();
Simon Atanasyan4e16a422014-07-04 12:37:04 +00007266 if (CPU == "octeon")
7267 Features["mips64r2"] = Features["cnmips"] = true;
7268 else
7269 Features[CPU] = true;
Eric Christopher007b0a02015-08-28 22:32:01 +00007270 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Eric Christopher0b26a612010-03-02 02:41:08 +00007271 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007272
Craig Topper3164f332014-03-11 03:39:26 +00007273 void getTargetDefines(const LangOptions &Opts,
7274 MacroBuilder &Builder) const override {
Daniel Sanders4672af62016-05-27 11:51:02 +00007275 if (BigEndian) {
7276 DefineStd(Builder, "MIPSEB", Opts);
7277 Builder.defineMacro("_MIPSEB");
7278 } else {
7279 DefineStd(Builder, "MIPSEL", Opts);
7280 Builder.defineMacro("_MIPSEL");
7281 }
7282
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007283 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00007284 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007285 if (Opts.GNUMode)
7286 Builder.defineMacro("mips");
7287
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007288 if (ABI == "o32") {
Daniel Sanders4672af62016-05-27 11:51:02 +00007289 Builder.defineMacro("__mips", "32");
7290 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
7291 } else {
7292 Builder.defineMacro("__mips", "64");
7293 Builder.defineMacro("__mips64");
7294 Builder.defineMacro("__mips64__");
7295 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
7296 }
7297
7298 const std::string ISARev = llvm::StringSwitch<std::string>(getCPU())
7299 .Cases("mips32", "mips64", "1")
7300 .Cases("mips32r2", "mips64r2", "2")
7301 .Cases("mips32r3", "mips64r3", "3")
7302 .Cases("mips32r5", "mips64r5", "5")
7303 .Cases("mips32r6", "mips64r6", "6")
7304 .Default("");
7305 if (!ISARev.empty())
7306 Builder.defineMacro("__mips_isa_rev", ISARev);
7307
7308 if (ABI == "o32") {
7309 Builder.defineMacro("__mips_o32");
7310 Builder.defineMacro("_ABIO32", "1");
7311 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
Daniel Sanders07c86542016-05-27 14:30:23 +00007312 } else if (ABI == "n32") {
Daniel Sanders4672af62016-05-27 11:51:02 +00007313 Builder.defineMacro("__mips_n32");
7314 Builder.defineMacro("_ABIN32", "2");
7315 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
7316 } else if (ABI == "n64") {
7317 Builder.defineMacro("__mips_n64");
7318 Builder.defineMacro("_ABI64", "3");
7319 Builder.defineMacro("_MIPS_SIM", "_ABI64");
7320 } else
7321 llvm_unreachable("Invalid ABI.");
7322
Simon Atanasyan683535b2012-08-29 19:14:58 +00007323 Builder.defineMacro("__REGISTER_PREFIX__", "");
7324
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007325 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007326 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00007327 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007328 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007329 case SoftFloat:
7330 Builder.defineMacro("__mips_soft_float", Twine(1));
7331 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00007332 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00007333
Simon Atanasyan16071912013-04-14 14:07:30 +00007334 if (IsSingleFloat)
7335 Builder.defineMacro("__mips_single_float", Twine(1));
7336
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007337 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
7338 Builder.defineMacro("_MIPS_FPSET",
7339 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
7340
Simon Atanasyan72244b62012-07-05 16:06:06 +00007341 if (IsMips16)
7342 Builder.defineMacro("__mips16", Twine(1));
7343
Simon Atanasyan60777612013-04-14 14:07:51 +00007344 if (IsMicromips)
7345 Builder.defineMacro("__mips_micromips", Twine(1));
7346
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007347 if (IsNan2008)
7348 Builder.defineMacro("__mips_nan2008", Twine(1));
7349
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007350 switch (DspRev) {
7351 default:
7352 break;
7353 case DSP1:
7354 Builder.defineMacro("__mips_dsp_rev", Twine(1));
7355 Builder.defineMacro("__mips_dsp", Twine(1));
7356 break;
7357 case DSP2:
7358 Builder.defineMacro("__mips_dsp_rev", Twine(2));
7359 Builder.defineMacro("__mips_dspr2", Twine(1));
7360 Builder.defineMacro("__mips_dsp", Twine(1));
7361 break;
7362 }
7363
Jack Carter44ff1e52013-08-12 17:20:29 +00007364 if (HasMSA)
7365 Builder.defineMacro("__mips_msa", Twine(1));
7366
Simon Atanasyan26f19672012-04-05 19:28:31 +00007367 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
7368 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
7369 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00007370
7371 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
7372 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Daniel Sanders5176f7e2015-12-22 12:59:30 +00007373
7374 // These shouldn't be defined for MIPS-I but there's no need to check
7375 // for that since MIPS-I isn't supported.
7376 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
7377 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
7378 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007379
7380 // 32-bit MIPS processors don't have the necessary lld/scd instructions
7381 // found in 64-bit processors. In the case of O32 on a 64-bit processor,
7382 // the instructions exist but using them violates the ABI since they
7383 // require 64-bit GPRs and O32 only supports 32-bit GPRs.
7384 if (ABI == "n32" || ABI == "n64")
Daniel Sanders4672af62016-05-27 11:51:02 +00007385 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007386 }
7387
Craig Topper6c03a542015-10-19 04:51:35 +00007388 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7389 return llvm::makeArrayRef(BuiltinInfo,
7390 clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin);
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007391 }
Craig Topper3164f332014-03-11 03:39:26 +00007392 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00007393 return llvm::StringSwitch<bool>(Feature)
7394 .Case("mips", true)
7395 .Case("fp64", HasFP64)
7396 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00007397 }
Craig Topper3164f332014-03-11 03:39:26 +00007398 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00007399 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007400 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007401 ArrayRef<const char *> getGCCRegNames() const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00007402 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00007403 // CPU register names
7404 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007405 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
7406 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
7407 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00007408 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
7409 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007410 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
7411 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
7412 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
7413 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00007414 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007415 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Hrvoje Varga14c42ee2016-03-29 12:46:16 +00007416 "$fcc5","$fcc6","$fcc7","$ac1hi","$ac1lo","$ac2hi","$ac2lo",
7417 "$ac3hi","$ac3lo",
Daniel Sanders8b59af12013-11-12 12:56:01 +00007418 // MSA register names
7419 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
7420 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
7421 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
7422 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
7423 // MSA control register names
7424 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
7425 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007426 };
Craig Topperf054e3a2015-10-19 03:52:27 +00007427 return llvm::makeArrayRef(GCCRegNames);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007428 }
Craig Topper3164f332014-03-11 03:39:26 +00007429 bool validateAsmConstraint(const char *&Name,
7430 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007431 switch (*Name) {
7432 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00007433 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007434 case 'r': // CPU registers.
7435 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00007436 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007437 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00007438 case 'c': // $25 for indirect jumps
7439 case 'l': // lo register
7440 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007441 Info.setAllowsRegister();
7442 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00007443 case 'I': // Signed 16-bit constant
7444 case 'J': // Integer 0
7445 case 'K': // Unsigned 16-bit constant
7446 case 'L': // Signed 32-bit constant, lower 16-bit zeros (for lui)
7447 case 'M': // Constants not loadable via lui, addiu, or ori
7448 case 'N': // Constant -1 to -65535
7449 case 'O': // A signed 15-bit constant
7450 case 'P': // A constant between 1 go 65535
7451 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00007452 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00007453 Info.setAllowsMemory();
7454 return true;
Daniel Sanders48fa39e2015-03-30 13:47:23 +00007455 case 'Z':
7456 if (Name[1] == 'C') { // An address usable by ll, and sc.
7457 Info.setAllowsMemory();
7458 Name++; // Skip over 'Z'.
7459 return true;
7460 }
7461 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007462 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007463 }
7464
Daniel Sanders48fa39e2015-03-30 13:47:23 +00007465 std::string convertConstraint(const char *&Constraint) const override {
7466 std::string R;
7467 switch (*Constraint) {
7468 case 'Z': // Two-character constraint; add "^" hint for later parsing.
7469 if (Constraint[1] == 'C') {
7470 R = std::string("^") + std::string(Constraint, 2);
7471 Constraint++;
7472 return R;
7473 }
7474 break;
7475 }
7476 return TargetInfo::convertConstraint(Constraint);
7477 }
7478
Craig Topper3164f332014-03-11 03:39:26 +00007479 const char *getClobbers() const override {
Toma Tabacucfab40f2015-01-12 14:41:30 +00007480 // In GCC, $1 is not widely used in generated code (it's used only in a few
7481 // specific situations), so there is no real need for users to add it to
7482 // the clobbers list if they want to use it in their inline assembly code.
7483 //
7484 // In LLVM, $1 is treated as a normal GPR and is always allocatable during
7485 // code generation, so using it in inline assembly without adding it to the
7486 // clobbers list can cause conflicts between the inline assembly code and
7487 // the surrounding generated code.
7488 //
7489 // Another problem is that LLVM is allowed to choose $1 for inline assembly
7490 // operands, which will conflict with the ".set at" assembler option (which
7491 // we use only for inline assembly, in order to maintain compatibility with
7492 // GCC) and will also conflict with the user's usage of $1.
7493 //
7494 // The easiest way to avoid these conflicts and keep $1 as an allocatable
7495 // register for generated code is to automatically clobber $1 for all inline
7496 // assembly code.
7497 //
7498 // FIXME: We should automatically clobber $1 only for inline assembly code
7499 // which actually uses it. This would allow LLVM to use $1 for inline
7500 // assembly operands if the user's assembly code doesn't use it.
Toma Tabacu99411952014-12-17 12:02:58 +00007501 return "~{$1}";
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007502 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007503
Craig Topper3164f332014-03-11 03:39:26 +00007504 bool handleTargetFeatures(std::vector<std::string> &Features,
7505 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00007506 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00007507 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007508 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00007509 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007510 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007511 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007512 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007513
Eric Christopher610fe112015-08-26 08:21:55 +00007514 for (const auto &Feature : Features) {
7515 if (Feature == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00007516 IsSingleFloat = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007517 else if (Feature == "+soft-float")
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007518 FloatABI = SoftFloat;
Eric Christopher610fe112015-08-26 08:21:55 +00007519 else if (Feature == "+mips16")
Simon Atanasyan72244b62012-07-05 16:06:06 +00007520 IsMips16 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007521 else if (Feature == "+micromips")
Simon Atanasyan60777612013-04-14 14:07:51 +00007522 IsMicromips = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007523 else if (Feature == "+dsp")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007524 DspRev = std::max(DspRev, DSP1);
Eric Christopher610fe112015-08-26 08:21:55 +00007525 else if (Feature == "+dspr2")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007526 DspRev = std::max(DspRev, DSP2);
Eric Christopher610fe112015-08-26 08:21:55 +00007527 else if (Feature == "+msa")
Jack Carter44ff1e52013-08-12 17:20:29 +00007528 HasMSA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007529 else if (Feature == "+fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007530 HasFP64 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007531 else if (Feature == "-fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007532 HasFP64 = false;
Eric Christopher610fe112015-08-26 08:21:55 +00007533 else if (Feature == "+nan2008")
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007534 IsNan2008 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007535 else if (Feature == "-nan2008")
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007536 IsNan2008 = false;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007537 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007538
James Y Knightb214cbc2016-03-04 19:00:41 +00007539 setDataLayout();
Akira Hatanaka9064e362013-10-29 18:30:33 +00007540
Rafael Espindolaeb265472013-08-21 21:59:03 +00007541 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007542 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00007543
Craig Topper3164f332014-03-11 03:39:26 +00007544 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00007545 if (RegNo == 0) return 4;
7546 if (RegNo == 1) return 5;
7547 return -1;
7548 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00007549
7550 bool isCLZForZeroUndef() const override { return false; }
Daniel Sanders4672af62016-05-27 11:51:02 +00007551
7552 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7553 static const TargetInfo::GCCRegAlias O32RegAliases[] = {
7554 {{"at"}, "$1"}, {{"v0"}, "$2"}, {{"v1"}, "$3"},
7555 {{"a0"}, "$4"}, {{"a1"}, "$5"}, {{"a2"}, "$6"},
7556 {{"a3"}, "$7"}, {{"t0"}, "$8"}, {{"t1"}, "$9"},
7557 {{"t2"}, "$10"}, {{"t3"}, "$11"}, {{"t4"}, "$12"},
7558 {{"t5"}, "$13"}, {{"t6"}, "$14"}, {{"t7"}, "$15"},
7559 {{"s0"}, "$16"}, {{"s1"}, "$17"}, {{"s2"}, "$18"},
7560 {{"s3"}, "$19"}, {{"s4"}, "$20"}, {{"s5"}, "$21"},
7561 {{"s6"}, "$22"}, {{"s7"}, "$23"}, {{"t8"}, "$24"},
7562 {{"t9"}, "$25"}, {{"k0"}, "$26"}, {{"k1"}, "$27"},
7563 {{"gp"}, "$28"}, {{"sp", "$sp"}, "$29"}, {{"fp", "$fp"}, "$30"},
7564 {{"ra"}, "$31"}};
7565 static const TargetInfo::GCCRegAlias NewABIRegAliases[] = {
7566 {{"at"}, "$1"}, {{"v0"}, "$2"}, {{"v1"}, "$3"},
7567 {{"a0"}, "$4"}, {{"a1"}, "$5"}, {{"a2"}, "$6"},
7568 {{"a3"}, "$7"}, {{"a4"}, "$8"}, {{"a5"}, "$9"},
7569 {{"a6"}, "$10"}, {{"a7"}, "$11"}, {{"t0"}, "$12"},
7570 {{"t1"}, "$13"}, {{"t2"}, "$14"}, {{"t3"}, "$15"},
7571 {{"s0"}, "$16"}, {{"s1"}, "$17"}, {{"s2"}, "$18"},
7572 {{"s3"}, "$19"}, {{"s4"}, "$20"}, {{"s5"}, "$21"},
7573 {{"s6"}, "$22"}, {{"s7"}, "$23"}, {{"t8"}, "$24"},
7574 {{"t9"}, "$25"}, {{"k0"}, "$26"}, {{"k1"}, "$27"},
7575 {{"gp"}, "$28"}, {{"sp", "$sp"}, "$29"}, {{"fp", "$fp"}, "$30"},
7576 {{"ra"}, "$31"}};
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007577 if (ABI == "o32")
Daniel Sanders4672af62016-05-27 11:51:02 +00007578 return llvm::makeArrayRef(O32RegAliases);
7579 return llvm::makeArrayRef(NewABIRegAliases);
7580 }
7581
7582 bool hasInt128Type() const override {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007583 return ABI == "n32" || ABI == "n64";
Daniel Sanders4672af62016-05-27 11:51:02 +00007584 }
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007585
7586 bool validateTarget(DiagnosticsEngine &Diags) const override {
7587 // FIXME: It's valid to use O32 on a 64-bit CPU but the backend can't handle
7588 // this yet. It's better to fail here than on the backend assertion.
7589 if (processorSupportsGPR64() && ABI == "o32") {
7590 Diags.Report(diag::err_target_unsupported_abi) << ABI << CPU;
7591 return false;
7592 }
7593
7594 // 64-bit ABI's require 64-bit CPU's.
7595 if (!processorSupportsGPR64() && (ABI == "n32" || ABI == "n64")) {
7596 Diags.Report(diag::err_target_unsupported_abi) << ABI << CPU;
7597 return false;
7598 }
7599
7600 // FIXME: It's valid to use O32 on a mips64/mips64el triple but the backend
7601 // can't handle this yet. It's better to fail here than on the
7602 // backend assertion.
7603 if ((getTriple().getArch() == llvm::Triple::mips64 ||
7604 getTriple().getArch() == llvm::Triple::mips64el) &&
7605 ABI == "o32") {
7606 Diags.Report(diag::err_target_unsupported_abi_for_triple)
7607 << ABI << getTriple().str();
7608 return false;
7609 }
7610
7611 // FIXME: It's valid to use N32/N64 on a mips/mipsel triple but the backend
7612 // can't handle this yet. It's better to fail here than on the
7613 // backend assertion.
7614 if ((getTriple().getArch() == llvm::Triple::mips ||
7615 getTriple().getArch() == llvm::Triple::mipsel) &&
7616 (ABI == "n32" || ABI == "n64")) {
7617 Diags.Report(diag::err_target_unsupported_abi_for_triple)
7618 << ABI << getTriple().str();
7619 return false;
7620 }
7621
7622 return true;
7623 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007624};
7625
Daniel Sanders4672af62016-05-27 11:51:02 +00007626const Builtin::Info MipsTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00007627#define BUILTIN(ID, TYPE, ATTRS) \
7628 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7629#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7630 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00007631#include "clang/Basic/BuiltinsMips.def"
7632};
7633
Ivan Krasindd7403e2011-08-24 20:22:22 +00007634class PNaClTargetInfo : public TargetInfo {
7635public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007636 PNaClTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7637 : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00007638 BigEndian = false;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007639 this->LongAlign = 32;
7640 this->LongWidth = 32;
7641 this->PointerAlign = 32;
7642 this->PointerWidth = 32;
7643 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007644 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00007645 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00007646 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00007647 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00007648 this->SizeType = TargetInfo::UnsignedInt;
7649 this->PtrDiffType = TargetInfo::SignedInt;
7650 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00007651 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00007652 }
7653
Craig Toppere6f17d02014-03-11 04:07:52 +00007654 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007655 Builder.defineMacro("__le32__");
7656 Builder.defineMacro("__pnacl__");
7657 }
Craig Topper3164f332014-03-11 03:39:26 +00007658 void getTargetDefines(const LangOptions &Opts,
7659 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007660 getArchDefines(Opts, Builder);
7661 }
Craig Topper3164f332014-03-11 03:39:26 +00007662 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00007663 return Feature == "pnacl";
7664 }
Craig Topper6c03a542015-10-19 04:51:35 +00007665 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Craig Topper3164f332014-03-11 03:39:26 +00007666 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00007667 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007668 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007669 ArrayRef<const char *> getGCCRegNames() const override;
7670 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00007671 bool validateAsmConstraint(const char *&Name,
7672 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007673 return false;
7674 }
7675
Craig Topper3164f332014-03-11 03:39:26 +00007676 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007677 return "";
7678 }
7679};
7680
Craig Topperf054e3a2015-10-19 03:52:27 +00007681ArrayRef<const char *> PNaClTargetInfo::getGCCRegNames() const {
7682 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007683}
7684
Craig Topperf054e3a2015-10-19 03:52:27 +00007685ArrayRef<TargetInfo::GCCRegAlias> PNaClTargetInfo::getGCCRegAliases() const {
7686 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007687}
Ivan Krasindd7403e2011-08-24 20:22:22 +00007688
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007689// We attempt to use PNaCl (le32) frontend and Mips32EL backend.
Daniel Sanders4672af62016-05-27 11:51:02 +00007690class NaClMips32TargetInfo : public MipsTargetInfo {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007691public:
Daniel Sanders4672af62016-05-27 11:51:02 +00007692 NaClMips32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7693 : MipsTargetInfo(Triple, Opts) {}
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007694
7695 BuiltinVaListKind getBuiltinVaListKind() const override {
7696 return TargetInfo::PNaClABIBuiltinVaList;
7697 }
7698};
7699
JF Bastien643817d2014-09-12 17:52:47 +00007700class Le64TargetInfo : public TargetInfo {
7701 static const Builtin::Info BuiltinInfo[];
7702
7703public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007704 Le64TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7705 : TargetInfo(Triple) {
JF Bastien643817d2014-09-12 17:52:47 +00007706 BigEndian = false;
7707 NoAsmVariants = true;
7708 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
7709 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00007710 resetDataLayout("e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128");
JF Bastien643817d2014-09-12 17:52:47 +00007711 }
7712
7713 void getTargetDefines(const LangOptions &Opts,
7714 MacroBuilder &Builder) const override {
7715 DefineStd(Builder, "unix", Opts);
7716 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
7717 Builder.defineMacro("__ELF__");
7718 }
Craig Topper6c03a542015-10-19 04:51:35 +00007719 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7720 return llvm::makeArrayRef(BuiltinInfo,
7721 clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin);
JF Bastien643817d2014-09-12 17:52:47 +00007722 }
7723 BuiltinVaListKind getBuiltinVaListKind() const override {
7724 return TargetInfo::PNaClABIBuiltinVaList;
7725 }
7726 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00007727 ArrayRef<const char *> getGCCRegNames() const override {
7728 return None;
JF Bastien643817d2014-09-12 17:52:47 +00007729 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007730 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7731 return None;
JF Bastien643817d2014-09-12 17:52:47 +00007732 }
7733 bool validateAsmConstraint(const char *&Name,
7734 TargetInfo::ConstraintInfo &Info) const override {
7735 return false;
7736 }
7737
7738 bool hasProtectedVisibility() const override { return false; }
JF Bastien643817d2014-09-12 17:52:47 +00007739};
Dan Gohmanc2853072015-09-03 22:51:53 +00007740
7741class WebAssemblyTargetInfo : public TargetInfo {
7742 static const Builtin::Info BuiltinInfo[];
7743
7744 enum SIMDEnum {
7745 NoSIMD,
7746 SIMD128,
7747 } SIMDLevel;
7748
7749public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007750 explicit WebAssemblyTargetInfo(const llvm::Triple &T, const TargetOptions &)
Dan Gohmanc2853072015-09-03 22:51:53 +00007751 : TargetInfo(T), SIMDLevel(NoSIMD) {
7752 BigEndian = false;
7753 NoAsmVariants = true;
7754 SuitableAlign = 128;
7755 LargeArrayMinWidth = 128;
7756 LargeArrayAlign = 128;
7757 SimdDefaultAlign = 128;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007758 SigAtomicType = SignedLong;
Dan Gohman6db46402015-11-10 21:01:46 +00007759 LongDoubleWidth = LongDoubleAlign = 128;
7760 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Dan Gohmanc2853072015-09-03 22:51:53 +00007761 }
7762
7763protected:
7764 void getTargetDefines(const LangOptions &Opts,
7765 MacroBuilder &Builder) const override {
7766 defineCPUMacros(Builder, "wasm", /*Tuning=*/false);
7767 if (SIMDLevel >= SIMD128)
7768 Builder.defineMacro("__wasm_simd128__");
7769 }
7770
7771private:
Eric Christopher8c47b422015-10-09 18:39:55 +00007772 bool
7773 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7774 StringRef CPU,
7775 const std::vector<std::string> &FeaturesVec) const override {
Dan Gohmanc2853072015-09-03 22:51:53 +00007776 if (CPU == "bleeding-edge")
7777 Features["simd128"] = true;
7778 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
7779 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007780 bool hasFeature(StringRef Feature) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007781 return llvm::StringSwitch<bool>(Feature)
7782 .Case("simd128", SIMDLevel >= SIMD128)
7783 .Default(false);
7784 }
7785 bool handleTargetFeatures(std::vector<std::string> &Features,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007786 DiagnosticsEngine &Diags) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007787 for (const auto &Feature : Features) {
7788 if (Feature == "+simd128") {
7789 SIMDLevel = std::max(SIMDLevel, SIMD128);
7790 continue;
7791 }
7792 if (Feature == "-simd128") {
7793 SIMDLevel = std::min(SIMDLevel, SIMDEnum(SIMD128 - 1));
7794 continue;
7795 }
7796
7797 Diags.Report(diag::err_opt_not_valid_with_opt) << Feature
7798 << "-target-feature";
7799 return false;
7800 }
7801 return true;
7802 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007803 bool setCPU(const std::string &Name) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007804 return llvm::StringSwitch<bool>(Name)
7805 .Case("mvp", true)
7806 .Case("bleeding-edge", true)
7807 .Case("generic", true)
7808 .Default(false);
7809 }
Craig Topper6c03a542015-10-19 04:51:35 +00007810 ArrayRef<Builtin::Info> getTargetBuiltins() const final {
7811 return llvm::makeArrayRef(BuiltinInfo,
7812 clang::WebAssembly::LastTSBuiltin - Builtin::FirstTSBuiltin);
Dan Gohmanc2853072015-09-03 22:51:53 +00007813 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007814 BuiltinVaListKind getBuiltinVaListKind() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007815 return VoidPtrBuiltinVaList;
7816 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007817 ArrayRef<const char *> getGCCRegNames() const final {
7818 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00007819 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007820 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const final {
7821 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00007822 }
7823 bool
7824 validateAsmConstraint(const char *&Name,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007825 TargetInfo::ConstraintInfo &Info) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007826 return false;
7827 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007828 const char *getClobbers() const final { return ""; }
7829 bool isCLZForZeroUndef() const final { return false; }
7830 bool hasInt128Type() const final { return true; }
Dan Gohmanab0e31f2015-09-14 21:49:41 +00007831 IntType getIntTypeByWidth(unsigned BitWidth,
7832 bool IsSigned) const final {
7833 // WebAssembly prefers long long for explicitly 64-bit integers.
7834 return BitWidth == 64 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
7835 : TargetInfo::getIntTypeByWidth(BitWidth, IsSigned);
7836 }
7837 IntType getLeastIntTypeByWidth(unsigned BitWidth,
7838 bool IsSigned) const final {
7839 // WebAssembly uses long long for int_least64_t and int_fast64_t.
7840 return BitWidth == 64
7841 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
7842 : TargetInfo::getLeastIntTypeByWidth(BitWidth, IsSigned);
7843 }
Dan Gohmanc2853072015-09-03 22:51:53 +00007844};
7845
7846const Builtin::Info WebAssemblyTargetInfo::BuiltinInfo[] = {
7847#define BUILTIN(ID, TYPE, ATTRS) \
7848 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7849#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7850 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
7851#include "clang/Basic/BuiltinsWebAssembly.def"
7852};
7853
7854class WebAssembly32TargetInfo : public WebAssemblyTargetInfo {
7855public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007856 explicit WebAssembly32TargetInfo(const llvm::Triple &T,
7857 const TargetOptions &Opts)
7858 : WebAssemblyTargetInfo(T, Opts) {
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007859 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
James Y Knightb214cbc2016-03-04 19:00:41 +00007860 resetDataLayout("e-m:e-p:32:32-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00007861 }
7862
7863protected:
7864 void getTargetDefines(const LangOptions &Opts,
7865 MacroBuilder &Builder) const override {
7866 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
7867 defineCPUMacros(Builder, "wasm32", /*Tuning=*/false);
7868 }
7869};
7870
7871class WebAssembly64TargetInfo : public WebAssemblyTargetInfo {
7872public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007873 explicit WebAssembly64TargetInfo(const llvm::Triple &T,
7874 const TargetOptions &Opts)
7875 : WebAssemblyTargetInfo(T, Opts) {
Dan Gohmanc2853072015-09-03 22:51:53 +00007876 LongAlign = LongWidth = 64;
7877 PointerAlign = PointerWidth = 64;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007878 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00007879 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00007880 }
7881
7882protected:
7883 void getTargetDefines(const LangOptions &Opts,
7884 MacroBuilder &Builder) const override {
7885 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
7886 defineCPUMacros(Builder, "wasm64", /*Tuning=*/false);
7887 }
7888};
7889
JF Bastien643817d2014-09-12 17:52:47 +00007890const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
7891#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00007892 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
JF Bastien643817d2014-09-12 17:52:47 +00007893#include "clang/Basic/BuiltinsLe64.def"
7894};
7895
Eric Christopherc48497a2015-09-18 21:26:24 +00007896static const unsigned SPIRAddrSpaceMap[] = {
7897 1, // opencl_global
7898 3, // opencl_local
7899 2, // opencl_constant
7900 4, // opencl_generic
7901 0, // cuda_device
7902 0, // cuda_constant
7903 0 // cuda_shared
7904};
7905class SPIRTargetInfo : public TargetInfo {
7906public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007907 SPIRTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7908 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007909 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
7910 "SPIR target must use unknown OS");
7911 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
7912 "SPIR target must use unknown environment type");
7913 BigEndian = false;
7914 TLSSupported = false;
7915 LongWidth = LongAlign = 64;
7916 AddrSpaceMap = &SPIRAddrSpaceMap;
7917 UseAddrSpaceMapMangling = true;
7918 // Define available target features
7919 // These must be defined in sorted order!
7920 NoAsmVariants = true;
7921 }
7922 void getTargetDefines(const LangOptions &Opts,
7923 MacroBuilder &Builder) const override {
7924 DefineStd(Builder, "SPIR", Opts);
7925 }
7926 bool hasFeature(StringRef Feature) const override {
7927 return Feature == "spir";
7928 }
Craig Topper3164f332014-03-11 03:39:26 +00007929
Craig Topper6c03a542015-10-19 04:51:35 +00007930 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007931 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00007932 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007933 bool validateAsmConstraint(const char *&Name,
7934 TargetInfo::ConstraintInfo &info) const override {
7935 return true;
7936 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007937 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7938 return None;
7939 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007940 BuiltinVaListKind getBuiltinVaListKind() const override {
7941 return TargetInfo::VoidPtrBuiltinVaList;
7942 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00007943
Eric Christopherc48497a2015-09-18 21:26:24 +00007944 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Nikolay Haustov8c6538b2016-06-30 09:06:33 +00007945 return (CC == CC_SpirFunction || CC == CC_OpenCLKernel) ? CCCR_OK
7946 : CCCR_Warning;
Eric Christopherc48497a2015-09-18 21:26:24 +00007947 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00007948
Eric Christopherc48497a2015-09-18 21:26:24 +00007949 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
7950 return CC_SpirFunction;
7951 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00007952
7953 void setSupportedOpenCLOpts() override {
7954 // Assume all OpenCL extensions and optional core features are supported
7955 // for SPIR since it is a generic target.
7956 getSupportedOpenCLOpts().setAll();
7957 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007958};
Guy Benyeib798fc92012-12-11 21:38:14 +00007959
Eric Christopherc48497a2015-09-18 21:26:24 +00007960class SPIR32TargetInfo : public SPIRTargetInfo {
7961public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007962 SPIR32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7963 : SPIRTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007964 PointerWidth = PointerAlign = 32;
7965 SizeType = TargetInfo::UnsignedInt;
7966 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +00007967 resetDataLayout("e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
7968 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00007969 }
7970 void getTargetDefines(const LangOptions &Opts,
7971 MacroBuilder &Builder) const override {
7972 DefineStd(Builder, "SPIR32", Opts);
7973 }
7974};
Guy Benyeib798fc92012-12-11 21:38:14 +00007975
Eric Christopherc48497a2015-09-18 21:26:24 +00007976class SPIR64TargetInfo : public SPIRTargetInfo {
7977public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007978 SPIR64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7979 : SPIRTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007980 PointerWidth = PointerAlign = 64;
7981 SizeType = TargetInfo::UnsignedLong;
7982 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00007983 resetDataLayout("e-i64:64-v16:16-v24:32-v32:32-v48:64-"
7984 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00007985 }
7986 void getTargetDefines(const LangOptions &Opts,
7987 MacroBuilder &Builder) const override {
7988 DefineStd(Builder, "SPIR64", Opts);
7989 }
7990};
Guy Benyeib798fc92012-12-11 21:38:14 +00007991
Robert Lytton0e076492013-08-13 09:43:10 +00007992class XCoreTargetInfo : public TargetInfo {
7993 static const Builtin::Info BuiltinInfo[];
7994public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007995 XCoreTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7996 : TargetInfo(Triple) {
Robert Lytton0e076492013-08-13 09:43:10 +00007997 BigEndian = false;
7998 NoAsmVariants = true;
7999 LongLongAlign = 32;
8000 SuitableAlign = 32;
8001 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00008002 SizeType = UnsignedInt;
8003 PtrDiffType = SignedInt;
8004 IntPtrType = SignedInt;
8005 WCharType = UnsignedChar;
8006 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00008007 UseZeroLengthBitfieldAlignment = true;
James Y Knightb214cbc2016-03-04 19:00:41 +00008008 resetDataLayout("e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32"
8009 "-f64:32-a:0:32-n32");
Robert Lytton0e076492013-08-13 09:43:10 +00008010 }
Craig Topper3164f332014-03-11 03:39:26 +00008011 void getTargetDefines(const LangOptions &Opts,
8012 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008013 Builder.defineMacro("__XS1B__");
8014 }
Craig Topper6c03a542015-10-19 04:51:35 +00008015 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
8016 return llvm::makeArrayRef(BuiltinInfo,
8017 clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin);
Robert Lytton0e076492013-08-13 09:43:10 +00008018 }
Craig Topper3164f332014-03-11 03:39:26 +00008019 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008020 return TargetInfo::VoidPtrBuiltinVaList;
8021 }
Craig Topper3164f332014-03-11 03:39:26 +00008022 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008023 return "";
8024 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008025 ArrayRef<const char *> getGCCRegNames() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008026 static const char * const GCCRegNames[] = {
8027 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
8028 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
8029 };
Craig Topperf054e3a2015-10-19 03:52:27 +00008030 return llvm::makeArrayRef(GCCRegNames);
Robert Lytton0e076492013-08-13 09:43:10 +00008031 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008032 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8033 return None;
Robert Lytton0e076492013-08-13 09:43:10 +00008034 }
Craig Topper3164f332014-03-11 03:39:26 +00008035 bool validateAsmConstraint(const char *&Name,
8036 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008037 return false;
8038 }
Craig Topper3164f332014-03-11 03:39:26 +00008039 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00008040 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
8041 return (RegNo < 2)? RegNo : -1;
8042 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00008043 bool allowsLargerPreferedTypeAlignment() const override {
8044 return false;
8045 }
Robert Lytton0e076492013-08-13 09:43:10 +00008046};
8047
8048const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00008049#define BUILTIN(ID, TYPE, ATTRS) \
8050 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
8051#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
8052 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Robert Lytton0e076492013-08-13 09:43:10 +00008053#include "clang/Basic/BuiltinsXCore.def"
8054};
Robert Lytton0e076492013-08-13 09:43:10 +00008055
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008056// x86_32 Android target
8057class AndroidX86_32TargetInfo : public LinuxTargetInfo<X86_32TargetInfo> {
8058public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008059 AndroidX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8060 : LinuxTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008061 SuitableAlign = 32;
8062 LongDoubleWidth = 64;
8063 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
8064 }
8065};
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008066
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008067// x86_64 Android target
8068class AndroidX86_64TargetInfo : public LinuxTargetInfo<X86_64TargetInfo> {
8069public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008070 AndroidX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8071 : LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008072 LongDoubleFormat = &llvm::APFloat::IEEEquad;
8073 }
Chih-Hung Hsieh0b0eeaa2015-07-24 18:12:54 +00008074
8075 bool useFloat128ManglingForLongDouble() const override {
8076 return true;
8077 }
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008078};
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008079
8080// 32-bit RenderScript is armv7 with width and align of 'long' set to 8-bytes
8081class RenderScript32TargetInfo : public ARMleTargetInfo {
8082public:
8083 RenderScript32TargetInfo(const llvm::Triple &Triple,
8084 const TargetOptions &Opts)
8085 : ARMleTargetInfo(llvm::Triple("armv7", Triple.getVendorName(),
8086 Triple.getOSName(),
8087 Triple.getEnvironmentName()),
8088 Opts) {
8089 LongWidth = LongAlign = 64;
8090 }
8091 void getTargetDefines(const LangOptions &Opts,
8092 MacroBuilder &Builder) const override {
8093 Builder.defineMacro("__RENDERSCRIPT__");
8094 ARMleTargetInfo::getTargetDefines(Opts, Builder);
8095 }
8096};
8097
8098// 64-bit RenderScript is aarch64
8099class RenderScript64TargetInfo : public AArch64leTargetInfo {
8100public:
8101 RenderScript64TargetInfo(const llvm::Triple &Triple,
8102 const TargetOptions &Opts)
8103 : AArch64leTargetInfo(llvm::Triple("aarch64", Triple.getVendorName(),
8104 Triple.getOSName(),
8105 Triple.getEnvironmentName()),
8106 Opts) {}
8107
8108 void getTargetDefines(const LangOptions &Opts,
8109 MacroBuilder &Builder) const override {
8110 Builder.defineMacro("__RENDERSCRIPT__");
8111 AArch64leTargetInfo::getTargetDefines(Opts, Builder);
8112 }
8113};
8114
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008115} // end anonymous namespace
8116
Chris Lattner5ba61f02006-10-14 07:39:34 +00008117//===----------------------------------------------------------------------===//
8118// Driver code
8119//===----------------------------------------------------------------------===//
8120
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008121static TargetInfo *AllocateTarget(const llvm::Triple &Triple,
8122 const TargetOptions &Opts) {
Daniel Dunbar52322032009-08-18 05:47:58 +00008123 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00008124
Daniel Dunbar52322032009-08-18 05:47:58 +00008125 switch (Triple.getArch()) {
8126 default:
Craig Topperf1186c52014-05-08 06:41:40 +00008127 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00008128
Tim Northover2a0783d2014-05-30 14:14:07 +00008129 case llvm::Triple::xcore:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008130 return new XCoreTargetInfo(Triple, Opts);
Tim Northover2a0783d2014-05-30 14:14:07 +00008131
8132 case llvm::Triple::hexagon:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008133 return new HexagonTargetInfo(Triple, Opts);
Tim Northover2a0783d2014-05-30 14:14:07 +00008134
Jacques Pienaard964cc22016-03-28 21:02:54 +00008135 case llvm::Triple::lanai:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008136 return new LanaiTargetInfo(Triple, Opts);
Jacques Pienaard964cc22016-03-28 21:02:54 +00008137
Tim Northover2a0783d2014-05-30 14:14:07 +00008138 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00008139 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008140 return new DarwinAArch64TargetInfo(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00008141
8142 switch (os) {
Ed Schoutenea9448e2015-10-15 15:07:07 +00008143 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008144 return new CloudABITargetInfo<AArch64leTargetInfo>(Triple, Opts);
Ed Maste6a9eda52014-11-13 16:55:42 +00008145 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008146 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00008147 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008148 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple, Opts);
James Molloy5e73df52014-04-16 15:06:20 +00008149 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008150 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00008151 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008152 return new AArch64leTargetInfo(Triple, Opts);
James Molloy5e73df52014-04-16 15:06:20 +00008153 }
8154
Christian Pirker9b019ae2014-02-25 13:51:00 +00008155 case llvm::Triple::aarch64_be:
8156 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00008157 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008158 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00008159 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008160 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00008161 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008162 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00008163 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008164 return new AArch64beTargetInfo(Triple, Opts);
Tim Northover9bb857a2013-01-31 12:13:10 +00008165 }
8166
Daniel Dunbar52322032009-08-18 05:47:58 +00008167 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00008168 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00008169 if (Triple.isOSBinFormatMachO())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008170 return new DarwinARMTargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008171
Daniel Dunbar52322032009-08-18 05:47:58 +00008172 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00008173 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008174 return new LinuxTargetInfo<ARMleTargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008175 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008176 return new FreeBSDTargetInfo<ARMleTargetInfo>(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<ARMleTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008179 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008180 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00008181 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008182 return new BitrigTargetInfo<ARMleTargetInfo>(Triple, Opts);
Douglas Gregor9fabd852011-07-01 22:41:14 +00008183 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008184 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00008185 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008186 return new NaClTargetInfo<ARMleTargetInfo>(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008187 case llvm::Triple::Win32:
8188 switch (Triple.getEnvironment()) {
Yaron Keren321249c2015-07-15 13:32:23 +00008189 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008190 return new CygwinARMTargetInfo(Triple, Opts);
Yaron Keren321249c2015-07-15 13:32:23 +00008191 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008192 return new MinGWARMTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008193 case llvm::Triple::Itanium:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008194 return new ItaniumWindowsARMleTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008195 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008196 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008197 return new MicrosoftARMleTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008198 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008199 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008200 return new ARMleTargetInfo(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008201 }
8202
8203 case llvm::Triple::armeb:
8204 case llvm::Triple::thumbeb:
8205 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008206 return new DarwinARMTargetInfo(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008207
8208 switch (os) {
8209 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008210 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008211 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008212 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008213 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008214 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008215 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008216 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008217 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008218 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008219 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008220 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008221 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008222 return new NaClTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008223 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008224 return new ARMbeTargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008225 }
Eli Friedmanb5366062008-05-20 14:21:01 +00008226
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00008227 case llvm::Triple::bpfeb:
8228 case llvm::Triple::bpfel:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008229 return new BPFTargetInfo(Triple, Opts);
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00008230
Daniel Dunbar52322032009-08-18 05:47:58 +00008231 case llvm::Triple::msp430:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008232 return new MSP430TargetInfo(Triple, Opts);
Eli Friedmanb5366062008-05-20 14:21:01 +00008233
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008234 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008235 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008236 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00008237 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008238 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00008239 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008240 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008241 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008242 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008243 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008244 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00008245 return new MipsTargetInfo(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008246 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008247
8248 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008249 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008250 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00008251 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008252 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00008253 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008254 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008255 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008256 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008257 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00008258 case llvm::Triple::NaCl:
Daniel Sanders4672af62016-05-27 11:51:02 +00008259 return new NaClTargetInfo<NaClMips32TargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008260 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00008261 return new MipsTargetInfo(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008262 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008263
Akira Hatanakabef17452011-09-20 19:21:49 +00008264 case llvm::Triple::mips64:
8265 switch (os) {
8266 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00008267 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008268 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00008269 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008270 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008271 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008272 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008273 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008274 case llvm::Triple::OpenBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008275 return new OpenBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008276 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00008277 return new MipsTargetInfo(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008278 }
8279
8280 case llvm::Triple::mips64el:
8281 switch (os) {
8282 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00008283 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008284 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00008285 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008286 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008287 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008288 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008289 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008290 case llvm::Triple::OpenBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008291 return new OpenBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008292 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00008293 return new MipsTargetInfo(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008294 }
8295
Ivan Krasindd7403e2011-08-24 20:22:22 +00008296 case llvm::Triple::le32:
8297 switch (os) {
Douglas Katzman78d7c542015-05-12 21:18:10 +00008298 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008299 return new NaClTargetInfo<PNaClTargetInfo>(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00008300 default:
8301 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00008302 }
8303
JF Bastien643817d2014-09-12 17:52:47 +00008304 case llvm::Triple::le64:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008305 return new Le64TargetInfo(Triple, Opts);
JF Bastien643817d2014-09-12 17:52:47 +00008306
Daniel Dunbar52322032009-08-18 05:47:58 +00008307 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008308 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008309 return new DarwinPPC32TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008310 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00008311 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008312 return new LinuxTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008313 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008314 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008315 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008316 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008317 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008318 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008319 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008320 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008321 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008322 return new PPC32TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008323 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008324
8325 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008326 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008327 return new DarwinPPC64TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008328 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00008329 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008330 return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008331 case llvm::Triple::Lv2:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008332 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008333 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008334 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008335 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008336 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008337 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008338 return new PPC64TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008339 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008340
Bill Schmidt778d3872013-07-26 01:36:11 +00008341 case llvm::Triple::ppc64le:
8342 switch (os) {
8343 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008344 return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger22a2d992015-04-10 20:53:48 +00008345 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008346 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Bill Schmidt778d3872013-07-26 01:36:11 +00008347 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008348 return new PPC64TargetInfo(Triple, Opts);
Bill Schmidt778d3872013-07-26 01:36:11 +00008349 }
8350
Peter Collingbournec947aae2012-05-20 23:28:41 +00008351 case llvm::Triple::nvptx:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008352 return new NVPTX32TargetInfo(Triple, Opts);
Peter Collingbournec947aae2012-05-20 23:28:41 +00008353 case llvm::Triple::nvptx64:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008354 return new NVPTX64TargetInfo(Triple, Opts);
Peter Collingbournec947aae2012-05-20 23:28:41 +00008355
Tom Stellardd8e38a32015-01-06 20:34:47 +00008356 case llvm::Triple::amdgcn:
Eli Friedmand13b41e2012-10-12 23:32:00 +00008357 case llvm::Triple::r600:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008358 return new AMDGPUTargetInfo(Triple, Opts);
Eli Friedmand13b41e2012-10-12 23:32:00 +00008359
Daniel Dunbar52322032009-08-18 05:47:58 +00008360 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008361 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00008362 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008363 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008364 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008365 return new SolarisTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008366 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008367 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008368 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008369 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008370 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008371 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008372 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008373 return new SparcV8TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008374 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008375
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008376 // The 'sparcel' architecture copies all the above cases except for Solaris.
8377 case llvm::Triple::sparcel:
8378 switch (os) {
8379 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008380 return new LinuxTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008381 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008382 return new NetBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008383 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008384 return new OpenBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008385 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008386 return new RTEMSTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008387 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008388 return new SparcV8elTargetInfo(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008389 }
8390
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008391 case llvm::Triple::sparcv9:
8392 switch (os) {
8393 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008394 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008395 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008396 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008397 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008398 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008399 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008400 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008401 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008402 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008403 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008404 return new SparcV9TargetInfo(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008405 }
8406
Ulrich Weigand47445072013-05-06 16:26:41 +00008407 case llvm::Triple::systemz:
8408 switch (os) {
8409 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008410 return new LinuxTargetInfo<SystemZTargetInfo>(Triple, Opts);
Ulrich Weigand47445072013-05-06 16:26:41 +00008411 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008412 return new SystemZTargetInfo(Triple, Opts);
Ulrich Weigand47445072013-05-06 16:26:41 +00008413 }
8414
Eli Friedmana9c3d712009-08-19 20:47:07 +00008415 case llvm::Triple::tce:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008416 return new TCETargetInfo(Triple, Opts);
Eli Friedmana9c3d712009-08-19 20:47:07 +00008417
Daniel Dunbar52322032009-08-18 05:47:58 +00008418 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008419 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008420 return new DarwinI386TargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008421
Daniel Dunbar52322032009-08-18 05:47:58 +00008422 switch (os) {
Ed Schouten7893e682015-06-13 21:33:49 +00008423 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008424 return new CloudABITargetInfo<X86_32TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008425 case llvm::Triple::Linux: {
8426 switch (Triple.getEnvironment()) {
8427 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008428 return new LinuxTargetInfo<X86_32TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008429 case llvm::Triple::Android:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008430 return new AndroidX86_32TargetInfo(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008431 }
8432 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008433 case llvm::Triple::DragonFly:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008434 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008435 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008436 return new NetBSDI386TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008437 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008438 return new OpenBSDI386TargetInfo(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00008439 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008440 return new BitrigI386TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008441 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008442 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00008443 case llvm::Triple::KFreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008444 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008445 case llvm::Triple::Minix:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008446 return new MinixTargetInfo<X86_32TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008447 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008448 return new SolarisTargetInfo<X86_32TargetInfo>(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008449 case llvm::Triple::Win32: {
8450 switch (Triple.getEnvironment()) {
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008451 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008452 return new CygwinX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008453 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008454 return new MinGWX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00008455 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008456 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008457 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008458 return new MicrosoftX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008459 }
8460 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00008461 case llvm::Triple::Haiku:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008462 return new HaikuX86_32TargetInfo(Triple, Opts);
Douglas Gregor9fabd852011-07-01 22:41:14 +00008463 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008464 return new RTEMSX86_32TargetInfo(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00008465 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008466 return new NaClTargetInfo<X86_32TargetInfo>(Triple, Opts);
Alexey Bataevc99b0492015-11-25 09:24:26 +00008467 case llvm::Triple::ELFIAMCU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008468 return new MCUX86_32TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008469 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008470 return new X86_32TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008471 }
8472
8473 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008474 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008475 return new DarwinX86_64TargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008476
Daniel Dunbar52322032009-08-18 05:47:58 +00008477 switch (os) {
Ed Schoutenf33c6072015-03-11 08:42:46 +00008478 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008479 return new CloudABITargetInfo<X86_64TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008480 case llvm::Triple::Linux: {
8481 switch (Triple.getEnvironment()) {
8482 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008483 return new LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008484 case llvm::Triple::Android:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008485 return new AndroidX86_64TargetInfo(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008486 }
8487 }
Chris Lattner002ba6b2010-01-09 05:41:14 +00008488 case llvm::Triple::DragonFly:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008489 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008490 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008491 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008492 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008493 return new OpenBSDX86_64TargetInfo(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00008494 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008495 return new BitrigX86_64TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008496 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008497 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00008498 case llvm::Triple::KFreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008499 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008500 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008501 return new SolarisTargetInfo<X86_64TargetInfo>(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008502 case llvm::Triple::Win32: {
8503 switch (Triple.getEnvironment()) {
Yaron Kerend030d112015-07-22 17:38:19 +00008504 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008505 return new CygwinX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008506 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008507 return new MinGWX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008508 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008509 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008510 return new MicrosoftX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008511 }
8512 }
Reid Kleckner330fb172016-05-11 16:19:05 +00008513 case llvm::Triple::Haiku:
8514 return new HaikuTargetInfo<X86_64TargetInfo>(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00008515 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008516 return new NaClTargetInfo<X86_64TargetInfo>(Triple, Opts);
Alex Rosenberg12207fa2015-01-27 14:47:44 +00008517 case llvm::Triple::PS4:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008518 return new PS4OSTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008519 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008520 return new X86_64TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008521 }
Guy Benyeib798fc92012-12-11 21:38:14 +00008522
Douglas Katzman78d7c542015-05-12 21:18:10 +00008523 case llvm::Triple::spir: {
8524 if (Triple.getOS() != llvm::Triple::UnknownOS ||
8525 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
8526 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008527 return new SPIR32TargetInfo(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00008528 }
8529 case llvm::Triple::spir64: {
8530 if (Triple.getOS() != llvm::Triple::UnknownOS ||
8531 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
8532 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008533 return new SPIR64TargetInfo(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00008534 }
Dan Gohmanc2853072015-09-03 22:51:53 +00008535 case llvm::Triple::wasm32:
8536 if (!(Triple == llvm::Triple("wasm32-unknown-unknown")))
8537 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008538 return new WebAssemblyOSTargetInfo<WebAssembly32TargetInfo>(Triple, Opts);
Dan Gohmanc2853072015-09-03 22:51:53 +00008539 case llvm::Triple::wasm64:
8540 if (!(Triple == llvm::Triple("wasm64-unknown-unknown")))
8541 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008542 return new WebAssemblyOSTargetInfo<WebAssembly64TargetInfo>(Triple, Opts);
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008543
8544 case llvm::Triple::renderscript32:
8545 return new LinuxTargetInfo<RenderScript32TargetInfo>(Triple, Opts);
8546 case llvm::Triple::renderscript64:
8547 return new LinuxTargetInfo<RenderScript64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008548 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00008549}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008550
8551/// CreateTargetInfo - Return the target info object for the specified target
Eric Christophere4f73b32015-08-07 19:07:08 +00008552/// options.
Alp Toker80758082014-07-06 05:26:44 +00008553TargetInfo *
8554TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
Saleem Abdulrasool10a49722016-04-08 16:52:00 +00008555 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00008556 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008557
8558 // Construct the target
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008559 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple, *Opts));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008560 if (!Target) {
8561 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00008562 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008563 }
Alp Toker80758082014-07-06 05:26:44 +00008564 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008565
Daniel Dunbaracde99e2009-12-18 18:42:37 +00008566 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008567 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
8568 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00008569 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00008570 }
8571
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008572 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008573 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
8574 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00008575 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008576 }
8577
Rafael Espindolaeb265472013-08-21 21:59:03 +00008578 // Set the fp math unit.
8579 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
8580 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00008581 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00008582 }
8583
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008584 // Compute the default target features, we need the target to handle this
8585 // because features may have dependencies on one another.
8586 llvm::StringMap<bool> Features;
Eric Christopher007b0a02015-08-28 22:32:01 +00008587 if (!Target->initFeatureMap(Features, Diags, Opts->CPU,
8588 Opts->FeaturesAsWritten))
Eric Christopher6b454372015-08-25 13:45:24 +00008589 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008590
8591 // Add the features to the compile options.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008592 Opts->Features.clear();
Aaron Ballmanb226d3d2015-08-12 13:38:59 +00008593 for (const auto &F : Features)
8594 Opts->Features.push_back((F.getValue() ? "+" : "-") + F.getKey().str());
8595
Eric Christopher3ff21b32013-10-16 21:26:26 +00008596 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00008597 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008598
Yaxun Liu39cf40f2016-05-16 17:06:34 +00008599 Target->setSupportedOpenCLOpts();
8600
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00008601 if (!Target->validateTarget(Diags))
8602 return nullptr;
8603
Ahmed Charles9a16beb2014-03-07 19:33:25 +00008604 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008605}