blob: 80b44fc635387b1285f7328fbd4c7d94b4fd3df7 [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 Pilgrim474c6422016-07-07 11:24:38 +00001780 default:
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 }
1808 }();
Eric Christopherc48497a2015-09-18 21:26:24 +00001809 Builder.defineMacro("__CUDA_ARCH__", CUDAArchCode);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001810 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001811 }
Craig Topper6c03a542015-10-19 04:51:35 +00001812 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
1813 return llvm::makeArrayRef(BuiltinInfo,
1814 clang::NVPTX::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eric Christopherc48497a2015-09-18 21:26:24 +00001815 }
1816 bool hasFeature(StringRef Feature) const override {
1817 return Feature == "ptx" || Feature == "nvptx";
Peter Collingbournec947aae2012-05-20 23:28:41 +00001818 }
1819
Craig Topperf054e3a2015-10-19 03:52:27 +00001820 ArrayRef<const char *> getGCCRegNames() const override;
1821 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00001822 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00001823 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00001824 }
1825 bool validateAsmConstraint(const char *&Name,
1826 TargetInfo::ConstraintInfo &Info) const override {
1827 switch (*Name) {
1828 default:
1829 return false;
1830 case 'c':
1831 case 'h':
1832 case 'r':
1833 case 'l':
1834 case 'f':
1835 case 'd':
1836 Info.setAllowsRegister();
1837 return true;
Eli Bendersky13467172015-04-01 20:29:18 +00001838 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001839 }
1840 const char *getClobbers() const override {
1841 // FIXME: Is this really right?
1842 return "";
1843 }
1844 BuiltinVaListKind getBuiltinVaListKind() const override {
1845 // FIXME: implement
1846 return TargetInfo::CharPtrBuiltinVaList;
1847 }
1848 bool setCPU(const std::string &Name) override {
Justin Lebar62907612016-07-06 21:21:39 +00001849 GPU = StringToCudaArch(Name);
1850 return GPU != CudaArch::UNKNOWN;
Eric Christopherc48497a2015-09-18 21:26:24 +00001851 }
Jan Vesely9674bd42016-06-17 19:02:14 +00001852 void setSupportedOpenCLOpts() override {
1853 auto &Opts = getSupportedOpenCLOpts();
1854 Opts.cl_clang_storage_class_specifiers = 1;
1855 Opts.cl_khr_gl_sharing = 1;
1856 Opts.cl_khr_icd = 1;
1857
1858 Opts.cl_khr_fp64 = 1;
1859 Opts.cl_khr_byte_addressable_store = 1;
1860 Opts.cl_khr_global_int32_base_atomics = 1;
1861 Opts.cl_khr_global_int32_extended_atomics = 1;
1862 Opts.cl_khr_local_int32_base_atomics = 1;
1863 Opts.cl_khr_local_int32_extended_atomics = 1;
1864 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001865};
1866
1867const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1868#define BUILTIN(ID, TYPE, ATTRS) \
1869 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1870#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1871 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
1872#include "clang/Basic/BuiltinsNVPTX.def"
1873};
1874
1875const char *const NVPTXTargetInfo::GCCRegNames[] = {"r0"};
1876
Craig Topperf054e3a2015-10-19 03:52:27 +00001877ArrayRef<const char *> NVPTXTargetInfo::getGCCRegNames() const {
1878 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00001879}
1880
1881class NVPTX32TargetInfo : public NVPTXTargetInfo {
1882public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001883 NVPTX32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1884 : NVPTXTargetInfo(Triple, Opts) {
Artem Belevich236cfdc2015-09-28 22:54:08 +00001885 LongWidth = LongAlign = 32;
Eric Christopherc48497a2015-09-18 21:26:24 +00001886 PointerWidth = PointerAlign = 32;
1887 SizeType = TargetInfo::UnsignedInt;
1888 PtrDiffType = TargetInfo::SignedInt;
1889 IntPtrType = TargetInfo::SignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +00001890 resetDataLayout("e-p:32:32-i64:64-v16:16-v32:32-n16:32:64");
Eric Christopherc48497a2015-09-18 21:26:24 +00001891 }
1892};
1893
1894class NVPTX64TargetInfo : public NVPTXTargetInfo {
1895public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001896 NVPTX64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1897 : NVPTXTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00001898 PointerWidth = PointerAlign = 64;
1899 SizeType = TargetInfo::UnsignedLong;
1900 PtrDiffType = TargetInfo::SignedLong;
1901 IntPtrType = TargetInfo::SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00001902 resetDataLayout("e-i64:64-v16:16-v32:32-n16:32:64");
Eric Christopherc48497a2015-09-18 21:26:24 +00001903 }
1904};
Eli Friedmand13b41e2012-10-12 23:32:00 +00001905
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001906static const unsigned AMDGPUAddrSpaceMap[] = {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001907 1, // opencl_global
1908 3, // opencl_local
1909 2, // opencl_constant
Matt Arsenaultbfe25b22014-12-01 16:46:03 +00001910 4, // opencl_generic
Eli Friedmand13b41e2012-10-12 23:32:00 +00001911 1, // cuda_device
1912 2, // cuda_constant
1913 3 // cuda_shared
1914};
1915
Tom Stellarda96344b2014-08-21 13:58:40 +00001916// If you edit the description strings, make sure you update
1917// getPointerWidthV().
1918
Craig Topper273dbc62015-10-18 05:29:26 +00001919static const char *const DataLayoutStringR600 =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001920 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1921 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001922
Craig Topper273dbc62015-10-18 05:29:26 +00001923static const char *const DataLayoutStringSI =
Matt Arsenault6dc455f2016-05-31 16:58:18 +00001924 "e-p:32:32-p1:64:64-p2:64:64-p3:32:32-p4:64:64-p5:32:32"
Rafael Espindola29db13a2014-01-03 18:13:17 +00001925 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1926 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001927
Matt Arsenault250024f2016-06-08 01:56:42 +00001928class AMDGPUTargetInfo final : public TargetInfo {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001929 static const Builtin::Info BuiltinInfo[];
Tom Stellard7b1059b2015-04-14 14:36:56 +00001930 static const char * const GCCRegNames[];
Matt Arsenault56f008d2014-06-24 20:45:01 +00001931
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001932 /// \brief The GPU profiles supported by the AMDGPU target.
Tom Stellardc74b1e02013-03-04 17:40:53 +00001933 enum GPUKind {
1934 GK_NONE,
1935 GK_R600,
1936 GK_R600_DOUBLE_OPS,
1937 GK_R700,
1938 GK_R700_DOUBLE_OPS,
1939 GK_EVERGREEN,
1940 GK_EVERGREEN_DOUBLE_OPS,
1941 GK_NORTHERN_ISLANDS,
1942 GK_CAYMAN,
Tom Stellard08ded122013-10-29 16:38:29 +00001943 GK_SOUTHERN_ISLANDS,
Tom Stellard5c384402015-06-18 19:14:15 +00001944 GK_SEA_ISLANDS,
1945 GK_VOLCANIC_ISLANDS
Tom Stellardc74b1e02013-03-04 17:40:53 +00001946 } GPU;
1947
Jan Veselyeebeaea2015-05-04 19:53:36 +00001948 bool hasFP64:1;
1949 bool hasFMAF:1;
1950 bool hasLDEXPF:1;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001951
Matt Arsenault250024f2016-06-08 01:56:42 +00001952 static bool isAMDGCN(const llvm::Triple &TT) {
1953 return TT.getArch() == llvm::Triple::amdgcn;
1954 }
1955
Eli Friedmand13b41e2012-10-12 23:32:00 +00001956public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001957 AMDGPUTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Matt Arsenault250024f2016-06-08 01:56:42 +00001958 : TargetInfo(Triple) ,
1959 GPU(isAMDGCN(Triple) ? GK_SOUTHERN_ISLANDS : GK_R600),
1960 hasFP64(false),
1961 hasFMAF(false),
1962 hasLDEXPF(false) {
1963 if (getTriple().getArch() == llvm::Triple::amdgcn) {
Jan Veselya3abd6d2015-05-01 17:38:13 +00001964 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001965 hasFMAF = true;
1966 hasLDEXPF = true;
Tom Stellardd99fb952015-01-28 15:38:44 +00001967 }
Matt Arsenault250024f2016-06-08 01:56:42 +00001968
1969 resetDataLayout(getTriple().getArch() == llvm::Triple::amdgcn ?
1970 DataLayoutStringSI : DataLayoutStringR600);
1971
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001972 AddrSpaceMap = &AMDGPUAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001973 UseAddrSpaceMapMangling = true;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001974 }
1975
Tom Stellarda96344b2014-08-21 13:58:40 +00001976 uint64_t getPointerWidthV(unsigned AddrSpace) const override {
1977 if (GPU <= GK_CAYMAN)
1978 return 32;
1979
1980 switch(AddrSpace) {
1981 default:
1982 return 64;
1983 case 0:
1984 case 3:
1985 case 5:
1986 return 32;
1987 }
1988 }
1989
Craig Topper3164f332014-03-11 03:39:26 +00001990 const char * getClobbers() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001991 return "";
1992 }
1993
Craig Topperf054e3a2015-10-19 03:52:27 +00001994 ArrayRef<const char *> getGCCRegNames() const override;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001995
Craig Topperf054e3a2015-10-19 03:52:27 +00001996 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
1997 return None;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001998 }
1999
Craig Topper3164f332014-03-11 03:39:26 +00002000 bool validateAsmConstraint(const char *&Name,
Tom Stellardd097e942015-11-19 22:11:58 +00002001 TargetInfo::ConstraintInfo &Info) const override {
2002 switch (*Name) {
2003 default: break;
2004 case 'v': // vgpr
2005 case 's': // sgpr
2006 Info.setAllowsRegister();
2007 return true;
2008 }
2009 return false;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002010 }
2011
Matt Arsenault250024f2016-06-08 01:56:42 +00002012 bool initFeatureMap(llvm::StringMap<bool> &Features,
2013 DiagnosticsEngine &Diags, StringRef CPU,
2014 const std::vector<std::string> &FeatureVec) const override;
2015
Craig Topper6c03a542015-10-19 04:51:35 +00002016 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
2017 return llvm::makeArrayRef(BuiltinInfo,
2018 clang::AMDGPU::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eli Friedmand13b41e2012-10-12 23:32:00 +00002019 }
2020
Craig Topper3164f332014-03-11 03:39:26 +00002021 void getTargetDefines(const LangOptions &Opts,
2022 MacroBuilder &Builder) const override {
Matt Arsenault5e020b22016-02-27 09:06:26 +00002023 if (getTriple().getArch() == llvm::Triple::amdgcn)
2024 Builder.defineMacro("__AMDGCN__");
2025 else
2026 Builder.defineMacro("__R600__");
2027
Jan Veselyeebeaea2015-05-04 19:53:36 +00002028 if (hasFMAF)
2029 Builder.defineMacro("__HAS_FMAF__");
2030 if (hasLDEXPF)
2031 Builder.defineMacro("__HAS_LDEXPF__");
Jan Vesely211ba782016-06-17 02:25:03 +00002032 if (hasFP64)
2033 Builder.defineMacro("__HAS_FP64__");
Eli Friedmand13b41e2012-10-12 23:32:00 +00002034 }
2035
Craig Topper3164f332014-03-11 03:39:26 +00002036 BuiltinVaListKind getBuiltinVaListKind() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00002037 return TargetInfo::CharPtrBuiltinVaList;
2038 }
2039
Matt Arsenault250024f2016-06-08 01:56:42 +00002040 static GPUKind parseR600Name(StringRef Name) {
2041 return llvm::StringSwitch<GPUKind>(Name)
Tom Stellardc74b1e02013-03-04 17:40:53 +00002042 .Case("r600" , GK_R600)
2043 .Case("rv610", GK_R600)
2044 .Case("rv620", GK_R600)
2045 .Case("rv630", GK_R600)
2046 .Case("rv635", GK_R600)
2047 .Case("rs780", GK_R600)
2048 .Case("rs880", GK_R600)
2049 .Case("rv670", GK_R600_DOUBLE_OPS)
2050 .Case("rv710", GK_R700)
2051 .Case("rv730", GK_R700)
2052 .Case("rv740", GK_R700_DOUBLE_OPS)
2053 .Case("rv770", GK_R700_DOUBLE_OPS)
2054 .Case("palm", GK_EVERGREEN)
2055 .Case("cedar", GK_EVERGREEN)
2056 .Case("sumo", GK_EVERGREEN)
2057 .Case("sumo2", GK_EVERGREEN)
2058 .Case("redwood", GK_EVERGREEN)
2059 .Case("juniper", GK_EVERGREEN)
2060 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
2061 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
2062 .Case("barts", GK_NORTHERN_ISLANDS)
2063 .Case("turks", GK_NORTHERN_ISLANDS)
2064 .Case("caicos", GK_NORTHERN_ISLANDS)
2065 .Case("cayman", GK_CAYMAN)
2066 .Case("aruba", GK_CAYMAN)
Matt Arsenault250024f2016-06-08 01:56:42 +00002067 .Default(GK_NONE);
2068 }
2069
2070 static GPUKind parseAMDGCNName(StringRef Name) {
2071 return llvm::StringSwitch<GPUKind>(Name)
Tom Stellard785699322013-04-01 20:56:49 +00002072 .Case("tahiti", GK_SOUTHERN_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00002073 .Case("pitcairn", GK_SOUTHERN_ISLANDS)
2074 .Case("verde", GK_SOUTHERN_ISLANDS)
2075 .Case("oland", GK_SOUTHERN_ISLANDS)
Tom Stellard9affba42014-08-21 13:58:38 +00002076 .Case("hainan", GK_SOUTHERN_ISLANDS)
Tom Stellard08ded122013-10-29 16:38:29 +00002077 .Case("bonaire", GK_SEA_ISLANDS)
2078 .Case("kabini", GK_SEA_ISLANDS)
2079 .Case("kaveri", GK_SEA_ISLANDS)
Tom Stellard55583042013-11-14 23:45:53 +00002080 .Case("hawaii", GK_SEA_ISLANDS)
Tom Stellard14e03962014-07-26 01:05:20 +00002081 .Case("mullins", GK_SEA_ISLANDS)
Tom Stellard5c384402015-06-18 19:14:15 +00002082 .Case("tonga", GK_VOLCANIC_ISLANDS)
2083 .Case("iceland", GK_VOLCANIC_ISLANDS)
2084 .Case("carrizo", GK_VOLCANIC_ISLANDS)
Tom Stellard2c7cdd22016-02-29 15:08:56 +00002085 .Case("fiji", GK_VOLCANIC_ISLANDS)
2086 .Case("stoney", GK_VOLCANIC_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00002087 .Default(GK_NONE);
Matt Arsenault250024f2016-06-08 01:56:42 +00002088 }
Tom Stellardc74b1e02013-03-04 17:40:53 +00002089
Matt Arsenault250024f2016-06-08 01:56:42 +00002090 bool setCPU(const std::string &Name) override {
2091 if (getTriple().getArch() == llvm::Triple::amdgcn)
2092 GPU = parseAMDGCNName(Name);
2093 else
2094 GPU = parseR600Name(Name);
Tom Stellardc74b1e02013-03-04 17:40:53 +00002095
Matt Arsenault250024f2016-06-08 01:56:42 +00002096 return GPU != GK_NONE;
Tom Stellardc74b1e02013-03-04 17:40:53 +00002097 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002098
Jan Vesely211ba782016-06-17 02:25:03 +00002099 void setSupportedOpenCLOpts() override {
2100 auto &Opts = getSupportedOpenCLOpts();
2101 Opts.cl_clang_storage_class_specifiers = 1;
2102 Opts.cl_khr_icd = 1;
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002103
Jan Vesely211ba782016-06-17 02:25:03 +00002104 if (hasFP64)
2105 Opts.cl_khr_fp64 = 1;
2106 if (GPU >= GK_EVERGREEN) {
2107 Opts.cl_khr_byte_addressable_store = 1;
2108 Opts.cl_khr_global_int32_base_atomics = 1;
2109 Opts.cl_khr_global_int32_extended_atomics = 1;
2110 Opts.cl_khr_local_int32_base_atomics = 1;
2111 Opts.cl_khr_local_int32_extended_atomics = 1;
2112 }
2113 if (GPU >= GK_SOUTHERN_ISLANDS) {
2114 Opts.cl_khr_fp16 = 1;
2115 Opts.cl_khr_int64_base_atomics = 1;
2116 Opts.cl_khr_int64_extended_atomics = 1;
2117 Opts.cl_khr_3d_image_writes = 1;
2118 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002119 }
Nikolay Haustov8c6538b2016-06-30 09:06:33 +00002120
2121 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
2122 switch (CC) {
2123 default:
2124 return CCCR_Warning;
2125 case CC_C:
2126 case CC_OpenCLKernel:
2127 return CCCR_OK;
2128 }
2129 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00002130};
2131
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002132const Builtin::Info AMDGPUTargetInfo::BuiltinInfo[] = {
Matt Arsenault56f008d2014-06-24 20:45:01 +00002133#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00002134 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Matt Arsenault250024f2016-06-08 01:56:42 +00002135#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
2136 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002137#include "clang/Basic/BuiltinsAMDGPU.def"
Matt Arsenault56f008d2014-06-24 20:45:01 +00002138};
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002139const char * const AMDGPUTargetInfo::GCCRegNames[] = {
Tom Stellard7b1059b2015-04-14 14:36:56 +00002140 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
2141 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
2142 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
2143 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
2144 "v32", "v33", "v34", "v35", "v36", "v37", "v38", "v39",
2145 "v40", "v41", "v42", "v43", "v44", "v45", "v46", "v47",
2146 "v48", "v49", "v50", "v51", "v52", "v53", "v54", "v55",
2147 "v56", "v57", "v58", "v59", "v60", "v61", "v62", "v63",
2148 "v64", "v65", "v66", "v67", "v68", "v69", "v70", "v71",
2149 "v72", "v73", "v74", "v75", "v76", "v77", "v78", "v79",
2150 "v80", "v81", "v82", "v83", "v84", "v85", "v86", "v87",
2151 "v88", "v89", "v90", "v91", "v92", "v93", "v94", "v95",
2152 "v96", "v97", "v98", "v99", "v100", "v101", "v102", "v103",
2153 "v104", "v105", "v106", "v107", "v108", "v109", "v110", "v111",
2154 "v112", "v113", "v114", "v115", "v116", "v117", "v118", "v119",
2155 "v120", "v121", "v122", "v123", "v124", "v125", "v126", "v127",
2156 "v128", "v129", "v130", "v131", "v132", "v133", "v134", "v135",
2157 "v136", "v137", "v138", "v139", "v140", "v141", "v142", "v143",
2158 "v144", "v145", "v146", "v147", "v148", "v149", "v150", "v151",
2159 "v152", "v153", "v154", "v155", "v156", "v157", "v158", "v159",
2160 "v160", "v161", "v162", "v163", "v164", "v165", "v166", "v167",
2161 "v168", "v169", "v170", "v171", "v172", "v173", "v174", "v175",
2162 "v176", "v177", "v178", "v179", "v180", "v181", "v182", "v183",
2163 "v184", "v185", "v186", "v187", "v188", "v189", "v190", "v191",
2164 "v192", "v193", "v194", "v195", "v196", "v197", "v198", "v199",
2165 "v200", "v201", "v202", "v203", "v204", "v205", "v206", "v207",
2166 "v208", "v209", "v210", "v211", "v212", "v213", "v214", "v215",
2167 "v216", "v217", "v218", "v219", "v220", "v221", "v222", "v223",
2168 "v224", "v225", "v226", "v227", "v228", "v229", "v230", "v231",
2169 "v232", "v233", "v234", "v235", "v236", "v237", "v238", "v239",
2170 "v240", "v241", "v242", "v243", "v244", "v245", "v246", "v247",
2171 "v248", "v249", "v250", "v251", "v252", "v253", "v254", "v255",
2172 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
2173 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
2174 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
2175 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
2176 "s32", "s33", "s34", "s35", "s36", "s37", "s38", "s39",
2177 "s40", "s41", "s42", "s43", "s44", "s45", "s46", "s47",
2178 "s48", "s49", "s50", "s51", "s52", "s53", "s54", "s55",
2179 "s56", "s57", "s58", "s59", "s60", "s61", "s62", "s63",
2180 "s64", "s65", "s66", "s67", "s68", "s69", "s70", "s71",
2181 "s72", "s73", "s74", "s75", "s76", "s77", "s78", "s79",
2182 "s80", "s81", "s82", "s83", "s84", "s85", "s86", "s87",
2183 "s88", "s89", "s90", "s91", "s92", "s93", "s94", "s95",
2184 "s96", "s97", "s98", "s99", "s100", "s101", "s102", "s103",
2185 "s104", "s105", "s106", "s107", "s108", "s109", "s110", "s111",
2186 "s112", "s113", "s114", "s115", "s116", "s117", "s118", "s119",
Etienne Bergerone8ae26f2016-03-24 18:29:24 +00002187 "s120", "s121", "s122", "s123", "s124", "s125", "s126", "s127",
Matt Arsenaultb015d622016-02-27 09:06:22 +00002188 "exec", "vcc", "scc", "m0", "flat_scratch", "exec_lo", "exec_hi",
2189 "vcc_lo", "vcc_hi", "flat_scratch_lo", "flat_scratch_hi"
Tom Stellard7b1059b2015-04-14 14:36:56 +00002190};
2191
Craig Topperf054e3a2015-10-19 03:52:27 +00002192ArrayRef<const char *> AMDGPUTargetInfo::getGCCRegNames() const {
2193 return llvm::makeArrayRef(GCCRegNames);
Tom Stellard7b1059b2015-04-14 14:36:56 +00002194}
Matt Arsenault56f008d2014-06-24 20:45:01 +00002195
Matt Arsenault250024f2016-06-08 01:56:42 +00002196bool AMDGPUTargetInfo::initFeatureMap(
2197 llvm::StringMap<bool> &Features,
2198 DiagnosticsEngine &Diags, StringRef CPU,
2199 const std::vector<std::string> &FeatureVec) const {
2200
2201 // XXX - What does the member GPU mean if device name string passed here?
2202 if (getTriple().getArch() == llvm::Triple::amdgcn) {
2203 if (CPU.empty())
2204 CPU = "tahiti";
2205
2206 switch (parseAMDGCNName(CPU)) {
2207 case GK_SOUTHERN_ISLANDS:
2208 case GK_SEA_ISLANDS:
2209 break;
2210
2211 case GK_VOLCANIC_ISLANDS:
2212 Features["s-memrealtime"] = true;
2213 Features["16-bit-insts"] = true;
2214 break;
2215
2216 case GK_NONE:
2217 return false;
2218 default:
2219 llvm_unreachable("unhandled subtarget");
2220 }
2221 } else {
2222 if (CPU.empty())
2223 CPU = "r600";
2224
2225 switch (parseR600Name(CPU)) {
2226 case GK_R600:
2227 case GK_R700:
2228 case GK_EVERGREEN:
2229 case GK_NORTHERN_ISLANDS:
2230 break;
2231 case GK_R600_DOUBLE_OPS:
2232 case GK_R700_DOUBLE_OPS:
2233 case GK_EVERGREEN_DOUBLE_OPS:
2234 case GK_CAYMAN:
2235 Features["fp64"] = true;
2236 break;
2237 case GK_NONE:
2238 return false;
2239 default:
2240 llvm_unreachable("unhandled subtarget");
2241 }
2242 }
2243
2244 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeatureVec);
2245}
2246
Eli Friedman3fd920a2008-08-20 02:34:37 +00002247// Namespace for x86 abstract base class
2248const Builtin::Info BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00002249#define BUILTIN(ID, TYPE, ATTRS) \
2250 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002251#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
Craig Topper07d3b622015-08-07 05:14:44 +00002252 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002253#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
Craig Topper07d3b622015-08-07 05:14:44 +00002254 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Chris Lattner5abdec72009-06-14 01:05:48 +00002255#include "clang/Basic/BuiltinsX86.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00002256};
Eli Friedmanb5366062008-05-20 14:21:01 +00002257
Nuno Lopescfca1f02009-12-23 17:49:57 +00002258static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002259 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
2260 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00002261 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002262 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
2263 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
2264 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00002265 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00002266 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
2267 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Marina Yatsina41c45fa2016-02-03 11:32:08 +00002268 "xmm16", "xmm17", "xmm18", "xmm19", "xmm20", "xmm21", "xmm22", "xmm23",
2269 "xmm24", "xmm25", "xmm26", "xmm27", "xmm28", "xmm29", "xmm30", "xmm31",
2270 "ymm16", "ymm17", "ymm18", "ymm19", "ymm20", "ymm21", "ymm22", "ymm23",
2271 "ymm24", "ymm25", "ymm26", "ymm27", "ymm28", "ymm29", "ymm30", "ymm31",
2272 "zmm0", "zmm1", "zmm2", "zmm3", "zmm4", "zmm5", "zmm6", "zmm7",
2273 "zmm8", "zmm9", "zmm10", "zmm11", "zmm12", "zmm13", "zmm14", "zmm15",
2274 "zmm16", "zmm17", "zmm18", "zmm19", "zmm20", "zmm21", "zmm22", "zmm23",
2275 "zmm24", "zmm25", "zmm26", "zmm27", "zmm28", "zmm29", "zmm30", "zmm31",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002276};
2277
Eric Christophercdd36352011-06-21 00:05:20 +00002278const TargetInfo::AddlRegName AddlRegNames[] = {
2279 { { "al", "ah", "eax", "rax" }, 0 },
2280 { { "bl", "bh", "ebx", "rbx" }, 3 },
2281 { { "cl", "ch", "ecx", "rcx" }, 2 },
2282 { { "dl", "dh", "edx", "rdx" }, 1 },
2283 { { "esi", "rsi" }, 4 },
2284 { { "edi", "rdi" }, 5 },
2285 { { "esp", "rsp" }, 7 },
2286 { { "ebp", "rbp" }, 6 },
Alexey Bataeva7ab1b42015-09-04 03:42:23 +00002287 { { "r8d", "r8w", "r8b" }, 38 },
2288 { { "r9d", "r9w", "r9b" }, 39 },
2289 { { "r10d", "r10w", "r10b" }, 40 },
2290 { { "r11d", "r11w", "r11b" }, 41 },
2291 { { "r12d", "r12w", "r12b" }, 42 },
2292 { { "r13d", "r13w", "r13b" }, 43 },
2293 { { "r14d", "r14w", "r14b" }, 44 },
2294 { { "r15d", "r15w", "r15b" }, 45 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00002295};
2296
2297// X86 target abstract base class; x86-32 and x86-64 are very close, so
2298// most of the implementation can be shared.
2299class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00002300 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002301 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Craig Topper543f3bd2015-10-14 23:47:57 +00002302 } SSELevel = NoSSE;
Eli Friedman33465822011-07-08 23:31:17 +00002303 enum MMX3DNowEnum {
2304 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
Craig Topper543f3bd2015-10-14 23:47:57 +00002305 } MMX3DNowLevel = NoMMX3DNow;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002306 enum XOPEnum {
2307 NoXOP,
2308 SSE4A,
2309 FMA4,
2310 XOP
Craig Topper543f3bd2015-10-14 23:47:57 +00002311 } XOPLevel = NoXOP;
Anders Carlssone437c682010-01-27 03:47:49 +00002312
Craig Topper543f3bd2015-10-14 23:47:57 +00002313 bool HasAES = false;
2314 bool HasPCLMUL = false;
2315 bool HasLZCNT = false;
2316 bool HasRDRND = false;
2317 bool HasFSGSBASE = false;
2318 bool HasBMI = false;
2319 bool HasBMI2 = false;
2320 bool HasPOPCNT = false;
2321 bool HasRTM = false;
2322 bool HasPRFCHW = false;
2323 bool HasRDSEED = false;
2324 bool HasADX = false;
2325 bool HasTBM = false;
2326 bool HasFMA = false;
2327 bool HasF16C = false;
2328 bool HasAVX512CD = false;
2329 bool HasAVX512ER = false;
2330 bool HasAVX512PF = false;
2331 bool HasAVX512DQ = false;
2332 bool HasAVX512BW = false;
2333 bool HasAVX512VL = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002334 bool HasAVX512VBMI = false;
2335 bool HasAVX512IFMA = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002336 bool HasSHA = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002337 bool HasMPX = false;
2338 bool HasSGX = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002339 bool HasCX16 = false;
Craig Toppere33f51f2015-10-16 06:22:36 +00002340 bool HasFXSR = false;
Craig Topperda9fe562015-10-15 05:23:38 +00002341 bool HasXSAVE = false;
2342 bool HasXSAVEOPT = false;
2343 bool HasXSAVEC = false;
2344 bool HasXSAVES = false;
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00002345 bool HasMWAITX = false;
Asaf Badouha9d1e182015-12-31 14:14:07 +00002346 bool HasPKU = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002347 bool HasCLFLUSHOPT = false;
2348 bool HasPCOMMIT = false;
2349 bool HasCLWB = false;
2350 bool HasUMIP = false;
2351 bool HasMOVBE = false;
2352 bool HasPREFETCHWT1 = false;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00002353
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002354 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
2355 ///
2356 /// Each enumeration represents a particular CPU supported by Clang. These
2357 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
2358 enum CPUKind {
2359 CK_Generic,
2360
2361 /// \name i386
2362 /// i386-generation processors.
2363 //@{
2364 CK_i386,
2365 //@}
2366
2367 /// \name i486
2368 /// i486-generation processors.
2369 //@{
2370 CK_i486,
2371 CK_WinChipC6,
2372 CK_WinChip2,
2373 CK_C3,
2374 //@}
2375
2376 /// \name i586
2377 /// i586-generation processors, P5 microarchitecture based.
2378 //@{
2379 CK_i586,
2380 CK_Pentium,
2381 CK_PentiumMMX,
2382 //@}
2383
2384 /// \name i686
2385 /// i686-generation processors, P6 / Pentium M microarchitecture based.
2386 //@{
2387 CK_i686,
2388 CK_PentiumPro,
2389 CK_Pentium2,
2390 CK_Pentium3,
2391 CK_Pentium3M,
2392 CK_PentiumM,
2393 CK_C3_2,
2394
2395 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
2396 /// Clang however has some logic to suport this.
2397 // FIXME: Warn, deprecate, and potentially remove this.
2398 CK_Yonah,
2399 //@}
2400
2401 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00002402 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002403 //@{
2404 CK_Pentium4,
2405 CK_Pentium4M,
2406 CK_Prescott,
2407 CK_Nocona,
2408 //@}
2409
2410 /// \name Core
2411 /// Core microarchitecture based processors.
2412 //@{
2413 CK_Core2,
2414
2415 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
2416 /// codename which GCC no longer accepts as an option to -march, but Clang
2417 /// has some logic for recognizing it.
2418 // FIXME: Warn, deprecate, and potentially remove this.
2419 CK_Penryn,
2420 //@}
2421
2422 /// \name Atom
2423 /// Atom processors
2424 //@{
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002425 CK_Bonnell,
Preston Gurda3c58c02013-09-13 19:27:17 +00002426 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002427 //@}
2428
2429 /// \name Nehalem
2430 /// Nehalem microarchitecture based processors.
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002431 CK_Nehalem,
2432
2433 /// \name Westmere
2434 /// Westmere microarchitecture based processors.
2435 CK_Westmere,
2436
2437 /// \name Sandy Bridge
2438 /// Sandy Bridge microarchitecture based processors.
2439 CK_SandyBridge,
2440
2441 /// \name Ivy Bridge
2442 /// Ivy Bridge microarchitecture based processors.
2443 CK_IvyBridge,
2444
2445 /// \name Haswell
2446 /// Haswell microarchitecture based processors.
2447 CK_Haswell,
2448
2449 /// \name Broadwell
2450 /// Broadwell microarchitecture based processors.
Robert Khasanov50e6f582014-09-19 09:53:48 +00002451 CK_Broadwell,
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002452
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002453 /// \name Skylake Client
2454 /// Skylake client microarchitecture based processors.
2455 CK_SkylakeClient,
2456
2457 /// \name Skylake Server
2458 /// Skylake server microarchitecture based processors.
2459 CK_SkylakeServer,
2460
2461 /// \name Cannonlake Client
2462 /// Cannonlake client microarchitecture based processors.
2463 CK_Cannonlake,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002464
Craig Topper449314e2013-08-20 07:09:39 +00002465 /// \name Knights Landing
2466 /// Knights Landing processor.
2467 CK_KNL,
2468
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002469 /// \name Lakemont
2470 /// Lakemont microarchitecture based processors.
2471 CK_Lakemont,
2472
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002473 /// \name K6
2474 /// K6 architecture processors.
2475 //@{
2476 CK_K6,
2477 CK_K6_2,
2478 CK_K6_3,
2479 //@}
2480
2481 /// \name K7
2482 /// K7 architecture processors.
2483 //@{
2484 CK_Athlon,
2485 CK_AthlonThunderbird,
2486 CK_Athlon4,
2487 CK_AthlonXP,
2488 CK_AthlonMP,
2489 //@}
2490
2491 /// \name K8
2492 /// K8 architecture processors.
2493 //@{
2494 CK_Athlon64,
2495 CK_Athlon64SSE3,
2496 CK_AthlonFX,
2497 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00002498 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002499 CK_Opteron,
2500 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00002501 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002502 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002503
Benjamin Kramer569f2152012-01-10 11:50:18 +00002504 /// \name Bobcat
2505 /// Bobcat architecture processors.
2506 //@{
2507 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002508 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002509 //@}
2510
2511 /// \name Bulldozer
2512 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002513 //@{
2514 CK_BDVER1,
2515 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002516 CK_BDVER3,
Benjamin Kramer56c58222014-05-02 15:47:51 +00002517 CK_BDVER4,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002518 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002519
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002520 /// This specification is deprecated and will be removed in the future.
2521 /// Users should prefer \see CK_K8.
2522 // FIXME: Warn on this when the CPU is set to it.
Saleem Abdulrasoolcb29c1a2014-11-17 18:40:15 +00002523 //@{
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002524 CK_x86_64,
2525 //@}
2526
2527 /// \name Geode
2528 /// Geode processors.
2529 //@{
2530 CK_Geode
2531 //@}
Craig Topper543f3bd2015-10-14 23:47:57 +00002532 } CPU = CK_Generic;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002533
Eric Christopherc50738f2015-08-27 00:05:50 +00002534 CPUKind getCPUKind(StringRef CPU) const {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002535 return llvm::StringSwitch<CPUKind>(CPU)
2536 .Case("i386", CK_i386)
2537 .Case("i486", CK_i486)
2538 .Case("winchip-c6", CK_WinChipC6)
2539 .Case("winchip2", CK_WinChip2)
2540 .Case("c3", CK_C3)
2541 .Case("i586", CK_i586)
2542 .Case("pentium", CK_Pentium)
2543 .Case("pentium-mmx", CK_PentiumMMX)
2544 .Case("i686", CK_i686)
2545 .Case("pentiumpro", CK_PentiumPro)
2546 .Case("pentium2", CK_Pentium2)
2547 .Case("pentium3", CK_Pentium3)
2548 .Case("pentium3m", CK_Pentium3M)
2549 .Case("pentium-m", CK_PentiumM)
2550 .Case("c3-2", CK_C3_2)
2551 .Case("yonah", CK_Yonah)
2552 .Case("pentium4", CK_Pentium4)
2553 .Case("pentium4m", CK_Pentium4M)
2554 .Case("prescott", CK_Prescott)
2555 .Case("nocona", CK_Nocona)
2556 .Case("core2", CK_Core2)
2557 .Case("penryn", CK_Penryn)
2558 .Case("bonnell", CK_Bonnell)
2559 .Case("atom", CK_Bonnell) // Legacy name.
2560 .Case("silvermont", CK_Silvermont)
2561 .Case("slm", CK_Silvermont) // Legacy name.
2562 .Case("nehalem", CK_Nehalem)
2563 .Case("corei7", CK_Nehalem) // Legacy name.
2564 .Case("westmere", CK_Westmere)
2565 .Case("sandybridge", CK_SandyBridge)
2566 .Case("corei7-avx", CK_SandyBridge) // Legacy name.
2567 .Case("ivybridge", CK_IvyBridge)
2568 .Case("core-avx-i", CK_IvyBridge) // Legacy name.
2569 .Case("haswell", CK_Haswell)
2570 .Case("core-avx2", CK_Haswell) // Legacy name.
2571 .Case("broadwell", CK_Broadwell)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002572 .Case("skylake", CK_SkylakeClient)
2573 .Case("skylake-avx512", CK_SkylakeServer)
2574 .Case("skx", CK_SkylakeServer) // Legacy name.
2575 .Case("cannonlake", CK_Cannonlake)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002576 .Case("knl", CK_KNL)
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002577 .Case("lakemont", CK_Lakemont)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002578 .Case("k6", CK_K6)
2579 .Case("k6-2", CK_K6_2)
2580 .Case("k6-3", CK_K6_3)
2581 .Case("athlon", CK_Athlon)
2582 .Case("athlon-tbird", CK_AthlonThunderbird)
2583 .Case("athlon-4", CK_Athlon4)
2584 .Case("athlon-xp", CK_AthlonXP)
2585 .Case("athlon-mp", CK_AthlonMP)
2586 .Case("athlon64", CK_Athlon64)
2587 .Case("athlon64-sse3", CK_Athlon64SSE3)
2588 .Case("athlon-fx", CK_AthlonFX)
2589 .Case("k8", CK_K8)
2590 .Case("k8-sse3", CK_K8SSE3)
2591 .Case("opteron", CK_Opteron)
2592 .Case("opteron-sse3", CK_OpteronSSE3)
2593 .Case("barcelona", CK_AMDFAM10)
2594 .Case("amdfam10", CK_AMDFAM10)
2595 .Case("btver1", CK_BTVER1)
2596 .Case("btver2", CK_BTVER2)
2597 .Case("bdver1", CK_BDVER1)
2598 .Case("bdver2", CK_BDVER2)
2599 .Case("bdver3", CK_BDVER3)
2600 .Case("bdver4", CK_BDVER4)
2601 .Case("x86-64", CK_x86_64)
2602 .Case("geode", CK_Geode)
2603 .Default(CK_Generic);
2604 }
2605
Rafael Espindolaeb265472013-08-21 21:59:03 +00002606 enum FPMathKind {
2607 FP_Default,
2608 FP_SSE,
2609 FP_387
Craig Topper543f3bd2015-10-14 23:47:57 +00002610 } FPMath = FP_Default;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002611
Eli Friedman3fd920a2008-08-20 02:34:37 +00002612public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00002613 X86TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
2614 : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00002615 BigEndian = false;
Andrey Bokhanko94e1d582015-11-05 12:43:09 +00002616 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00002617 }
Craig Topper3164f332014-03-11 03:39:26 +00002618 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00002619 // X87 evaluates with 80 bits "long double" precision.
2620 return SSELevel == NoSSE ? 2 : 0;
2621 }
Craig Topper6c03a542015-10-19 04:51:35 +00002622 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
2623 return llvm::makeArrayRef(BuiltinInfo,
2624 clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner10a5b382007-01-29 05:24:35 +00002625 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002626 ArrayRef<const char *> getGCCRegNames() const override {
2627 return llvm::makeArrayRef(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00002628 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002629 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
2630 return None;
Eric Christophercdd36352011-06-21 00:05:20 +00002631 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002632 ArrayRef<TargetInfo::AddlRegName> getGCCAddlRegNames() const override {
2633 return llvm::makeArrayRef(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00002634 }
Eric Christopherd9832702015-06-29 21:00:05 +00002635 bool validateCpuSupports(StringRef Name) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002636 bool validateAsmConstraint(const char *&Name,
Eric Christopher917e9522014-11-18 22:36:15 +00002637 TargetInfo::ConstraintInfo &info) const override;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002638
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00002639 bool validateGlobalRegisterVariable(StringRef RegName,
2640 unsigned RegSize,
2641 bool &HasSizeMismatch) const override {
2642 // esp and ebp are the only 32-bit registers the x86 backend can currently
2643 // handle.
2644 if (RegName.equals("esp") || RegName.equals("ebp")) {
2645 // Check that the register size is 32-bit.
2646 HasSizeMismatch = RegSize != 32;
2647 return true;
2648 }
2649
2650 return false;
2651 }
2652
Akira Hatanaka974131e2014-09-18 18:17:18 +00002653 bool validateOutputSize(StringRef Constraint, unsigned Size) const override;
2654
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002655 bool validateInputSize(StringRef Constraint, unsigned Size) const override;
2656
Akira Hatanaka974131e2014-09-18 18:17:18 +00002657 virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const;
2658
Craig Topper3164f332014-03-11 03:39:26 +00002659 std::string convertConstraint(const char *&Constraint) const override;
2660 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002661 return "~{dirflag},~{fpsr},~{flags}";
2662 }
Craig Topper3164f332014-03-11 03:39:26 +00002663 void getTargetDefines(const LangOptions &Opts,
2664 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00002665 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
2666 bool Enabled);
2667 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
2668 bool Enabled);
2669 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
2670 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002671 void setFeatureEnabled(llvm::StringMap<bool> &Features,
2672 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00002673 setFeatureEnabledImpl(Features, Name, Enabled);
2674 }
2675 // This exists purely to cut down on the number of virtual calls in
Eric Christopheref1e2952015-08-28 02:13:58 +00002676 // initFeatureMap which calls this repeatedly.
Craig Topper86d79ef2013-09-17 04:51:29 +00002677 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2678 StringRef Name, bool Enabled);
Eric Christopher8c47b422015-10-09 18:39:55 +00002679 bool
2680 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
2681 StringRef CPU,
2682 const std::vector<std::string> &FeaturesVec) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002683 bool hasFeature(StringRef Feature) const override;
2684 bool handleTargetFeatures(std::vector<std::string> &Features,
2685 DiagnosticsEngine &Diags) override;
Alp Toker4925ba72014-06-07 23:30:42 +00002686 StringRef getABI() const override {
Ahmed Bougacha0b938282015-06-22 21:31:43 +00002687 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX512F)
2688 return "avx512";
Craig Topperd945d502015-10-20 00:00:17 +00002689 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002690 return "avx";
Craig Topperd945d502015-10-20 00:00:17 +00002691 if (getTriple().getArch() == llvm::Triple::x86 &&
Derek Schuffc7dd7222012-10-11 15:52:22 +00002692 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002693 return "no-mmx";
2694 return "";
Eli Friedman33465822011-07-08 23:31:17 +00002695 }
Craig Topper3164f332014-03-11 03:39:26 +00002696 bool setCPU(const std::string &Name) override {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002697 CPU = getCPUKind(Name);
Chandler Carruth212334f2011-09-28 08:55:37 +00002698
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002699 // Perform any per-CPU checks necessary to determine if this CPU is
2700 // acceptable.
2701 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
2702 // invalid without explaining *why*.
2703 switch (CPU) {
2704 case CK_Generic:
2705 // No processor selected!
2706 return false;
2707
2708 case CK_i386:
2709 case CK_i486:
2710 case CK_WinChipC6:
2711 case CK_WinChip2:
2712 case CK_C3:
2713 case CK_i586:
2714 case CK_Pentium:
2715 case CK_PentiumMMX:
2716 case CK_i686:
2717 case CK_PentiumPro:
2718 case CK_Pentium2:
2719 case CK_Pentium3:
2720 case CK_Pentium3M:
2721 case CK_PentiumM:
2722 case CK_Yonah:
2723 case CK_C3_2:
2724 case CK_Pentium4:
2725 case CK_Pentium4M:
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002726 case CK_Lakemont:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002727 case CK_Prescott:
2728 case CK_K6:
2729 case CK_K6_2:
2730 case CK_K6_3:
2731 case CK_Athlon:
2732 case CK_AthlonThunderbird:
2733 case CK_Athlon4:
2734 case CK_AthlonXP:
2735 case CK_AthlonMP:
2736 case CK_Geode:
2737 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002738 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002739 return false;
2740
2741 // Fallthrough
2742 case CK_Nocona:
2743 case CK_Core2:
2744 case CK_Penryn:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002745 case CK_Bonnell:
Preston Gurda3c58c02013-09-13 19:27:17 +00002746 case CK_Silvermont:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002747 case CK_Nehalem:
2748 case CK_Westmere:
2749 case CK_SandyBridge:
2750 case CK_IvyBridge:
2751 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002752 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002753 case CK_SkylakeClient:
2754 case CK_SkylakeServer:
2755 case CK_Cannonlake:
Craig Topper449314e2013-08-20 07:09:39 +00002756 case CK_KNL:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002757 case CK_Athlon64:
2758 case CK_Athlon64SSE3:
2759 case CK_AthlonFX:
2760 case CK_K8:
2761 case CK_K8SSE3:
2762 case CK_Opteron:
2763 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00002764 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00002765 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002766 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002767 case CK_BDVER1:
2768 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002769 case CK_BDVER3:
Benjamin Kramer56c58222014-05-02 15:47:51 +00002770 case CK_BDVER4:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002771 case CK_x86_64:
2772 return true;
2773 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00002774 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002775 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002776
Craig Topper3164f332014-03-11 03:39:26 +00002777 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002778
Craig Topper3164f332014-03-11 03:39:26 +00002779 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00002780 // Most of the non-ARM calling conventions are i386 conventions.
2781 switch (CC) {
2782 case CC_X86ThisCall:
2783 case CC_X86FastCall:
2784 case CC_X86StdCall:
2785 case CC_X86VectorCall:
2786 case CC_C:
2787 case CC_Swift:
2788 case CC_X86Pascal:
2789 case CC_IntelOclBicc:
2790 return CCCR_OK;
2791 default:
2792 return CCCR_Warning;
2793 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002794 }
2795
Craig Topper3164f332014-03-11 03:39:26 +00002796 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00002797 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002798 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00002799
2800 bool hasSjLjLowering() const override {
2801 return true;
2802 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002803
2804 void setSupportedOpenCLOpts() override {
2805 getSupportedOpenCLOpts().setAll();
2806 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00002807};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002808
Rafael Espindolaeb265472013-08-21 21:59:03 +00002809bool X86TargetInfo::setFPMath(StringRef Name) {
2810 if (Name == "387") {
2811 FPMath = FP_387;
2812 return true;
2813 }
2814 if (Name == "sse") {
2815 FPMath = FP_SSE;
2816 return true;
2817 }
2818 return false;
2819}
2820
Eric Christopher007b0a02015-08-28 22:32:01 +00002821bool X86TargetInfo::initFeatureMap(
2822 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
Eric Christopher8c47b422015-10-09 18:39:55 +00002823 const std::vector<std::string> &FeaturesVec) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002824 // FIXME: This *really* should not be here.
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002825 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002826 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00002827 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002828
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002829 const CPUKind Kind = getCPUKind(CPU);
Andrey Turetskiy5f1cf5f2016-03-23 11:15:10 +00002830
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002831 // Enable X87 for all X86 processors but Lakemont.
2832 if (Kind != CK_Lakemont)
2833 setFeatureEnabledImpl(Features, "x87", true);
2834
2835 switch (Kind) {
Chandler Carruth212334f2011-09-28 08:55:37 +00002836 case CK_Generic:
2837 case CK_i386:
2838 case CK_i486:
2839 case CK_i586:
2840 case CK_Pentium:
2841 case CK_i686:
2842 case CK_PentiumPro:
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002843 case CK_Lakemont:
Chandler Carruth212334f2011-09-28 08:55:37 +00002844 break;
2845 case CK_PentiumMMX:
2846 case CK_Pentium2:
Craig Topperdb4dc082014-11-06 05:52:19 +00002847 case CK_K6:
2848 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00002849 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002850 break;
2851 case CK_Pentium3:
2852 case CK_Pentium3M:
Craig Topperdb4dc082014-11-06 05:52:19 +00002853 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002854 setFeatureEnabledImpl(Features, "sse", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002855 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002856 break;
2857 case CK_PentiumM:
2858 case CK_Pentium4:
2859 case CK_Pentium4M:
2860 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00002861 setFeatureEnabledImpl(Features, "sse2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002862 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002863 break;
2864 case CK_Yonah:
2865 case CK_Prescott:
2866 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00002867 setFeatureEnabledImpl(Features, "sse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002868 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002869 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002870 break;
2871 case CK_Core2:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002872 case CK_Bonnell:
Craig Topper86d79ef2013-09-17 04:51:29 +00002873 setFeatureEnabledImpl(Features, "ssse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002874 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002875 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002876 break;
2877 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00002878 setFeatureEnabledImpl(Features, "sse4.1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002879 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002880 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002881 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002882 case CK_Cannonlake:
2883 setFeatureEnabledImpl(Features, "avx512ifma", true);
2884 setFeatureEnabledImpl(Features, "avx512vbmi", true);
2885 setFeatureEnabledImpl(Features, "sha", true);
2886 setFeatureEnabledImpl(Features, "umip", true);
2887 // FALLTHROUGH
2888 case CK_SkylakeServer:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002889 setFeatureEnabledImpl(Features, "avx512f", true);
2890 setFeatureEnabledImpl(Features, "avx512cd", true);
2891 setFeatureEnabledImpl(Features, "avx512dq", true);
2892 setFeatureEnabledImpl(Features, "avx512bw", true);
2893 setFeatureEnabledImpl(Features, "avx512vl", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002894 setFeatureEnabledImpl(Features, "pku", true);
2895 setFeatureEnabledImpl(Features, "pcommit", true);
2896 setFeatureEnabledImpl(Features, "clwb", true);
2897 // FALLTHROUGH
2898 case CK_SkylakeClient:
Craig Topperda9fe562015-10-15 05:23:38 +00002899 setFeatureEnabledImpl(Features, "xsavec", true);
2900 setFeatureEnabledImpl(Features, "xsaves", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002901 setFeatureEnabledImpl(Features, "mpx", true);
2902 setFeatureEnabledImpl(Features, "sgx", true);
2903 setFeatureEnabledImpl(Features, "clflushopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002904 // FALLTHROUGH
2905 case CK_Broadwell:
2906 setFeatureEnabledImpl(Features, "rdseed", true);
2907 setFeatureEnabledImpl(Features, "adx", true);
2908 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002909 case CK_Haswell:
Craig Topperdb4dc082014-11-06 05:52:19 +00002910 setFeatureEnabledImpl(Features, "avx2", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002911 setFeatureEnabledImpl(Features, "lzcnt", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002912 setFeatureEnabledImpl(Features, "bmi", true);
2913 setFeatureEnabledImpl(Features, "bmi2", true);
2914 setFeatureEnabledImpl(Features, "rtm", true);
2915 setFeatureEnabledImpl(Features, "fma", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002916 setFeatureEnabledImpl(Features, "movbe", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002917 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002918 case CK_IvyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002919 setFeatureEnabledImpl(Features, "rdrnd", true);
2920 setFeatureEnabledImpl(Features, "f16c", true);
2921 setFeatureEnabledImpl(Features, "fsgsbase", true);
2922 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002923 case CK_SandyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002924 setFeatureEnabledImpl(Features, "avx", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002925 setFeatureEnabledImpl(Features, "xsave", true);
2926 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002927 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002928 case CK_Westmere:
Craig Topperdb4dc082014-11-06 05:52:19 +00002929 case CK_Silvermont:
2930 setFeatureEnabledImpl(Features, "aes", true);
2931 setFeatureEnabledImpl(Features, "pclmul", true);
2932 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002933 case CK_Nehalem:
Craig Topperdb4dc082014-11-06 05:52:19 +00002934 setFeatureEnabledImpl(Features, "sse4.2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002935 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002936 setFeatureEnabledImpl(Features, "cx16", true);
2937 break;
2938 case CK_KNL:
2939 setFeatureEnabledImpl(Features, "avx512f", true);
2940 setFeatureEnabledImpl(Features, "avx512cd", true);
2941 setFeatureEnabledImpl(Features, "avx512er", true);
2942 setFeatureEnabledImpl(Features, "avx512pf", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002943 setFeatureEnabledImpl(Features, "prefetchwt1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002944 setFeatureEnabledImpl(Features, "fxsr", true);
Robert Khasanov50e6f582014-09-19 09:53:48 +00002945 setFeatureEnabledImpl(Features, "rdseed", true);
2946 setFeatureEnabledImpl(Features, "adx", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002947 setFeatureEnabledImpl(Features, "lzcnt", true);
2948 setFeatureEnabledImpl(Features, "bmi", true);
2949 setFeatureEnabledImpl(Features, "bmi2", true);
2950 setFeatureEnabledImpl(Features, "rtm", true);
2951 setFeatureEnabledImpl(Features, "fma", true);
2952 setFeatureEnabledImpl(Features, "rdrnd", true);
2953 setFeatureEnabledImpl(Features, "f16c", true);
2954 setFeatureEnabledImpl(Features, "fsgsbase", true);
2955 setFeatureEnabledImpl(Features, "aes", true);
2956 setFeatureEnabledImpl(Features, "pclmul", true);
2957 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002958 setFeatureEnabledImpl(Features, "xsaveopt", true);
2959 setFeatureEnabledImpl(Features, "xsave", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002960 setFeatureEnabledImpl(Features, "movbe", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002961 break;
2962 case CK_K6_2:
2963 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00002964 case CK_WinChip2:
2965 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002966 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002967 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002968 case CK_Athlon:
2969 case CK_AthlonThunderbird:
2970 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00002971 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002972 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002973 case CK_Athlon4:
2974 case CK_AthlonXP:
2975 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00002976 setFeatureEnabledImpl(Features, "sse", true);
2977 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002978 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002979 break;
2980 case CK_K8:
2981 case CK_Opteron:
2982 case CK_Athlon64:
2983 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00002984 setFeatureEnabledImpl(Features, "sse2", true);
2985 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002986 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002987 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002988 case CK_AMDFAM10:
2989 setFeatureEnabledImpl(Features, "sse4a", true);
2990 setFeatureEnabledImpl(Features, "lzcnt", true);
2991 setFeatureEnabledImpl(Features, "popcnt", true);
2992 // FALLTHROUGH
Chandler Carruth212334f2011-09-28 08:55:37 +00002993 case CK_K8SSE3:
2994 case CK_OpteronSSE3:
2995 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002996 setFeatureEnabledImpl(Features, "sse3", true);
2997 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002998 setFeatureEnabledImpl(Features, "fxsr", true);
Roman Divackyce253d82011-10-30 13:47:56 +00002999 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00003000 case CK_BTVER2:
3001 setFeatureEnabledImpl(Features, "avx", true);
3002 setFeatureEnabledImpl(Features, "aes", true);
3003 setFeatureEnabledImpl(Features, "pclmul", true);
3004 setFeatureEnabledImpl(Features, "bmi", true);
3005 setFeatureEnabledImpl(Features, "f16c", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003006 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00003007 // FALLTHROUGH
Benjamin Kramer569f2152012-01-10 11:50:18 +00003008 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00003009 setFeatureEnabledImpl(Features, "ssse3", true);
3010 setFeatureEnabledImpl(Features, "sse4a", true);
3011 setFeatureEnabledImpl(Features, "lzcnt", true);
3012 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00003013 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003014 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003015 setFeatureEnabledImpl(Features, "fxsr", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003016 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003017 case CK_BDVER4:
3018 setFeatureEnabledImpl(Features, "avx2", true);
3019 setFeatureEnabledImpl(Features, "bmi2", true);
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003020 setFeatureEnabledImpl(Features, "mwaitx", true);
Benjamin Kramer56c58222014-05-02 15:47:51 +00003021 // FALLTHROUGH
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003022 case CK_BDVER3:
Craig Topper8c7f2512014-11-03 06:51:41 +00003023 setFeatureEnabledImpl(Features, "fsgsbase", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003024 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topper8c7f2512014-11-03 06:51:41 +00003025 // FALLTHROUGH
3026 case CK_BDVER2:
Andrea Di Biagio9760a442014-11-06 12:08:57 +00003027 setFeatureEnabledImpl(Features, "bmi", true);
3028 setFeatureEnabledImpl(Features, "fma", true);
3029 setFeatureEnabledImpl(Features, "f16c", true);
3030 setFeatureEnabledImpl(Features, "tbm", true);
3031 // FALLTHROUGH
3032 case CK_BDVER1:
3033 // xop implies avx, sse4a and fma4.
Craig Topper86d79ef2013-09-17 04:51:29 +00003034 setFeatureEnabledImpl(Features, "xop", true);
3035 setFeatureEnabledImpl(Features, "lzcnt", true);
3036 setFeatureEnabledImpl(Features, "aes", true);
3037 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00003038 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003039 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003040 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003041 setFeatureEnabledImpl(Features, "xsave", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003042 break;
Eli Friedman33465822011-07-08 23:31:17 +00003043 }
Eric Christopherbbd746d2015-10-08 20:10:14 +00003044 if (!TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec))
3045 return false;
3046
3047 // Can't do this earlier because we need to be able to explicitly enable
3048 // or disable these features and the things that they depend upon.
3049
3050 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
3051 auto I = Features.find("sse4.2");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003052 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00003053 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-popcnt") ==
3054 FeaturesVec.end())
3055 Features["popcnt"] = true;
3056
3057 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
3058 I = Features.find("3dnow");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003059 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00003060 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-prfchw") ==
3061 FeaturesVec.end())
3062 Features["prfchw"] = true;
3063
Eric Christophera7260af2015-10-08 20:10:18 +00003064 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
3065 // then enable MMX.
3066 I = Features.find("sse");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003067 if (I != Features.end() && I->getValue() &&
Eric Christophera7260af2015-10-08 20:10:18 +00003068 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-mmx") ==
3069 FeaturesVec.end())
3070 Features["mmx"] = true;
3071
Eric Christopherbbd746d2015-10-08 20:10:14 +00003072 return true;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003073}
3074
Rafael Espindolae62e2792013-08-20 13:44:29 +00003075void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00003076 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003077 if (Enabled) {
3078 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003079 case AVX512F:
3080 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003081 case AVX2:
3082 Features["avx2"] = true;
3083 case AVX:
3084 Features["avx"] = true;
Craig Topperda9fe562015-10-15 05:23:38 +00003085 Features["xsave"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003086 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00003087 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003088 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00003089 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003090 case SSSE3:
3091 Features["ssse3"] = true;
3092 case SSE3:
3093 Features["sse3"] = true;
3094 case SSE2:
3095 Features["sse2"] = true;
3096 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00003097 Features["sse"] = true;
3098 case NoSSE:
3099 break;
3100 }
3101 return;
3102 }
3103
3104 switch (Level) {
3105 case NoSSE:
3106 case SSE1:
3107 Features["sse"] = false;
3108 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00003109 Features["sse2"] = Features["pclmul"] = Features["aes"] =
3110 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003111 case SSE3:
3112 Features["sse3"] = false;
3113 setXOPLevel(Features, NoXOP, false);
3114 case SSSE3:
3115 Features["ssse3"] = false;
3116 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00003117 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003118 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00003119 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003120 case AVX:
Craig Topperda9fe562015-10-15 05:23:38 +00003121 Features["fma"] = Features["avx"] = Features["f16c"] = Features["xsave"] =
3122 Features["xsaveopt"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00003123 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003124 case AVX2:
3125 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00003126 case AVX512F:
Eric Christopher917e9522014-11-18 22:36:15 +00003127 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
Craig Toppera31a5da2014-12-27 06:59:37 +00003128 Features["avx512pf"] = Features["avx512dq"] = Features["avx512bw"] =
Craig Topperb4f83a02016-02-29 06:51:38 +00003129 Features["avx512vl"] = Features["avx512vbmi"] =
3130 Features["avx512ifma"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003131 }
3132}
3133
3134void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00003135 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003136 if (Enabled) {
3137 switch (Level) {
3138 case AMD3DNowAthlon:
3139 Features["3dnowa"] = true;
3140 case AMD3DNow:
3141 Features["3dnow"] = true;
3142 case MMX:
3143 Features["mmx"] = true;
3144 case NoMMX3DNow:
3145 break;
3146 }
3147 return;
3148 }
3149
3150 switch (Level) {
3151 case NoMMX3DNow:
3152 case MMX:
3153 Features["mmx"] = false;
3154 case AMD3DNow:
3155 Features["3dnow"] = false;
3156 case AMD3DNowAthlon:
3157 Features["3dnowa"] = false;
3158 }
3159}
3160
3161void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00003162 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003163 if (Enabled) {
3164 switch (Level) {
3165 case XOP:
3166 Features["xop"] = true;
3167 case FMA4:
3168 Features["fma4"] = true;
3169 setSSELevel(Features, AVX, true);
3170 case SSE4A:
3171 Features["sse4a"] = true;
3172 setSSELevel(Features, SSE3, true);
3173 case NoXOP:
3174 break;
3175 }
3176 return;
3177 }
3178
3179 switch (Level) {
3180 case NoXOP:
3181 case SSE4A:
3182 Features["sse4a"] = false;
3183 case FMA4:
3184 Features["fma4"] = false;
3185 case XOP:
3186 Features["xop"] = false;
3187 }
3188}
3189
Craig Topper86d79ef2013-09-17 04:51:29 +00003190void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
3191 StringRef Name, bool Enabled) {
Eric Christopher298ac302015-07-01 00:08:32 +00003192 // This is a bit of a hack to deal with the sse4 target feature when used
3193 // as part of the target attribute. We handle sse4 correctly everywhere
3194 // else. See below for more information on how we handle the sse4 options.
3195 if (Name != "sse4")
3196 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00003197
Craig Topper29561122013-09-19 01:13:07 +00003198 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003199 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003200 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003201 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003202 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003203 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003204 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003205 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003206 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003207 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003208 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003209 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003210 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003211 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003212 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003213 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003214 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003215 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003216 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003217 if (Enabled)
3218 setSSELevel(Features, SSE2, Enabled);
3219 } else if (Name == "pclmul") {
3220 if (Enabled)
3221 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003222 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003223 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003224 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003225 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003226 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003227 setSSELevel(Features, AVX512F, Enabled);
Craig Topperb4f83a02016-02-29 06:51:38 +00003228 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf" ||
3229 Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl" ||
3230 Name == "avx512vbmi" || Name == "avx512ifma") {
Craig Topper679b53a2013-08-21 05:29:10 +00003231 if (Enabled)
3232 setSSELevel(Features, AVX512F, Enabled);
3233 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003234 if (Enabled)
3235 setSSELevel(Features, AVX, Enabled);
3236 } else if (Name == "fma4") {
3237 setXOPLevel(Features, FMA4, Enabled);
3238 } else if (Name == "xop") {
3239 setXOPLevel(Features, XOP, Enabled);
3240 } else if (Name == "sse4a") {
3241 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00003242 } else if (Name == "f16c") {
3243 if (Enabled)
3244 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00003245 } else if (Name == "sha") {
3246 if (Enabled)
3247 setSSELevel(Features, SSE2, Enabled);
Eric Christopher298ac302015-07-01 00:08:32 +00003248 } else if (Name == "sse4") {
3249 // We can get here via the __target__ attribute since that's not controlled
3250 // via the -msse4/-mno-sse4 command line alias. Handle this the same way
3251 // here - turn on the sse4.2 if enabled, turn off the sse4.1 level if
3252 // disabled.
3253 if (Enabled)
3254 setSSELevel(Features, SSE42, Enabled);
3255 else
3256 setSSELevel(Features, SSE41, Enabled);
Craig Topperda9fe562015-10-15 05:23:38 +00003257 } else if (Name == "xsave") {
Craig Topper840927e2016-02-29 06:51:34 +00003258 if (!Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003259 Features["xsaveopt"] = false;
3260 } else if (Name == "xsaveopt" || Name == "xsavec" || Name == "xsaves") {
Craig Topper840927e2016-02-29 06:51:34 +00003261 if (Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003262 Features["xsave"] = true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003263 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003264}
3265
Eric Christopher3ff21b32013-10-16 21:26:26 +00003266/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003267/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00003268bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00003269 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00003270 for (const auto &Feature : Features) {
3271 if (Feature[0] != '+')
Daniel Dunbar979586e2009-11-11 09:38:56 +00003272 continue;
3273
Eric Christopher610fe112015-08-26 08:21:55 +00003274 if (Feature == "+aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00003275 HasAES = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003276 } else if (Feature == "+pclmul") {
Craig Topper3f122a72012-05-31 05:18:48 +00003277 HasPCLMUL = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003278 } else if (Feature == "+lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00003279 HasLZCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003280 } else if (Feature == "+rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00003281 HasRDRND = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003282 } else if (Feature == "+fsgsbase") {
Craig Topper8c7f2512014-11-03 06:51:41 +00003283 HasFSGSBASE = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003284 } else if (Feature == "+bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00003285 HasBMI = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003286 } else if (Feature == "+bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00003287 HasBMI2 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003288 } else if (Feature == "+popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00003289 HasPOPCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003290 } else if (Feature == "+rtm") {
Michael Liao625a8752012-11-10 05:17:46 +00003291 HasRTM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003292 } else if (Feature == "+prfchw") {
Michael Liao74f4eaf2013-03-26 17:52:08 +00003293 HasPRFCHW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003294 } else if (Feature == "+rdseed") {
Michael Liaoffaae352013-03-29 05:17:55 +00003295 HasRDSEED = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003296 } else if (Feature == "+adx") {
Robert Khasanov50e6f582014-09-19 09:53:48 +00003297 HasADX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003298 } else if (Feature == "+tbm") {
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003299 HasTBM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003300 } else if (Feature == "+fma") {
Craig Topperbba778b2012-06-03 21:46:30 +00003301 HasFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003302 } else if (Feature == "+f16c") {
Manman Rena45358c2012-10-11 00:59:55 +00003303 HasF16C = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003304 } else if (Feature == "+avx512cd") {
Craig Topper679b53a2013-08-21 05:29:10 +00003305 HasAVX512CD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003306 } else if (Feature == "+avx512er") {
Craig Topper679b53a2013-08-21 05:29:10 +00003307 HasAVX512ER = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003308 } else if (Feature == "+avx512pf") {
Craig Topper679b53a2013-08-21 05:29:10 +00003309 HasAVX512PF = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003310 } else if (Feature == "+avx512dq") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003311 HasAVX512DQ = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003312 } else if (Feature == "+avx512bw") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003313 HasAVX512BW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003314 } else if (Feature == "+avx512vl") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003315 HasAVX512VL = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003316 } else if (Feature == "+avx512vbmi") {
3317 HasAVX512VBMI = true;
3318 } else if (Feature == "+avx512ifma") {
3319 HasAVX512IFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003320 } else if (Feature == "+sha") {
Ben Langmuir58078d02013-09-19 13:22:04 +00003321 HasSHA = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003322 } else if (Feature == "+mpx") {
3323 HasMPX = true;
3324 } else if (Feature == "+movbe") {
3325 HasMOVBE = true;
3326 } else if (Feature == "+sgx") {
3327 HasSGX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003328 } else if (Feature == "+cx16") {
Nick Lewycky50e8f482013-10-05 20:14:27 +00003329 HasCX16 = true;
Craig Toppere33f51f2015-10-16 06:22:36 +00003330 } else if (Feature == "+fxsr") {
3331 HasFXSR = true;
Craig Topperda9fe562015-10-15 05:23:38 +00003332 } else if (Feature == "+xsave") {
3333 HasXSAVE = true;
3334 } else if (Feature == "+xsaveopt") {
3335 HasXSAVEOPT = true;
3336 } else if (Feature == "+xsavec") {
3337 HasXSAVEC = true;
3338 } else if (Feature == "+xsaves") {
3339 HasXSAVES = true;
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003340 } else if (Feature == "+mwaitx") {
3341 HasMWAITX = true;
Asaf Badouha9d1e182015-12-31 14:14:07 +00003342 } else if (Feature == "+pku") {
3343 HasPKU = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003344 } else if (Feature == "+clflushopt") {
3345 HasCLFLUSHOPT = true;
3346 } else if (Feature == "+pcommit") {
3347 HasPCOMMIT = true;
3348 } else if (Feature == "+clwb") {
3349 HasCLWB = true;
3350 } else if (Feature == "+umip") {
3351 HasUMIP = true;
3352 } else if (Feature == "+prefetchwt1") {
3353 HasPREFETCHWT1 = true;
Nick Lewycky50e8f482013-10-05 20:14:27 +00003354 }
3355
Benjamin Kramer27402c62012-03-05 15:10:44 +00003356 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003357 .Case("+avx512f", AVX512F)
3358 .Case("+avx2", AVX2)
3359 .Case("+avx", AVX)
3360 .Case("+sse4.2", SSE42)
3361 .Case("+sse4.1", SSE41)
3362 .Case("+ssse3", SSSE3)
3363 .Case("+sse3", SSE3)
3364 .Case("+sse2", SSE2)
3365 .Case("+sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00003366 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003367 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003368
Eli Friedman33465822011-07-08 23:31:17 +00003369 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00003370 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003371 .Case("+3dnowa", AMD3DNowAthlon)
3372 .Case("+3dnow", AMD3DNow)
3373 .Case("+mmx", MMX)
Eli Friedman33465822011-07-08 23:31:17 +00003374 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00003375 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003376
3377 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003378 .Case("+xop", XOP)
3379 .Case("+fma4", FMA4)
3380 .Case("+sse4a", SSE4A)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003381 .Default(NoXOP);
3382 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003383 }
Eli Friedman33465822011-07-08 23:31:17 +00003384
Rafael Espindolaeb265472013-08-21 21:59:03 +00003385 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
3386 // matches the selected sse level.
Craig Topperd945d502015-10-20 00:00:17 +00003387 if ((FPMath == FP_SSE && SSELevel < SSE1) ||
3388 (FPMath == FP_387 && SSELevel >= SSE1)) {
3389 Diags.Report(diag::err_target_unsupported_fpmath) <<
3390 (FPMath == FP_SSE ? "sse" : "387");
Rafael Espindolaeb265472013-08-21 21:59:03 +00003391 return false;
3392 }
3393
Alexey Bataev00396512015-07-02 03:40:19 +00003394 SimdDefaultAlign =
Ahmed Bougacha68bf64e2015-08-27 22:24:56 +00003395 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Rafael Espindolaeb265472013-08-21 21:59:03 +00003396 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00003397}
Chris Lattnerecd49032009-03-02 22:27:17 +00003398
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003399/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
3400/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00003401void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003402 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00003403 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00003404 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003405 Builder.defineMacro("__amd64__");
3406 Builder.defineMacro("__amd64");
3407 Builder.defineMacro("__x86_64");
3408 Builder.defineMacro("__x86_64__");
Bob Wilsona2acb1e2014-08-08 23:46:28 +00003409 if (getTriple().getArchName() == "x86_64h") {
3410 Builder.defineMacro("__x86_64h");
3411 Builder.defineMacro("__x86_64h__");
3412 }
Chris Lattnerecd49032009-03-02 22:27:17 +00003413 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003414 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00003415 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003416
Chris Lattnerecd49032009-03-02 22:27:17 +00003417 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003418 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
3419 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00003420 switch (CPU) {
3421 case CK_Generic:
3422 break;
3423 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003424 // The rest are coming from the i386 define above.
3425 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003426 break;
3427 case CK_i486:
3428 case CK_WinChipC6:
3429 case CK_WinChip2:
3430 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003431 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00003432 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003433 case CK_PentiumMMX:
3434 Builder.defineMacro("__pentium_mmx__");
3435 Builder.defineMacro("__tune_pentium_mmx__");
3436 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003437 case CK_i586:
3438 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003439 defineCPUMacros(Builder, "i586");
3440 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00003441 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003442 case CK_Pentium3:
3443 case CK_Pentium3M:
3444 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003445 Builder.defineMacro("__tune_pentium3__");
3446 // Fallthrough
3447 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00003448 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003449 Builder.defineMacro("__tune_pentium2__");
3450 // Fallthrough
3451 case CK_PentiumPro:
3452 Builder.defineMacro("__tune_i686__");
3453 Builder.defineMacro("__tune_pentiumpro__");
3454 // Fallthrough
3455 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003456 Builder.defineMacro("__i686");
3457 Builder.defineMacro("__i686__");
3458 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
3459 Builder.defineMacro("__pentiumpro");
3460 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003461 break;
3462 case CK_Pentium4:
3463 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003464 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00003465 break;
3466 case CK_Yonah:
3467 case CK_Prescott:
3468 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003469 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00003470 break;
3471 case CK_Core2:
3472 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003473 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00003474 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003475 case CK_Bonnell:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003476 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00003477 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00003478 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00003479 defineCPUMacros(Builder, "slm");
3480 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003481 case CK_Nehalem:
3482 case CK_Westmere:
3483 case CK_SandyBridge:
3484 case CK_IvyBridge:
3485 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00003486 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003487 case CK_SkylakeClient:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003488 // FIXME: Historically, we defined this legacy name, it would be nice to
3489 // remove it at some point. We've never exposed fine-grained names for
3490 // recent primary x86 CPUs, and we should keep it that way.
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003491 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00003492 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003493 case CK_SkylakeServer:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003494 defineCPUMacros(Builder, "skx");
3495 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003496 case CK_Cannonlake:
3497 break;
Craig Topper449314e2013-08-20 07:09:39 +00003498 case CK_KNL:
3499 defineCPUMacros(Builder, "knl");
3500 break;
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003501 case CK_Lakemont:
3502 Builder.defineMacro("__tune_lakemont__");
3503 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003504 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003505 Builder.defineMacro("__k6_2__");
3506 Builder.defineMacro("__tune_k6_2__");
3507 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003508 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003509 if (CPU != CK_K6_2) { // In case of fallthrough
3510 // FIXME: GCC may be enabling these in cases where some other k6
3511 // architecture is specified but -m3dnow is explicitly provided. The
3512 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003513 Builder.defineMacro("__k6_3__");
3514 Builder.defineMacro("__tune_k6_3__");
3515 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003516 // Fallthrough
3517 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003518 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00003519 break;
3520 case CK_Athlon:
3521 case CK_AthlonThunderbird:
3522 case CK_Athlon4:
3523 case CK_AthlonXP:
3524 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003525 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003526 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003527 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003528 Builder.defineMacro("__tune_athlon_sse__");
3529 }
Chandler Carruth212334f2011-09-28 08:55:37 +00003530 break;
3531 case CK_K8:
3532 case CK_K8SSE3:
3533 case CK_x86_64:
3534 case CK_Opteron:
3535 case CK_OpteronSSE3:
3536 case CK_Athlon64:
3537 case CK_Athlon64SSE3:
3538 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003539 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00003540 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00003541 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003542 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00003543 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00003544 case CK_BTVER1:
3545 defineCPUMacros(Builder, "btver1");
3546 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003547 case CK_BTVER2:
3548 defineCPUMacros(Builder, "btver2");
3549 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003550 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003551 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003552 break;
3553 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003554 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003555 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003556 case CK_BDVER3:
3557 defineCPUMacros(Builder, "bdver3");
3558 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003559 case CK_BDVER4:
3560 defineCPUMacros(Builder, "bdver4");
3561 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003562 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003563 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00003564 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003565 }
Chris Lattner96e43572009-03-02 22:40:39 +00003566
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003567 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003568 Builder.defineMacro("__REGISTER_PREFIX__", "");
3569
Chris Lattner6df41af2009-04-19 17:32:33 +00003570 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
3571 // functions in glibc header files that use FP Stack inline asm which the
3572 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003573 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003574
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003575 if (HasAES)
3576 Builder.defineMacro("__AES__");
3577
Craig Topper3f122a72012-05-31 05:18:48 +00003578 if (HasPCLMUL)
3579 Builder.defineMacro("__PCLMUL__");
3580
Craig Topper22967d42011-12-25 05:06:45 +00003581 if (HasLZCNT)
3582 Builder.defineMacro("__LZCNT__");
3583
Benjamin Kramer1e250392012-07-07 09:39:18 +00003584 if (HasRDRND)
3585 Builder.defineMacro("__RDRND__");
3586
Craig Topper8c7f2512014-11-03 06:51:41 +00003587 if (HasFSGSBASE)
3588 Builder.defineMacro("__FSGSBASE__");
3589
Craig Topper22967d42011-12-25 05:06:45 +00003590 if (HasBMI)
3591 Builder.defineMacro("__BMI__");
3592
3593 if (HasBMI2)
3594 Builder.defineMacro("__BMI2__");
3595
Craig Topper1de83482011-12-29 16:10:46 +00003596 if (HasPOPCNT)
3597 Builder.defineMacro("__POPCNT__");
3598
Michael Liao625a8752012-11-10 05:17:46 +00003599 if (HasRTM)
3600 Builder.defineMacro("__RTM__");
3601
Michael Liao74f4eaf2013-03-26 17:52:08 +00003602 if (HasPRFCHW)
3603 Builder.defineMacro("__PRFCHW__");
3604
Michael Liaoffaae352013-03-29 05:17:55 +00003605 if (HasRDSEED)
3606 Builder.defineMacro("__RDSEED__");
3607
Robert Khasanov50e6f582014-09-19 09:53:48 +00003608 if (HasADX)
3609 Builder.defineMacro("__ADX__");
3610
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003611 if (HasTBM)
3612 Builder.defineMacro("__TBM__");
3613
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003614 if (HasMWAITX)
3615 Builder.defineMacro("__MWAITX__");
3616
Rafael Espindolae62e2792013-08-20 13:44:29 +00003617 switch (XOPLevel) {
3618 case XOP:
3619 Builder.defineMacro("__XOP__");
3620 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00003621 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00003622 case SSE4A:
3623 Builder.defineMacro("__SSE4A__");
3624 case NoXOP:
3625 break;
3626 }
Craig Topperffdb46c2011-12-30 07:33:42 +00003627
Craig Topperbba778b2012-06-03 21:46:30 +00003628 if (HasFMA)
3629 Builder.defineMacro("__FMA__");
3630
Manman Rena45358c2012-10-11 00:59:55 +00003631 if (HasF16C)
3632 Builder.defineMacro("__F16C__");
3633
Craig Topper679b53a2013-08-21 05:29:10 +00003634 if (HasAVX512CD)
3635 Builder.defineMacro("__AVX512CD__");
3636 if (HasAVX512ER)
3637 Builder.defineMacro("__AVX512ER__");
3638 if (HasAVX512PF)
3639 Builder.defineMacro("__AVX512PF__");
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003640 if (HasAVX512DQ)
3641 Builder.defineMacro("__AVX512DQ__");
3642 if (HasAVX512BW)
3643 Builder.defineMacro("__AVX512BW__");
3644 if (HasAVX512VL)
3645 Builder.defineMacro("__AVX512VL__");
Craig Topperb4f83a02016-02-29 06:51:38 +00003646 if (HasAVX512VBMI)
3647 Builder.defineMacro("__AVX512VBMI__");
3648 if (HasAVX512IFMA)
3649 Builder.defineMacro("__AVX512IFMA__");
Craig Topper679b53a2013-08-21 05:29:10 +00003650
Ben Langmuir58078d02013-09-19 13:22:04 +00003651 if (HasSHA)
3652 Builder.defineMacro("__SHA__");
3653
Craig Toppere33f51f2015-10-16 06:22:36 +00003654 if (HasFXSR)
3655 Builder.defineMacro("__FXSR__");
Craig Topperda9fe562015-10-15 05:23:38 +00003656 if (HasXSAVE)
3657 Builder.defineMacro("__XSAVE__");
3658 if (HasXSAVEOPT)
3659 Builder.defineMacro("__XSAVEOPT__");
3660 if (HasXSAVEC)
3661 Builder.defineMacro("__XSAVEC__");
3662 if (HasXSAVES)
3663 Builder.defineMacro("__XSAVES__");
Asaf Badouha9d1e182015-12-31 14:14:07 +00003664 if (HasPKU)
3665 Builder.defineMacro("__PKU__");
Nick Lewycky50e8f482013-10-05 20:14:27 +00003666 if (HasCX16)
3667 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
3668
Chris Lattner96e43572009-03-02 22:40:39 +00003669 // Each case falls through to the previous one here.
3670 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003671 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00003672 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00003673 case AVX2:
3674 Builder.defineMacro("__AVX2__");
3675 case AVX:
3676 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00003677 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003678 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00003679 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003680 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00003681 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003682 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003683 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003684 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003685 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003686 Builder.defineMacro("__SSE2__");
3687 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00003688 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003689 Builder.defineMacro("__SSE__");
3690 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00003691 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00003692 break;
3693 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003694
Derek Schuffc7dd7222012-10-11 15:52:22 +00003695 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003696 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003697 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00003698 case AVX2:
3699 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003700 case SSE42:
3701 case SSE41:
3702 case SSSE3:
3703 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003704 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003705 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003706 break;
3707 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003708 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003709 break;
3710 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003711 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003712 }
3713 }
3714
Anders Carlssone437c682010-01-27 03:47:49 +00003715 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00003716 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00003717 case AMD3DNowAthlon:
3718 Builder.defineMacro("__3dNOW_A__");
3719 case AMD3DNow:
3720 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00003721 case MMX:
3722 Builder.defineMacro("__MMX__");
3723 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00003724 break;
3725 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00003726
3727 if (CPU >= CK_i486) {
3728 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
3729 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
3730 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
3731 }
3732 if (CPU >= CK_i586)
3733 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00003734}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003735
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003736bool X86TargetInfo::hasFeature(StringRef Feature) const {
3737 return llvm::StringSwitch<bool>(Feature)
3738 .Case("aes", HasAES)
3739 .Case("avx", SSELevel >= AVX)
3740 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00003741 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00003742 .Case("avx512cd", HasAVX512CD)
3743 .Case("avx512er", HasAVX512ER)
3744 .Case("avx512pf", HasAVX512PF)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003745 .Case("avx512dq", HasAVX512DQ)
3746 .Case("avx512bw", HasAVX512BW)
3747 .Case("avx512vl", HasAVX512VL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003748 .Case("avx512vbmi", HasAVX512VBMI)
3749 .Case("avx512ifma", HasAVX512IFMA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003750 .Case("bmi", HasBMI)
3751 .Case("bmi2", HasBMI2)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003752 .Case("clflushopt", HasCLFLUSHOPT)
3753 .Case("clwb", HasCLWB)
Nick Lewycky50e8f482013-10-05 20:14:27 +00003754 .Case("cx16", HasCX16)
3755 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00003756 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003757 .Case("fma4", XOPLevel >= FMA4)
Craig Topper8c7f2512014-11-03 06:51:41 +00003758 .Case("fsgsbase", HasFSGSBASE)
Craig Toppere33f51f2015-10-16 06:22:36 +00003759 .Case("fxsr", HasFXSR)
Craig Topper8dbc5842014-11-03 07:05:26 +00003760 .Case("lzcnt", HasLZCNT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003761 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
3762 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
3763 .Case("mmx", MMX3DNowLevel >= MMX)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003764 .Case("movbe", HasMOVBE)
3765 .Case("mpx", HasMPX)
Craig Topper3f122a72012-05-31 05:18:48 +00003766 .Case("pclmul", HasPCLMUL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003767 .Case("pcommit", HasPCOMMIT)
3768 .Case("pku", HasPKU)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003769 .Case("popcnt", HasPOPCNT)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003770 .Case("prefetchwt1", HasPREFETCHWT1)
Michael Liao74f4eaf2013-03-26 17:52:08 +00003771 .Case("prfchw", HasPRFCHW)
Craig Topper8dbc5842014-11-03 07:05:26 +00003772 .Case("rdrnd", HasRDRND)
Michael Liaoffaae352013-03-29 05:17:55 +00003773 .Case("rdseed", HasRDSEED)
Craig Topper8dbc5842014-11-03 07:05:26 +00003774 .Case("rtm", HasRTM)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003775 .Case("sgx", HasSGX)
Ben Langmuir58078d02013-09-19 13:22:04 +00003776 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003777 .Case("sse", SSELevel >= SSE1)
3778 .Case("sse2", SSELevel >= SSE2)
3779 .Case("sse3", SSELevel >= SSE3)
3780 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00003781 .Case("sse4.1", SSELevel >= SSE41)
3782 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003783 .Case("sse4a", XOPLevel >= SSE4A)
Craig Topper8dbc5842014-11-03 07:05:26 +00003784 .Case("tbm", HasTBM)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003785 .Case("umip", HasUMIP)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003786 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00003787 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
3788 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003789 .Case("xop", XOPLevel >= XOP)
Craig Topperda9fe562015-10-15 05:23:38 +00003790 .Case("xsave", HasXSAVE)
3791 .Case("xsavec", HasXSAVEC)
3792 .Case("xsaves", HasXSAVES)
3793 .Case("xsaveopt", HasXSAVEOPT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003794 .Default(false);
3795}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003796
Eric Christopherd9832702015-06-29 21:00:05 +00003797// We can't use a generic validation scheme for the features accepted here
3798// versus subtarget features accepted in the target attribute because the
3799// bitfield structure that's initialized in the runtime only supports the
3800// below currently rather than the full range of subtarget features. (See
3801// X86TargetInfo::hasFeature for a somewhat comprehensive list).
3802bool X86TargetInfo::validateCpuSupports(StringRef FeatureStr) const {
3803 return llvm::StringSwitch<bool>(FeatureStr)
3804 .Case("cmov", true)
3805 .Case("mmx", true)
3806 .Case("popcnt", true)
3807 .Case("sse", true)
3808 .Case("sse2", true)
3809 .Case("sse3", true)
Benjamin Kramerf4c520d2016-05-20 15:21:08 +00003810 .Case("ssse3", true)
Eric Christopherd9832702015-06-29 21:00:05 +00003811 .Case("sse4.1", true)
3812 .Case("sse4.2", true)
3813 .Case("avx", true)
3814 .Case("avx2", true)
3815 .Case("sse4a", true)
3816 .Case("fma4", true)
3817 .Case("xop", true)
3818 .Case("fma", true)
3819 .Case("avx512f", true)
3820 .Case("bmi", true)
3821 .Case("bmi2", true)
Benjamin Kramerf4c520d2016-05-20 15:21:08 +00003822 .Case("aes", true)
3823 .Case("pclmul", true)
3824 .Case("avx512vl", true)
3825 .Case("avx512bw", true)
3826 .Case("avx512dq", true)
3827 .Case("avx512cd", true)
3828 .Case("avx512er", true)
3829 .Case("avx512pf", true)
3830 .Case("avx512vbmi", true)
3831 .Case("avx512ifma", true)
Eric Christopherd9832702015-06-29 21:00:05 +00003832 .Default(false);
3833}
3834
Eli Friedman3fd920a2008-08-20 02:34:37 +00003835bool
Anders Carlsson58436352009-02-28 17:11:49 +00003836X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00003837 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00003838 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003839 default: return false;
Alexey Bataev91e58602015-07-20 12:08:00 +00003840 // Constant constraints.
3841 case 'e': // 32-bit signed integer constant for use with sign-extending x86_64
3842 // instructions.
3843 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
3844 // x86_64 instructions.
3845 case 's':
3846 Info.setRequiresImmediate();
3847 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003848 case 'I':
3849 Info.setRequiresImmediate(0, 31);
3850 return true;
3851 case 'J':
3852 Info.setRequiresImmediate(0, 63);
3853 return true;
3854 case 'K':
3855 Info.setRequiresImmediate(-128, 127);
3856 return true;
3857 case 'L':
Alexey Bataev91e58602015-07-20 12:08:00 +00003858 Info.setRequiresImmediate({ int(0xff), int(0xffff), int(0xffffffff) });
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003859 return true;
3860 case 'M':
3861 Info.setRequiresImmediate(0, 3);
3862 return true;
3863 case 'N':
3864 Info.setRequiresImmediate(0, 255);
3865 return true;
3866 case 'O':
3867 Info.setRequiresImmediate(0, 127);
3868 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003869 // Register constraints.
3870 case 'Y': // 'Y' is the first character for several 2-character constraints.
3871 // Shift the pointer to the second character of the constraint.
3872 Name++;
3873 switch (*Name) {
3874 default:
3875 return false;
3876 case '0': // First SSE register.
3877 case 't': // Any SSE register, when SSE2 is enabled.
3878 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
3879 case 'm': // Any MMX register, when inter-unit moves enabled.
3880 Info.setAllowsRegister();
3881 return true;
3882 }
3883 case 'f': // Any x87 floating point stack register.
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003884 // Constraint 'f' cannot be used for output operands.
3885 if (Info.ConstraintStr[0] == '=')
3886 return false;
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003887 Info.setAllowsRegister();
3888 return true;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003889 case 'a': // eax.
3890 case 'b': // ebx.
3891 case 'c': // ecx.
3892 case 'd': // edx.
3893 case 'S': // esi.
3894 case 'D': // edi.
3895 case 'A': // edx:eax.
Alexey Bataev91e58602015-07-20 12:08:00 +00003896 case 't': // Top of floating point stack.
3897 case 'u': // Second from top of floating point stack.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003898 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00003899 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00003900 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003901 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00003902 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
3903 case 'l': // "Index" registers: any general register that can be used as an
3904 // index in a base+index memory access.
3905 Info.setAllowsRegister();
3906 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003907 // Floating point constant constraints.
Dale Johannesen46742a42010-08-24 22:33:12 +00003908 case 'C': // SSE floating point constant.
3909 case 'G': // x87 floating point constant.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003910 return true;
3911 }
3912}
3913
Akira Hatanaka974131e2014-09-18 18:17:18 +00003914bool X86TargetInfo::validateOutputSize(StringRef Constraint,
3915 unsigned Size) const {
3916 // Strip off constraint modifiers.
3917 while (Constraint[0] == '=' ||
3918 Constraint[0] == '+' ||
3919 Constraint[0] == '&')
3920 Constraint = Constraint.substr(1);
3921
3922 return validateOperandSize(Constraint, Size);
3923}
3924
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003925bool X86TargetInfo::validateInputSize(StringRef Constraint,
3926 unsigned Size) const {
Akira Hatanaka974131e2014-09-18 18:17:18 +00003927 return validateOperandSize(Constraint, Size);
3928}
3929
3930bool X86TargetInfo::validateOperandSize(StringRef Constraint,
3931 unsigned Size) const {
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003932 switch (Constraint[0]) {
3933 default: break;
3934 case 'y':
3935 return Size <= 64;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003936 case 'f':
3937 case 't':
3938 case 'u':
3939 return Size <= 128;
Hans Wennborg3c619a42014-09-18 20:24:04 +00003940 case 'x':
Alexey Bataev91e58602015-07-20 12:08:00 +00003941 if (SSELevel >= AVX512F)
3942 // 512-bit zmm registers can be used if target supports AVX512F.
3943 return Size <= 512U;
3944 else if (SSELevel >= AVX)
3945 // 256-bit ymm registers can be used if target supports AVX.
3946 return Size <= 256U;
3947 return Size <= 128U;
3948 case 'Y':
3949 // 'Y' is the first character for several 2-character constraints.
3950 switch (Constraint[1]) {
3951 default: break;
3952 case 'm':
3953 // 'Ym' is synonymous with 'y'.
3954 return Size <= 64;
3955 case 'i':
3956 case 't':
3957 // 'Yi' and 'Yt' are synonymous with 'x' when SSE2 is enabled.
3958 if (SSELevel >= AVX512F)
3959 return Size <= 512U;
3960 else if (SSELevel >= AVX)
3961 return Size <= 256U;
3962 return SSELevel >= SSE2 && Size <= 128U;
3963 }
3964
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003965 }
3966
3967 return true;
3968}
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00003969
Eli Friedman3fd920a2008-08-20 02:34:37 +00003970std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003971X86TargetInfo::convertConstraint(const char *&Constraint) const {
3972 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003973 case 'a': return std::string("{ax}");
3974 case 'b': return std::string("{bx}");
3975 case 'c': return std::string("{cx}");
3976 case 'd': return std::string("{dx}");
3977 case 'S': return std::string("{si}");
3978 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00003979 case 'p': // address
3980 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00003981 case 't': // top of floating point stack.
3982 return std::string("{st}");
3983 case 'u': // second from top of floating point stack.
3984 return std::string("{st(1)}"); // second from top of floating point stack.
3985 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003986 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00003987 }
3988}
Chris Lattner5ba61f02006-10-14 07:39:34 +00003989
Eli Friedman3fd920a2008-08-20 02:34:37 +00003990// X86-32 generic target
3991class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00003992public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00003993 X86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
3994 : X86TargetInfo(Triple, Opts) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003995 DoubleAlign = LongLongAlign = 32;
3996 LongDoubleWidth = 96;
3997 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00003998 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00003999 resetDataLayout("e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128");
Eli Friedman32ca82a2009-03-29 20:31:09 +00004000 SizeType = UnsignedInt;
4001 PtrDiffType = SignedInt;
4002 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00004003 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00004004
4005 // Use fpret for all types.
4006 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
4007 (1 << TargetInfo::Double) |
4008 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004009
4010 // x86-32 has atomics up to 8 bytes
4011 // FIXME: Check that we actually have cmpxchg8b before setting
4012 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
4013 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004014 }
Craig Topper3164f332014-03-11 03:39:26 +00004015 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004016 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004017 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004018
Craig Topper3164f332014-03-11 03:39:26 +00004019 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00004020 if (RegNo == 0) return 0;
4021 if (RegNo == 1) return 2;
4022 return -1;
4023 }
Akira Hatanaka974131e2014-09-18 18:17:18 +00004024 bool validateOperandSize(StringRef Constraint,
4025 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00004026 switch (Constraint[0]) {
4027 default: break;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004028 case 'R':
4029 case 'q':
4030 case 'Q':
Bill Wendling887b4852012-11-12 06:42:51 +00004031 case 'a':
4032 case 'b':
4033 case 'c':
4034 case 'd':
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004035 case 'S':
4036 case 'D':
Bill Wendling3c7fed82012-11-12 18:52:32 +00004037 return Size <= 32;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004038 case 'A':
4039 return Size <= 64;
Bill Wendling887b4852012-11-12 06:42:51 +00004040 }
4041
Akira Hatanaka974131e2014-09-18 18:17:18 +00004042 return X86TargetInfo::validateOperandSize(Constraint, Size);
Bill Wendling887b4852012-11-12 06:42:51 +00004043 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004044};
Eli Friedman3fd920a2008-08-20 02:34:37 +00004045
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004046class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
4047public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004048 NetBSDI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4049 : NetBSDTargetInfo<X86_32TargetInfo>(Triple, Opts) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004050
Craig Topper3164f332014-03-11 03:39:26 +00004051 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00004052 unsigned Major, Minor, Micro;
4053 getTriple().getOSVersion(Major, Minor, Micro);
4054 // New NetBSD uses the default rounding mode.
4055 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
4056 return X86_32TargetInfo::getFloatEvalMethod();
4057 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004058 return 1;
4059 }
4060};
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004061
Eli Friedmane3aa4542009-07-05 18:47:56 +00004062class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
4063public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004064 OpenBSDI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4065 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00004066 SizeType = UnsignedLong;
4067 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004068 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00004069 }
4070};
Eli Friedmane3aa4542009-07-05 18:47:56 +00004071
Eli Friedman9fa28852012-08-08 23:57:20 +00004072class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
4073public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004074 BitrigI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4075 : BitrigTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman9fa28852012-08-08 23:57:20 +00004076 SizeType = UnsignedLong;
4077 IntPtrType = SignedLong;
4078 PtrDiffType = SignedLong;
4079 }
4080};
Eli Friedman9fa28852012-08-08 23:57:20 +00004081
Torok Edwinb2b37c62009-06-30 17:10:35 +00004082class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004083public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004084 DarwinI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4085 : DarwinTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004086 LongDoubleWidth = 128;
4087 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004088 SuitableAlign = 128;
Tim Northover5627d392015-10-30 16:30:45 +00004089 MaxVectorAlign = 256;
4090 // The watchOS simulator uses the builtin bool type for Objective-C.
4091 llvm::Triple T = llvm::Triple(Triple);
4092 if (T.isWatchOS())
4093 UseSignedCharForObjCBool = false;
Eli Friedman32ca82a2009-03-29 20:31:09 +00004094 SizeType = UnsignedLong;
4095 IntPtrType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00004096 resetDataLayout("e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128");
Daniel Dunbarbd606522010-05-27 00:35:16 +00004097 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00004098 }
4099
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004100 bool handleTargetFeatures(std::vector<std::string> &Features,
4101 DiagnosticsEngine &Diags) override {
4102 if (!DarwinTargetInfo<X86_32TargetInfo>::handleTargetFeatures(Features,
4103 Diags))
4104 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004105 // We now know the features we have: we can decide how to align vectors.
4106 MaxVectorAlign =
4107 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004108 return true;
4109 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004110};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004111
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004112// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004113class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004114public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004115 WindowsX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4116 : WindowsTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Chris Lattner46be2e12009-06-24 17:12:15 +00004117 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00004118 DoubleAlign = LongLongAlign = 64;
Reid Kleckner7510c092015-04-01 16:45:06 +00004119 bool IsWinCOFF =
4120 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
James Y Knightb214cbc2016-03-04 19:00:41 +00004121 resetDataLayout(IsWinCOFF
4122 ? "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
4123 : "e-m:e-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32");
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004124 }
Craig Topper3164f332014-03-11 03:39:26 +00004125 void getTargetDefines(const LangOptions &Opts,
4126 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004127 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
4128 }
4129};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004130
4131// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004132class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004133public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004134 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple,
4135 const TargetOptions &Opts)
4136 : WindowsX86_32TargetInfo(Triple, Opts) {
Eli Friedman015d6282011-03-22 21:25:11 +00004137 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004138 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
4139 }
Craig Topper3164f332014-03-11 03:39:26 +00004140 void getTargetDefines(const LangOptions &Opts,
4141 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004142 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
4143 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
4144 // The value of the following reflects processor type.
4145 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
4146 // We lost the original triple, so we use the default.
4147 Builder.defineMacro("_M_IX86", "600");
4148 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004149};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004150
David Majnemerae1ed0e2015-05-28 04:36:18 +00004151static void addCygMingDefines(const LangOptions &Opts, MacroBuilder &Builder) {
Eric Christopherb093d692015-10-09 18:39:59 +00004152 // Mingw and cygwin define __declspec(a) to __attribute__((a)). Clang
4153 // supports __declspec natively under -fms-extensions, but we define a no-op
4154 // __declspec macro anyway for pre-processor compatibility.
Reid Kleckner47606832014-04-21 20:58:00 +00004155 if (Opts.MicrosoftExt)
4156 Builder.defineMacro("__declspec", "__declspec");
4157 else
4158 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
4159
4160 if (!Opts.MicrosoftExt) {
4161 // Provide macros for all the calling convention keywords. Provide both
4162 // single and double underscore prefixed variants. These are available on
4163 // x64 as well as x86, even though they have no effect.
4164 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
4165 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00004166 std::string GCCSpelling = "__attribute__((__";
4167 GCCSpelling += CC;
4168 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00004169 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
4170 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
4171 }
4172 }
4173}
4174
David Majnemerae1ed0e2015-05-28 04:36:18 +00004175static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
4176 Builder.defineMacro("__MSVCRT__");
4177 Builder.defineMacro("__MINGW32__");
4178 addCygMingDefines(Opts, Builder);
4179}
4180
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004181// x86-32 MinGW target
4182class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
4183public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004184 MinGWX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4185 : WindowsX86_32TargetInfo(Triple, Opts) {}
Craig Topper3164f332014-03-11 03:39:26 +00004186 void getTargetDefines(const LangOptions &Opts,
4187 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004188 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004189 DefineStd(Builder, "WIN32", Opts);
4190 DefineStd(Builder, "WINNT", Opts);
4191 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00004192 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004193 }
4194};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004195
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004196// x86-32 Cygwin target
4197class CygwinX86_32TargetInfo : public X86_32TargetInfo {
4198public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004199 CygwinX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4200 : X86_32TargetInfo(Triple, Opts) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004201 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004202 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00004203 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 +00004204 }
Craig Topper3164f332014-03-11 03:39:26 +00004205 void getTargetDefines(const LangOptions &Opts,
4206 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004207 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00004208 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004209 Builder.defineMacro("__CYGWIN__");
4210 Builder.defineMacro("__CYGWIN32__");
David Majnemerae1ed0e2015-05-28 04:36:18 +00004211 addCygMingDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004212 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00004213 if (Opts.CPlusPlus)
4214 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00004215 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004216};
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004217
Chris Lattnerb986aba2010-04-11 19:29:39 +00004218// x86-32 Haiku target
Reid Kleckner330fb172016-05-11 16:19:05 +00004219class HaikuX86_32TargetInfo : public HaikuTargetInfo<X86_32TargetInfo> {
Chris Lattnerb986aba2010-04-11 19:29:39 +00004220public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004221 HaikuX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Reid Kleckner330fb172016-05-11 16:19:05 +00004222 : HaikuTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman04831922010-08-22 01:00:03 +00004223 }
Craig Topper3164f332014-03-11 03:39:26 +00004224 void getTargetDefines(const LangOptions &Opts,
4225 MacroBuilder &Builder) const override {
Reid Kleckner330fb172016-05-11 16:19:05 +00004226 HaikuTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
Chris Lattnerb986aba2010-04-11 19:29:39 +00004227 Builder.defineMacro("__INTEL__");
Chris Lattnerb986aba2010-04-11 19:29:39 +00004228 }
4229};
Chris Lattnerb986aba2010-04-11 19:29:39 +00004230
Alexey Bataevc99b0492015-11-25 09:24:26 +00004231// X86-32 MCU target
4232class MCUX86_32TargetInfo : public X86_32TargetInfo {
4233public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004234 MCUX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4235 : X86_32TargetInfo(Triple, Opts) {
Alexey Bataevc99b0492015-11-25 09:24:26 +00004236 LongDoubleWidth = 64;
4237 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
James Y Knightb214cbc2016-03-04 19:00:41 +00004238 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 +00004239 WIntType = UnsignedInt;
Alexey Bataevc99b0492015-11-25 09:24:26 +00004240 }
4241
4242 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
4243 // On MCU we support only C calling convention.
4244 return CC == CC_C ? CCCR_OK : CCCR_Warning;
4245 }
4246
4247 void getTargetDefines(const LangOptions &Opts,
4248 MacroBuilder &Builder) const override {
4249 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4250 Builder.defineMacro("__iamcu");
4251 Builder.defineMacro("__iamcu__");
4252 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00004253
4254 bool allowsLargerPreferedTypeAlignment() const override {
4255 return false;
4256 }
Alexey Bataevc99b0492015-11-25 09:24:26 +00004257};
4258
Douglas Gregor9fabd852011-07-01 22:41:14 +00004259// RTEMS Target
4260template<typename Target>
4261class RTEMSTargetInfo : public OSTargetInfo<Target> {
4262protected:
Craig Topper3164f332014-03-11 03:39:26 +00004263 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4264 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004265 // RTEMS defines; list based off of gcc output
4266
Douglas Gregor9fabd852011-07-01 22:41:14 +00004267 Builder.defineMacro("__rtems__");
4268 Builder.defineMacro("__ELF__");
4269 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004270
Douglas Gregor9fabd852011-07-01 22:41:14 +00004271public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004272 RTEMSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4273 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004274 switch (Triple.getArch()) {
4275 default:
4276 case llvm::Triple::x86:
4277 // this->MCountName = ".mcount";
4278 break;
4279 case llvm::Triple::mips:
4280 case llvm::Triple::mipsel:
4281 case llvm::Triple::ppc:
4282 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00004283 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004284 // this->MCountName = "_mcount";
4285 break;
4286 case llvm::Triple::arm:
4287 // this->MCountName = "__mcount";
4288 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004289 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004290 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00004291};
4292
Douglas Gregor9fabd852011-07-01 22:41:14 +00004293// x86-32 RTEMS target
4294class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
4295public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004296 RTEMSX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4297 : X86_32TargetInfo(Triple, Opts) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004298 SizeType = UnsignedLong;
4299 IntPtrType = SignedLong;
4300 PtrDiffType = SignedLong;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004301 }
Craig Topper3164f332014-03-11 03:39:26 +00004302 void getTargetDefines(const LangOptions &Opts,
4303 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004304 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4305 Builder.defineMacro("__INTEL__");
4306 Builder.defineMacro("__rtems__");
4307 }
4308};
Douglas Gregor9fabd852011-07-01 22:41:14 +00004309
Eli Friedman3fd920a2008-08-20 02:34:37 +00004310// x86-64 generic target
4311class X86_64TargetInfo : public X86TargetInfo {
4312public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004313 X86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4314 : X86TargetInfo(Triple, Opts) {
David Blaikie40f842d2014-07-10 18:46:15 +00004315 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
David Majnemer8fa8c382015-03-17 23:55:00 +00004316 bool IsWinCOFF =
4317 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Zinovy Nis1db95732014-07-10 15:27:19 +00004318 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00004319 LongDoubleWidth = 128;
4320 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00004321 LargeArrayMinWidth = 128;
4322 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004323 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00004324 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
4325 PtrDiffType = IsX32 ? SignedInt : SignedLong;
4326 IntPtrType = IsX32 ? SignedInt : SignedLong;
4327 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00004328 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00004329 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00004330
Eric Christopher917e9522014-11-18 22:36:15 +00004331 // Pointers are 32-bit in x32.
James Y Knightb214cbc2016-03-04 19:00:41 +00004332 resetDataLayout(IsX32
4333 ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128"
4334 : IsWinCOFF ? "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
4335 : "e-m:e-i64:64-f80:128-n8:16:32:64-S128");
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00004336
4337 // Use fpret only for long double.
4338 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004339
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00004340 // Use fp2ret for _Complex long double.
4341 ComplexLongDoubleUsesFP2Ret = true;
4342
Charles Davisc7d5c942015-09-17 20:55:33 +00004343 // Make __builtin_ms_va_list available.
4344 HasBuiltinMSVaList = true;
4345
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004346 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004347 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00004348 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00004349 }
Craig Topper3164f332014-03-11 03:39:26 +00004350 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004351 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00004352 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004353
Craig Topper3164f332014-03-11 03:39:26 +00004354 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00004355 if (RegNo == 0) return 0;
4356 if (RegNo == 1) return 1;
4357 return -1;
4358 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004359
Craig Topper3164f332014-03-11 03:39:26 +00004360 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00004361 switch (CC) {
4362 case CC_C:
4363 case CC_Swift:
4364 case CC_X86VectorCall:
4365 case CC_IntelOclBicc:
4366 case CC_X86_64Win64:
Roman Levenstein35aa5ce2016-03-16 18:00:46 +00004367 case CC_PreserveMost:
4368 case CC_PreserveAll:
John McCall477f2bb2016-03-03 06:39:32 +00004369 return CCCR_OK;
4370 default:
4371 return CCCR_Warning;
4372 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004373 }
4374
Craig Topper3164f332014-03-11 03:39:26 +00004375 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00004376 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004377 }
4378
Pavel Chupinfd223e12014-08-04 12:39:43 +00004379 // for x32 we need it here explicitly
4380 bool hasInt128Type() const override { return true; }
Reid Klecknerf27e7522016-02-01 18:58:24 +00004381 unsigned getUnwindWordWidth() const override { return 64; }
4382 unsigned getRegisterWidth() const override { return 64; }
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00004383
4384 bool validateGlobalRegisterVariable(StringRef RegName,
4385 unsigned RegSize,
4386 bool &HasSizeMismatch) const override {
4387 // rsp and rbp are the only 64-bit registers the x86 backend can currently
4388 // handle.
4389 if (RegName.equals("rsp") || RegName.equals("rbp")) {
4390 // Check that the register size is 64-bit.
4391 HasSizeMismatch = RegSize != 64;
4392 return true;
4393 }
4394
4395 // Check if the register is a 32-bit register the backend can handle.
4396 return X86TargetInfo::validateGlobalRegisterVariable(RegName, RegSize,
4397 HasSizeMismatch);
4398 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004399};
Eli Friedman3fd920a2008-08-20 02:34:37 +00004400
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004401// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004402class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004403public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004404 WindowsX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4405 : WindowsTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004406 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00004407 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004408 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004409 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004410 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00004411 SizeType = UnsignedLongLong;
4412 PtrDiffType = SignedLongLong;
4413 IntPtrType = SignedLongLong;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004414 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004415
Craig Topper3164f332014-03-11 03:39:26 +00004416 void getTargetDefines(const LangOptions &Opts,
4417 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004418 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004419 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004420 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004421
Craig Topper3164f332014-03-11 03:39:26 +00004422 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004423 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00004424 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004425
Craig Topper3164f332014-03-11 03:39:26 +00004426 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004427 switch (CC) {
4428 case CC_X86StdCall:
4429 case CC_X86ThisCall:
4430 case CC_X86FastCall:
4431 return CCCR_Ignore;
4432 case CC_C:
4433 case CC_X86VectorCall:
4434 case CC_IntelOclBicc:
4435 case CC_X86_64SysV:
4436 return CCCR_OK;
4437 default:
4438 return CCCR_Warning;
4439 }
Charles Davisb5a214e2013-08-30 04:39:01 +00004440 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004441};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004442
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004443// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004444class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004445public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004446 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple,
4447 const TargetOptions &Opts)
4448 : WindowsX86_64TargetInfo(Triple, Opts) {
Eli Friedman015d6282011-03-22 21:25:11 +00004449 LongDoubleWidth = LongDoubleAlign = 64;
4450 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004451 }
Craig Topper3164f332014-03-11 03:39:26 +00004452 void getTargetDefines(const LangOptions &Opts,
4453 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004454 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
4455 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
David Majnemerb856e8f2015-07-26 23:17:29 +00004456 Builder.defineMacro("_M_X64", "100");
4457 Builder.defineMacro("_M_AMD64", "100");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004458 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004459};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004460
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004461// x86-64 MinGW target
4462class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
4463public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004464 MinGWX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4465 : WindowsX86_64TargetInfo(Triple, Opts) {
Reid Kleckner11a17192015-10-28 22:29:52 +00004466 // Mingw64 rounds long double size and alignment up to 16 bytes, but sticks
4467 // with x86 FP ops. Weird.
4468 LongDoubleWidth = LongDoubleAlign = 128;
4469 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
4470 }
4471
Craig Topper3164f332014-03-11 03:39:26 +00004472 void getTargetDefines(const LangOptions &Opts,
4473 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004474 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004475 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004476 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00004477 addMinGWDefines(Opts, Builder);
Reid Klecknere070b992014-11-14 02:01:10 +00004478
4479 // GCC defines this macro when it is using __gxx_personality_seh0.
4480 if (!Opts.SjLjExceptions)
4481 Builder.defineMacro("__SEH__");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004482 }
4483};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004484
Yaron Kerend030d112015-07-22 17:38:19 +00004485// x86-64 Cygwin target
4486class CygwinX86_64TargetInfo : public X86_64TargetInfo {
4487public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004488 CygwinX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4489 : X86_64TargetInfo(Triple, Opts) {
Yaron Kerend030d112015-07-22 17:38:19 +00004490 TLSSupported = false;
4491 WCharType = UnsignedShort;
4492 }
4493 void getTargetDefines(const LangOptions &Opts,
4494 MacroBuilder &Builder) const override {
4495 X86_64TargetInfo::getTargetDefines(Opts, Builder);
4496 Builder.defineMacro("__x86_64__");
4497 Builder.defineMacro("__CYGWIN__");
4498 Builder.defineMacro("__CYGWIN64__");
4499 addCygMingDefines(Opts, Builder);
4500 DefineStd(Builder, "unix", Opts);
4501 if (Opts.CPlusPlus)
4502 Builder.defineMacro("_GNU_SOURCE");
4503
4504 // GCC defines this macro when it is using __gxx_personality_seh0.
4505 if (!Opts.SjLjExceptions)
4506 Builder.defineMacro("__SEH__");
4507 }
4508};
4509
Eli Friedman2857ccb2009-07-01 03:36:11 +00004510class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
4511public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004512 DarwinX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4513 : DarwinTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00004514 Int64Type = SignedLongLong;
Tim Northovera2ee4332014-03-29 15:09:45 +00004515 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
4516 llvm::Triple T = llvm::Triple(Triple);
Bob Wilson946c04c2014-10-19 02:19:27 +00004517 if (T.isiOS())
Tim Northovera2ee4332014-03-29 15:09:45 +00004518 UseSignedCharForObjCBool = false;
James Y Knightb214cbc2016-03-04 19:00:41 +00004519 resetDataLayout("e-m:o-i64:64-f80:128-n8:16:32:64-S128");
Eli Friedman2857ccb2009-07-01 03:36:11 +00004520 }
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004521
4522 bool handleTargetFeatures(std::vector<std::string> &Features,
4523 DiagnosticsEngine &Diags) override {
4524 if (!DarwinTargetInfo<X86_64TargetInfo>::handleTargetFeatures(Features,
4525 Diags))
4526 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004527 // We now know the features we have: we can decide how to align vectors.
4528 MaxVectorAlign =
4529 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004530 return true;
4531 }
Eli Friedman2857ccb2009-07-01 03:36:11 +00004532};
Eli Friedman2857ccb2009-07-01 03:36:11 +00004533
Eli Friedman245f2292009-07-05 22:31:18 +00004534class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
4535public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004536 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4537 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Eli Friedman245f2292009-07-05 22:31:18 +00004538 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004539 Int64Type = SignedLongLong;
4540 }
4541};
Eli Friedman245f2292009-07-05 22:31:18 +00004542
Eli Friedman9fa28852012-08-08 23:57:20 +00004543class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
4544public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004545 BitrigX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4546 : BitrigTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004547 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004548 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00004549 }
4550};
Tim Northover9bb857a2013-01-31 12:13:10 +00004551
Eli Friedmanf05b7722008-08-20 07:44:10 +00004552class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004553 // Possible FPU choices.
4554 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004555 VFP2FPU = (1 << 0),
4556 VFP3FPU = (1 << 1),
4557 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00004558 NeonFPU = (1 << 3),
4559 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004560 };
4561
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004562 // Possible HWDiv features.
4563 enum HWDivMode {
4564 HWDivThumb = (1 << 0),
4565 HWDivARM = (1 << 1)
4566 };
4567
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004568 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004569 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004570 }
4571
4572 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4573 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004574
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004575 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004576
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004577 StringRef CPUProfile;
4578 StringRef CPUAttr;
4579
Rafael Espindolaeb265472013-08-21 21:59:03 +00004580 enum {
4581 FP_Default,
4582 FP_VFP,
4583 FP_Neon
4584 } FPMath;
4585
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004586 unsigned ArchISA;
Renato Goline84b0002015-10-08 16:43:26 +00004587 unsigned ArchKind = llvm::ARM::AK_ARMV4T;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004588 unsigned ArchProfile;
4589 unsigned ArchVersion;
4590
Bernard Ogdenda13af32013-10-24 18:32:51 +00004591 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004592
Logan Chien57086ce2012-10-10 06:56:20 +00004593 unsigned IsAAPCS : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004594 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004595
4596 // Initialized via features.
4597 unsigned SoftFloat : 1;
4598 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004599
Bernard Ogden18b57012013-10-29 09:47:51 +00004600 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00004601 unsigned Crypto : 1;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004602 unsigned DSP : 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004603 unsigned Unaligned : 1;
4604
4605 enum {
4606 LDREX_B = (1 << 0), /// byte (8-bit)
4607 LDREX_H = (1 << 1), /// half (16-bit)
4608 LDREX_W = (1 << 2), /// word (32-bit)
4609 LDREX_D = (1 << 3), /// double (64-bit)
4610 };
4611
4612 uint32_t LDREX;
Bernard Ogden18b57012013-10-29 09:47:51 +00004613
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004614 // ACLE 6.5.1 Hardware floating point
4615 enum {
4616 HW_FP_HP = (1 << 1), /// half (16-bit)
4617 HW_FP_SP = (1 << 2), /// single (32-bit)
4618 HW_FP_DP = (1 << 3), /// double (64-bit)
4619 };
4620 uint32_t HW_FP;
4621
Chris Lattner5cc15e02010-03-03 19:03:45 +00004622 static const Builtin::Info BuiltinInfo[];
4623
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004624 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004625 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004626
4627 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00004628 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004629
Renato Golin9ba39232015-02-27 16:35:48 +00004630 // size_t is unsigned long on MachO-derived environments, NetBSD and Bitrig.
4631 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD ||
4632 T.getOS() == llvm::Triple::Bitrig)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004633 SizeType = UnsignedLong;
4634 else
4635 SizeType = UnsignedInt;
4636
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004637 switch (T.getOS()) {
4638 case llvm::Triple::NetBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004639 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004640 break;
4641 case llvm::Triple::Win32:
4642 WCharType = UnsignedShort;
4643 break;
4644 case llvm::Triple::Linux:
4645 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004646 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
4647 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004648 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004649 }
4650
4651 UseBitFieldTypeAlignment = true;
4652
4653 ZeroLengthBitfieldBoundary = 0;
4654
Tim Northover147cd2f2014-10-14 22:12:21 +00004655 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
4656 // so set preferred for small types to 32.
4657 if (T.isOSBinFormatMachO()) {
James Y Knightb214cbc2016-03-04 19:00:41 +00004658 resetDataLayout(BigEndian
4659 ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4660 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Tim Northover147cd2f2014-10-14 22:12:21 +00004661 } else if (T.isOSWindows()) {
Tim Northover147cd2f2014-10-14 22:12:21 +00004662 assert(!BigEndian && "Windows on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004663 resetDataLayout("e"
4664 "-m:w"
4665 "-p:32:32"
4666 "-i64:64"
4667 "-v128:64:128"
4668 "-a:0:32"
4669 "-n32"
4670 "-S64");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00004671 } else if (T.isOSNaCl()) {
4672 assert(!BigEndian && "NaCl on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004673 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004674 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00004675 resetDataLayout(BigEndian
4676 ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4677 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004678 }
4679
4680 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004681 }
4682
Tim Northover5627d392015-10-30 16:30:45 +00004683 void setABIAPCS(bool IsAAPCS16) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00004684 const llvm::Triple &T = getTriple();
4685
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004686 IsAAPCS = false;
4687
Tim Northover5627d392015-10-30 16:30:45 +00004688 if (IsAAPCS16)
4689 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
4690 else
4691 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004692
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004693 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00004694 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004695 SizeType = UnsignedInt;
4696 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004697 SizeType = UnsignedLong;
4698
4699 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
4700 WCharType = SignedInt;
4701
4702 // Do not respect the alignment of bit-field types when laying out
4703 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
4704 UseBitFieldTypeAlignment = false;
4705
4706 /// gcc forces the alignment to 4 bytes, regardless of the type of the
4707 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
4708 /// gcc.
4709 ZeroLengthBitfieldBoundary = 32;
4710
Tim Northover5627d392015-10-30 16:30:45 +00004711 if (T.isOSBinFormatMachO() && IsAAPCS16) {
4712 assert(!BigEndian && "AAPCS16 does not support big-endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004713 resetDataLayout("e-m:o-p:32:32-i64:64-a:0:32-n32-S128");
Tim Northover5627d392015-10-30 16:30:45 +00004714 } else if (T.isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00004715 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00004716 BigEndian
4717 ? "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 +00004718 : "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 +00004719 else
James Y Knightb214cbc2016-03-04 19:00:41 +00004720 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00004721 BigEndian
4722 ? "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 +00004723 : "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 +00004724
4725 // FIXME: Override "preferred align" for double and long long.
4726 }
4727
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004728 void setArchInfo() {
4729 StringRef ArchName = getTriple().getArchName();
4730
Renato Goline84b0002015-10-08 16:43:26 +00004731 ArchISA = llvm::ARM::parseArchISA(ArchName);
4732 CPU = llvm::ARM::getDefaultCPU(ArchName);
4733 unsigned AK = llvm::ARM::parseArch(ArchName);
4734 if (AK != llvm::ARM::AK_INVALID)
4735 ArchKind = AK;
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004736 setArchInfo(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004737 }
4738
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004739 void setArchInfo(unsigned Kind) {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004740 StringRef SubArch;
4741
4742 // cache TargetParser info
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004743 ArchKind = Kind;
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00004744 SubArch = llvm::ARM::getSubArch(ArchKind);
4745 ArchProfile = llvm::ARM::parseArchProfile(SubArch);
4746 ArchVersion = llvm::ARM::parseArchVersion(SubArch);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004747
4748 // cache CPU related strings
4749 CPUAttr = getCPUAttr();
4750 CPUProfile = getCPUProfile();
4751 }
4752
4753 void setAtomic() {
Eric Christopherb093d692015-10-09 18:39:59 +00004754 // when triple does not specify a sub arch,
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004755 // then we are not using inline atomics
Renato Goline84b0002015-10-08 16:43:26 +00004756 bool ShouldUseInlineAtomic =
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004757 (ArchISA == llvm::ARM::IK_ARM && ArchVersion >= 6) ||
4758 (ArchISA == llvm::ARM::IK_THUMB && ArchVersion >= 7);
Eric Christopherb093d692015-10-09 18:39:59 +00004759 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004760 if (ArchProfile == llvm::ARM::PK_M) {
4761 MaxAtomicPromoteWidth = 32;
4762 if (ShouldUseInlineAtomic)
4763 MaxAtomicInlineWidth = 32;
4764 }
4765 else {
4766 MaxAtomicPromoteWidth = 64;
4767 if (ShouldUseInlineAtomic)
4768 MaxAtomicInlineWidth = 64;
Eric Christopherb093d692015-10-09 18:39:59 +00004769 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004770 }
4771
4772 bool isThumb() const {
4773 return (ArchISA == llvm::ARM::IK_THUMB);
4774 }
4775
4776 bool supportsThumb() const {
4777 return CPUAttr.count('T') || ArchVersion >= 6;
4778 }
4779
4780 bool supportsThumb2() const {
Bradley Smithf4affc12016-03-03 13:52:22 +00004781 return CPUAttr.equals("6T2") ||
4782 (ArchVersion >= 7 && !CPUAttr.equals("8M_BASE"));
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004783 }
4784
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004785 StringRef getCPUAttr() const {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004786 // For most sub-arches, the build attribute CPU name is enough.
4787 // For Cortex variants, it's slightly different.
4788 switch(ArchKind) {
4789 default:
Chandler Carruthd96f37a2015-08-30 07:51:18 +00004790 return llvm::ARM::getCPUAttr(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004791 case llvm::ARM::AK_ARMV6M:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004792 return "6M";
Tim Northover525c73c2015-07-21 21:47:33 +00004793 case llvm::ARM::AK_ARMV7S:
4794 return "7S";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004795 case llvm::ARM::AK_ARMV7A:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004796 return "7A";
4797 case llvm::ARM::AK_ARMV7R:
4798 return "7R";
4799 case llvm::ARM::AK_ARMV7M:
4800 return "7M";
4801 case llvm::ARM::AK_ARMV7EM:
4802 return "7EM";
4803 case llvm::ARM::AK_ARMV8A:
4804 return "8A";
4805 case llvm::ARM::AK_ARMV8_1A:
4806 return "8_1A";
Oliver Stannard3086c042016-02-11 16:05:52 +00004807 case llvm::ARM::AK_ARMV8_2A:
4808 return "8_2A";
Bradley Smithf4affc12016-03-03 13:52:22 +00004809 case llvm::ARM::AK_ARMV8MBaseline:
4810 return "8M_BASE";
4811 case llvm::ARM::AK_ARMV8MMainline:
4812 return "8M_MAIN";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004813 }
4814 }
4815
4816 StringRef getCPUProfile() const {
4817 switch(ArchProfile) {
4818 case llvm::ARM::PK_A:
4819 return "A";
4820 case llvm::ARM::PK_R:
4821 return "R";
4822 case llvm::ARM::PK_M:
4823 return "M";
4824 default:
4825 return "";
4826 }
4827 }
4828
Chris Lattner17df24e2008-04-21 18:56:49 +00004829public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004830 ARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts,
4831 bool IsBigEndian)
4832 : TargetInfo(Triple), FPMath(FP_Default), IsAAPCS(true), LDREX(0),
4833 HW_FP(0) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004834 BigEndian = IsBigEndian;
4835
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004836 switch (getTriple().getOS()) {
4837 case llvm::Triple::NetBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004838 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004839 break;
4840 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004841 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004842 break;
4843 }
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004844
Renato Goline84b0002015-10-08 16:43:26 +00004845 // Cache arch related info.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004846 setArchInfo();
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004847
Chris Lattner1a8f3942010-04-23 16:29:58 +00004848 // {} in inline assembly are neon specifiers, not assembly variant
4849 // specifiers.
4850 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004851
Eric Christopher0e261882014-12-05 01:06:59 +00004852 // FIXME: This duplicates code from the driver that sets the -target-abi
4853 // option - this code is used if -target-abi isn't passed and should
4854 // be unified in some way.
4855 if (Triple.isOSBinFormatMachO()) {
4856 // The backend is hardwired to assume AAPCS for M-class processors, ensure
4857 // the frontend matches that.
4858 if (Triple.getEnvironment() == llvm::Triple::EABI ||
4859 Triple.getOS() == llvm::Triple::UnknownOS ||
4860 StringRef(CPU).startswith("cortex-m")) {
4861 setABI("aapcs");
Tim Northoverd88ecb32016-01-27 19:32:40 +00004862 } else if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00004863 setABI("aapcs16");
Eric Christopher0e261882014-12-05 01:06:59 +00004864 } else {
4865 setABI("apcs-gnu");
4866 }
4867 } else if (Triple.isOSWindows()) {
4868 // FIXME: this is invalid for WindowsCE
4869 setABI("aapcs");
4870 } else {
4871 // Select the default based on the platform.
4872 switch (Triple.getEnvironment()) {
4873 case llvm::Triple::Android:
4874 case llvm::Triple::GNUEABI:
4875 case llvm::Triple::GNUEABIHF:
Rafael Espindola0fa66802016-06-24 21:35:06 +00004876 case llvm::Triple::MuslEABI:
4877 case llvm::Triple::MuslEABIHF:
Eric Christopher0e261882014-12-05 01:06:59 +00004878 setABI("aapcs-linux");
4879 break;
4880 case llvm::Triple::EABIHF:
4881 case llvm::Triple::EABI:
4882 setABI("aapcs");
4883 break;
Eric Christopher560cc4f2014-12-18 02:08:55 +00004884 case llvm::Triple::GNU:
Renato Goline84b0002015-10-08 16:43:26 +00004885 setABI("apcs-gnu");
4886 break;
Eric Christopher0e261882014-12-05 01:06:59 +00004887 default:
4888 if (Triple.getOS() == llvm::Triple::NetBSD)
4889 setABI("apcs-gnu");
4890 else
4891 setABI("aapcs");
4892 break;
4893 }
4894 }
John McCall86353412010-08-21 22:46:04 +00004895
4896 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00004897 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004898
Renato Golin15b86152015-07-03 16:41:13 +00004899 // ARM has atomics up to 8 bytes
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004900 setAtomic();
Rafael Espindola5ab8e2e2015-07-02 15:14:10 +00004901
James Molloya7139222012-03-12 09:14:10 +00004902 // Do force alignment of members that follow zero length bitfields. If
Eric Christopher917e9522014-11-18 22:36:15 +00004903 // the alignment of the zero-length bitfield is greater than the member
4904 // that follows it, `bar', `bar' will be aligned as the type of the
James Molloya7139222012-03-12 09:14:10 +00004905 // zero length bitfield.
4906 UseZeroLengthBitfieldAlignment = true;
Saleem Abdulrasool9b5ba542016-04-10 03:19:47 +00004907
4908 if (Triple.getOS() == llvm::Triple::Linux ||
4909 Triple.getOS() == llvm::Triple::UnknownOS)
4910 this->MCountName =
4911 Opts.EABIVersion == "gnu" ? "\01__gnu_mcount_nc" : "\01mcount";
Eli Friedmanb5366062008-05-20 14:21:01 +00004912 }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00004913
Alp Toker4925ba72014-06-07 23:30:42 +00004914 StringRef getABI() const override { return ABI; }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00004915
Craig Topper3164f332014-03-11 03:39:26 +00004916 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004917 ABI = Name;
4918
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004919 // The defaults (above) are for AAPCS, check if we need to change them.
4920 //
4921 // FIXME: We need support for -meabi... we could just mangle it into the
4922 // name.
Tim Northover756447a2015-10-30 16:30:36 +00004923 if (Name == "apcs-gnu" || Name == "aapcs16") {
Tim Northover5627d392015-10-30 16:30:45 +00004924 setABIAPCS(Name == "aapcs16");
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004925 return true;
4926 }
4927 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
4928 setABIAAPCS();
4929 return true;
4930 }
4931 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004932 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004933
Renato Golinf5c4dec2015-05-27 13:33:00 +00004934 // FIXME: This should be based on Arch attributes, not CPU names.
Eric Christopher8c47b422015-10-09 18:39:55 +00004935 bool
4936 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
4937 StringRef CPU,
4938 const std::vector<std::string> &FeaturesVec) const override {
4939
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004940 std::vector<const char*> TargetFeatures;
Bradley Smithb3501962015-11-16 11:16:36 +00004941 unsigned Arch = llvm::ARM::parseArch(getTriple().getArchName());
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004942
4943 // get default FPU features
Bradley Smithb3501962015-11-16 11:16:36 +00004944 unsigned FPUKind = llvm::ARM::getDefaultFPU(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004945 llvm::ARM::getFPUFeatures(FPUKind, TargetFeatures);
4946
4947 // get default Extension features
Bradley Smithb3501962015-11-16 11:16:36 +00004948 unsigned Extensions = llvm::ARM::getDefaultExtensions(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004949 llvm::ARM::getExtensionFeatures(Extensions, TargetFeatures);
4950
4951 for (const char *Feature : TargetFeatures)
4952 if (Feature[0] == '+')
Eric Christopherb093d692015-10-09 18:39:59 +00004953 Features[Feature+1] = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004954
Eric Christopher007b0a02015-08-28 22:32:01 +00004955 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004956 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004957
Craig Topper3164f332014-03-11 03:39:26 +00004958 bool handleTargetFeatures(std::vector<std::string> &Features,
4959 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004960 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00004961 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00004962 Crypto = 0;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004963 DSP = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004964 Unaligned = 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004965 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004966 HWDiv = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004967
Ranjeet Singhac08e532015-06-24 23:39:25 +00004968 // This does not diagnose illegal cases like having both
4969 // "+vfpv2" and "+vfpv3" or having "+neon" and "+fp-only-sp".
4970 uint32_t HW_FP_remove = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004971 for (const auto &Feature : Features) {
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004972 if (Feature == "+soft-float") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004973 SoftFloat = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004974 } else if (Feature == "+soft-float-abi") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004975 SoftFloatABI = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004976 } else if (Feature == "+vfp2") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004977 FPU |= VFP2FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004978 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004979 } else if (Feature == "+vfp3") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004980 FPU |= VFP3FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004981 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004982 } else if (Feature == "+vfp4") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004983 FPU |= VFP4FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004984 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004985 } else if (Feature == "+fp-armv8") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004986 FPU |= FPARMV8;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004987 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004988 } else if (Feature == "+neon") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004989 FPU |= NeonFPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004990 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004991 } else if (Feature == "+hwdiv") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004992 HWDiv |= HWDivThumb;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004993 } else if (Feature == "+hwdiv-arm") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004994 HWDiv |= HWDivARM;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004995 } else if (Feature == "+crc") {
Bernard Ogden18b57012013-10-29 09:47:51 +00004996 CRC = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004997 } else if (Feature == "+crypto") {
Tim Northover02e38602014-02-03 17:28:04 +00004998 Crypto = 1;
Artyom Skrobov05d85ae2015-10-23 17:19:02 +00004999 } else if (Feature == "+dsp") {
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005000 DSP = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005001 } else if (Feature == "+fp-only-sp") {
Matt Arsenault250024f2016-06-08 01:56:42 +00005002 HW_FP_remove |= HW_FP_DP;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005003 } else if (Feature == "+strict-align") {
5004 Unaligned = 0;
5005 } else if (Feature == "+fp16") {
5006 HW_FP |= HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005007 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00005008 }
Ranjeet Singhac08e532015-06-24 23:39:25 +00005009 HW_FP &= ~HW_FP_remove;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005010
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005011 switch (ArchVersion) {
5012 case 6:
5013 if (ArchProfile == llvm::ARM::PK_M)
5014 LDREX = 0;
5015 else if (ArchKind == llvm::ARM::AK_ARMV6K)
5016 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5017 else
5018 LDREX = LDREX_W;
5019 break;
5020 case 7:
5021 if (ArchProfile == llvm::ARM::PK_M)
5022 LDREX = LDREX_W | LDREX_H | LDREX_B ;
5023 else
5024 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5025 break;
5026 case 8:
5027 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5028 }
5029
Rafael Espindolaeb265472013-08-21 21:59:03 +00005030 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
5031 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
5032 return false;
5033 }
5034
5035 if (FPMath == FP_Neon)
5036 Features.push_back("+neonfp");
5037 else if (FPMath == FP_VFP)
5038 Features.push_back("-neonfp");
5039
Daniel Dunbar893d4752009-12-19 04:15:38 +00005040 // Remove front-end specific options which the backend handles differently.
Eric Christopher9e172d22015-05-12 01:26:21 +00005041 auto Feature =
5042 std::find(Features.begin(), Features.end(), "+soft-float-abi");
5043 if (Feature != Features.end())
5044 Features.erase(Feature);
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005045
Rafael Espindolaeb265472013-08-21 21:59:03 +00005046 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005047 }
5048
Craig Topper3164f332014-03-11 03:39:26 +00005049 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005050 return llvm::StringSwitch<bool>(Feature)
5051 .Case("arm", true)
Ben Langmuir587aeaf2015-08-07 01:59:56 +00005052 .Case("aarch32", true)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005053 .Case("softfloat", SoftFloat)
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005054 .Case("thumb", isThumb())
Amara Emerson8c3de542013-09-16 18:07:35 +00005055 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005056 .Case("hwdiv", HWDiv & HWDivThumb)
5057 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005058 .Default(false);
5059 }
Renato Golin15b86152015-07-03 16:41:13 +00005060
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005061 bool setCPU(const std::string &Name) override {
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005062 if (Name != "generic")
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00005063 setArchInfo(llvm::ARM::parseCPUArch(Name));
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005064
Renato Golin15b86152015-07-03 16:41:13 +00005065 if (ArchKind == llvm::ARM::AK_INVALID)
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005066 return false;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005067 setAtomic();
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005068 CPU = Name;
5069 return true;
5070 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005071
Craig Topper3164f332014-03-11 03:39:26 +00005072 bool setFPMath(StringRef Name) override;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005073
Craig Topper3164f332014-03-11 03:39:26 +00005074 void getTargetDefines(const LangOptions &Opts,
5075 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00005076 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005077 Builder.defineMacro("__arm");
5078 Builder.defineMacro("__arm__");
Weiming Zhaob0613132016-04-18 16:25:46 +00005079 // For bare-metal none-eabi.
5080 if (getTriple().getOS() == llvm::Triple::UnknownOS &&
5081 getTriple().getEnvironment() == llvm::Triple::EABI)
5082 Builder.defineMacro("__ELF__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00005083
Chris Lattnerecd49032009-03-02 22:27:17 +00005084 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005085 Builder.defineMacro("__REGISTER_PREFIX__", "");
Tim Northover5627d392015-10-30 16:30:45 +00005086
5087 // Unfortunately, __ARM_ARCH_7K__ is now more of an ABI descriptor. The CPU
5088 // happens to be Cortex-A7 though, so it should still get __ARM_ARCH_7A__.
Tim Northoverd88ecb32016-01-27 19:32:40 +00005089 if (getTriple().isWatchABI())
Tim Northover5627d392015-10-30 16:30:45 +00005090 Builder.defineMacro("__ARM_ARCH_7K__", "2");
5091
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005092 if (!CPUAttr.empty())
5093 Builder.defineMacro("__ARM_ARCH_" + CPUAttr + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005094
5095 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005096 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
Benjamin Kramerb42d9a52015-12-24 10:07:37 +00005097 Builder.defineMacro("__ARM_ARCH", Twine(ArchVersion));
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005098
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005099 if (ArchVersion >= 8) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005100 // ACLE 6.5.7 Crypto Extension
5101 if (Crypto)
5102 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
5103 // ACLE 6.5.8 CRC32 Extension
5104 if (CRC)
5105 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
5106 // ACLE 6.5.10 Numeric Maximum and Minimum
5107 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
5108 // ACLE 6.5.9 Directed Rounding
5109 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
James Molloy0ffb0932014-09-15 11:25:38 +00005110 }
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005111
5112 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
5113 // is not defined for the M-profile.
Bradley Smithf4affc12016-03-03 13:52:22 +00005114 // NOTE that the default profile is assumed to be 'A'
5115 if (CPUProfile.empty() || ArchProfile != llvm::ARM::PK_M)
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005116 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
5117
Bradley Smithf4affc12016-03-03 13:52:22 +00005118 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supports the original
5119 // Thumb ISA (including v6-M and v8-M Baseline). It is set to 2 if the
5120 // core supports the Thumb-2 ISA as found in the v6T2 architecture and all
5121 // v7 and v8 architectures excluding v8-M Baseline.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005122 if (supportsThumb2())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005123 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005124 else if (supportsThumb())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005125 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
5126
5127 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
5128 // instruction set such as ARM or Thumb.
5129 Builder.defineMacro("__ARM_32BIT_STATE", "1");
5130
5131 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
5132
5133 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005134 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005135 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00005136
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005137 // ACLE 6.4.3 Unaligned access supported in hardware
Eric Christopherb093d692015-10-09 18:39:59 +00005138 if (Unaligned)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005139 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Eric Christopherb093d692015-10-09 18:39:59 +00005140
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005141 // ACLE 6.4.4 LDREX/STREX
5142 if (LDREX)
5143 Builder.defineMacro("__ARM_FEATURE_LDREX", "0x" + llvm::utohexstr(LDREX));
5144
5145 // ACLE 6.4.5 CLZ
Eric Christopherb093d692015-10-09 18:39:59 +00005146 if (ArchVersion == 5 ||
5147 (ArchVersion == 6 && CPUProfile != "M") ||
5148 ArchVersion > 6)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005149 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
5150
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005151 // ACLE 6.5.1 Hardware Floating Point
5152 if (HW_FP)
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +00005153 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005154
Yi Konga44c4d72014-06-27 21:25:42 +00005155 // ACLE predefines.
5156 Builder.defineMacro("__ARM_ACLE", "200");
5157
Oliver Stannarddc2854c2015-09-03 12:40:58 +00005158 // FP16 support (we currently only support IEEE format).
5159 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
5160 Builder.defineMacro("__ARM_FP16_ARGS", "1");
5161
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005162 // ACLE 6.5.3 Fused multiply-accumulate (FMA)
Silviu Baranga632fdc52016-04-28 11:29:08 +00005163 if (ArchVersion >= 7 && (FPU & VFP4FPU))
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005164 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
5165
Mike Stump9d54bd72009-04-08 02:07:04 +00005166 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005167
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005168 // FIXME: It's more complicated than this and we don't really support
5169 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005170 // Windows on ARM does not "support" interworking
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005171 if (5 <= ArchVersion && ArchVersion <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005172 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005173
David Tweed8f676532012-10-25 13:33:01 +00005174 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00005175 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005176 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
Tim Northover862eaf82016-05-13 21:26:45 +00005177 if (!getTriple().isOSBinFormatMachO() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00005178 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005179 Builder.defineMacro("__ARM_PCS", "1");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005180 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005181
Tim Northover28fc0e12016-04-28 13:59:55 +00005182 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp" ||
5183 ABI == "aapcs16")
5184 Builder.defineMacro("__ARM_PCS_VFP", "1");
5185
Daniel Dunbar893d4752009-12-19 04:15:38 +00005186 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005187 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005188
5189 if (CPU == "xscale")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005190 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005191
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005192 if (isThumb()) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005193 Builder.defineMacro("__THUMBEL__");
5194 Builder.defineMacro("__thumb__");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005195 if (supportsThumb2())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005196 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005197 }
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005198
5199 // ACLE 6.4.9 32-bit SIMD instructions
5200 if (ArchVersion >= 6 && (CPUProfile != "M" || CPUAttr == "7EM"))
5201 Builder.defineMacro("__ARM_FEATURE_SIMD32", "1");
5202
5203 // ACLE 6.4.10 Hardware Integer Divide
Eric Christopherb093d692015-10-09 18:39:59 +00005204 if (((HWDiv & HWDivThumb) && isThumb()) ||
5205 ((HWDiv & HWDivARM) && !isThumb())) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005206 Builder.defineMacro("__ARM_FEATURE_IDIV", "1");
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005207 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005208 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005209
5210 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005211 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005212
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005213 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005214 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005215 if (FPU & VFP2FPU)
5216 Builder.defineMacro("__ARM_VFPV2__");
5217 if (FPU & VFP3FPU)
5218 Builder.defineMacro("__ARM_VFPV3__");
5219 if (FPU & VFP4FPU)
5220 Builder.defineMacro("__ARM_VFPV4__");
5221 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00005222
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005223 // This only gets set when Neon instructions are actually available, unlike
5224 // the VFP define, hence the soft float and arch check. This is subtly
5225 // different from gcc, we follow the intent which was that it should be set
5226 // when Neon instructions are actually available.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005227 if ((FPU & NeonFPU) && !SoftFloat && ArchVersion >= 7) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005228 Builder.defineMacro("__ARM_NEON", "1");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005229 Builder.defineMacro("__ARM_NEON__");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005230 // current AArch32 NEON implementations do not support double-precision
5231 // floating-point even when it is present in VFP.
Eric Christopherb093d692015-10-09 18:39:59 +00005232 Builder.defineMacro("__ARM_NEON_FP",
5233 "0x" + llvm::utohexstr(HW_FP & ~HW_FP_DP));
Tim Northover5bb34ca2013-11-21 12:36:34 +00005234 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00005235
Bradley Smith0f28f0c2014-01-20 10:52:00 +00005236 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
5237 Opts.ShortWChar ? "2" : "4");
5238
5239 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5240 Opts.ShortEnums ? "1" : "4");
5241
Bradley Smithf4affc12016-03-03 13:52:22 +00005242 if (ArchVersion >= 6 && CPUAttr != "6M" && CPUAttr != "8M_BASE") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00005243 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5244 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5245 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5246 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
5247 }
Sergey Dmitrouk745f5302014-11-25 08:57:36 +00005248
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005249 // ACLE 6.4.7 DSP instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005250 if (DSP) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005251 Builder.defineMacro("__ARM_FEATURE_DSP", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005252 }
5253
5254 // ACLE 6.4.8 Saturation instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005255 bool SAT = false;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005256 if ((ArchVersion == 6 && CPUProfile != "M") || ArchVersion > 6 ) {
5257 Builder.defineMacro("__ARM_FEATURE_SAT", "1");
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005258 SAT = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005259 }
5260
5261 // ACLE 6.4.6 Q (saturation) flag
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005262 if (DSP || SAT)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005263 Builder.defineMacro("__ARM_FEATURE_QBIT", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005264
5265 if (Opts.UnsafeFPMath)
5266 Builder.defineMacro("__ARM_FP_FAST", "1");
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005267
5268 if (ArchKind == llvm::ARM::AK_ARMV8_1A)
5269 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
Chris Lattner17df24e2008-04-21 18:56:49 +00005270 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005271
Craig Topper6c03a542015-10-19 04:51:35 +00005272 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5273 return llvm::makeArrayRef(BuiltinInfo,
5274 clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner17df24e2008-04-21 18:56:49 +00005275 }
Craig Topper3164f332014-03-11 03:39:26 +00005276 bool isCLZForZeroUndef() const override { return false; }
5277 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northover5627d392015-10-30 16:30:45 +00005278 return IsAAPCS
5279 ? AAPCSABIBuiltinVaList
Tim Northoverd88ecb32016-01-27 19:32:40 +00005280 : (getTriple().isWatchABI() ? TargetInfo::CharPtrBuiltinVaList
5281 : TargetInfo::VoidPtrBuiltinVaList);
Chris Lattner17df24e2008-04-21 18:56:49 +00005282 }
Craig Topperf054e3a2015-10-19 03:52:27 +00005283 ArrayRef<const char *> getGCCRegNames() const override;
5284 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00005285 bool validateAsmConstraint(const char *&Name,
5286 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00005287 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00005288 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00005289 case 'l': // r0-r7
5290 case 'h': // r8-r15
JF Bastien750caef2016-02-19 06:54:45 +00005291 case 't': // VFP Floating point register single precision
5292 case 'w': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00005293 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00005294 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005295 case 'I':
5296 case 'J':
5297 case 'K':
5298 case 'L':
5299 case 'M':
5300 // FIXME
5301 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00005302 case 'Q': // A memory address that is a single base register.
5303 Info.setAllowsMemory();
5304 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005305 case 'U': // a memory reference...
5306 switch (Name[1]) {
5307 case 'q': // ...ARMV4 ldrsb
5308 case 'v': // ...VFP load/store (reg+constant offset)
5309 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00005310 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00005311 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00005312 case 'n': // valid address for Neon doubleword vector load/store
5313 case 'm': // valid address for Neon element and structure load/store
5314 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00005315 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005316 Info.setAllowsMemory();
5317 Name++;
5318 return true;
5319 }
Nate Begeman2908fa02008-04-22 05:03:19 +00005320 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005321 return false;
5322 }
Craig Topper3164f332014-03-11 03:39:26 +00005323 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005324 std::string R;
5325 switch (*Constraint) {
5326 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00005327 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005328 Constraint++;
5329 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00005330 case 'p': // 'p' should be translated to 'r' by default.
5331 R = std::string("r");
5332 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005333 default:
5334 return std::string(1, *Constraint);
5335 }
5336 return R;
5337 }
Akira Hatanaka987f1862014-08-22 06:05:21 +00005338 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005339 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005340 std::string &SuggestedModifier) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00005341 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00005342 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00005343
Bill Wendling9d1ee112012-10-25 23:28:48 +00005344 // Strip off constraint modifiers.
5345 while (Constraint[0] == '=' ||
5346 Constraint[0] == '+' ||
5347 Constraint[0] == '&')
5348 Constraint = Constraint.substr(1);
5349
5350 switch (Constraint[0]) {
5351 default: break;
5352 case 'r': {
5353 switch (Modifier) {
5354 default:
Tim Northover8f24b172013-12-08 15:24:55 +00005355 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00005356 case 'q':
5357 // A register of size 32 cannot fit a vector type.
5358 return false;
5359 }
5360 }
5361 }
5362
5363 return true;
5364 }
Craig Topper3164f332014-03-11 03:39:26 +00005365 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00005366 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00005367 return "";
5368 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005369
Craig Topper3164f332014-03-11 03:39:26 +00005370 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00005371 switch (CC) {
5372 case CC_AAPCS:
5373 case CC_AAPCS_VFP:
5374 case CC_Swift:
5375 return CCCR_OK;
5376 default:
5377 return CCCR_Warning;
5378 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005379 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00005380
Craig Topper3164f332014-03-11 03:39:26 +00005381 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00005382 if (RegNo == 0) return 0;
5383 if (RegNo == 1) return 1;
5384 return -1;
5385 }
Matthias Braund1e2fad2015-07-17 00:15:22 +00005386
5387 bool hasSjLjLowering() const override {
5388 return true;
5389 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005390};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005391
Rafael Espindolaeb265472013-08-21 21:59:03 +00005392bool ARMTargetInfo::setFPMath(StringRef Name) {
5393 if (Name == "neon") {
5394 FPMath = FP_Neon;
5395 return true;
5396 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
5397 Name == "vfp4") {
5398 FPMath = FP_VFP;
5399 return true;
5400 }
5401 return false;
5402}
5403
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005404const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005405 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005406 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005407 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
5408
5409 // Float registers
5410 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
5411 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
5412 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005413 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005414
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005415 // Double registers
5416 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
5417 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005418 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
5419 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005420
5421 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005422 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
5423 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005424};
5425
Craig Topperf054e3a2015-10-19 03:52:27 +00005426ArrayRef<const char *> ARMTargetInfo::getGCCRegNames() const {
5427 return llvm::makeArrayRef(GCCRegNames);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005428}
5429
5430const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005431 { { "a1" }, "r0" },
5432 { { "a2" }, "r1" },
5433 { { "a3" }, "r2" },
5434 { { "a4" }, "r3" },
5435 { { "v1" }, "r4" },
5436 { { "v2" }, "r5" },
5437 { { "v3" }, "r6" },
5438 { { "v4" }, "r7" },
5439 { { "v5" }, "r8" },
5440 { { "v6", "rfp" }, "r9" },
5441 { { "sl" }, "r10" },
5442 { { "fp" }, "r11" },
5443 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00005444 { { "r13" }, "sp" },
5445 { { "r14" }, "lr" },
5446 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005447 // The S, D and Q registers overlap, but aren't really aliases; we
5448 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005449};
5450
Craig Topperf054e3a2015-10-19 03:52:27 +00005451ArrayRef<TargetInfo::GCCRegAlias> ARMTargetInfo::getGCCRegAliases() const {
5452 return llvm::makeArrayRef(GCCRegAliases);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005453}
Chris Lattner5cc15e02010-03-03 19:03:45 +00005454
5455const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00005456#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005457 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005458#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5459 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00005460#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00005461
Craig Topper07d3b622015-08-07 05:14:44 +00005462#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005463 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005464#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005465 { #ID, TYPE, ATTRS, nullptr, LANG, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005466#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5467 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5cc15e02010-03-03 19:03:45 +00005468#include "clang/Basic/BuiltinsARM.def"
5469};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005470
5471class ARMleTargetInfo : public ARMTargetInfo {
5472public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005473 ARMleTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5474 : ARMTargetInfo(Triple, Opts, /*BigEndian=*/false) {}
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005475 void getTargetDefines(const LangOptions &Opts,
5476 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005477 Builder.defineMacro("__ARMEL__");
5478 ARMTargetInfo::getTargetDefines(Opts, Builder);
5479 }
5480};
5481
5482class ARMbeTargetInfo : public ARMTargetInfo {
5483public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005484 ARMbeTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5485 : ARMTargetInfo(Triple, Opts, /*BigEndian=*/true) {}
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005486 void getTargetDefines(const LangOptions &Opts,
5487 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005488 Builder.defineMacro("__ARMEB__");
5489 Builder.defineMacro("__ARM_BIG_ENDIAN");
5490 ARMTargetInfo::getTargetDefines(Opts, Builder);
5491 }
5492};
Chris Lattner17df24e2008-04-21 18:56:49 +00005493
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005494class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
5495 const llvm::Triple Triple;
5496public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005497 WindowsARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5498 : WindowsTargetInfo<ARMleTargetInfo>(Triple, Opts), Triple(Triple) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005499 WCharType = UnsignedShort;
5500 SizeType = UnsignedInt;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005501 }
5502 void getVisualStudioDefines(const LangOptions &Opts,
5503 MacroBuilder &Builder) const {
5504 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
5505
5506 // FIXME: this is invalid for WindowsCE
5507 Builder.defineMacro("_M_ARM_NT", "1");
5508 Builder.defineMacro("_M_ARMT", "_M_ARM");
5509 Builder.defineMacro("_M_THUMB", "_M_ARM");
5510
5511 assert((Triple.getArch() == llvm::Triple::arm ||
5512 Triple.getArch() == llvm::Triple::thumb) &&
5513 "invalid architecture for Windows ARM target info");
5514 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
5515 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
5516
5517 // TODO map the complete set of values
5518 // 31: VFPv3 40: VFPv4
5519 Builder.defineMacro("_M_ARM_FP", "31");
5520 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00005521 BuiltinVaListKind getBuiltinVaListKind() const override {
5522 return TargetInfo::CharPtrBuiltinVaList;
5523 }
Martell Malone7ccda3c2015-08-14 18:00:09 +00005524 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5525 switch (CC) {
5526 case CC_X86StdCall:
5527 case CC_X86ThisCall:
5528 case CC_X86FastCall:
5529 case CC_X86VectorCall:
5530 return CCCR_Ignore;
5531 case CC_C:
5532 return CCCR_OK;
5533 default:
5534 return CCCR_Warning;
5535 }
5536 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005537};
5538
5539// Windows ARM + Itanium C++ ABI Target
5540class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
5541public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005542 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple,
5543 const TargetOptions &Opts)
5544 : WindowsARMTargetInfo(Triple, Opts) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005545 TheCXXABI.set(TargetCXXABI::GenericARM);
5546 }
5547
5548 void getTargetDefines(const LangOptions &Opts,
5549 MacroBuilder &Builder) const override {
5550 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5551
5552 if (Opts.MSVCCompat)
5553 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5554 }
5555};
5556
5557// Windows ARM, MS (C++) ABI
5558class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
5559public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005560 MicrosoftARMleTargetInfo(const llvm::Triple &Triple,
5561 const TargetOptions &Opts)
5562 : WindowsARMTargetInfo(Triple, Opts) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005563 TheCXXABI.set(TargetCXXABI::Microsoft);
5564 }
5565
5566 void getTargetDefines(const LangOptions &Opts,
5567 MacroBuilder &Builder) const override {
5568 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5569 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5570 }
5571};
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005572
Yaron Keren321249c2015-07-15 13:32:23 +00005573// ARM MinGW target
5574class MinGWARMTargetInfo : public WindowsARMTargetInfo {
5575public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005576 MinGWARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5577 : WindowsARMTargetInfo(Triple, Opts) {
Yaron Keren321249c2015-07-15 13:32:23 +00005578 TheCXXABI.set(TargetCXXABI::GenericARM);
5579 }
5580
5581 void getTargetDefines(const LangOptions &Opts,
5582 MacroBuilder &Builder) const override {
5583 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5584 DefineStd(Builder, "WIN32", Opts);
5585 DefineStd(Builder, "WINNT", Opts);
5586 Builder.defineMacro("_ARM_");
5587 addMinGWDefines(Opts, Builder);
5588 }
5589};
5590
5591// ARM Cygwin target
5592class CygwinARMTargetInfo : public ARMleTargetInfo {
5593public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005594 CygwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5595 : ARMleTargetInfo(Triple, Opts) {
Yaron Keren321249c2015-07-15 13:32:23 +00005596 TLSSupported = false;
5597 WCharType = UnsignedShort;
5598 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00005599 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Yaron Keren321249c2015-07-15 13:32:23 +00005600 }
5601 void getTargetDefines(const LangOptions &Opts,
5602 MacroBuilder &Builder) const override {
5603 ARMleTargetInfo::getTargetDefines(Opts, Builder);
5604 Builder.defineMacro("_ARM_");
5605 Builder.defineMacro("__CYGWIN__");
5606 Builder.defineMacro("__CYGWIN32__");
5607 DefineStd(Builder, "unix", Opts);
5608 if (Opts.CPlusPlus)
5609 Builder.defineMacro("_GNU_SOURCE");
5610 }
5611};
5612
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005613class DarwinARMTargetInfo : public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00005614protected:
Craig Topper3164f332014-03-11 03:39:26 +00005615 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5616 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00005617 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00005618 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005619
Torok Edwinb2b37c62009-06-30 17:10:35 +00005620public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005621 DarwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5622 : DarwinTargetInfo<ARMleTargetInfo>(Triple, Opts) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005623 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005624 // iOS always has 64-bit atomic instructions.
Eric Christopher917e9522014-11-18 22:36:15 +00005625 // FIXME: This should be based off of the target features in
5626 // ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005627 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00005628
Tim Northoverd88ecb32016-01-27 19:32:40 +00005629 if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00005630 // Darwin on iOS uses a variant of the ARM C++ ABI.
5631 TheCXXABI.set(TargetCXXABI::WatchOS);
5632
5633 // The 32-bit ABI is silent on what ptrdiff_t should be, but given that
5634 // size_t is long, it's a bit weird for it to be int.
5635 PtrDiffType = SignedLong;
5636
5637 // BOOL should be a real boolean on the new ABI
5638 UseSignedCharForObjCBool = false;
5639 } else
5640 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005641 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005642};
Eli Friedmanf05b7722008-08-20 07:44:10 +00005643
Tim Northover573cbee2014-05-24 12:52:07 +00005644class AArch64TargetInfo : public TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00005645 virtual void setDataLayout() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00005646 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5647 static const char *const GCCRegNames[];
5648
James Molloy75f5f9e2014-04-16 15:33:48 +00005649 enum FPUModeEnum {
5650 FPUMode,
5651 NeonMode
5652 };
5653
5654 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00005655 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00005656 unsigned Crypto;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005657 unsigned Unaligned;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005658 unsigned V8_1A;
James Molloy75f5f9e2014-04-16 15:33:48 +00005659
Tim Northovera2ee4332014-03-29 15:09:45 +00005660 static const Builtin::Info BuiltinInfo[];
5661
5662 std::string ABI;
5663
5664public:
Saleem Abdulrasool9b5ba542016-04-10 03:19:47 +00005665 AArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Tim Northovera2ee4332014-03-29 15:09:45 +00005666 : TargetInfo(Triple), ABI("aapcs") {
Tim Northover25e8a672014-05-24 12:51:25 +00005667 if (getTriple().getOS() == llvm::Triple::NetBSD) {
5668 WCharType = SignedInt;
5669
5670 // NetBSD apparently prefers consistency across ARM targets to consistency
5671 // across 64-bit targets.
5672 Int64Type = SignedLongLong;
5673 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005674 } else {
5675 WCharType = UnsignedInt;
5676 Int64Type = SignedLong;
5677 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005678 }
5679
Tim Northovera2ee4332014-03-29 15:09:45 +00005680 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005681 MaxVectorAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005682 MaxAtomicInlineWidth = 128;
5683 MaxAtomicPromoteWidth = 128;
5684
Tim Northovera6a19f12015-02-06 01:25:07 +00005685 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005686 LongDoubleFormat = &llvm::APFloat::IEEEquad;
5687
Tim Northovera2ee4332014-03-29 15:09:45 +00005688 // {} in inline assembly are neon specifiers, not assembly variant
5689 // specifiers.
5690 NoAsmVariants = true;
5691
Tim Northover7ad87af2015-01-16 18:44:04 +00005692 // AAPCS gives rules for bitfields. 7.1.7 says: "The container type
5693 // contributes to the alignment of the containing aggregate in the same way
5694 // a plain (non bit-field) member of that type would, without exception for
5695 // zero-sized or anonymous bit-fields."
Tim Northover5627d392015-10-30 16:30:45 +00005696 assert(UseBitFieldTypeAlignment && "bitfields affect type alignment");
Tim Northover7ad87af2015-01-16 18:44:04 +00005697 UseZeroLengthBitfieldAlignment = true;
5698
Tim Northover573cbee2014-05-24 12:52:07 +00005699 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00005700 TheCXXABI.set(TargetCXXABI::GenericAArch64);
Saleem Abdulrasoolc066d9c2016-04-12 03:05:03 +00005701
5702 if (Triple.getOS() == llvm::Triple::Linux ||
5703 Triple.getOS() == llvm::Triple::UnknownOS)
5704 this->MCountName = Opts.EABIVersion == "gnu" ? "\01_mcount" : "mcount";
Tim Northovera2ee4332014-03-29 15:09:45 +00005705 }
5706
Alp Toker4925ba72014-06-07 23:30:42 +00005707 StringRef getABI() const override { return ABI; }
David Blaikie1cbb9712014-11-14 19:09:44 +00005708 bool setABI(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005709 if (Name != "aapcs" && Name != "darwinpcs")
5710 return false;
5711
5712 ABI = Name;
5713 return true;
5714 }
5715
David Blaikie1cbb9712014-11-14 19:09:44 +00005716 bool setCPU(const std::string &Name) override {
Renato Golin3b8709c2016-05-25 12:36:31 +00005717 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5718 .Case("generic", true)
5719 .Cases("cortex-a53", "cortex-a57", "cortex-a72",
5720 "cortex-a35", "exynos-m1", true)
Sjoerd Meijer90df4a72016-06-02 10:48:37 +00005721 .Case("cortex-a73", true)
Renato Golin3b8709c2016-05-25 12:36:31 +00005722 .Case("cyclone", true)
5723 .Case("kryo", true)
Pankaj Gode3267e842016-06-29 10:00:31 +00005724 .Case("vulcan", true)
Renato Golin3b8709c2016-05-25 12:36:31 +00005725 .Default(false);
5726 return CPUKnown;
Tim Northovera2ee4332014-03-29 15:09:45 +00005727 }
5728
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005729 void getTargetDefines(const LangOptions &Opts,
5730 MacroBuilder &Builder) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005731 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00005732 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005733
5734 // Target properties.
5735 Builder.defineMacro("_LP64");
5736 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005737
5738 // ACLE predefines. Many can only have one possible value on v8 AArch64.
5739 Builder.defineMacro("__ARM_ACLE", "200");
5740 Builder.defineMacro("__ARM_ARCH", "8");
5741 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
5742
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005743 Builder.defineMacro("__ARM_64BIT_STATE", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005744 Builder.defineMacro("__ARM_PCS_AAPCS64", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005745 Builder.defineMacro("__ARM_ARCH_ISA_A64", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005746
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005747 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
5748 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
5749 Builder.defineMacro("__ARM_FEATURE_LDREX", "0xF");
5750 Builder.defineMacro("__ARM_FEATURE_IDIV", "1"); // As specified in ACLE
James Molloy0ffb0932014-09-15 11:25:38 +00005751 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005752 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
5753 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005754
5755 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
5756
5757 // 0xe implies support for half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005758 Builder.defineMacro("__ARM_FP", "0xE");
Tim Northovera2ee4332014-03-29 15:09:45 +00005759
5760 // PCS specifies this for SysV variants, which is all we support. Other ABIs
5761 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005762 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
5763 Builder.defineMacro("__ARM_FP16_ARGS", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005764
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005765 if (Opts.UnsafeFPMath)
5766 Builder.defineMacro("__ARM_FP_FAST", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005767
5768 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
5769
5770 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5771 Opts.ShortEnums ? "1" : "4");
5772
James Molloy75f5f9e2014-04-16 15:33:48 +00005773 if (FPU == NeonMode) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005774 Builder.defineMacro("__ARM_NEON", "1");
James Molloy75f5f9e2014-04-16 15:33:48 +00005775 // 64-bit NEON supports half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005776 Builder.defineMacro("__ARM_NEON_FP", "0xE");
James Molloy75f5f9e2014-04-16 15:33:48 +00005777 }
Tim Northovera2ee4332014-03-29 15:09:45 +00005778
Bradley Smith418c5932014-05-02 15:17:51 +00005779 if (CRC)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005780 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
Bradley Smith418c5932014-05-02 15:17:51 +00005781
James Molloy75f5f9e2014-04-16 15:33:48 +00005782 if (Crypto)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005783 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
5784
5785 if (Unaligned)
5786 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Reid Klecknerd167d422015-05-06 15:31:46 +00005787
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005788 if (V8_1A)
5789 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
5790
Reid Klecknerd167d422015-05-06 15:31:46 +00005791 // All of the __sync_(bool|val)_compare_and_swap_(1|2|4|8) builtins work.
5792 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5793 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5794 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5795 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Tim Northovera2ee4332014-03-29 15:09:45 +00005796 }
5797
Craig Topper6c03a542015-10-19 04:51:35 +00005798 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5799 return llvm::makeArrayRef(BuiltinInfo,
5800 clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin);
Tim Northovera2ee4332014-03-29 15:09:45 +00005801 }
5802
David Blaikie1cbb9712014-11-14 19:09:44 +00005803 bool hasFeature(StringRef Feature) const override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005804 return Feature == "aarch64" ||
5805 Feature == "arm64" ||
Ben Langmuir587aeaf2015-08-07 01:59:56 +00005806 Feature == "arm" ||
James Molloy75f5f9e2014-04-16 15:33:48 +00005807 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00005808 }
5809
James Molloy5e73df52014-04-16 15:06:20 +00005810 bool handleTargetFeatures(std::vector<std::string> &Features,
5811 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005812 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00005813 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00005814 Crypto = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005815 Unaligned = 1;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005816 V8_1A = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005817
Eric Christopher610fe112015-08-26 08:21:55 +00005818 for (const auto &Feature : Features) {
5819 if (Feature == "+neon")
James Molloy75f5f9e2014-04-16 15:33:48 +00005820 FPU = NeonMode;
Eric Christopher610fe112015-08-26 08:21:55 +00005821 if (Feature == "+crc")
Bradley Smith418c5932014-05-02 15:17:51 +00005822 CRC = 1;
Eric Christopher610fe112015-08-26 08:21:55 +00005823 if (Feature == "+crypto")
James Molloy75f5f9e2014-04-16 15:33:48 +00005824 Crypto = 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005825 if (Feature == "+strict-align")
5826 Unaligned = 0;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005827 if (Feature == "+v8.1a")
5828 V8_1A = 1;
James Molloy75f5f9e2014-04-16 15:33:48 +00005829 }
5830
James Y Knightb214cbc2016-03-04 19:00:41 +00005831 setDataLayout();
James Molloy5e73df52014-04-16 15:06:20 +00005832
5833 return true;
5834 }
5835
John McCall477f2bb2016-03-03 06:39:32 +00005836 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5837 switch (CC) {
5838 case CC_C:
5839 case CC_Swift:
Roman Levenstein35aa5ce2016-03-16 18:00:46 +00005840 case CC_PreserveMost:
5841 case CC_PreserveAll:
John McCall477f2bb2016-03-03 06:39:32 +00005842 return CCCR_OK;
5843 default:
5844 return CCCR_Warning;
5845 }
5846 }
5847
David Blaikie1cbb9712014-11-14 19:09:44 +00005848 bool isCLZForZeroUndef() const override { return false; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005849
David Blaikie1cbb9712014-11-14 19:09:44 +00005850 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005851 return TargetInfo::AArch64ABIBuiltinVaList;
5852 }
5853
Craig Topperf054e3a2015-10-19 03:52:27 +00005854 ArrayRef<const char *> getGCCRegNames() const override;
5855 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00005856
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005857 bool validateAsmConstraint(const char *&Name,
5858 TargetInfo::ConstraintInfo &Info) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005859 switch (*Name) {
5860 default:
5861 return false;
5862 case 'w': // Floating point and SIMD registers (V0-V31)
5863 Info.setAllowsRegister();
5864 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00005865 case 'I': // Constant that can be used with an ADD instruction
5866 case 'J': // Constant that can be used with a SUB instruction
5867 case 'K': // Constant that can be used with a 32-bit logical instruction
5868 case 'L': // Constant that can be used with a 64-bit logical instruction
5869 case 'M': // Constant that can be used as a 32-bit MOV immediate
5870 case 'N': // Constant that can be used as a 64-bit MOV immediate
5871 case 'Y': // Floating point constant zero
5872 case 'Z': // Integer constant zero
5873 return true;
5874 case 'Q': // A memory reference with base register and no offset
5875 Info.setAllowsMemory();
5876 return true;
5877 case 'S': // A symbolic address
5878 Info.setAllowsRegister();
5879 return true;
5880 case 'U':
Eric Christopher917e9522014-11-18 22:36:15 +00005881 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
5882 // Utf: A memory address suitable for ldp/stp in TF mode.
5883 // Usa: An absolute symbolic address.
5884 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
5885 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
Tim Northovera2ee4332014-03-29 15:09:45 +00005886 case 'z': // Zero register, wzr or xzr
5887 Info.setAllowsRegister();
5888 return true;
5889 case 'x': // Floating point and SIMD registers (V0-V15)
5890 Info.setAllowsRegister();
5891 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00005892 }
5893 return false;
5894 }
5895
Akira Hatanaka987f1862014-08-22 06:05:21 +00005896 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005897 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005898 std::string &SuggestedModifier) const override {
James Molloy8a157bf2014-07-25 10:19:47 +00005899 // Strip off constraint modifiers.
5900 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
5901 Constraint = Constraint.substr(1);
5902
5903 switch (Constraint[0]) {
5904 default:
5905 return true;
5906 case 'z':
5907 case 'r': {
5908 switch (Modifier) {
5909 case 'x':
5910 case 'w':
5911 // For now assume that the person knows what they're
5912 // doing with the modifier.
5913 return true;
5914 default:
5915 // By default an 'r' constraint will be in the 'x'
5916 // registers.
Akira Hatanaka987f1862014-08-22 06:05:21 +00005917 if (Size == 64)
5918 return true;
5919
5920 SuggestedModifier = "w";
5921 return false;
James Molloy8a157bf2014-07-25 10:19:47 +00005922 }
5923 }
5924 }
5925 }
5926
David Blaikie1cbb9712014-11-14 19:09:44 +00005927 const char *getClobbers() const override { return ""; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005928
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00005929 int getEHDataRegisterNumber(unsigned RegNo) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005930 if (RegNo == 0)
5931 return 0;
5932 if (RegNo == 1)
5933 return 1;
5934 return -1;
5935 }
5936};
5937
Tim Northover573cbee2014-05-24 12:52:07 +00005938const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005939 // 32-bit Integer registers
5940 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
5941 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
5942 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
5943
5944 // 64-bit Integer registers
5945 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
5946 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
5947 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
5948
5949 // 32-bit floating point regsisters
5950 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
5951 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
5952 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
5953
5954 // 64-bit floating point regsisters
5955 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
5956 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
5957 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
5958
5959 // Vector registers
5960 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
5961 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
5962 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
5963};
5964
Craig Topperf054e3a2015-10-19 03:52:27 +00005965ArrayRef<const char *> AArch64TargetInfo::getGCCRegNames() const {
5966 return llvm::makeArrayRef(GCCRegNames);
Tim Northovera2ee4332014-03-29 15:09:45 +00005967}
5968
Tim Northover573cbee2014-05-24 12:52:07 +00005969const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005970 { { "w31" }, "wsp" },
5971 { { "x29" }, "fp" },
5972 { { "x30" }, "lr" },
5973 { { "x31" }, "sp" },
5974 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
5975 // don't want to substitute one of these for a different-sized one.
5976};
5977
Craig Topperf054e3a2015-10-19 03:52:27 +00005978ArrayRef<TargetInfo::GCCRegAlias> AArch64TargetInfo::getGCCRegAliases() const {
5979 return llvm::makeArrayRef(GCCRegAliases);
Tim Northovera2ee4332014-03-29 15:09:45 +00005980}
5981
Tim Northover573cbee2014-05-24 12:52:07 +00005982const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005983#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00005984 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00005985#include "clang/Basic/BuiltinsNEON.def"
5986
5987#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00005988 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northover573cbee2014-05-24 12:52:07 +00005989#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00005990};
James Molloy5e73df52014-04-16 15:06:20 +00005991
Tim Northover573cbee2014-05-24 12:52:07 +00005992class AArch64leTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00005993 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00005994 if (getTriple().isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00005995 resetDataLayout("e-m:o-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00005996 else
Chad Rosier4c077aa2016-07-07 20:02:25 +00005997 resetDataLayout("e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00005998 }
5999
6000public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006001 AArch64leTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6002 : AArch64TargetInfo(Triple, Opts) {
James Molloy5e73df52014-04-16 15:06:20 +00006003 BigEndian = false;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006004 }
James Molloy5e73df52014-04-16 15:06:20 +00006005 void getTargetDefines(const LangOptions &Opts,
6006 MacroBuilder &Builder) const override {
6007 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00006008 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00006009 }
6010};
6011
Tim Northover573cbee2014-05-24 12:52:07 +00006012class AArch64beTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00006013 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00006014 assert(!getTriple().isOSBinFormatMachO());
Chad Rosier4c077aa2016-07-07 20:02:25 +00006015 resetDataLayout("E-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006016 }
6017
6018public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006019 AArch64beTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6020 : AArch64TargetInfo(Triple, Opts) {}
James Molloy5e73df52014-04-16 15:06:20 +00006021 void getTargetDefines(const LangOptions &Opts,
6022 MacroBuilder &Builder) const override {
6023 Builder.defineMacro("__AARCH64EB__");
6024 Builder.defineMacro("__AARCH_BIG_ENDIAN");
6025 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00006026 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00006027 }
6028};
Tim Northovera2ee4332014-03-29 15:09:45 +00006029
Tim Northover573cbee2014-05-24 12:52:07 +00006030class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00006031protected:
6032 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
6033 MacroBuilder &Builder) const override {
6034 Builder.defineMacro("__AARCH64_SIMD__");
6035 Builder.defineMacro("__ARM64_ARCH_8__");
6036 Builder.defineMacro("__ARM_NEON__");
6037 Builder.defineMacro("__LITTLE_ENDIAN__");
6038 Builder.defineMacro("__REGISTER_PREFIX__", "");
6039 Builder.defineMacro("__arm64", "1");
6040 Builder.defineMacro("__arm64__", "1");
6041
6042 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
6043 }
6044
Tim Northovera2ee4332014-03-29 15:09:45 +00006045public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006046 DarwinAArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6047 : DarwinTargetInfo<AArch64leTargetInfo>(Triple, Opts) {
Tim Northovera2ee4332014-03-29 15:09:45 +00006048 Int64Type = SignedLongLong;
6049 WCharType = SignedInt;
6050 UseSignedCharForObjCBool = false;
6051
Tim Northovera6a19f12015-02-06 01:25:07 +00006052 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00006053 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
6054
6055 TheCXXABI.set(TargetCXXABI::iOS64);
6056 }
6057
David Blaikie1cbb9712014-11-14 19:09:44 +00006058 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006059 return TargetInfo::CharPtrBuiltinVaList;
6060 }
6061};
Tim Northovera2ee4332014-03-29 15:09:45 +00006062
Tony Linthicum76329bf2011-12-12 21:14:55 +00006063// Hexagon abstract base class
6064class HexagonTargetInfo : public TargetInfo {
6065 static const Builtin::Info BuiltinInfo[];
6066 static const char * const GCCRegNames[];
6067 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6068 std::string CPU;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006069 bool HasHVX, HasHVXDouble;
6070
Tony Linthicum76329bf2011-12-12 21:14:55 +00006071public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006072 HexagonTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6073 : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006074 BigEndian = false;
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00006075 // Specify the vector alignment explicitly. For v512x1, the calculated
6076 // alignment would be 512*alignment(i1), which is 512 bytes, instead of
6077 // the required minimum of 64 bytes.
James Y Knightb214cbc2016-03-04 19:00:41 +00006078 resetDataLayout("e-m:e-p:32:32:32-a:0-n16:32-"
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00006079 "i64:64:64-i32:32:32-i16:16:16-i1:8:8-f32:32:32-f64:64:64-"
James Y Knightb214cbc2016-03-04 19:00:41 +00006080 "v32:32:32-v64:64:64-v512:512:512-v1024:1024:1024-v2048:2048:2048");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006081 SizeType = UnsignedInt;
6082 PtrDiffType = SignedInt;
6083 IntPtrType = SignedInt;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006084
6085 // {} in inline assembly are packet specifiers, not assembly variant
6086 // specifiers.
6087 NoAsmVariants = true;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006088
6089 LargeArrayMinWidth = 64;
6090 LargeArrayAlign = 64;
6091 UseBitFieldTypeAlignment = true;
6092 ZeroLengthBitfieldBoundary = 32;
6093 HasHVX = HasHVXDouble = false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006094 }
6095
Craig Topper6c03a542015-10-19 04:51:35 +00006096 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6097 return llvm::makeArrayRef(BuiltinInfo,
6098 clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006099 }
6100
Craig Topper3164f332014-03-11 03:39:26 +00006101 bool validateAsmConstraint(const char *&Name,
6102 TargetInfo::ConstraintInfo &Info) const override {
Krzysztof Parzyszeke0026e42016-05-18 14:56:14 +00006103 switch (*Name) {
6104 case 'v':
6105 case 'q':
6106 if (HasHVX) {
6107 Info.setAllowsRegister();
6108 return true;
6109 }
6110 break;
Krzysztof Parzyszek89fb4412016-05-20 13:50:32 +00006111 case 's':
6112 // Relocatable constant.
6113 return true;
Krzysztof Parzyszeke0026e42016-05-18 14:56:14 +00006114 }
6115 return false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006116 }
6117
Craig Topper3164f332014-03-11 03:39:26 +00006118 void getTargetDefines(const LangOptions &Opts,
6119 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006120
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006121 bool isCLZForZeroUndef() const override { return false; }
6122
Craig Topper3164f332014-03-11 03:39:26 +00006123 bool hasFeature(StringRef Feature) const override {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006124 return llvm::StringSwitch<bool>(Feature)
6125 .Case("hexagon", true)
6126 .Case("hvx", HasHVX)
6127 .Case("hvx-double", HasHVXDouble)
6128 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006129 }
Craig Topper3164f332014-03-11 03:39:26 +00006130
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006131 bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6132 StringRef CPU, const std::vector<std::string> &FeaturesVec)
6133 const override;
6134
6135 bool handleTargetFeatures(std::vector<std::string> &Features,
6136 DiagnosticsEngine &Diags) override;
6137
Craig Topper3164f332014-03-11 03:39:26 +00006138 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006139 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006140 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006141 ArrayRef<const char *> getGCCRegNames() const override;
6142 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00006143 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006144 return "";
6145 }
Sebastian Pop86500282012-01-13 20:37:10 +00006146
6147 static const char *getHexagonCPUSuffix(StringRef Name) {
6148 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00006149 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006150 .Case("hexagonv5", "5")
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006151 .Case("hexagonv55", "55")
6152 .Case("hexagonv60", "60")
Craig Topperf1186c52014-05-08 06:41:40 +00006153 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00006154 }
6155
Craig Topper3164f332014-03-11 03:39:26 +00006156 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00006157 if (!getHexagonCPUSuffix(Name))
6158 return false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006159 CPU = Name;
6160 return true;
6161 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006162
6163 int getEHDataRegisterNumber(unsigned RegNo) const override {
6164 return RegNo < 2 ? RegNo : -1;
6165 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006166};
6167
6168void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006169 MacroBuilder &Builder) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006170 Builder.defineMacro("__qdsp6__", "1");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006171 Builder.defineMacro("__hexagon__", "1");
6172
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006173 if (CPU == "hexagonv4") {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006174 Builder.defineMacro("__HEXAGON_V4__");
6175 Builder.defineMacro("__HEXAGON_ARCH__", "4");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006176 if (Opts.HexagonQdsp6Compat) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006177 Builder.defineMacro("__QDSP6_V4__");
6178 Builder.defineMacro("__QDSP6_ARCH__", "4");
6179 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006180 } else if (CPU == "hexagonv5") {
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006181 Builder.defineMacro("__HEXAGON_V5__");
6182 Builder.defineMacro("__HEXAGON_ARCH__", "5");
6183 if(Opts.HexagonQdsp6Compat) {
6184 Builder.defineMacro("__QDSP6_V5__");
6185 Builder.defineMacro("__QDSP6_ARCH__", "5");
6186 }
Krzysztof Parzyszeka58ff512016-04-21 14:30:04 +00006187 } else if (CPU == "hexagonv55") {
6188 Builder.defineMacro("__HEXAGON_V55__");
6189 Builder.defineMacro("__HEXAGON_ARCH__", "55");
6190 Builder.defineMacro("__QDSP6_V55__");
6191 Builder.defineMacro("__QDSP6_ARCH__", "55");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006192 } else if (CPU == "hexagonv60") {
6193 Builder.defineMacro("__HEXAGON_V60__");
6194 Builder.defineMacro("__HEXAGON_ARCH__", "60");
6195 Builder.defineMacro("__QDSP6_V60__");
6196 Builder.defineMacro("__QDSP6_ARCH__", "60");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006197 }
Krzysztof Parzyszek7f0756c2016-04-18 18:38:11 +00006198
6199 if (hasFeature("hvx")) {
6200 Builder.defineMacro("__HVX__");
6201 if (hasFeature("hvx-double"))
6202 Builder.defineMacro("__HVXDBL__");
6203 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006204}
6205
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006206bool HexagonTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
6207 DiagnosticsEngine &Diags) {
6208 for (auto &F : Features) {
6209 if (F == "+hvx")
6210 HasHVX = true;
6211 else if (F == "-hvx")
6212 HasHVX = HasHVXDouble = false;
6213 else if (F == "+hvx-double")
6214 HasHVX = HasHVXDouble = true;
6215 else if (F == "-hvx-double")
6216 HasHVXDouble = false;
6217 }
6218 return true;
6219}
6220
6221bool HexagonTargetInfo::initFeatureMap(llvm::StringMap<bool> &Features,
6222 DiagnosticsEngine &Diags, StringRef CPU,
6223 const std::vector<std::string> &FeaturesVec) const {
6224 // Default for v60: -hvx, -hvx-double.
6225 Features["hvx"] = false;
6226 Features["hvx-double"] = false;
6227
6228 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
6229}
6230
6231
6232const char *const HexagonTargetInfo::GCCRegNames[] = {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006233 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6234 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6235 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6236 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
6237 "p0", "p1", "p2", "p3",
6238 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
6239};
6240
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006241ArrayRef<const char*> HexagonTargetInfo::getGCCRegNames() const {
Craig Topperf054e3a2015-10-19 03:52:27 +00006242 return llvm::makeArrayRef(GCCRegNames);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006243}
6244
Tony Linthicum76329bf2011-12-12 21:14:55 +00006245const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
6246 { { "sp" }, "r29" },
6247 { { "fp" }, "r30" },
6248 { { "lr" }, "r31" },
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006249};
Tony Linthicum76329bf2011-12-12 21:14:55 +00006250
Craig Topperf054e3a2015-10-19 03:52:27 +00006251ArrayRef<TargetInfo::GCCRegAlias> HexagonTargetInfo::getGCCRegAliases() const {
6252 return llvm::makeArrayRef(GCCRegAliases);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006253}
6254
6255
6256const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00006257#define BUILTIN(ID, TYPE, ATTRS) \
6258 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
6259#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
6260 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tony Linthicum76329bf2011-12-12 21:14:55 +00006261#include "clang/Basic/BuiltinsHexagon.def"
6262};
Tony Linthicum76329bf2011-12-12 21:14:55 +00006263
Jacques Pienaard964cc22016-03-28 21:02:54 +00006264class LanaiTargetInfo : public TargetInfo {
6265 // Class for Lanai (32-bit).
6266 // The CPU profiles supported by the Lanai backend
6267 enum CPUKind {
6268 CK_NONE,
6269 CK_V11,
6270 } CPU;
6271
6272 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6273 static const char *const GCCRegNames[];
6274
6275public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006276 LanaiTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6277 : TargetInfo(Triple) {
Jacques Pienaard964cc22016-03-28 21:02:54 +00006278 // Description string has to be kept in sync with backend.
6279 resetDataLayout("E" // Big endian
6280 "-m:e" // ELF name manging
6281 "-p:32:32" // 32 bit pointers, 32 bit aligned
6282 "-i64:64" // 64 bit integers, 64 bit aligned
6283 "-a:0:32" // 32 bit alignment of objects of aggregate type
6284 "-n32" // 32 bit native integer width
6285 "-S64" // 64 bit natural stack alignment
6286 );
6287
6288 // Setting RegParmMax equal to what mregparm was set to in the old
6289 // toolchain
6290 RegParmMax = 4;
6291
6292 // Set the default CPU to V11
6293 CPU = CK_V11;
6294
6295 // Temporary approach to make everything at least word-aligned and allow for
6296 // safely casting between pointers with different alignment requirements.
6297 // TODO: Remove this when there are no more cast align warnings on the
6298 // firmware.
6299 MinGlobalAlign = 32;
6300 }
6301
6302 void getTargetDefines(const LangOptions &Opts,
6303 MacroBuilder &Builder) const override {
6304 // Define __lanai__ when building for target lanai.
6305 Builder.defineMacro("__lanai__");
6306
6307 // Set define for the CPU specified.
6308 switch (CPU) {
6309 case CK_V11:
6310 Builder.defineMacro("__LANAI_V11__");
6311 break;
6312 case CK_NONE:
6313 llvm_unreachable("Unhandled target CPU");
6314 }
6315 }
6316
6317 bool setCPU(const std::string &Name) override {
6318 CPU = llvm::StringSwitch<CPUKind>(Name)
6319 .Case("v11", CK_V11)
6320 .Default(CK_NONE);
6321
6322 return CPU != CK_NONE;
6323 }
6324
6325 bool hasFeature(StringRef Feature) const override {
6326 return llvm::StringSwitch<bool>(Feature).Case("lanai", true).Default(false);
6327 }
6328
6329 ArrayRef<const char *> getGCCRegNames() const override;
6330
6331 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
6332
6333 BuiltinVaListKind getBuiltinVaListKind() const override {
6334 return TargetInfo::VoidPtrBuiltinVaList;
6335 }
6336
6337 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
6338
6339 bool validateAsmConstraint(const char *&Name,
6340 TargetInfo::ConstraintInfo &info) const override {
6341 return false;
6342 }
6343
6344 const char *getClobbers() const override { return ""; }
6345};
6346
6347const char *const LanaiTargetInfo::GCCRegNames[] = {
6348 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10",
6349 "r11", "r12", "r13", "r14", "r15", "r16", "r17", "r18", "r19", "r20", "r21",
6350 "r22", "r23", "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"};
6351
6352ArrayRef<const char *> LanaiTargetInfo::getGCCRegNames() const {
6353 return llvm::makeArrayRef(GCCRegNames);
6354}
6355
6356const TargetInfo::GCCRegAlias LanaiTargetInfo::GCCRegAliases[] = {
6357 {{"pc"}, "r2"},
6358 {{"sp"}, "r4"},
6359 {{"fp"}, "r5"},
6360 {{"rv"}, "r8"},
6361 {{"rr1"}, "r10"},
6362 {{"rr2"}, "r11"},
6363 {{"rca"}, "r15"},
6364};
6365
6366ArrayRef<TargetInfo::GCCRegAlias> LanaiTargetInfo::getGCCRegAliases() const {
6367 return llvm::makeArrayRef(GCCRegAliases);
6368}
6369
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006370// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
6371class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00006372 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6373 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006374 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00006375public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006376 SparcTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
James Y Knighta3518ad2016-01-27 01:04:51 +00006377 : TargetInfo(Triple), SoftFloat(false) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006378
Joerg Sonnenbergerd0be8dc2016-03-07 17:19:15 +00006379 int getEHDataRegisterNumber(unsigned RegNo) const override {
6380 if (RegNo == 0) return 24;
6381 if (RegNo == 1) return 25;
6382 return -1;
6383 }
6384
Craig Topper3164f332014-03-11 03:39:26 +00006385 bool handleTargetFeatures(std::vector<std::string> &Features,
6386 DiagnosticsEngine &Diags) override {
Jacob Baungard Hansen13a49372016-05-24 08:30:08 +00006387 // Check if software floating point is enabled
Eric Christopherfb481a42015-04-29 23:32:17 +00006388 auto Feature = std::find(Features.begin(), Features.end(), "+soft-float");
6389 if (Feature != Features.end()) {
6390 SoftFloat = true;
Eric Christopherfb481a42015-04-29 23:32:17 +00006391 }
Rafael Espindolaeb265472013-08-21 21:59:03 +00006392 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006393 }
Craig Topper3164f332014-03-11 03:39:26 +00006394 void getTargetDefines(const LangOptions &Opts,
6395 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006396 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006397 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006398
6399 if (SoftFloat)
6400 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00006401 }
Craig Topper3164f332014-03-11 03:39:26 +00006402
6403 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006404 return llvm::StringSwitch<bool>(Feature)
6405 .Case("softfloat", SoftFloat)
6406 .Case("sparc", true)
6407 .Default(false);
6408 }
Craig Topper3164f332014-03-11 03:39:26 +00006409
Chris Dewhurst0381cd72016-06-15 12:44:47 +00006410 bool hasSjLjLowering() const override {
6411 return true;
6412 }
6413
Craig Topper6c03a542015-10-19 04:51:35 +00006414 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006415 // FIXME: Implement!
Craig Topper6c03a542015-10-19 04:51:35 +00006416 return None;
Gabor Greif49991682008-02-21 16:29:08 +00006417 }
Craig Topper3164f332014-03-11 03:39:26 +00006418 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006419 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00006420 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006421 ArrayRef<const char *> getGCCRegNames() const override;
6422 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00006423 bool validateAsmConstraint(const char *&Name,
6424 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006425 // FIXME: Implement!
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00006426 switch (*Name) {
6427 case 'I': // Signed 13-bit constant
6428 case 'J': // Zero
6429 case 'K': // 32-bit constant with the low 12 bits clear
6430 case 'L': // A constant in the range supported by movcc (11-bit signed imm)
6431 case 'M': // A constant in the range supported by movrcc (19-bit signed imm)
6432 case 'N': // Same as 'K' but zext (required for SIMode)
6433 case 'O': // The constant 4096
6434 return true;
6435 }
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006436 return false;
Gabor Greif49991682008-02-21 16:29:08 +00006437 }
Craig Topper3164f332014-03-11 03:39:26 +00006438 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006439 // FIXME: Implement!
6440 return "";
Gabor Greif49991682008-02-21 16:29:08 +00006441 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006442
6443 // No Sparc V7 for now, the backend doesn't support it anyway.
6444 enum CPUKind {
6445 CK_GENERIC,
6446 CK_V8,
6447 CK_SUPERSPARC,
6448 CK_SPARCLITE,
6449 CK_F934,
6450 CK_HYPERSPARC,
6451 CK_SPARCLITE86X,
6452 CK_SPARCLET,
6453 CK_TSC701,
6454 CK_V9,
6455 CK_ULTRASPARC,
6456 CK_ULTRASPARC3,
6457 CK_NIAGARA,
6458 CK_NIAGARA2,
6459 CK_NIAGARA3,
Douglas Katzman6871afc2016-03-15 22:34:02 +00006460 CK_NIAGARA4,
6461 CK_MYRIAD2_1,
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006462 CK_MYRIAD2_2,
6463 CK_LEON2,
6464 CK_LEON2_AT697E,
6465 CK_LEON2_AT697F,
6466 CK_LEON3,
6467 CK_LEON3_UT699,
6468 CK_LEON3_GR712RC,
6469 CK_LEON4,
6470 CK_LEON4_GR740
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006471 } CPU = CK_GENERIC;
6472
6473 enum CPUGeneration {
6474 CG_V8,
6475 CG_V9,
6476 };
6477
6478 CPUGeneration getCPUGeneration(CPUKind Kind) const {
6479 switch (Kind) {
6480 case CK_GENERIC:
6481 case CK_V8:
6482 case CK_SUPERSPARC:
6483 case CK_SPARCLITE:
6484 case CK_F934:
6485 case CK_HYPERSPARC:
6486 case CK_SPARCLITE86X:
6487 case CK_SPARCLET:
6488 case CK_TSC701:
Douglas Katzman6871afc2016-03-15 22:34:02 +00006489 case CK_MYRIAD2_1:
6490 case CK_MYRIAD2_2:
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006491 case CK_LEON2:
6492 case CK_LEON2_AT697E:
6493 case CK_LEON2_AT697F:
6494 case CK_LEON3:
6495 case CK_LEON3_UT699:
6496 case CK_LEON3_GR712RC:
6497 case CK_LEON4:
6498 case CK_LEON4_GR740:
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006499 return CG_V8;
6500 case CK_V9:
6501 case CK_ULTRASPARC:
6502 case CK_ULTRASPARC3:
6503 case CK_NIAGARA:
6504 case CK_NIAGARA2:
6505 case CK_NIAGARA3:
6506 case CK_NIAGARA4:
6507 return CG_V9;
6508 }
Aaron Ballmana9a72852015-11-11 13:42:02 +00006509 llvm_unreachable("Unexpected CPU kind");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006510 }
6511
6512 CPUKind getCPUKind(StringRef Name) const {
6513 return llvm::StringSwitch<CPUKind>(Name)
6514 .Case("v8", CK_V8)
6515 .Case("supersparc", CK_SUPERSPARC)
6516 .Case("sparclite", CK_SPARCLITE)
6517 .Case("f934", CK_F934)
6518 .Case("hypersparc", CK_HYPERSPARC)
6519 .Case("sparclite86x", CK_SPARCLITE86X)
6520 .Case("sparclet", CK_SPARCLET)
6521 .Case("tsc701", CK_TSC701)
6522 .Case("v9", CK_V9)
6523 .Case("ultrasparc", CK_ULTRASPARC)
6524 .Case("ultrasparc3", CK_ULTRASPARC3)
6525 .Case("niagara", CK_NIAGARA)
6526 .Case("niagara2", CK_NIAGARA2)
6527 .Case("niagara3", CK_NIAGARA3)
6528 .Case("niagara4", CK_NIAGARA4)
Douglas Katzman6871afc2016-03-15 22:34:02 +00006529 .Case("myriad2", CK_MYRIAD2_1)
6530 .Case("myriad2.1", CK_MYRIAD2_1)
6531 .Case("myriad2.2", CK_MYRIAD2_2)
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006532 .Case("leon2", CK_LEON2)
6533 .Case("at697e", CK_LEON2_AT697E)
6534 .Case("at697f", CK_LEON2_AT697F)
6535 .Case("leon3", CK_LEON3)
6536 .Case("ut699", CK_LEON3_UT699)
6537 .Case("gr712rc", CK_LEON3_GR712RC)
6538 .Case("leon4", CK_LEON4)
6539 .Case("gr740", CK_LEON4_GR740)
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006540 .Default(CK_GENERIC);
6541 }
6542
6543 bool setCPU(const std::string &Name) override {
6544 CPU = getCPUKind(Name);
6545 return CPU != CK_GENERIC;
6546 }
Gabor Greif49991682008-02-21 16:29:08 +00006547};
6548
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006549const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00006550 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6551 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6552 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6553 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
6554};
6555
Craig Topperf054e3a2015-10-19 03:52:27 +00006556ArrayRef<const char *> SparcTargetInfo::getGCCRegNames() const {
6557 return llvm::makeArrayRef(GCCRegNames);
Chris Lattner9b415d62009-01-27 01:58:38 +00006558}
6559
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006560const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00006561 { { "g0" }, "r0" },
6562 { { "g1" }, "r1" },
6563 { { "g2" }, "r2" },
6564 { { "g3" }, "r3" },
6565 { { "g4" }, "r4" },
6566 { { "g5" }, "r5" },
6567 { { "g6" }, "r6" },
6568 { { "g7" }, "r7" },
6569 { { "o0" }, "r8" },
6570 { { "o1" }, "r9" },
6571 { { "o2" }, "r10" },
6572 { { "o3" }, "r11" },
6573 { { "o4" }, "r12" },
6574 { { "o5" }, "r13" },
6575 { { "o6", "sp" }, "r14" },
6576 { { "o7" }, "r15" },
6577 { { "l0" }, "r16" },
6578 { { "l1" }, "r17" },
6579 { { "l2" }, "r18" },
6580 { { "l3" }, "r19" },
6581 { { "l4" }, "r20" },
6582 { { "l5" }, "r21" },
6583 { { "l6" }, "r22" },
6584 { { "l7" }, "r23" },
6585 { { "i0" }, "r24" },
6586 { { "i1" }, "r25" },
6587 { { "i2" }, "r26" },
6588 { { "i3" }, "r27" },
6589 { { "i4" }, "r28" },
6590 { { "i5" }, "r29" },
6591 { { "i6", "fp" }, "r30" },
6592 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00006593};
6594
Craig Topperf054e3a2015-10-19 03:52:27 +00006595ArrayRef<TargetInfo::GCCRegAlias> SparcTargetInfo::getGCCRegAliases() const {
6596 return llvm::makeArrayRef(GCCRegAliases);
Chris Lattner9b415d62009-01-27 01:58:38 +00006597}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006598
6599// SPARC v8 is the 32-bit mode selected by Triple::sparc.
6600class SparcV8TargetInfo : public SparcTargetInfo {
6601public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006602 SparcV8TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6603 : SparcTargetInfo(Triple, Opts) {
James Y Knightb214cbc2016-03-04 19:00:41 +00006604 resetDataLayout("E-m:e-p:32:32-i64:64-f128:64-n32-S64");
Brad Smith73859112015-08-13 21:45:57 +00006605 // NetBSD / OpenBSD use long (same as llvm default); everyone else uses int.
6606 switch (getTriple().getOS()) {
6607 default:
James Y Knight4b4d19e2015-06-04 15:36:29 +00006608 SizeType = UnsignedInt;
6609 IntPtrType = SignedInt;
6610 PtrDiffType = SignedInt;
Brad Smith73859112015-08-13 21:45:57 +00006611 break;
6612 case llvm::Triple::NetBSD:
6613 case llvm::Triple::OpenBSD:
6614 SizeType = UnsignedLong;
6615 IntPtrType = SignedLong;
6616 PtrDiffType = SignedLong;
6617 break;
Brad Smith56495d52015-08-13 22:00:53 +00006618 }
Chris Dewhurst7cc4cfe2016-06-28 12:55:55 +00006619 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006620 }
6621
Craig Topper3164f332014-03-11 03:39:26 +00006622 void getTargetDefines(const LangOptions &Opts,
6623 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006624 SparcTargetInfo::getTargetDefines(Opts, Builder);
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006625 switch (getCPUGeneration(CPU)) {
6626 case CG_V8:
6627 Builder.defineMacro("__sparcv8");
6628 if (getTriple().getOS() != llvm::Triple::Solaris)
6629 Builder.defineMacro("__sparcv8__");
6630 break;
6631 case CG_V9:
6632 Builder.defineMacro("__sparcv9");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00006633 if (getTriple().getOS() != llvm::Triple::Solaris) {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006634 Builder.defineMacro("__sparcv9__");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00006635 Builder.defineMacro("__sparc_v9__");
6636 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006637 break;
6638 }
Douglas Katzman6871afc2016-03-15 22:34:02 +00006639 if (getTriple().getVendor() == llvm::Triple::Myriad) {
6640 switch (CPU) {
6641 case CK_MYRIAD2_1:
6642 Builder.defineMacro("__myriad2", "1");
6643 Builder.defineMacro("__myriad2__", "1");
6644 break;
6645 case CK_MYRIAD2_2:
6646 Builder.defineMacro("__myriad2", "2");
6647 Builder.defineMacro("__myriad2__", "2");
6648 break;
6649 default:
6650 break;
6651 }
6652 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006653 }
Chris Dewhurst69fa1922016-05-04 09:33:30 +00006654
6655 bool hasSjLjLowering() const override {
6656 return true;
6657 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006658};
6659
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006660// SPARCV8el is the 32-bit little-endian mode selected by Triple::sparcel.
6661class SparcV8elTargetInfo : public SparcV8TargetInfo {
6662 public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006663 SparcV8elTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6664 : SparcV8TargetInfo(Triple, Opts) {
6665 resetDataLayout("e-m:e-p:32:32-i64:64-f128:64-n32-S64");
6666 BigEndian = false;
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006667 }
6668};
6669
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006670// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
6671class SparcV9TargetInfo : public SparcTargetInfo {
6672public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006673 SparcV9TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6674 : SparcTargetInfo(Triple, Opts) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006675 // FIXME: Support Sparc quad-precision long double?
James Y Knightb214cbc2016-03-04 19:00:41 +00006676 resetDataLayout("E-m:e-i64:64-n32:64-S128");
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00006677 // This is an LP64 platform.
6678 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006679
6680 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00006681 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006682 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00006683 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006684 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006685 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00006686
6687 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
6688 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
6689 LongDoubleWidth = 128;
6690 LongDoubleAlign = 128;
6691 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00006692 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006693 }
6694
Craig Topper3164f332014-03-11 03:39:26 +00006695 void getTargetDefines(const LangOptions &Opts,
6696 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006697 SparcTargetInfo::getTargetDefines(Opts, Builder);
6698 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00006699 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00006700 // Solaris doesn't need these variants, but the BSDs do.
6701 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00006702 Builder.defineMacro("__sparc64__");
6703 Builder.defineMacro("__sparc_v9__");
6704 Builder.defineMacro("__sparcv9__");
6705 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006706 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00006707
Craig Topper3164f332014-03-11 03:39:26 +00006708 bool setCPU(const std::string &Name) override {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006709 if (!SparcTargetInfo::setCPU(Name))
6710 return false;
6711 return getCPUGeneration(CPU) == CG_V9;
Roman Divackyb1ae3d42014-02-25 18:35:30 +00006712 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006713};
6714
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006715class SystemZTargetInfo : public TargetInfo {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006716 static const Builtin::Info BuiltinInfo[];
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006717 static const char *const GCCRegNames[];
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006718 std::string CPU;
6719 bool HasTransactionalExecution;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006720 bool HasVector;
Ulrich Weigand47445072013-05-06 16:26:41 +00006721
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006722public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006723 SystemZTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Eric Christopherb093d692015-10-09 18:39:59 +00006724 : TargetInfo(Triple), CPU("z10"), HasTransactionalExecution(false),
6725 HasVector(false) {
Ulrich Weigand881497a2015-03-30 13:50:21 +00006726 IntMaxType = SignedLong;
6727 Int64Type = SignedLong;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006728 TLSSupported = true;
6729 IntWidth = IntAlign = 32;
6730 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
6731 PointerWidth = PointerAlign = 64;
6732 LongDoubleWidth = 128;
6733 LongDoubleAlign = 64;
6734 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Ulrich Weigandca3cb7f2015-04-21 17:29:35 +00006735 DefaultAlignForAttributeAligned = 64;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006736 MinGlobalAlign = 16;
James Y Knightb214cbc2016-03-04 19:00:41 +00006737 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 +00006738 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
6739 }
6740 void getTargetDefines(const LangOptions &Opts,
6741 MacroBuilder &Builder) const override {
6742 Builder.defineMacro("__s390__");
6743 Builder.defineMacro("__s390x__");
6744 Builder.defineMacro("__zarch__");
6745 Builder.defineMacro("__LONG_DOUBLE_128__");
Ulrich Weigandb038a522016-02-05 21:34:28 +00006746
6747 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
6748 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
6749 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
6750 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
6751
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006752 if (HasTransactionalExecution)
6753 Builder.defineMacro("__HTM__");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00006754 if (Opts.ZVector)
6755 Builder.defineMacro("__VEC__", "10301");
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006756 }
Craig Topper6c03a542015-10-19 04:51:35 +00006757 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6758 return llvm::makeArrayRef(BuiltinInfo,
6759 clang::SystemZ::LastTSBuiltin-Builtin::FirstTSBuiltin);
Ulrich Weigand47445072013-05-06 16:26:41 +00006760 }
6761
Craig Topperf054e3a2015-10-19 03:52:27 +00006762 ArrayRef<const char *> getGCCRegNames() const override;
6763 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006764 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00006765 return None;
Ulrich Weigand47445072013-05-06 16:26:41 +00006766 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006767 bool validateAsmConstraint(const char *&Name,
6768 TargetInfo::ConstraintInfo &info) const override;
6769 const char *getClobbers() const override {
6770 // FIXME: Is this really right?
6771 return "";
6772 }
6773 BuiltinVaListKind getBuiltinVaListKind() const override {
6774 return TargetInfo::SystemZBuiltinVaList;
6775 }
6776 bool setCPU(const std::string &Name) override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006777 CPU = Name;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006778 bool CPUKnown = llvm::StringSwitch<bool>(Name)
6779 .Case("z10", true)
6780 .Case("z196", true)
6781 .Case("zEC12", true)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006782 .Case("z13", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006783 .Default(false);
6784
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006785 return CPUKnown;
6786 }
Eric Christopher8c47b422015-10-09 18:39:55 +00006787 bool
6788 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6789 StringRef CPU,
6790 const std::vector<std::string> &FeaturesVec) const override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006791 if (CPU == "zEC12")
6792 Features["transactional-execution"] = true;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006793 if (CPU == "z13") {
6794 Features["transactional-execution"] = true;
6795 Features["vector"] = true;
6796 }
Eric Christopher007b0a02015-08-28 22:32:01 +00006797 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006798 }
6799
6800 bool handleTargetFeatures(std::vector<std::string> &Features,
6801 DiagnosticsEngine &Diags) override {
6802 HasTransactionalExecution = false;
Eric Christopher610fe112015-08-26 08:21:55 +00006803 for (const auto &Feature : Features) {
6804 if (Feature == "+transactional-execution")
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006805 HasTransactionalExecution = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006806 else if (Feature == "+vector")
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006807 HasVector = true;
6808 }
6809 // If we use the vector ABI, vector types are 64-bit aligned.
6810 if (HasVector) {
6811 MaxVectorAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00006812 resetDataLayout("E-m:e-i1:8:16-i8:8:16-i64:64-f128:64"
6813 "-v128:64-a:8:16-n32:64");
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006814 }
6815 return true;
6816 }
6817
6818 bool hasFeature(StringRef Feature) const override {
6819 return llvm::StringSwitch<bool>(Feature)
Ulrich Weigandcc673442015-04-01 14:15:35 +00006820 .Case("systemz", true)
6821 .Case("htm", HasTransactionalExecution)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006822 .Case("vx", HasVector)
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006823 .Default(false);
6824 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006825
Bryan Chane3f1ed52016-04-28 13:56:43 +00006826 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
6827 switch (CC) {
6828 case CC_C:
6829 case CC_Swift:
6830 return CCCR_OK;
6831 default:
6832 return CCCR_Warning;
6833 }
6834 }
6835
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006836 StringRef getABI() const override {
6837 if (HasVector)
6838 return "vector";
6839 return "";
6840 }
Ulrich Weigand47fd2532015-06-16 15:21:47 +00006841
6842 bool useFloat128ManglingForLongDouble() const override {
6843 return true;
6844 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006845};
6846
6847const Builtin::Info SystemZTargetInfo::BuiltinInfo[] = {
6848#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006849 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Jonas Paulsson3ace74a2016-03-30 15:51:24 +00006850#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
6851 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006852#include "clang/Basic/BuiltinsSystemZ.def"
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006853};
6854
6855const char *const SystemZTargetInfo::GCCRegNames[] = {
6856 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6857 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6858 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
6859 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
6860};
6861
Craig Topperf054e3a2015-10-19 03:52:27 +00006862ArrayRef<const char *> SystemZTargetInfo::getGCCRegNames() const {
6863 return llvm::makeArrayRef(GCCRegNames);
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006864}
6865
6866bool SystemZTargetInfo::
6867validateAsmConstraint(const char *&Name,
6868 TargetInfo::ConstraintInfo &Info) const {
6869 switch (*Name) {
6870 default:
6871 return false;
6872
6873 case 'a': // Address register
6874 case 'd': // Data register (equivalent to 'r')
6875 case 'f': // Floating-point register
6876 Info.setAllowsRegister();
6877 return true;
6878
6879 case 'I': // Unsigned 8-bit constant
6880 case 'J': // Unsigned 12-bit constant
6881 case 'K': // Signed 16-bit constant
6882 case 'L': // Signed 20-bit displacement (on all targets we support)
6883 case 'M': // 0x7fffffff
6884 return true;
6885
6886 case 'Q': // Memory with base and unsigned 12-bit displacement
6887 case 'R': // Likewise, plus an index
6888 case 'S': // Memory with base and signed 20-bit displacement
6889 case 'T': // Likewise, plus an index
6890 Info.setAllowsMemory();
6891 return true;
6892 }
6893}
Ulrich Weigand47445072013-05-06 16:26:41 +00006894
Eric Christopherc48497a2015-09-18 21:26:24 +00006895class MSP430TargetInfo : public TargetInfo {
6896 static const char *const GCCRegNames[];
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006897
Eric Christopherc48497a2015-09-18 21:26:24 +00006898public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006899 MSP430TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6900 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00006901 BigEndian = false;
6902 TLSSupported = false;
6903 IntWidth = 16;
6904 IntAlign = 16;
6905 LongWidth = 32;
6906 LongLongWidth = 64;
6907 LongAlign = LongLongAlign = 16;
6908 PointerWidth = 16;
6909 PointerAlign = 16;
6910 SuitableAlign = 16;
6911 SizeType = UnsignedInt;
6912 IntMaxType = SignedLongLong;
6913 IntPtrType = SignedInt;
6914 PtrDiffType = SignedInt;
6915 SigAtomicType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00006916 resetDataLayout("e-m:e-p:16:16-i32:16:32-a:16-n8:16");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006917 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006918 void getTargetDefines(const LangOptions &Opts,
6919 MacroBuilder &Builder) const override {
6920 Builder.defineMacro("MSP430");
6921 Builder.defineMacro("__MSP430__");
6922 // FIXME: defines for different 'flavours' of MCU
6923 }
Craig Topper6c03a542015-10-19 04:51:35 +00006924 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00006925 // FIXME: Implement.
Craig Topper6c03a542015-10-19 04:51:35 +00006926 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00006927 }
6928 bool hasFeature(StringRef Feature) const override {
6929 return Feature == "msp430";
6930 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006931 ArrayRef<const char *> getGCCRegNames() const override;
6932 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00006933 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00006934 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00006935 }
6936 bool validateAsmConstraint(const char *&Name,
6937 TargetInfo::ConstraintInfo &info) const override {
6938 // FIXME: implement
6939 switch (*Name) {
6940 case 'K': // the constant 1
6941 case 'L': // constant -1^20 .. 1^19
6942 case 'M': // constant 1-4:
Eli Friedmana9c3d712009-08-19 20:47:07 +00006943 return true;
6944 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006945 // No target constraints for now.
6946 return false;
6947 }
6948 const char *getClobbers() const override {
6949 // FIXME: Is this really right?
6950 return "";
6951 }
6952 BuiltinVaListKind getBuiltinVaListKind() const override {
6953 // FIXME: implement
6954 return TargetInfo::CharPtrBuiltinVaList;
6955 }
6956};
6957
6958const char *const MSP430TargetInfo::GCCRegNames[] = {
6959 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6960 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"};
6961
Craig Topperf054e3a2015-10-19 03:52:27 +00006962ArrayRef<const char *> MSP430TargetInfo::getGCCRegNames() const {
6963 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00006964}
6965
6966// LLVM and Clang cannot be used directly to output native binaries for
6967// target, but is used to compile C code to llvm bitcode with correct
6968// type and alignment information.
6969//
6970// TCE uses the llvm bitcode as input and uses it for generating customized
6971// target processor and program binary. TCE co-design environment is
6972// publicly available in http://tce.cs.tut.fi
6973
6974static const unsigned TCEOpenCLAddrSpaceMap[] = {
6975 3, // opencl_global
6976 4, // opencl_local
6977 5, // opencl_constant
6978 // FIXME: generic has to be added to the target
6979 0, // opencl_generic
6980 0, // cuda_device
6981 0, // cuda_constant
6982 0 // cuda_shared
6983};
6984
6985class TCETargetInfo : public TargetInfo {
6986public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006987 TCETargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6988 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00006989 TLSSupported = false;
6990 IntWidth = 32;
6991 LongWidth = LongLongWidth = 32;
6992 PointerWidth = 32;
6993 IntAlign = 32;
6994 LongAlign = LongLongAlign = 32;
6995 PointerAlign = 32;
6996 SuitableAlign = 32;
6997 SizeType = UnsignedInt;
6998 IntMaxType = SignedLong;
6999 IntPtrType = SignedInt;
7000 PtrDiffType = SignedInt;
7001 FloatWidth = 32;
7002 FloatAlign = 32;
7003 DoubleWidth = 32;
7004 DoubleAlign = 32;
7005 LongDoubleWidth = 32;
7006 LongDoubleAlign = 32;
7007 FloatFormat = &llvm::APFloat::IEEEsingle;
7008 DoubleFormat = &llvm::APFloat::IEEEsingle;
7009 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
James Y Knightb214cbc2016-03-04 19:00:41 +00007010 resetDataLayout("E-p:32:32-i8:8:32-i16:16:32-i64:32"
7011 "-f64:32-v64:32-v128:32-a:0:32-n32");
Eric Christopherc48497a2015-09-18 21:26:24 +00007012 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
7013 UseAddrSpaceMapMangling = true;
7014 }
7015
7016 void getTargetDefines(const LangOptions &Opts,
7017 MacroBuilder &Builder) const override {
7018 DefineStd(Builder, "tce", Opts);
7019 Builder.defineMacro("__TCE__");
7020 Builder.defineMacro("__TCE_V1__");
7021 }
7022 bool hasFeature(StringRef Feature) const override { return Feature == "tce"; }
7023
Craig Topper6c03a542015-10-19 04:51:35 +00007024 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007025 const char *getClobbers() const override { return ""; }
7026 BuiltinVaListKind getBuiltinVaListKind() const override {
7027 return TargetInfo::VoidPtrBuiltinVaList;
7028 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007029 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007030 bool validateAsmConstraint(const char *&Name,
7031 TargetInfo::ConstraintInfo &info) const override {
7032 return true;
7033 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007034 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7035 return None;
7036 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007037};
Eli Friedmana9c3d712009-08-19 20:47:07 +00007038
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007039class BPFTargetInfo : public TargetInfo {
7040public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007041 BPFTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7042 : TargetInfo(Triple) {
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007043 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
7044 SizeType = UnsignedLong;
7045 PtrDiffType = SignedLong;
7046 IntPtrType = SignedLong;
7047 IntMaxType = SignedLong;
7048 Int64Type = SignedLong;
7049 RegParmMax = 5;
7050 if (Triple.getArch() == llvm::Triple::bpfeb) {
7051 BigEndian = true;
James Y Knightb214cbc2016-03-04 19:00:41 +00007052 resetDataLayout("E-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007053 } else {
7054 BigEndian = false;
James Y Knightb214cbc2016-03-04 19:00:41 +00007055 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007056 }
7057 MaxAtomicPromoteWidth = 64;
7058 MaxAtomicInlineWidth = 64;
7059 TLSSupported = false;
7060 }
7061 void getTargetDefines(const LangOptions &Opts,
7062 MacroBuilder &Builder) const override {
7063 DefineStd(Builder, "bpf", Opts);
7064 Builder.defineMacro("__BPF__");
7065 }
7066 bool hasFeature(StringRef Feature) const override {
7067 return Feature == "bpf";
7068 }
7069
Craig Topper6c03a542015-10-19 04:51:35 +00007070 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007071 const char *getClobbers() const override {
7072 return "";
7073 }
7074 BuiltinVaListKind getBuiltinVaListKind() const override {
7075 return TargetInfo::VoidPtrBuiltinVaList;
7076 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007077 ArrayRef<const char *> getGCCRegNames() const override {
7078 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007079 }
7080 bool validateAsmConstraint(const char *&Name,
7081 TargetInfo::ConstraintInfo &info) const override {
7082 return true;
7083 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007084 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7085 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007086 }
7087};
7088
Daniel Sanders4672af62016-05-27 11:51:02 +00007089class MipsTargetInfo : public TargetInfo {
7090 void setDataLayout() {
Daniel Sanders55e40692016-06-03 10:11:01 +00007091 StringRef Layout;
7092
7093 if (ABI == "o32")
7094 Layout = "m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
7095 else if (ABI == "n32")
7096 Layout = "m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32:64-S128";
7097 else if (ABI == "n64")
7098 Layout = "m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
7099 else
7100 llvm_unreachable("Invalid ABI");
7101
7102 if (BigEndian)
7103 resetDataLayout(("E-" + Layout).str());
7104 else
7105 resetDataLayout(("e-" + Layout).str());
Daniel Sanders4672af62016-05-27 11:51:02 +00007106 }
7107
Akira Hatanaka9064e362013-10-29 18:30:33 +00007108
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00007109 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007110 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00007111 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00007112 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007113 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00007114 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007115 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00007116 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007117 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007118 enum DspRevEnum {
7119 NoDSP, DSP1, DSP2
7120 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00007121 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007122
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007123protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00007124 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007125 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007126
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007127public:
Daniel Sanders4672af62016-05-27 11:51:02 +00007128 MipsTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007129 : TargetInfo(Triple), IsMips16(false), IsMicromips(false),
7130 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
7131 DspRev(NoDSP), HasMSA(false), HasFP64(false) {
Zoran Jovanovic26a12162015-02-18 15:21:35 +00007132 TheCXXABI.set(TargetCXXABI::GenericMIPS);
Daniel Sanders4672af62016-05-27 11:51:02 +00007133 BigEndian = getTriple().getArch() == llvm::Triple::mips ||
7134 getTriple().getArch() == llvm::Triple::mips64;
7135
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007136 setABI((getTriple().getArch() == llvm::Triple::mips ||
7137 getTriple().getArch() == llvm::Triple::mipsel)
7138 ? "o32"
7139 : "n64");
7140
7141 CPU = ABI == "o32" ? "mips32r2" : "mips64r2";
Zoran Jovanovic26a12162015-02-18 15:21:35 +00007142 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007143
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007144 bool isNaN2008Default() const {
7145 return CPU == "mips32r6" || CPU == "mips64r6";
7146 }
7147
7148 bool isFP64Default() const {
7149 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
7150 }
7151
Petar Jovanovicd55ae6b2015-02-26 18:19:22 +00007152 bool isNan2008() const override {
7153 return IsNan2008;
7154 }
7155
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007156 bool processorSupportsGPR64() const {
7157 return llvm::StringSwitch<bool>(CPU)
7158 .Case("mips3", true)
7159 .Case("mips4", true)
7160 .Case("mips5", true)
7161 .Case("mips64", true)
7162 .Case("mips64r2", true)
7163 .Case("mips64r3", true)
7164 .Case("mips64r5", true)
7165 .Case("mips64r6", true)
7166 .Case("octeon", true)
7167 .Default(false);
7168 return false;
7169 }
7170
Alp Toker4925ba72014-06-07 23:30:42 +00007171 StringRef getABI() const override { return ABI; }
Daniel Sanders4672af62016-05-27 11:51:02 +00007172 bool setABI(const std::string &Name) override {
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007173 if (Name == "o32") {
7174 setO32ABITypes();
7175 ABI = Name;
7176 return true;
Daniel Sanders4672af62016-05-27 11:51:02 +00007177 }
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007178
7179 if (Name == "n32") {
7180 setN32ABITypes();
7181 ABI = Name;
7182 return true;
7183 }
7184 if (Name == "n64") {
7185 setN64ABITypes();
7186 ABI = Name;
7187 return true;
Daniel Sanders4672af62016-05-27 11:51:02 +00007188 }
7189 return false;
7190 }
7191
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007192 void setO32ABITypes() {
7193 Int64Type = SignedLongLong;
7194 IntMaxType = Int64Type;
7195 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
7196 LongDoubleWidth = LongDoubleAlign = 64;
7197 LongWidth = LongAlign = 32;
7198 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
7199 PointerWidth = PointerAlign = 32;
7200 PtrDiffType = SignedInt;
7201 SizeType = UnsignedInt;
7202 SuitableAlign = 64;
7203 }
7204
7205 void setN32N64ABITypes() {
7206 LongDoubleWidth = LongDoubleAlign = 128;
7207 LongDoubleFormat = &llvm::APFloat::IEEEquad;
7208 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
7209 LongDoubleWidth = LongDoubleAlign = 64;
7210 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
7211 }
7212 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
7213 SuitableAlign = 128;
7214 }
7215
Daniel Sanders4672af62016-05-27 11:51:02 +00007216 void setN64ABITypes() {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007217 setN32N64ABITypes();
Daniel Sanders4672af62016-05-27 11:51:02 +00007218 Int64Type = SignedLong;
7219 IntMaxType = Int64Type;
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007220 LongWidth = LongAlign = 64;
7221 PointerWidth = PointerAlign = 64;
7222 PtrDiffType = SignedLong;
7223 SizeType = UnsignedLong;
Daniel Sanders4672af62016-05-27 11:51:02 +00007224 }
7225
7226 void setN32ABITypes() {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007227 setN32N64ABITypes();
Daniel Sanders4672af62016-05-27 11:51:02 +00007228 Int64Type = SignedLongLong;
7229 IntMaxType = Int64Type;
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007230 LongWidth = LongAlign = 32;
7231 PointerWidth = PointerAlign = 32;
7232 PtrDiffType = SignedInt;
7233 SizeType = UnsignedInt;
Daniel Sanders4672af62016-05-27 11:51:02 +00007234 }
7235
Craig Topper3164f332014-03-11 03:39:26 +00007236 bool setCPU(const std::string &Name) override {
Eric Christopher0b26a612010-03-02 02:41:08 +00007237 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007238 return llvm::StringSwitch<bool>(Name)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007239 .Case("mips1", true)
7240 .Case("mips2", true)
Simon Atanasyan26610c52014-07-04 12:36:56 +00007241 .Case("mips3", true)
7242 .Case("mips4", true)
7243 .Case("mips5", true)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007244 .Case("mips32", true)
7245 .Case("mips32r2", true)
7246 .Case("mips32r3", true)
7247 .Case("mips32r5", true)
7248 .Case("mips32r6", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007249 .Case("mips64", true)
7250 .Case("mips64r2", true)
Simon Atanasyan162feb52015-02-20 23:37:40 +00007251 .Case("mips64r3", true)
7252 .Case("mips64r5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007253 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00007254 .Case("octeon", true)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007255 .Case("p5600", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007256 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00007257 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00007258 const std::string& getCPU() const { return CPU; }
Eric Christopher8c47b422015-10-09 18:39:55 +00007259 bool
7260 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7261 StringRef CPU,
7262 const std::vector<std::string> &FeaturesVec) const override {
Bhushan D. Attardebacb988732016-03-04 06:56:29 +00007263 if (CPU.empty())
7264 CPU = getCPU();
Simon Atanasyan4e16a422014-07-04 12:37:04 +00007265 if (CPU == "octeon")
7266 Features["mips64r2"] = Features["cnmips"] = true;
7267 else
7268 Features[CPU] = true;
Eric Christopher007b0a02015-08-28 22:32:01 +00007269 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Eric Christopher0b26a612010-03-02 02:41:08 +00007270 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007271
Craig Topper3164f332014-03-11 03:39:26 +00007272 void getTargetDefines(const LangOptions &Opts,
7273 MacroBuilder &Builder) const override {
Daniel Sanders4672af62016-05-27 11:51:02 +00007274 if (BigEndian) {
7275 DefineStd(Builder, "MIPSEB", Opts);
7276 Builder.defineMacro("_MIPSEB");
7277 } else {
7278 DefineStd(Builder, "MIPSEL", Opts);
7279 Builder.defineMacro("_MIPSEL");
7280 }
7281
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007282 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00007283 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007284 if (Opts.GNUMode)
7285 Builder.defineMacro("mips");
7286
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007287 if (ABI == "o32") {
Daniel Sanders4672af62016-05-27 11:51:02 +00007288 Builder.defineMacro("__mips", "32");
7289 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
7290 } else {
7291 Builder.defineMacro("__mips", "64");
7292 Builder.defineMacro("__mips64");
7293 Builder.defineMacro("__mips64__");
7294 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
7295 }
7296
7297 const std::string ISARev = llvm::StringSwitch<std::string>(getCPU())
7298 .Cases("mips32", "mips64", "1")
7299 .Cases("mips32r2", "mips64r2", "2")
7300 .Cases("mips32r3", "mips64r3", "3")
7301 .Cases("mips32r5", "mips64r5", "5")
7302 .Cases("mips32r6", "mips64r6", "6")
7303 .Default("");
7304 if (!ISARev.empty())
7305 Builder.defineMacro("__mips_isa_rev", ISARev);
7306
7307 if (ABI == "o32") {
7308 Builder.defineMacro("__mips_o32");
7309 Builder.defineMacro("_ABIO32", "1");
7310 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
Daniel Sanders07c86542016-05-27 14:30:23 +00007311 } else if (ABI == "n32") {
Daniel Sanders4672af62016-05-27 11:51:02 +00007312 Builder.defineMacro("__mips_n32");
7313 Builder.defineMacro("_ABIN32", "2");
7314 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
7315 } else if (ABI == "n64") {
7316 Builder.defineMacro("__mips_n64");
7317 Builder.defineMacro("_ABI64", "3");
7318 Builder.defineMacro("_MIPS_SIM", "_ABI64");
7319 } else
7320 llvm_unreachable("Invalid ABI.");
7321
Simon Atanasyan683535b2012-08-29 19:14:58 +00007322 Builder.defineMacro("__REGISTER_PREFIX__", "");
7323
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007324 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007325 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00007326 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007327 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007328 case SoftFloat:
7329 Builder.defineMacro("__mips_soft_float", Twine(1));
7330 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00007331 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00007332
Simon Atanasyan16071912013-04-14 14:07:30 +00007333 if (IsSingleFloat)
7334 Builder.defineMacro("__mips_single_float", Twine(1));
7335
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007336 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
7337 Builder.defineMacro("_MIPS_FPSET",
7338 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
7339
Simon Atanasyan72244b62012-07-05 16:06:06 +00007340 if (IsMips16)
7341 Builder.defineMacro("__mips16", Twine(1));
7342
Simon Atanasyan60777612013-04-14 14:07:51 +00007343 if (IsMicromips)
7344 Builder.defineMacro("__mips_micromips", Twine(1));
7345
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007346 if (IsNan2008)
7347 Builder.defineMacro("__mips_nan2008", Twine(1));
7348
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007349 switch (DspRev) {
7350 default:
7351 break;
7352 case DSP1:
7353 Builder.defineMacro("__mips_dsp_rev", Twine(1));
7354 Builder.defineMacro("__mips_dsp", Twine(1));
7355 break;
7356 case DSP2:
7357 Builder.defineMacro("__mips_dsp_rev", Twine(2));
7358 Builder.defineMacro("__mips_dspr2", Twine(1));
7359 Builder.defineMacro("__mips_dsp", Twine(1));
7360 break;
7361 }
7362
Jack Carter44ff1e52013-08-12 17:20:29 +00007363 if (HasMSA)
7364 Builder.defineMacro("__mips_msa", Twine(1));
7365
Simon Atanasyan26f19672012-04-05 19:28:31 +00007366 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
7367 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
7368 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00007369
7370 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
7371 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Daniel Sanders5176f7e2015-12-22 12:59:30 +00007372
7373 // These shouldn't be defined for MIPS-I but there's no need to check
7374 // for that since MIPS-I isn't supported.
7375 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
7376 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
7377 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007378
7379 // 32-bit MIPS processors don't have the necessary lld/scd instructions
7380 // found in 64-bit processors. In the case of O32 on a 64-bit processor,
7381 // the instructions exist but using them violates the ABI since they
7382 // require 64-bit GPRs and O32 only supports 32-bit GPRs.
7383 if (ABI == "n32" || ABI == "n64")
Daniel Sanders4672af62016-05-27 11:51:02 +00007384 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007385 }
7386
Craig Topper6c03a542015-10-19 04:51:35 +00007387 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7388 return llvm::makeArrayRef(BuiltinInfo,
7389 clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin);
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007390 }
Craig Topper3164f332014-03-11 03:39:26 +00007391 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00007392 return llvm::StringSwitch<bool>(Feature)
7393 .Case("mips", true)
7394 .Case("fp64", HasFP64)
7395 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00007396 }
Craig Topper3164f332014-03-11 03:39:26 +00007397 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00007398 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007399 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007400 ArrayRef<const char *> getGCCRegNames() const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00007401 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00007402 // CPU register names
7403 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007404 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
7405 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
7406 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00007407 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
7408 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007409 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
7410 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
7411 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
7412 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00007413 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007414 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Hrvoje Varga14c42ee2016-03-29 12:46:16 +00007415 "$fcc5","$fcc6","$fcc7","$ac1hi","$ac1lo","$ac2hi","$ac2lo",
7416 "$ac3hi","$ac3lo",
Daniel Sanders8b59af12013-11-12 12:56:01 +00007417 // MSA register names
7418 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
7419 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
7420 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
7421 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
7422 // MSA control register names
7423 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
7424 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007425 };
Craig Topperf054e3a2015-10-19 03:52:27 +00007426 return llvm::makeArrayRef(GCCRegNames);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007427 }
Craig Topper3164f332014-03-11 03:39:26 +00007428 bool validateAsmConstraint(const char *&Name,
7429 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007430 switch (*Name) {
7431 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00007432 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007433 case 'r': // CPU registers.
7434 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00007435 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007436 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00007437 case 'c': // $25 for indirect jumps
7438 case 'l': // lo register
7439 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007440 Info.setAllowsRegister();
7441 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00007442 case 'I': // Signed 16-bit constant
7443 case 'J': // Integer 0
7444 case 'K': // Unsigned 16-bit constant
7445 case 'L': // Signed 32-bit constant, lower 16-bit zeros (for lui)
7446 case 'M': // Constants not loadable via lui, addiu, or ori
7447 case 'N': // Constant -1 to -65535
7448 case 'O': // A signed 15-bit constant
7449 case 'P': // A constant between 1 go 65535
7450 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00007451 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00007452 Info.setAllowsMemory();
7453 return true;
Daniel Sanders48fa39e2015-03-30 13:47:23 +00007454 case 'Z':
7455 if (Name[1] == 'C') { // An address usable by ll, and sc.
7456 Info.setAllowsMemory();
7457 Name++; // Skip over 'Z'.
7458 return true;
7459 }
7460 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007461 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007462 }
7463
Daniel Sanders48fa39e2015-03-30 13:47:23 +00007464 std::string convertConstraint(const char *&Constraint) const override {
7465 std::string R;
7466 switch (*Constraint) {
7467 case 'Z': // Two-character constraint; add "^" hint for later parsing.
7468 if (Constraint[1] == 'C') {
7469 R = std::string("^") + std::string(Constraint, 2);
7470 Constraint++;
7471 return R;
7472 }
7473 break;
7474 }
7475 return TargetInfo::convertConstraint(Constraint);
7476 }
7477
Craig Topper3164f332014-03-11 03:39:26 +00007478 const char *getClobbers() const override {
Toma Tabacucfab40f2015-01-12 14:41:30 +00007479 // In GCC, $1 is not widely used in generated code (it's used only in a few
7480 // specific situations), so there is no real need for users to add it to
7481 // the clobbers list if they want to use it in their inline assembly code.
7482 //
7483 // In LLVM, $1 is treated as a normal GPR and is always allocatable during
7484 // code generation, so using it in inline assembly without adding it to the
7485 // clobbers list can cause conflicts between the inline assembly code and
7486 // the surrounding generated code.
7487 //
7488 // Another problem is that LLVM is allowed to choose $1 for inline assembly
7489 // operands, which will conflict with the ".set at" assembler option (which
7490 // we use only for inline assembly, in order to maintain compatibility with
7491 // GCC) and will also conflict with the user's usage of $1.
7492 //
7493 // The easiest way to avoid these conflicts and keep $1 as an allocatable
7494 // register for generated code is to automatically clobber $1 for all inline
7495 // assembly code.
7496 //
7497 // FIXME: We should automatically clobber $1 only for inline assembly code
7498 // which actually uses it. This would allow LLVM to use $1 for inline
7499 // assembly operands if the user's assembly code doesn't use it.
Toma Tabacu99411952014-12-17 12:02:58 +00007500 return "~{$1}";
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007501 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007502
Craig Topper3164f332014-03-11 03:39:26 +00007503 bool handleTargetFeatures(std::vector<std::string> &Features,
7504 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00007505 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00007506 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007507 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00007508 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007509 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007510 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007511 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007512
Eric Christopher610fe112015-08-26 08:21:55 +00007513 for (const auto &Feature : Features) {
7514 if (Feature == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00007515 IsSingleFloat = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007516 else if (Feature == "+soft-float")
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007517 FloatABI = SoftFloat;
Eric Christopher610fe112015-08-26 08:21:55 +00007518 else if (Feature == "+mips16")
Simon Atanasyan72244b62012-07-05 16:06:06 +00007519 IsMips16 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007520 else if (Feature == "+micromips")
Simon Atanasyan60777612013-04-14 14:07:51 +00007521 IsMicromips = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007522 else if (Feature == "+dsp")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007523 DspRev = std::max(DspRev, DSP1);
Eric Christopher610fe112015-08-26 08:21:55 +00007524 else if (Feature == "+dspr2")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007525 DspRev = std::max(DspRev, DSP2);
Eric Christopher610fe112015-08-26 08:21:55 +00007526 else if (Feature == "+msa")
Jack Carter44ff1e52013-08-12 17:20:29 +00007527 HasMSA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007528 else if (Feature == "+fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007529 HasFP64 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007530 else if (Feature == "-fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007531 HasFP64 = false;
Eric Christopher610fe112015-08-26 08:21:55 +00007532 else if (Feature == "+nan2008")
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007533 IsNan2008 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007534 else if (Feature == "-nan2008")
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007535 IsNan2008 = false;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007536 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007537
James Y Knightb214cbc2016-03-04 19:00:41 +00007538 setDataLayout();
Akira Hatanaka9064e362013-10-29 18:30:33 +00007539
Rafael Espindolaeb265472013-08-21 21:59:03 +00007540 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007541 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00007542
Craig Topper3164f332014-03-11 03:39:26 +00007543 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00007544 if (RegNo == 0) return 4;
7545 if (RegNo == 1) return 5;
7546 return -1;
7547 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00007548
7549 bool isCLZForZeroUndef() const override { return false; }
Daniel Sanders4672af62016-05-27 11:51:02 +00007550
7551 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7552 static const TargetInfo::GCCRegAlias O32RegAliases[] = {
7553 {{"at"}, "$1"}, {{"v0"}, "$2"}, {{"v1"}, "$3"},
7554 {{"a0"}, "$4"}, {{"a1"}, "$5"}, {{"a2"}, "$6"},
7555 {{"a3"}, "$7"}, {{"t0"}, "$8"}, {{"t1"}, "$9"},
7556 {{"t2"}, "$10"}, {{"t3"}, "$11"}, {{"t4"}, "$12"},
7557 {{"t5"}, "$13"}, {{"t6"}, "$14"}, {{"t7"}, "$15"},
7558 {{"s0"}, "$16"}, {{"s1"}, "$17"}, {{"s2"}, "$18"},
7559 {{"s3"}, "$19"}, {{"s4"}, "$20"}, {{"s5"}, "$21"},
7560 {{"s6"}, "$22"}, {{"s7"}, "$23"}, {{"t8"}, "$24"},
7561 {{"t9"}, "$25"}, {{"k0"}, "$26"}, {{"k1"}, "$27"},
7562 {{"gp"}, "$28"}, {{"sp", "$sp"}, "$29"}, {{"fp", "$fp"}, "$30"},
7563 {{"ra"}, "$31"}};
7564 static const TargetInfo::GCCRegAlias NewABIRegAliases[] = {
7565 {{"at"}, "$1"}, {{"v0"}, "$2"}, {{"v1"}, "$3"},
7566 {{"a0"}, "$4"}, {{"a1"}, "$5"}, {{"a2"}, "$6"},
7567 {{"a3"}, "$7"}, {{"a4"}, "$8"}, {{"a5"}, "$9"},
7568 {{"a6"}, "$10"}, {{"a7"}, "$11"}, {{"t0"}, "$12"},
7569 {{"t1"}, "$13"}, {{"t2"}, "$14"}, {{"t3"}, "$15"},
7570 {{"s0"}, "$16"}, {{"s1"}, "$17"}, {{"s2"}, "$18"},
7571 {{"s3"}, "$19"}, {{"s4"}, "$20"}, {{"s5"}, "$21"},
7572 {{"s6"}, "$22"}, {{"s7"}, "$23"}, {{"t8"}, "$24"},
7573 {{"t9"}, "$25"}, {{"k0"}, "$26"}, {{"k1"}, "$27"},
7574 {{"gp"}, "$28"}, {{"sp", "$sp"}, "$29"}, {{"fp", "$fp"}, "$30"},
7575 {{"ra"}, "$31"}};
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007576 if (ABI == "o32")
Daniel Sanders4672af62016-05-27 11:51:02 +00007577 return llvm::makeArrayRef(O32RegAliases);
7578 return llvm::makeArrayRef(NewABIRegAliases);
7579 }
7580
7581 bool hasInt128Type() const override {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007582 return ABI == "n32" || ABI == "n64";
Daniel Sanders4672af62016-05-27 11:51:02 +00007583 }
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007584
7585 bool validateTarget(DiagnosticsEngine &Diags) const override {
7586 // FIXME: It's valid to use O32 on a 64-bit CPU but the backend can't handle
7587 // this yet. It's better to fail here than on the backend assertion.
7588 if (processorSupportsGPR64() && ABI == "o32") {
7589 Diags.Report(diag::err_target_unsupported_abi) << ABI << CPU;
7590 return false;
7591 }
7592
7593 // 64-bit ABI's require 64-bit CPU's.
7594 if (!processorSupportsGPR64() && (ABI == "n32" || ABI == "n64")) {
7595 Diags.Report(diag::err_target_unsupported_abi) << ABI << CPU;
7596 return false;
7597 }
7598
7599 // FIXME: It's valid to use O32 on a mips64/mips64el triple but the backend
7600 // can't handle this yet. It's better to fail here than on the
7601 // backend assertion.
7602 if ((getTriple().getArch() == llvm::Triple::mips64 ||
7603 getTriple().getArch() == llvm::Triple::mips64el) &&
7604 ABI == "o32") {
7605 Diags.Report(diag::err_target_unsupported_abi_for_triple)
7606 << ABI << getTriple().str();
7607 return false;
7608 }
7609
7610 // FIXME: It's valid to use N32/N64 on a mips/mipsel triple but the backend
7611 // can't handle this yet. It's better to fail here than on the
7612 // backend assertion.
7613 if ((getTriple().getArch() == llvm::Triple::mips ||
7614 getTriple().getArch() == llvm::Triple::mipsel) &&
7615 (ABI == "n32" || ABI == "n64")) {
7616 Diags.Report(diag::err_target_unsupported_abi_for_triple)
7617 << ABI << getTriple().str();
7618 return false;
7619 }
7620
7621 return true;
7622 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007623};
7624
Daniel Sanders4672af62016-05-27 11:51:02 +00007625const Builtin::Info MipsTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00007626#define BUILTIN(ID, TYPE, ATTRS) \
7627 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7628#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7629 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00007630#include "clang/Basic/BuiltinsMips.def"
7631};
7632
Ivan Krasindd7403e2011-08-24 20:22:22 +00007633class PNaClTargetInfo : public TargetInfo {
7634public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007635 PNaClTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7636 : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00007637 BigEndian = false;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007638 this->LongAlign = 32;
7639 this->LongWidth = 32;
7640 this->PointerAlign = 32;
7641 this->PointerWidth = 32;
7642 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007643 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00007644 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00007645 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00007646 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00007647 this->SizeType = TargetInfo::UnsignedInt;
7648 this->PtrDiffType = TargetInfo::SignedInt;
7649 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00007650 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00007651 }
7652
Craig Toppere6f17d02014-03-11 04:07:52 +00007653 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007654 Builder.defineMacro("__le32__");
7655 Builder.defineMacro("__pnacl__");
7656 }
Craig Topper3164f332014-03-11 03:39:26 +00007657 void getTargetDefines(const LangOptions &Opts,
7658 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007659 getArchDefines(Opts, Builder);
7660 }
Craig Topper3164f332014-03-11 03:39:26 +00007661 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00007662 return Feature == "pnacl";
7663 }
Craig Topper6c03a542015-10-19 04:51:35 +00007664 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Craig Topper3164f332014-03-11 03:39:26 +00007665 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00007666 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007667 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007668 ArrayRef<const char *> getGCCRegNames() const override;
7669 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00007670 bool validateAsmConstraint(const char *&Name,
7671 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007672 return false;
7673 }
7674
Craig Topper3164f332014-03-11 03:39:26 +00007675 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007676 return "";
7677 }
7678};
7679
Craig Topperf054e3a2015-10-19 03:52:27 +00007680ArrayRef<const char *> PNaClTargetInfo::getGCCRegNames() const {
7681 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007682}
7683
Craig Topperf054e3a2015-10-19 03:52:27 +00007684ArrayRef<TargetInfo::GCCRegAlias> PNaClTargetInfo::getGCCRegAliases() const {
7685 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007686}
Ivan Krasindd7403e2011-08-24 20:22:22 +00007687
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007688// We attempt to use PNaCl (le32) frontend and Mips32EL backend.
Daniel Sanders4672af62016-05-27 11:51:02 +00007689class NaClMips32TargetInfo : public MipsTargetInfo {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007690public:
Daniel Sanders4672af62016-05-27 11:51:02 +00007691 NaClMips32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7692 : MipsTargetInfo(Triple, Opts) {}
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007693
7694 BuiltinVaListKind getBuiltinVaListKind() const override {
7695 return TargetInfo::PNaClABIBuiltinVaList;
7696 }
7697};
7698
JF Bastien643817d2014-09-12 17:52:47 +00007699class Le64TargetInfo : public TargetInfo {
7700 static const Builtin::Info BuiltinInfo[];
7701
7702public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007703 Le64TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7704 : TargetInfo(Triple) {
JF Bastien643817d2014-09-12 17:52:47 +00007705 BigEndian = false;
7706 NoAsmVariants = true;
7707 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
7708 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00007709 resetDataLayout("e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128");
JF Bastien643817d2014-09-12 17:52:47 +00007710 }
7711
7712 void getTargetDefines(const LangOptions &Opts,
7713 MacroBuilder &Builder) const override {
7714 DefineStd(Builder, "unix", Opts);
7715 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
7716 Builder.defineMacro("__ELF__");
7717 }
Craig Topper6c03a542015-10-19 04:51:35 +00007718 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7719 return llvm::makeArrayRef(BuiltinInfo,
7720 clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin);
JF Bastien643817d2014-09-12 17:52:47 +00007721 }
7722 BuiltinVaListKind getBuiltinVaListKind() const override {
7723 return TargetInfo::PNaClABIBuiltinVaList;
7724 }
7725 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00007726 ArrayRef<const char *> getGCCRegNames() const override {
7727 return None;
JF Bastien643817d2014-09-12 17:52:47 +00007728 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007729 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7730 return None;
JF Bastien643817d2014-09-12 17:52:47 +00007731 }
7732 bool validateAsmConstraint(const char *&Name,
7733 TargetInfo::ConstraintInfo &Info) const override {
7734 return false;
7735 }
7736
7737 bool hasProtectedVisibility() const override { return false; }
JF Bastien643817d2014-09-12 17:52:47 +00007738};
Dan Gohmanc2853072015-09-03 22:51:53 +00007739
7740class WebAssemblyTargetInfo : public TargetInfo {
7741 static const Builtin::Info BuiltinInfo[];
7742
7743 enum SIMDEnum {
7744 NoSIMD,
7745 SIMD128,
7746 } SIMDLevel;
7747
7748public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007749 explicit WebAssemblyTargetInfo(const llvm::Triple &T, const TargetOptions &)
Dan Gohmanc2853072015-09-03 22:51:53 +00007750 : TargetInfo(T), SIMDLevel(NoSIMD) {
7751 BigEndian = false;
7752 NoAsmVariants = true;
7753 SuitableAlign = 128;
7754 LargeArrayMinWidth = 128;
7755 LargeArrayAlign = 128;
7756 SimdDefaultAlign = 128;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007757 SigAtomicType = SignedLong;
Dan Gohman6db46402015-11-10 21:01:46 +00007758 LongDoubleWidth = LongDoubleAlign = 128;
7759 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Dan Gohmanc2853072015-09-03 22:51:53 +00007760 }
7761
7762protected:
7763 void getTargetDefines(const LangOptions &Opts,
7764 MacroBuilder &Builder) const override {
7765 defineCPUMacros(Builder, "wasm", /*Tuning=*/false);
7766 if (SIMDLevel >= SIMD128)
7767 Builder.defineMacro("__wasm_simd128__");
7768 }
7769
7770private:
Eric Christopher8c47b422015-10-09 18:39:55 +00007771 bool
7772 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7773 StringRef CPU,
7774 const std::vector<std::string> &FeaturesVec) const override {
Dan Gohmanc2853072015-09-03 22:51:53 +00007775 if (CPU == "bleeding-edge")
7776 Features["simd128"] = true;
7777 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
7778 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007779 bool hasFeature(StringRef Feature) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007780 return llvm::StringSwitch<bool>(Feature)
7781 .Case("simd128", SIMDLevel >= SIMD128)
7782 .Default(false);
7783 }
7784 bool handleTargetFeatures(std::vector<std::string> &Features,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007785 DiagnosticsEngine &Diags) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007786 for (const auto &Feature : Features) {
7787 if (Feature == "+simd128") {
7788 SIMDLevel = std::max(SIMDLevel, SIMD128);
7789 continue;
7790 }
7791 if (Feature == "-simd128") {
7792 SIMDLevel = std::min(SIMDLevel, SIMDEnum(SIMD128 - 1));
7793 continue;
7794 }
7795
7796 Diags.Report(diag::err_opt_not_valid_with_opt) << Feature
7797 << "-target-feature";
7798 return false;
7799 }
7800 return true;
7801 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007802 bool setCPU(const std::string &Name) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007803 return llvm::StringSwitch<bool>(Name)
7804 .Case("mvp", true)
7805 .Case("bleeding-edge", true)
7806 .Case("generic", true)
7807 .Default(false);
7808 }
Craig Topper6c03a542015-10-19 04:51:35 +00007809 ArrayRef<Builtin::Info> getTargetBuiltins() const final {
7810 return llvm::makeArrayRef(BuiltinInfo,
7811 clang::WebAssembly::LastTSBuiltin - Builtin::FirstTSBuiltin);
Dan Gohmanc2853072015-09-03 22:51:53 +00007812 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007813 BuiltinVaListKind getBuiltinVaListKind() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007814 return VoidPtrBuiltinVaList;
7815 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007816 ArrayRef<const char *> getGCCRegNames() const final {
7817 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00007818 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007819 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const final {
7820 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00007821 }
7822 bool
7823 validateAsmConstraint(const char *&Name,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007824 TargetInfo::ConstraintInfo &Info) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007825 return false;
7826 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007827 const char *getClobbers() const final { return ""; }
7828 bool isCLZForZeroUndef() const final { return false; }
7829 bool hasInt128Type() const final { return true; }
Dan Gohmanab0e31f2015-09-14 21:49:41 +00007830 IntType getIntTypeByWidth(unsigned BitWidth,
7831 bool IsSigned) const final {
7832 // WebAssembly prefers long long for explicitly 64-bit integers.
7833 return BitWidth == 64 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
7834 : TargetInfo::getIntTypeByWidth(BitWidth, IsSigned);
7835 }
7836 IntType getLeastIntTypeByWidth(unsigned BitWidth,
7837 bool IsSigned) const final {
7838 // WebAssembly uses long long for int_least64_t and int_fast64_t.
7839 return BitWidth == 64
7840 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
7841 : TargetInfo::getLeastIntTypeByWidth(BitWidth, IsSigned);
7842 }
Dan Gohmanc2853072015-09-03 22:51:53 +00007843};
7844
7845const Builtin::Info WebAssemblyTargetInfo::BuiltinInfo[] = {
7846#define BUILTIN(ID, TYPE, ATTRS) \
7847 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7848#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7849 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
7850#include "clang/Basic/BuiltinsWebAssembly.def"
7851};
7852
7853class WebAssembly32TargetInfo : public WebAssemblyTargetInfo {
7854public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007855 explicit WebAssembly32TargetInfo(const llvm::Triple &T,
7856 const TargetOptions &Opts)
7857 : WebAssemblyTargetInfo(T, Opts) {
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007858 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
James Y Knightb214cbc2016-03-04 19:00:41 +00007859 resetDataLayout("e-m:e-p:32:32-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00007860 }
7861
7862protected:
7863 void getTargetDefines(const LangOptions &Opts,
7864 MacroBuilder &Builder) const override {
7865 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
7866 defineCPUMacros(Builder, "wasm32", /*Tuning=*/false);
7867 }
7868};
7869
7870class WebAssembly64TargetInfo : public WebAssemblyTargetInfo {
7871public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007872 explicit WebAssembly64TargetInfo(const llvm::Triple &T,
7873 const TargetOptions &Opts)
7874 : WebAssemblyTargetInfo(T, Opts) {
Dan Gohmanc2853072015-09-03 22:51:53 +00007875 LongAlign = LongWidth = 64;
7876 PointerAlign = PointerWidth = 64;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007877 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00007878 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00007879 }
7880
7881protected:
7882 void getTargetDefines(const LangOptions &Opts,
7883 MacroBuilder &Builder) const override {
7884 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
7885 defineCPUMacros(Builder, "wasm64", /*Tuning=*/false);
7886 }
7887};
7888
JF Bastien643817d2014-09-12 17:52:47 +00007889const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
7890#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00007891 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
JF Bastien643817d2014-09-12 17:52:47 +00007892#include "clang/Basic/BuiltinsLe64.def"
7893};
7894
Eric Christopherc48497a2015-09-18 21:26:24 +00007895static const unsigned SPIRAddrSpaceMap[] = {
7896 1, // opencl_global
7897 3, // opencl_local
7898 2, // opencl_constant
7899 4, // opencl_generic
7900 0, // cuda_device
7901 0, // cuda_constant
7902 0 // cuda_shared
7903};
7904class SPIRTargetInfo : public TargetInfo {
7905public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007906 SPIRTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7907 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007908 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
7909 "SPIR target must use unknown OS");
7910 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
7911 "SPIR target must use unknown environment type");
7912 BigEndian = false;
7913 TLSSupported = false;
7914 LongWidth = LongAlign = 64;
7915 AddrSpaceMap = &SPIRAddrSpaceMap;
7916 UseAddrSpaceMapMangling = true;
7917 // Define available target features
7918 // These must be defined in sorted order!
7919 NoAsmVariants = true;
7920 }
7921 void getTargetDefines(const LangOptions &Opts,
7922 MacroBuilder &Builder) const override {
7923 DefineStd(Builder, "SPIR", Opts);
7924 }
7925 bool hasFeature(StringRef Feature) const override {
7926 return Feature == "spir";
7927 }
Craig Topper3164f332014-03-11 03:39:26 +00007928
Craig Topper6c03a542015-10-19 04:51:35 +00007929 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007930 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00007931 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007932 bool validateAsmConstraint(const char *&Name,
7933 TargetInfo::ConstraintInfo &info) const override {
7934 return true;
7935 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007936 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7937 return None;
7938 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007939 BuiltinVaListKind getBuiltinVaListKind() const override {
7940 return TargetInfo::VoidPtrBuiltinVaList;
7941 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00007942
Eric Christopherc48497a2015-09-18 21:26:24 +00007943 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Nikolay Haustov8c6538b2016-06-30 09:06:33 +00007944 return (CC == CC_SpirFunction || CC == CC_OpenCLKernel) ? CCCR_OK
7945 : CCCR_Warning;
Eric Christopherc48497a2015-09-18 21:26:24 +00007946 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00007947
Eric Christopherc48497a2015-09-18 21:26:24 +00007948 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
7949 return CC_SpirFunction;
7950 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00007951
7952 void setSupportedOpenCLOpts() override {
7953 // Assume all OpenCL extensions and optional core features are supported
7954 // for SPIR since it is a generic target.
7955 getSupportedOpenCLOpts().setAll();
7956 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007957};
Guy Benyeib798fc92012-12-11 21:38:14 +00007958
Eric Christopherc48497a2015-09-18 21:26:24 +00007959class SPIR32TargetInfo : public SPIRTargetInfo {
7960public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007961 SPIR32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7962 : SPIRTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007963 PointerWidth = PointerAlign = 32;
7964 SizeType = TargetInfo::UnsignedInt;
7965 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +00007966 resetDataLayout("e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
7967 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00007968 }
7969 void getTargetDefines(const LangOptions &Opts,
7970 MacroBuilder &Builder) const override {
7971 DefineStd(Builder, "SPIR32", Opts);
7972 }
7973};
Guy Benyeib798fc92012-12-11 21:38:14 +00007974
Eric Christopherc48497a2015-09-18 21:26:24 +00007975class SPIR64TargetInfo : public SPIRTargetInfo {
7976public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007977 SPIR64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7978 : SPIRTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007979 PointerWidth = PointerAlign = 64;
7980 SizeType = TargetInfo::UnsignedLong;
7981 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00007982 resetDataLayout("e-i64:64-v16:16-v24:32-v32:32-v48:64-"
7983 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00007984 }
7985 void getTargetDefines(const LangOptions &Opts,
7986 MacroBuilder &Builder) const override {
7987 DefineStd(Builder, "SPIR64", Opts);
7988 }
7989};
Guy Benyeib798fc92012-12-11 21:38:14 +00007990
Robert Lytton0e076492013-08-13 09:43:10 +00007991class XCoreTargetInfo : public TargetInfo {
7992 static const Builtin::Info BuiltinInfo[];
7993public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007994 XCoreTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7995 : TargetInfo(Triple) {
Robert Lytton0e076492013-08-13 09:43:10 +00007996 BigEndian = false;
7997 NoAsmVariants = true;
7998 LongLongAlign = 32;
7999 SuitableAlign = 32;
8000 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00008001 SizeType = UnsignedInt;
8002 PtrDiffType = SignedInt;
8003 IntPtrType = SignedInt;
8004 WCharType = UnsignedChar;
8005 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00008006 UseZeroLengthBitfieldAlignment = true;
James Y Knightb214cbc2016-03-04 19:00:41 +00008007 resetDataLayout("e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32"
8008 "-f64:32-a:0:32-n32");
Robert Lytton0e076492013-08-13 09:43:10 +00008009 }
Craig Topper3164f332014-03-11 03:39:26 +00008010 void getTargetDefines(const LangOptions &Opts,
8011 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008012 Builder.defineMacro("__XS1B__");
8013 }
Craig Topper6c03a542015-10-19 04:51:35 +00008014 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
8015 return llvm::makeArrayRef(BuiltinInfo,
8016 clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin);
Robert Lytton0e076492013-08-13 09:43:10 +00008017 }
Craig Topper3164f332014-03-11 03:39:26 +00008018 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008019 return TargetInfo::VoidPtrBuiltinVaList;
8020 }
Craig Topper3164f332014-03-11 03:39:26 +00008021 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008022 return "";
8023 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008024 ArrayRef<const char *> getGCCRegNames() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008025 static const char * const GCCRegNames[] = {
8026 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
8027 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
8028 };
Craig Topperf054e3a2015-10-19 03:52:27 +00008029 return llvm::makeArrayRef(GCCRegNames);
Robert Lytton0e076492013-08-13 09:43:10 +00008030 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008031 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8032 return None;
Robert Lytton0e076492013-08-13 09:43:10 +00008033 }
Craig Topper3164f332014-03-11 03:39:26 +00008034 bool validateAsmConstraint(const char *&Name,
8035 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008036 return false;
8037 }
Craig Topper3164f332014-03-11 03:39:26 +00008038 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00008039 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
8040 return (RegNo < 2)? RegNo : -1;
8041 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00008042 bool allowsLargerPreferedTypeAlignment() const override {
8043 return false;
8044 }
Robert Lytton0e076492013-08-13 09:43:10 +00008045};
8046
8047const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00008048#define BUILTIN(ID, TYPE, ATTRS) \
8049 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
8050#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
8051 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Robert Lytton0e076492013-08-13 09:43:10 +00008052#include "clang/Basic/BuiltinsXCore.def"
8053};
Robert Lytton0e076492013-08-13 09:43:10 +00008054
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008055// x86_32 Android target
8056class AndroidX86_32TargetInfo : public LinuxTargetInfo<X86_32TargetInfo> {
8057public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008058 AndroidX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8059 : LinuxTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008060 SuitableAlign = 32;
8061 LongDoubleWidth = 64;
8062 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
8063 }
8064};
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008065
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008066// x86_64 Android target
8067class AndroidX86_64TargetInfo : public LinuxTargetInfo<X86_64TargetInfo> {
8068public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008069 AndroidX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8070 : LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008071 LongDoubleFormat = &llvm::APFloat::IEEEquad;
8072 }
Chih-Hung Hsieh0b0eeaa2015-07-24 18:12:54 +00008073
8074 bool useFloat128ManglingForLongDouble() const override {
8075 return true;
8076 }
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008077};
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008078
8079// 32-bit RenderScript is armv7 with width and align of 'long' set to 8-bytes
8080class RenderScript32TargetInfo : public ARMleTargetInfo {
8081public:
8082 RenderScript32TargetInfo(const llvm::Triple &Triple,
8083 const TargetOptions &Opts)
8084 : ARMleTargetInfo(llvm::Triple("armv7", Triple.getVendorName(),
8085 Triple.getOSName(),
8086 Triple.getEnvironmentName()),
8087 Opts) {
8088 LongWidth = LongAlign = 64;
8089 }
8090 void getTargetDefines(const LangOptions &Opts,
8091 MacroBuilder &Builder) const override {
8092 Builder.defineMacro("__RENDERSCRIPT__");
8093 ARMleTargetInfo::getTargetDefines(Opts, Builder);
8094 }
8095};
8096
8097// 64-bit RenderScript is aarch64
8098class RenderScript64TargetInfo : public AArch64leTargetInfo {
8099public:
8100 RenderScript64TargetInfo(const llvm::Triple &Triple,
8101 const TargetOptions &Opts)
8102 : AArch64leTargetInfo(llvm::Triple("aarch64", Triple.getVendorName(),
8103 Triple.getOSName(),
8104 Triple.getEnvironmentName()),
8105 Opts) {}
8106
8107 void getTargetDefines(const LangOptions &Opts,
8108 MacroBuilder &Builder) const override {
8109 Builder.defineMacro("__RENDERSCRIPT__");
8110 AArch64leTargetInfo::getTargetDefines(Opts, Builder);
8111 }
8112};
8113
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008114} // end anonymous namespace
8115
Chris Lattner5ba61f02006-10-14 07:39:34 +00008116//===----------------------------------------------------------------------===//
8117// Driver code
8118//===----------------------------------------------------------------------===//
8119
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008120static TargetInfo *AllocateTarget(const llvm::Triple &Triple,
8121 const TargetOptions &Opts) {
Daniel Dunbar52322032009-08-18 05:47:58 +00008122 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00008123
Daniel Dunbar52322032009-08-18 05:47:58 +00008124 switch (Triple.getArch()) {
8125 default:
Craig Topperf1186c52014-05-08 06:41:40 +00008126 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00008127
Tim Northover2a0783d2014-05-30 14:14:07 +00008128 case llvm::Triple::xcore:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008129 return new XCoreTargetInfo(Triple, Opts);
Tim Northover2a0783d2014-05-30 14:14:07 +00008130
8131 case llvm::Triple::hexagon:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008132 return new HexagonTargetInfo(Triple, Opts);
Tim Northover2a0783d2014-05-30 14:14:07 +00008133
Jacques Pienaard964cc22016-03-28 21:02:54 +00008134 case llvm::Triple::lanai:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008135 return new LanaiTargetInfo(Triple, Opts);
Jacques Pienaard964cc22016-03-28 21:02:54 +00008136
Tim Northover2a0783d2014-05-30 14:14:07 +00008137 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00008138 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008139 return new DarwinAArch64TargetInfo(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00008140
8141 switch (os) {
Ed Schoutenea9448e2015-10-15 15:07:07 +00008142 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008143 return new CloudABITargetInfo<AArch64leTargetInfo>(Triple, Opts);
Ed Maste6a9eda52014-11-13 16:55:42 +00008144 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008145 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00008146 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008147 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple, Opts);
James Molloy5e73df52014-04-16 15:06:20 +00008148 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008149 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00008150 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008151 return new AArch64leTargetInfo(Triple, Opts);
James Molloy5e73df52014-04-16 15:06:20 +00008152 }
8153
Christian Pirker9b019ae2014-02-25 13:51:00 +00008154 case llvm::Triple::aarch64_be:
8155 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00008156 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008157 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00008158 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008159 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00008160 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008161 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00008162 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008163 return new AArch64beTargetInfo(Triple, Opts);
Tim Northover9bb857a2013-01-31 12:13:10 +00008164 }
8165
Daniel Dunbar52322032009-08-18 05:47:58 +00008166 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00008167 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00008168 if (Triple.isOSBinFormatMachO())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008169 return new DarwinARMTargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008170
Daniel Dunbar52322032009-08-18 05:47:58 +00008171 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00008172 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008173 return new LinuxTargetInfo<ARMleTargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008174 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008175 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008176 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008177 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008178 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008179 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00008180 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008181 return new BitrigTargetInfo<ARMleTargetInfo>(Triple, Opts);
Douglas Gregor9fabd852011-07-01 22:41:14 +00008182 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008183 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00008184 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008185 return new NaClTargetInfo<ARMleTargetInfo>(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008186 case llvm::Triple::Win32:
8187 switch (Triple.getEnvironment()) {
Yaron Keren321249c2015-07-15 13:32:23 +00008188 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008189 return new CygwinARMTargetInfo(Triple, Opts);
Yaron Keren321249c2015-07-15 13:32:23 +00008190 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008191 return new MinGWARMTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008192 case llvm::Triple::Itanium:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008193 return new ItaniumWindowsARMleTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008194 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008195 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008196 return new MicrosoftARMleTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008197 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008198 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008199 return new ARMleTargetInfo(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008200 }
8201
8202 case llvm::Triple::armeb:
8203 case llvm::Triple::thumbeb:
8204 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008205 return new DarwinARMTargetInfo(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008206
8207 switch (os) {
8208 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008209 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008210 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008211 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008212 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008213 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008214 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008215 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008216 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008217 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008218 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008219 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008220 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008221 return new NaClTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008222 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008223 return new ARMbeTargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008224 }
Eli Friedmanb5366062008-05-20 14:21:01 +00008225
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00008226 case llvm::Triple::bpfeb:
8227 case llvm::Triple::bpfel:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008228 return new BPFTargetInfo(Triple, Opts);
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00008229
Daniel Dunbar52322032009-08-18 05:47:58 +00008230 case llvm::Triple::msp430:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008231 return new MSP430TargetInfo(Triple, Opts);
Eli Friedmanb5366062008-05-20 14:21:01 +00008232
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008233 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008234 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008235 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00008236 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008237 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00008238 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008239 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008240 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008241 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008242 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008243 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00008244 return new MipsTargetInfo(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008245 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008246
8247 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008248 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008249 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00008250 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008251 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00008252 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008253 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008254 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008255 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008256 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00008257 case llvm::Triple::NaCl:
Daniel Sanders4672af62016-05-27 11:51:02 +00008258 return new NaClTargetInfo<NaClMips32TargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008259 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00008260 return new MipsTargetInfo(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008261 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008262
Akira Hatanakabef17452011-09-20 19:21:49 +00008263 case llvm::Triple::mips64:
8264 switch (os) {
8265 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00008266 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008267 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00008268 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008269 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008270 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008271 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008272 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008273 case llvm::Triple::OpenBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008274 return new OpenBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008275 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00008276 return new MipsTargetInfo(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008277 }
8278
8279 case llvm::Triple::mips64el:
8280 switch (os) {
8281 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00008282 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008283 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00008284 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008285 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008286 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008287 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008288 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008289 case llvm::Triple::OpenBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008290 return new OpenBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008291 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00008292 return new MipsTargetInfo(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008293 }
8294
Ivan Krasindd7403e2011-08-24 20:22:22 +00008295 case llvm::Triple::le32:
8296 switch (os) {
Douglas Katzman78d7c542015-05-12 21:18:10 +00008297 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008298 return new NaClTargetInfo<PNaClTargetInfo>(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00008299 default:
8300 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00008301 }
8302
JF Bastien643817d2014-09-12 17:52:47 +00008303 case llvm::Triple::le64:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008304 return new Le64TargetInfo(Triple, Opts);
JF Bastien643817d2014-09-12 17:52:47 +00008305
Daniel Dunbar52322032009-08-18 05:47:58 +00008306 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008307 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008308 return new DarwinPPC32TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008309 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00008310 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008311 return new LinuxTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008312 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008313 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008314 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008315 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008316 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008317 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008318 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008319 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008320 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008321 return new PPC32TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008322 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008323
8324 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008325 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008326 return new DarwinPPC64TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008327 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00008328 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008329 return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008330 case llvm::Triple::Lv2:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008331 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008332 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008333 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008334 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008335 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008336 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008337 return new PPC64TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008338 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008339
Bill Schmidt778d3872013-07-26 01:36:11 +00008340 case llvm::Triple::ppc64le:
8341 switch (os) {
8342 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008343 return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger22a2d992015-04-10 20:53:48 +00008344 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008345 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Bill Schmidt778d3872013-07-26 01:36:11 +00008346 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008347 return new PPC64TargetInfo(Triple, Opts);
Bill Schmidt778d3872013-07-26 01:36:11 +00008348 }
8349
Peter Collingbournec947aae2012-05-20 23:28:41 +00008350 case llvm::Triple::nvptx:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008351 return new NVPTX32TargetInfo(Triple, Opts);
Peter Collingbournec947aae2012-05-20 23:28:41 +00008352 case llvm::Triple::nvptx64:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008353 return new NVPTX64TargetInfo(Triple, Opts);
Peter Collingbournec947aae2012-05-20 23:28:41 +00008354
Tom Stellardd8e38a32015-01-06 20:34:47 +00008355 case llvm::Triple::amdgcn:
Eli Friedmand13b41e2012-10-12 23:32:00 +00008356 case llvm::Triple::r600:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008357 return new AMDGPUTargetInfo(Triple, Opts);
Eli Friedmand13b41e2012-10-12 23:32:00 +00008358
Daniel Dunbar52322032009-08-18 05:47:58 +00008359 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008360 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00008361 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008362 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008363 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008364 return new SolarisTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008365 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008366 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008367 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008368 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008369 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008370 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008371 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008372 return new SparcV8TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008373 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008374
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008375 // The 'sparcel' architecture copies all the above cases except for Solaris.
8376 case llvm::Triple::sparcel:
8377 switch (os) {
8378 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008379 return new LinuxTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008380 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008381 return new NetBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008382 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008383 return new OpenBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008384 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008385 return new RTEMSTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008386 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008387 return new SparcV8elTargetInfo(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008388 }
8389
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008390 case llvm::Triple::sparcv9:
8391 switch (os) {
8392 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008393 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008394 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008395 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008396 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008397 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008398 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008399 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008400 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008401 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008402 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008403 return new SparcV9TargetInfo(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008404 }
8405
Ulrich Weigand47445072013-05-06 16:26:41 +00008406 case llvm::Triple::systemz:
8407 switch (os) {
8408 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008409 return new LinuxTargetInfo<SystemZTargetInfo>(Triple, Opts);
Ulrich Weigand47445072013-05-06 16:26:41 +00008410 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008411 return new SystemZTargetInfo(Triple, Opts);
Ulrich Weigand47445072013-05-06 16:26:41 +00008412 }
8413
Eli Friedmana9c3d712009-08-19 20:47:07 +00008414 case llvm::Triple::tce:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008415 return new TCETargetInfo(Triple, Opts);
Eli Friedmana9c3d712009-08-19 20:47:07 +00008416
Daniel Dunbar52322032009-08-18 05:47:58 +00008417 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008418 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008419 return new DarwinI386TargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008420
Daniel Dunbar52322032009-08-18 05:47:58 +00008421 switch (os) {
Ed Schouten7893e682015-06-13 21:33:49 +00008422 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008423 return new CloudABITargetInfo<X86_32TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008424 case llvm::Triple::Linux: {
8425 switch (Triple.getEnvironment()) {
8426 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008427 return new LinuxTargetInfo<X86_32TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008428 case llvm::Triple::Android:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008429 return new AndroidX86_32TargetInfo(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008430 }
8431 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008432 case llvm::Triple::DragonFly:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008433 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008434 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008435 return new NetBSDI386TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008436 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008437 return new OpenBSDI386TargetInfo(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00008438 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008439 return new BitrigI386TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008440 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008441 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00008442 case llvm::Triple::KFreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008443 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008444 case llvm::Triple::Minix:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008445 return new MinixTargetInfo<X86_32TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008446 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008447 return new SolarisTargetInfo<X86_32TargetInfo>(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008448 case llvm::Triple::Win32: {
8449 switch (Triple.getEnvironment()) {
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008450 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008451 return new CygwinX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008452 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008453 return new MinGWX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00008454 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008455 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008456 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008457 return new MicrosoftX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008458 }
8459 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00008460 case llvm::Triple::Haiku:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008461 return new HaikuX86_32TargetInfo(Triple, Opts);
Douglas Gregor9fabd852011-07-01 22:41:14 +00008462 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008463 return new RTEMSX86_32TargetInfo(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00008464 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008465 return new NaClTargetInfo<X86_32TargetInfo>(Triple, Opts);
Alexey Bataevc99b0492015-11-25 09:24:26 +00008466 case llvm::Triple::ELFIAMCU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008467 return new MCUX86_32TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008468 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008469 return new X86_32TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008470 }
8471
8472 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008473 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008474 return new DarwinX86_64TargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008475
Daniel Dunbar52322032009-08-18 05:47:58 +00008476 switch (os) {
Ed Schoutenf33c6072015-03-11 08:42:46 +00008477 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008478 return new CloudABITargetInfo<X86_64TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008479 case llvm::Triple::Linux: {
8480 switch (Triple.getEnvironment()) {
8481 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008482 return new LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008483 case llvm::Triple::Android:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008484 return new AndroidX86_64TargetInfo(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008485 }
8486 }
Chris Lattner002ba6b2010-01-09 05:41:14 +00008487 case llvm::Triple::DragonFly:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008488 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008489 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008490 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008491 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008492 return new OpenBSDX86_64TargetInfo(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00008493 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008494 return new BitrigX86_64TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008495 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008496 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00008497 case llvm::Triple::KFreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008498 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008499 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008500 return new SolarisTargetInfo<X86_64TargetInfo>(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008501 case llvm::Triple::Win32: {
8502 switch (Triple.getEnvironment()) {
Yaron Kerend030d112015-07-22 17:38:19 +00008503 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008504 return new CygwinX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008505 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008506 return new MinGWX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008507 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008508 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008509 return new MicrosoftX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008510 }
8511 }
Reid Kleckner330fb172016-05-11 16:19:05 +00008512 case llvm::Triple::Haiku:
8513 return new HaikuTargetInfo<X86_64TargetInfo>(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00008514 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008515 return new NaClTargetInfo<X86_64TargetInfo>(Triple, Opts);
Alex Rosenberg12207fa2015-01-27 14:47:44 +00008516 case llvm::Triple::PS4:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008517 return new PS4OSTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008518 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008519 return new X86_64TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008520 }
Guy Benyeib798fc92012-12-11 21:38:14 +00008521
Douglas Katzman78d7c542015-05-12 21:18:10 +00008522 case llvm::Triple::spir: {
8523 if (Triple.getOS() != llvm::Triple::UnknownOS ||
8524 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
8525 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008526 return new SPIR32TargetInfo(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00008527 }
8528 case llvm::Triple::spir64: {
8529 if (Triple.getOS() != llvm::Triple::UnknownOS ||
8530 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
8531 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008532 return new SPIR64TargetInfo(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00008533 }
Dan Gohmanc2853072015-09-03 22:51:53 +00008534 case llvm::Triple::wasm32:
8535 if (!(Triple == llvm::Triple("wasm32-unknown-unknown")))
8536 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008537 return new WebAssemblyOSTargetInfo<WebAssembly32TargetInfo>(Triple, Opts);
Dan Gohmanc2853072015-09-03 22:51:53 +00008538 case llvm::Triple::wasm64:
8539 if (!(Triple == llvm::Triple("wasm64-unknown-unknown")))
8540 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008541 return new WebAssemblyOSTargetInfo<WebAssembly64TargetInfo>(Triple, Opts);
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008542
8543 case llvm::Triple::renderscript32:
8544 return new LinuxTargetInfo<RenderScript32TargetInfo>(Triple, Opts);
8545 case llvm::Triple::renderscript64:
8546 return new LinuxTargetInfo<RenderScript64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008547 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00008548}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008549
8550/// CreateTargetInfo - Return the target info object for the specified target
Eric Christophere4f73b32015-08-07 19:07:08 +00008551/// options.
Alp Toker80758082014-07-06 05:26:44 +00008552TargetInfo *
8553TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
Saleem Abdulrasool10a49722016-04-08 16:52:00 +00008554 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00008555 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008556
8557 // Construct the target
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008558 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple, *Opts));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008559 if (!Target) {
8560 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00008561 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008562 }
Alp Toker80758082014-07-06 05:26:44 +00008563 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008564
Daniel Dunbaracde99e2009-12-18 18:42:37 +00008565 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008566 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
8567 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00008568 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00008569 }
8570
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008571 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008572 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
8573 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00008574 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008575 }
8576
Rafael Espindolaeb265472013-08-21 21:59:03 +00008577 // Set the fp math unit.
8578 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
8579 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00008580 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00008581 }
8582
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008583 // Compute the default target features, we need the target to handle this
8584 // because features may have dependencies on one another.
8585 llvm::StringMap<bool> Features;
Eric Christopher007b0a02015-08-28 22:32:01 +00008586 if (!Target->initFeatureMap(Features, Diags, Opts->CPU,
8587 Opts->FeaturesAsWritten))
Eric Christopher6b454372015-08-25 13:45:24 +00008588 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008589
8590 // Add the features to the compile options.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008591 Opts->Features.clear();
Aaron Ballmanb226d3d2015-08-12 13:38:59 +00008592 for (const auto &F : Features)
8593 Opts->Features.push_back((F.getValue() ? "+" : "-") + F.getKey().str());
8594
Eric Christopher3ff21b32013-10-16 21:26:26 +00008595 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00008596 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008597
Yaxun Liu39cf40f2016-05-16 17:06:34 +00008598 Target->setSupportedOpenCLOpts();
8599
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00008600 if (!Target->validateTarget(Diags))
8601 return nullptr;
8602
Ahmed Charles9a16beb2014-03-07 19:33:25 +00008603 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008604}