blob: 78b03b1c314a5118a78dd4ee10a736656834bfe5 [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"
Yaxun Liu2c17e822016-08-09 19:43:38 +000024#include "clang/Frontend/CodeGenOptions.h"
Eli Friedman7cef49e2008-05-20 14:27:34 +000025#include "llvm/ADT/APFloat.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000026#include "llvm/ADT/STLExtras.h"
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +000027#include "llvm/ADT/StringExtras.h"
Daniel Dunbar58bc48c2009-08-19 20:04:03 +000028#include "llvm/ADT/StringRef.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000029#include "llvm/ADT/StringSwitch.h"
Chris Lattner859c37a2009-08-12 06:24:27 +000030#include "llvm/ADT/Triple.h"
Chris Lattner30ba6742009-08-10 19:03:04 +000031#include "llvm/MC/MCSectionMachO.h"
David Blaikie76bd3c82011-09-23 05:35:21 +000032#include "llvm/Support/ErrorHandling.h"
Renato Golinf5c4dec2015-05-27 13:33:00 +000033#include "llvm/Support/TargetParser.h"
Benjamin Kramerdc2f0062010-01-09 18:20:57 +000034#include <algorithm>
Ahmed Charlesdfca6f92014-03-09 11:36:40 +000035#include <memory>
Hans Wennborg7eb54642015-09-10 17:07:54 +000036
Chris Lattner5ba61f02006-10-14 07:39:34 +000037using namespace clang;
38
Chris Lattner5ba61f02006-10-14 07:39:34 +000039//===----------------------------------------------------------------------===//
Chris Lattner1f5ad112006-10-14 18:32:12 +000040// Common code shared among targets.
Chris Lattner5ba61f02006-10-14 07:39:34 +000041//===----------------------------------------------------------------------===//
42
Chris Lattner1e1c0b92009-03-20 16:06:38 +000043/// DefineStd - Define a macro name and standard variants. For example if
44/// MacroName is "unix", then this will define "__unix", "__unix__", and "unix"
45/// when in GNU mode.
Chris Lattner0e62c1c2011-07-23 10:55:15 +000046static void DefineStd(MacroBuilder &Builder, StringRef MacroName,
Chris Lattner1e1c0b92009-03-20 16:06:38 +000047 const LangOptions &Opts) {
48 assert(MacroName[0] != '_' && "Identifier should be in the user's namespace");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000049
Chris Lattner1e1c0b92009-03-20 16:06:38 +000050 // If in GNU mode (e.g. -std=gnu99 but not -std=c99) define the raw identifier
51 // in the user's namespace.
52 if (Opts.GNUMode)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000053 Builder.defineMacro(MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000054
Chris Lattner1e1c0b92009-03-20 16:06:38 +000055 // Define __unix.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000056 Builder.defineMacro("__" + MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000057
Chris Lattner1e1c0b92009-03-20 16:06:38 +000058 // Define __unix__.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000059 Builder.defineMacro("__" + MacroName + "__");
Chris Lattner1e1c0b92009-03-20 16:06:38 +000060}
61
Benjamin Kramere3b442d2012-01-10 11:50:09 +000062static void defineCPUMacros(MacroBuilder &Builder, StringRef CPUName,
63 bool Tuning = true) {
64 Builder.defineMacro("__" + CPUName);
65 Builder.defineMacro("__" + CPUName + "__");
66 if (Tuning)
67 Builder.defineMacro("__tune_" + CPUName + "__");
68}
69
Justin Lebar76945b22016-04-29 23:05:19 +000070static TargetInfo *AllocateTarget(const llvm::Triple &Triple,
71 const TargetOptions &Opts);
72
Chris Lattner09d98f52008-10-05 21:50:58 +000073//===----------------------------------------------------------------------===//
74// Defines specific to certain operating systems.
75//===----------------------------------------------------------------------===//
Chris Lattner30ba6742009-08-10 19:03:04 +000076
Torok Edwinb2b37c62009-06-30 17:10:35 +000077namespace {
Douglas Gregorc05d2a12009-07-01 15:12:53 +000078template<typename TgtInfo>
79class OSTargetInfo : public TgtInfo {
Torok Edwinb2b37c62009-06-30 17:10:35 +000080protected:
Daniel Dunbar40165182009-08-24 09:10:05 +000081 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000082 MacroBuilder &Builder) const=0;
Torok Edwinb2b37c62009-06-30 17:10:35 +000083public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +000084 OSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
85 : TgtInfo(Triple, Opts) {}
Craig Topper3164f332014-03-11 03:39:26 +000086 void getTargetDefines(const LangOptions &Opts,
87 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000088 TgtInfo::getTargetDefines(Opts, Builder);
89 getOSDefines(Opts, TgtInfo::getTriple(), Builder);
Torok Edwin4e054162009-06-30 17:00:25 +000090 }
Torok Edwinb2b37c62009-06-30 17:10:35 +000091
92};
Chris Lattner30ba6742009-08-10 19:03:04 +000093
Eric Christopher7d0c7252015-09-24 21:17:04 +000094// CloudABI Target
95template <typename Target>
96class CloudABITargetInfo : public OSTargetInfo<Target> {
97protected:
98 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
99 MacroBuilder &Builder) const override {
100 Builder.defineMacro("__CloudABI__");
101 Builder.defineMacro("__ELF__");
102
103 // CloudABI uses ISO/IEC 10646:2012 for wchar_t, char16_t and char32_t.
104 Builder.defineMacro("__STDC_ISO_10646__", "201206L");
105 Builder.defineMacro("__STDC_UTF_16__");
106 Builder.defineMacro("__STDC_UTF_32__");
107 }
108
109public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000110 CloudABITargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
111 : OSTargetInfo<Target>(Triple, Opts) {}
Eric Christopher7d0c7252015-09-24 21:17:04 +0000112};
113
Daniel Dunbard86666f2010-01-26 01:44:04 +0000114static void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000115 const llvm::Triple &Triple,
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000116 StringRef &PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000117 VersionTuple &PlatformMinVersion) {
Bob Wilson834400b2013-08-19 20:23:37 +0000118 Builder.defineMacro("__APPLE_CC__", "6000");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000119 Builder.defineMacro("__APPLE__");
Duncan P. N. Exon Smith16b1ac92017-04-27 01:47:22 +0000120 Builder.defineMacro("__STDC_NO_THREADS__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000121 Builder.defineMacro("OBJC_NEW_PROPERTIES");
Alexander Potapenkob4f81902012-09-20 10:10:01 +0000122 // AddressSanitizer doesn't play well with source fortification, which is on
123 // by default on Darwin.
Alexey Samsonovedf99a92014-11-07 22:29:38 +0000124 if (Opts.Sanitize.has(SanitizerKind::Address))
125 Builder.defineMacro("_FORTIFY_SOURCE", "0");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000126
John McCall460ce582015-10-22 18:38:17 +0000127 // Darwin defines __weak, __strong, and __unsafe_unretained even in C mode.
128 if (!Opts.ObjC1) {
John McCall31168b02011-06-15 23:02:42 +0000129 // __weak is always defined, for use in blocks and with objc pointers.
130 Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))");
John McCall460ce582015-10-22 18:38:17 +0000131 Builder.defineMacro("__strong", "");
John McCall31168b02011-06-15 23:02:42 +0000132 Builder.defineMacro("__unsafe_unretained", "");
John McCall31168b02011-06-15 23:02:42 +0000133 }
Eric Christopher0c912c52011-07-07 22:55:26 +0000134
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000135 if (Opts.Static)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000136 Builder.defineMacro("__STATIC__");
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000137 else
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000138 Builder.defineMacro("__DYNAMIC__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000139
140 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000141 Builder.defineMacro("_REENTRANT");
Daniel Dunbar497ff132009-04-10 19:52:24 +0000142
Daniel Dunbarecf13562011-04-19 21:40:34 +0000143 // Get the platform type and version number from the triple.
Daniel Dunbar497ff132009-04-10 19:52:24 +0000144 unsigned Maj, Min, Rev;
Bob Wilson8e5acc52012-01-31 23:52:58 +0000145 if (Triple.isMacOSX()) {
146 Triple.getMacOSXVersion(Maj, Min, Rev);
Manman Renccf25bb2016-06-28 20:55:30 +0000147 PlatformName = "macos";
Daniel Dunbarecf13562011-04-19 21:40:34 +0000148 } else {
Bob Wilson8e5acc52012-01-31 23:52:58 +0000149 Triple.getOSVersion(Maj, Min, Rev);
150 PlatformName = llvm::Triple::getOSTypeName(Triple.getOS());
Daniel Dunbarecf13562011-04-19 21:40:34 +0000151 }
Daniel Dunbard86666f2010-01-26 01:44:04 +0000152
Sebastian Pop422377c2012-01-20 22:01:23 +0000153 // If -target arch-pc-win32-macho option specified, we're
Eric Christopherb081ba62011-07-29 21:20:35 +0000154 // generating code for Win32 ABI. No need to emit
Chad Rosierb90e4022011-07-19 20:00:06 +0000155 // __ENVIRONMENT_XX_OS_VERSION_MIN_REQUIRED__.
156 if (PlatformName == "win32") {
157 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
158 return;
159 }
160
Evan Cheng31dd9a62014-01-26 23:12:43 +0000161 // Set the appropriate OS version define.
162 if (Triple.isiOS()) {
Bob Wilson4cf27c42016-07-18 20:29:14 +0000163 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
164 char Str[7];
165 if (Maj < 10) {
166 Str[0] = '0' + Maj;
167 Str[1] = '0' + (Min / 10);
168 Str[2] = '0' + (Min % 10);
169 Str[3] = '0' + (Rev / 10);
170 Str[4] = '0' + (Rev % 10);
171 Str[5] = '\0';
172 } else {
173 // Handle versions >= 10.
174 Str[0] = '0' + (Maj / 10);
175 Str[1] = '0' + (Maj % 10);
176 Str[2] = '0' + (Min / 10);
177 Str[3] = '0' + (Min % 10);
178 Str[4] = '0' + (Rev / 10);
179 Str[5] = '0' + (Rev % 10);
180 Str[6] = '\0';
181 }
Tim Northover67465f82015-10-30 16:30:30 +0000182 if (Triple.isTvOS())
183 Builder.defineMacro("__ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__", Str);
184 else
185 Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__",
186 Str);
187
188 } else if (Triple.isWatchOS()) {
189 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
190 char Str[6];
191 Str[0] = '0' + Maj;
192 Str[1] = '0' + (Min / 10);
193 Str[2] = '0' + (Min % 10);
194 Str[3] = '0' + (Rev / 10);
195 Str[4] = '0' + (Rev % 10);
196 Str[5] = '\0';
197 Builder.defineMacro("__ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__", Str);
Evan Cheng31dd9a62014-01-26 23:12:43 +0000198 } else if (Triple.isMacOSX()) {
199 // Note that the Driver allows versions which aren't representable in the
200 // define (because we only get a single digit for the minor and micro
201 // revision numbers). So, we limit them to the maximum representable
202 // version.
203 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
Bob Wilson2a3710e2014-08-08 21:45:53 +0000204 char Str[7];
205 if (Maj < 10 || (Maj == 10 && Min < 10)) {
206 Str[0] = '0' + (Maj / 10);
207 Str[1] = '0' + (Maj % 10);
208 Str[2] = '0' + std::min(Min, 9U);
209 Str[3] = '0' + std::min(Rev, 9U);
210 Str[4] = '\0';
211 } else {
212 // Handle versions > 10.9.
213 Str[0] = '0' + (Maj / 10);
214 Str[1] = '0' + (Maj % 10);
215 Str[2] = '0' + (Min / 10);
216 Str[3] = '0' + (Min % 10);
217 Str[4] = '0' + (Rev / 10);
218 Str[5] = '0' + (Rev % 10);
219 Str[6] = '\0';
220 }
Evan Cheng31dd9a62014-01-26 23:12:43 +0000221 Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
Daniel Dunbar497ff132009-04-10 19:52:24 +0000222 }
Daniel Dunbarecf13562011-04-19 21:40:34 +0000223
Tim Northover157d9112014-01-16 08:48:16 +0000224 // Tell users about the kernel if there is one.
225 if (Triple.isOSDarwin())
226 Builder.defineMacro("__MACH__");
227
Chris Bieneman46977b62016-04-29 17:53:00 +0000228 // The Watch ABI uses Dwarf EH.
229 if(Triple.isWatchABI())
230 Builder.defineMacro("__ARM_DWARF_EH__");
231
Daniel Dunbarecf13562011-04-19 21:40:34 +0000232 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
Eli Friedman3fd920a2008-08-20 02:34:37 +0000233}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000234
Torok Edwinb2b37c62009-06-30 17:10:35 +0000235template<typename Target>
236class DarwinTargetInfo : public OSTargetInfo<Target> {
237protected:
Craig Topper3164f332014-03-11 03:39:26 +0000238 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
239 MacroBuilder &Builder) const override {
Eric Christopher0c912c52011-07-07 22:55:26 +0000240 getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000241 this->PlatformMinVersion);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000242 }
Mike Stump11289f42009-09-09 15:08:12 +0000243
Torok Edwinb2b37c62009-06-30 17:10:35 +0000244public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000245 DarwinTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
246 : OSTargetInfo<Target>(Triple, Opts) {
Tim Northovera12d0a92016-01-07 09:04:46 +0000247 // By default, no TLS, and we whitelist permitted architecture/OS
248 // combinations.
249 this->TLSSupported = false;
250
251 if (Triple.isMacOSX())
252 this->TLSSupported = !Triple.isMacOSXVersionLT(10, 7);
253 else if (Triple.isiOS()) {
254 // 64-bit iOS supported it from 8 onwards, 32-bit from 9 onwards.
255 if (Triple.getArch() == llvm::Triple::x86_64 ||
256 Triple.getArch() == llvm::Triple::aarch64)
257 this->TLSSupported = !Triple.isOSVersionLT(8);
258 else if (Triple.getArch() == llvm::Triple::x86 ||
259 Triple.getArch() == llvm::Triple::arm ||
260 Triple.getArch() == llvm::Triple::thumb)
261 this->TLSSupported = !Triple.isOSVersionLT(9);
262 } else if (Triple.isWatchOS())
263 this->TLSSupported = !Triple.isOSVersionLT(2);
264
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000265 this->MCountName = "\01mcount";
266 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000267
Craig Topper3164f332014-03-11 03:39:26 +0000268 std::string isValidSectionSpecifier(StringRef SR) const override {
Chris Lattner30ba6742009-08-10 19:03:04 +0000269 // Let MCSectionMachO validate this.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000270 StringRef Segment, Section;
Chris Lattner30ba6742009-08-10 19:03:04 +0000271 unsigned TAA, StubSize;
Daniel Dunbar75942372011-03-19 02:06:21 +0000272 bool HasTAA;
Chris Lattner30ba6742009-08-10 19:03:04 +0000273 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
Daniel Dunbar75942372011-03-19 02:06:21 +0000274 TAA, HasTAA, StubSize);
Chris Lattner30ba6742009-08-10 19:03:04 +0000275 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000276
Craig Topper3164f332014-03-11 03:39:26 +0000277 const char *getStaticInitSectionSpecifier() const override {
Anders Carlsson851318a2010-06-08 22:47:50 +0000278 // FIXME: We should return 0 when building kexts.
279 return "__TEXT,__StaticInit,regular,pure_instructions";
280 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000281
John McCalleed64c72012-01-29 01:20:30 +0000282 /// Darwin does not support protected visibility. Darwin's "default"
283 /// is very similar to ELF's "protected"; Darwin requires a "weak"
284 /// attribute on declarations that can be dynamically replaced.
Craig Topper3164f332014-03-11 03:39:26 +0000285 bool hasProtectedVisibility() const override {
John McCalleed64c72012-01-29 01:20:30 +0000286 return false;
287 }
Akira Hatanaka68ab7fe2016-03-31 06:36:07 +0000288
289 unsigned getExnObjectAlignment() const override {
290 // The alignment of an exception object is 8-bytes for darwin since
291 // libc++abi doesn't declare _Unwind_Exception with __attribute__((aligned))
292 // and therefore doesn't guarantee 16-byte alignment.
293 return 64;
294 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000295};
296
Chris Lattner30ba6742009-08-10 19:03:04 +0000297
Torok Edwinb2b37c62009-06-30 17:10:35 +0000298// DragonFlyBSD Target
299template<typename Target>
300class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
301protected:
Craig Topper3164f332014-03-11 03:39:26 +0000302 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
303 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000304 // DragonFly defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000305 Builder.defineMacro("__DragonFly__");
306 Builder.defineMacro("__DragonFly_cc_version", "100001");
307 Builder.defineMacro("__ELF__");
308 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
309 Builder.defineMacro("__tune_i386__");
Saleem Abdulrasool56027092017-02-07 19:00:06 +0000310 DefineStd(Builder, "unix", Opts);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000311 }
312public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000313 DragonFlyBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
314 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000315 switch (Triple.getArch()) {
316 default:
317 case llvm::Triple::x86:
318 case llvm::Triple::x86_64:
319 this->MCountName = ".mcount";
320 break;
321 }
Eli Friedman4286fba2012-02-10 23:02:29 +0000322 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000323};
324
Dimitry Andricc6d924c2016-05-20 17:27:22 +0000325#ifndef FREEBSD_CC_VERSION
326#define FREEBSD_CC_VERSION 0U
327#endif
328
Torok Edwinb2b37c62009-06-30 17:10:35 +0000329// FreeBSD Target
330template<typename Target>
331class FreeBSDTargetInfo : public OSTargetInfo<Target> {
332protected:
Craig Topper3164f332014-03-11 03:39:26 +0000333 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
334 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000335 // FreeBSD defines; list based off of gcc output
336
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000337 unsigned Release = Triple.getOSMajorVersion();
338 if (Release == 0U)
Dimitry Andricc6d924c2016-05-20 17:27:22 +0000339 Release = 8U;
340 unsigned CCVersion = FREEBSD_CC_VERSION;
341 if (CCVersion == 0U)
342 CCVersion = Release * 100000U + 1U;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000343
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000344 Builder.defineMacro("__FreeBSD__", Twine(Release));
Dimitry Andricc6d924c2016-05-20 17:27:22 +0000345 Builder.defineMacro("__FreeBSD_cc_version", Twine(CCVersion));
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000346 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
Saleem Abdulrasool56027092017-02-07 19:00:06 +0000347 DefineStd(Builder, "unix", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000348 Builder.defineMacro("__ELF__");
Ed Schoutend0621462013-09-29 07:54:52 +0000349
350 // On FreeBSD, wchar_t contains the number of the code point as
351 // used by the character set of the locale. These character sets are
352 // not necessarily a superset of ASCII.
Richard Smith00a4a852015-01-13 01:47:45 +0000353 //
354 // FIXME: This is wrong; the macro refers to the numerical values
355 // of wchar_t *literals*, which are not locale-dependent. However,
356 // FreeBSD systems apparently depend on us getting this wrong, and
357 // setting this to 1 is conforming even if all the basic source
358 // character literals have the same encoding as char and wchar_t.
Ed Schoutend0621462013-09-29 07:54:52 +0000359 Builder.defineMacro("__STDC_MB_MIGHT_NEQ_WC__", "1");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000360 }
361public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000362 FreeBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
363 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000364 switch (Triple.getArch()) {
365 default:
366 case llvm::Triple::x86:
367 case llvm::Triple::x86_64:
368 this->MCountName = ".mcount";
369 break;
370 case llvm::Triple::mips:
371 case llvm::Triple::mipsel:
372 case llvm::Triple::ppc:
373 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +0000374 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000375 this->MCountName = "_mcount";
376 break;
377 case llvm::Triple::arm:
378 this->MCountName = "__mcount";
379 break;
Duncan Sands9cb27e92009-07-08 13:55:08 +0000380 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000381 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000382};
383
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000384// GNU/kFreeBSD Target
385template<typename Target>
386class KFreeBSDTargetInfo : public OSTargetInfo<Target> {
387protected:
Craig Topper3164f332014-03-11 03:39:26 +0000388 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
389 MacroBuilder &Builder) const override {
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000390 // GNU/kFreeBSD defines; list based off of gcc output
391
Saleem Abdulrasool56027092017-02-07 19:00:06 +0000392 DefineStd(Builder, "unix", Opts);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000393 Builder.defineMacro("__FreeBSD_kernel__");
394 Builder.defineMacro("__GLIBC__");
395 Builder.defineMacro("__ELF__");
396 if (Opts.POSIXThreads)
397 Builder.defineMacro("_REENTRANT");
398 if (Opts.CPlusPlus)
399 Builder.defineMacro("_GNU_SOURCE");
400 }
401public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000402 KFreeBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
403 : OSTargetInfo<Target>(Triple, Opts) {}
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000404};
405
Reid Kleckner330fb172016-05-11 16:19:05 +0000406// Haiku Target
407template<typename Target>
408class HaikuTargetInfo : public OSTargetInfo<Target> {
409protected:
410 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
411 MacroBuilder &Builder) const override {
412 // Haiku defines; list based off of gcc output
413 Builder.defineMacro("__HAIKU__");
414 Builder.defineMacro("__ELF__");
Saleem Abdulrasool56027092017-02-07 19:00:06 +0000415 DefineStd(Builder, "unix", Opts);
Reid Kleckner330fb172016-05-11 16:19:05 +0000416 }
417public:
418 HaikuTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
419 : OSTargetInfo<Target>(Triple, Opts) {
420 this->SizeType = TargetInfo::UnsignedLong;
421 this->IntPtrType = TargetInfo::SignedLong;
422 this->PtrDiffType = TargetInfo::SignedLong;
423 this->ProcessIDType = TargetInfo::SignedLong;
424 this->TLSSupported = false;
425
426 }
427};
428
Chris Lattner3e2ee142010-07-07 16:01:42 +0000429// Minix Target
430template<typename Target>
431class MinixTargetInfo : public OSTargetInfo<Target> {
432protected:
Craig Topper3164f332014-03-11 03:39:26 +0000433 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
434 MacroBuilder &Builder) const override {
Chris Lattner3e2ee142010-07-07 16:01:42 +0000435 // Minix defines
436
437 Builder.defineMacro("__minix", "3");
438 Builder.defineMacro("_EM_WSIZE", "4");
439 Builder.defineMacro("_EM_PSIZE", "4");
440 Builder.defineMacro("_EM_SSIZE", "2");
441 Builder.defineMacro("_EM_LSIZE", "4");
442 Builder.defineMacro("_EM_FSIZE", "4");
443 Builder.defineMacro("_EM_DSIZE", "8");
Eli Friedman83de5132011-12-08 23:54:21 +0000444 Builder.defineMacro("__ELF__");
Saleem Abdulrasool56027092017-02-07 19:00:06 +0000445 DefineStd(Builder, "unix", Opts);
Chris Lattner3e2ee142010-07-07 16:01:42 +0000446 }
447public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000448 MinixTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
449 : OSTargetInfo<Target>(Triple, Opts) {}
Chris Lattner3e2ee142010-07-07 16:01:42 +0000450};
451
Torok Edwinb2b37c62009-06-30 17:10:35 +0000452// Linux target
453template<typename Target>
454class LinuxTargetInfo : public OSTargetInfo<Target> {
455protected:
Craig Topper3164f332014-03-11 03:39:26 +0000456 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
457 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000458 // Linux defines; list based off of gcc output
Saleem Abdulrasool56027092017-02-07 19:00:06 +0000459 DefineStd(Builder, "unix", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000460 DefineStd(Builder, "linux", Opts);
461 Builder.defineMacro("__gnu_linux__");
462 Builder.defineMacro("__ELF__");
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +0000463 if (Triple.isAndroid()) {
Evgeniy Stepanov94dc4c92012-04-26 12:08:09 +0000464 Builder.defineMacro("__ANDROID__", "1");
Dan Albert84aee012015-03-03 18:28:38 +0000465 unsigned Maj, Min, Rev;
David Majnemer5c2589a2015-06-01 23:38:25 +0000466 Triple.getEnvironmentVersion(Maj, Min, Rev);
Dan Albert84aee012015-03-03 18:28:38 +0000467 this->PlatformName = "android";
468 this->PlatformMinVersion = VersionTuple(Maj, Min, Rev);
Stephen Hinesa89d8ff2016-11-11 01:29:39 +0000469 if (Maj)
470 Builder.defineMacro("__ANDROID_API__", Twine(Maj));
Dan Albert84aee012015-03-03 18:28:38 +0000471 }
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000472 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000473 Builder.defineMacro("_REENTRANT");
Douglas Gregor3ecc6652010-04-21 05:52:38 +0000474 if (Opts.CPlusPlus)
475 Builder.defineMacro("_GNU_SOURCE");
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +0000476 if (this->HasFloat128)
477 Builder.defineMacro("__FLOAT128__");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000478 }
479public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000480 LinuxTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
481 : OSTargetInfo<Target>(Triple, Opts) {
Douglas Gregore6d6e512011-01-12 21:19:25 +0000482 this->WIntType = TargetInfo::UnsignedInt;
Hal Finkelecdb4542014-03-30 13:00:06 +0000483
484 switch (Triple.getArch()) {
485 default:
486 break;
487 case llvm::Triple::ppc:
488 case llvm::Triple::ppc64:
489 case llvm::Triple::ppc64le:
490 this->MCountName = "_mcount";
491 break;
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +0000492 case llvm::Triple::x86:
493 case llvm::Triple::x86_64:
494 case llvm::Triple::systemz:
495 this->HasFloat128 = true;
496 break;
Hal Finkelecdb4542014-03-30 13:00:06 +0000497 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000498 }
Benjamin Kramera518b222011-10-15 17:53:33 +0000499
Craig Topper3164f332014-03-11 03:39:26 +0000500 const char *getStaticInitSectionSpecifier() const override {
Benjamin Kramera518b222011-10-15 17:53:33 +0000501 return ".text.startup";
502 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000503};
504
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000505// NetBSD Target
506template<typename Target>
507class NetBSDTargetInfo : public OSTargetInfo<Target> {
508protected:
Craig Topper3164f332014-03-11 03:39:26 +0000509 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
510 MacroBuilder &Builder) const override {
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000511 // NetBSD defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000512 Builder.defineMacro("__NetBSD__");
513 Builder.defineMacro("__unix__");
514 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000515 if (Opts.POSIXThreads)
Joerg Sonnenberger84502662017-01-16 14:07:24 +0000516 Builder.defineMacro("_REENTRANT");
Joerg Sonnenbergercc1edb52014-05-13 18:58:36 +0000517
518 switch (Triple.getArch()) {
519 default:
520 break;
521 case llvm::Triple::arm:
522 case llvm::Triple::armeb:
523 case llvm::Triple::thumb:
524 case llvm::Triple::thumbeb:
525 Builder.defineMacro("__ARM_DWARF_EH__");
526 break;
527 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000528 }
529public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000530 NetBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
531 : OSTargetInfo<Target>(Triple, Opts) {
Joerg Sonnenberger740f3f42015-04-10 21:02:53 +0000532 this->MCountName = "_mcount";
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000533 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000534};
535
Torok Edwinb2b37c62009-06-30 17:10:35 +0000536// OpenBSD Target
537template<typename Target>
538class OpenBSDTargetInfo : public OSTargetInfo<Target> {
539protected:
Craig Topper3164f332014-03-11 03:39:26 +0000540 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
541 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000542 // OpenBSD defines; list based off of gcc output
543
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000544 Builder.defineMacro("__OpenBSD__");
Saleem Abdulrasool56027092017-02-07 19:00:06 +0000545 DefineStd(Builder, "unix", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000546 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000547 if (Opts.POSIXThreads)
Chris Lattner024e12d2012-04-25 06:12:24 +0000548 Builder.defineMacro("_REENTRANT");
Brad Smith0561a5a2017-02-20 03:18:15 +0000549 if (this->HasFloat128)
550 Builder.defineMacro("__FLOAT128__");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000551 }
552public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000553 OpenBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
554 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000555 this->TLSSupported = false;
Eli Friedman3715d1f2011-12-15 02:15:56 +0000556
Eli Friedman3715d1f2011-12-15 02:15:56 +0000557 switch (Triple.getArch()) {
Eli Friedman3715d1f2011-12-15 02:15:56 +0000558 case llvm::Triple::x86:
559 case llvm::Triple::x86_64:
Brad Smith0561a5a2017-02-20 03:18:15 +0000560 this->HasFloat128 = true;
561 // FALLTHROUGH
562 default:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000563 this->MCountName = "__mcount";
564 break;
565 case llvm::Triple::mips64:
566 case llvm::Triple::mips64el:
567 case llvm::Triple::ppc:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000568 case llvm::Triple::sparcv9:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000569 this->MCountName = "_mcount";
570 break;
571 }
572 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000573};
574
Eli Friedman9fa28852012-08-08 23:57:20 +0000575// Bitrig Target
576template<typename Target>
577class BitrigTargetInfo : public OSTargetInfo<Target> {
578protected:
Craig Topper3164f332014-03-11 03:39:26 +0000579 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
580 MacroBuilder &Builder) const override {
Eli Friedman9fa28852012-08-08 23:57:20 +0000581 // Bitrig defines; list based off of gcc output
582
583 Builder.defineMacro("__Bitrig__");
Saleem Abdulrasool56027092017-02-07 19:00:06 +0000584 DefineStd(Builder, "unix", Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +0000585 Builder.defineMacro("__ELF__");
586 if (Opts.POSIXThreads)
587 Builder.defineMacro("_REENTRANT");
Renato Golin9ba39232015-02-27 16:35:48 +0000588
589 switch (Triple.getArch()) {
590 default:
591 break;
592 case llvm::Triple::arm:
593 case llvm::Triple::armeb:
594 case llvm::Triple::thumb:
595 case llvm::Triple::thumbeb:
596 Builder.defineMacro("__ARM_DWARF_EH__");
597 break;
598 }
Eli Friedman9fa28852012-08-08 23:57:20 +0000599 }
600public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000601 BitrigTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
602 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000603 this->MCountName = "__mcount";
Eli Friedman9fa28852012-08-08 23:57:20 +0000604 }
605};
606
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000607// PSP Target
608template<typename Target>
609class PSPTargetInfo : public OSTargetInfo<Target> {
610protected:
Craig Topper3164f332014-03-11 03:39:26 +0000611 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
612 MacroBuilder &Builder) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000613 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000614 Builder.defineMacro("PSP");
615 Builder.defineMacro("_PSP");
616 Builder.defineMacro("__psp__");
617 Builder.defineMacro("__ELF__");
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000618 }
619public:
James Y Knightb214cbc2016-03-04 19:00:41 +0000620 PSPTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {}
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000621};
622
John Thompsone467e192009-11-19 17:18:50 +0000623// PS3 PPU Target
624template<typename Target>
625class PS3PPUTargetInfo : public OSTargetInfo<Target> {
626protected:
Craig Topper3164f332014-03-11 03:39:26 +0000627 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
628 MacroBuilder &Builder) const override {
John Thompsone467e192009-11-19 17:18:50 +0000629 // PS3 PPU defines.
John Thompson957816f2010-03-25 16:18:32 +0000630 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000631 Builder.defineMacro("__PPU__");
632 Builder.defineMacro("__CELLOS_LV2__");
633 Builder.defineMacro("__ELF__");
634 Builder.defineMacro("__LP32__");
John Thompson07a61a42010-06-24 22:44:13 +0000635 Builder.defineMacro("_ARCH_PPC64");
636 Builder.defineMacro("__powerpc64__");
John Thompsone467e192009-11-19 17:18:50 +0000637 }
638public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000639 PS3PPUTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
640 : OSTargetInfo<Target>(Triple, Opts) {
Nick Lewyckyc0a61732011-12-16 22:32:39 +0000641 this->LongWidth = this->LongAlign = 32;
642 this->PointerWidth = this->PointerAlign = 32;
John Thompson07a61a42010-06-24 22:44:13 +0000643 this->IntMaxType = TargetInfo::SignedLongLong;
John Thompson07a61a42010-06-24 22:44:13 +0000644 this->Int64Type = TargetInfo::SignedLongLong;
John Thompson6f8dba72009-12-18 14:21:08 +0000645 this->SizeType = TargetInfo::UnsignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +0000646 this->resetDataLayout("E-m:e-p:32:32-i64:64-n32:64");
John Thompsone467e192009-11-19 17:18:50 +0000647 }
648};
649
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000650template <typename Target>
651class PS4OSTargetInfo : public OSTargetInfo<Target> {
652protected:
653 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
654 MacroBuilder &Builder) const override {
655 Builder.defineMacro("__FreeBSD__", "9");
656 Builder.defineMacro("__FreeBSD_cc_version", "900001");
657 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
Saleem Abdulrasool56027092017-02-07 19:00:06 +0000658 DefineStd(Builder, "unix", Opts);
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000659 Builder.defineMacro("__ELF__");
Paul Robinson9d613612016-05-16 17:22:25 +0000660 Builder.defineMacro("__ORBIS__");
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000661 }
662public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000663 PS4OSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
664 : OSTargetInfo<Target>(Triple, Opts) {
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000665 this->WCharType = this->UnsignedShort;
666
Paul Robinsond30e2ee2015-07-14 20:52:32 +0000667 // On PS4, TLS variable cannot be aligned to more than 32 bytes (256 bits).
668 this->MaxTLSAlign = 256;
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000669
Sunil Srivastava0ce2f222016-02-05 20:50:02 +0000670 // On PS4, do not honor explicit bit field alignment,
671 // as in "__attribute__((aligned(2))) int b : 1;".
672 this->UseExplicitBitFieldAlignment = false;
673
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000674 switch (Triple.getArch()) {
675 default:
676 case llvm::Triple::x86_64:
677 this->MCountName = ".mcount";
678 break;
679 }
680 }
681};
682
Torok Edwinb2b37c62009-06-30 17:10:35 +0000683// Solaris target
684template<typename Target>
685class SolarisTargetInfo : public OSTargetInfo<Target> {
686protected:
Craig Topper3164f332014-03-11 03:39:26 +0000687 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
688 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000689 DefineStd(Builder, "sun", Opts);
Saleem Abdulrasool56027092017-02-07 19:00:06 +0000690 DefineStd(Builder, "unix", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000691 Builder.defineMacro("__ELF__");
692 Builder.defineMacro("__svr4__");
693 Builder.defineMacro("__SVR4");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000694 // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and
695 // newer, but to 500 for everything else. feature_test.h has a check to
696 // ensure that you are not using C99 with an old version of X/Open or C89
Richard Smithab506ad2014-10-20 23:26:58 +0000697 // with a new version.
698 if (Opts.C99)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000699 Builder.defineMacro("_XOPEN_SOURCE", "600");
700 else
701 Builder.defineMacro("_XOPEN_SOURCE", "500");
David Chisnalle04307e2012-03-02 10:49:52 +0000702 if (Opts.CPlusPlus)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000703 Builder.defineMacro("__C99FEATURES__");
David Chisnall0c1941cb2012-02-17 18:35:11 +0000704 Builder.defineMacro("_LARGEFILE_SOURCE");
705 Builder.defineMacro("_LARGEFILE64_SOURCE");
706 Builder.defineMacro("__EXTENSIONS__");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000707 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000708 }
709public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000710 SolarisTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
711 : OSTargetInfo<Target>(Triple, Opts) {
David Chisnallb526e932012-03-28 18:04:14 +0000712 this->WCharType = this->SignedInt;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000713 // FIXME: WIntType should be SignedLong
714 }
715};
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000716
717// Windows target
718template<typename Target>
719class WindowsTargetInfo : public OSTargetInfo<Target> {
720protected:
Craig Topper3164f332014-03-11 03:39:26 +0000721 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
722 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000723 Builder.defineMacro("_WIN32");
724 }
725 void getVisualStudioDefines(const LangOptions &Opts,
726 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000727 if (Opts.CPlusPlus) {
David Majnemerf6072342014-07-01 22:24:56 +0000728 if (Opts.RTTIData)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000729 Builder.defineMacro("_CPPRTTI");
730
Reid Kleckner16514352015-01-30 21:42:55 +0000731 if (Opts.CXXExceptions)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000732 Builder.defineMacro("_CPPUNWIND");
733 }
734
David Majnemer6a658902015-07-22 22:36:26 +0000735 if (Opts.Bool)
736 Builder.defineMacro("__BOOL_DEFINED");
737
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000738 if (!Opts.CharIsSigned)
739 Builder.defineMacro("_CHAR_UNSIGNED");
740
741 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
742 // but it works for now.
743 if (Opts.POSIXThreads)
744 Builder.defineMacro("_MT");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000745
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +0000746 if (Opts.MSCompatibilityVersion) {
747 Builder.defineMacro("_MSC_VER",
748 Twine(Opts.MSCompatibilityVersion / 100000));
749 Builder.defineMacro("_MSC_FULL_VER", Twine(Opts.MSCompatibilityVersion));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000750 // FIXME We cannot encode the revision information into 32-bits
751 Builder.defineMacro("_MSC_BUILD", Twine(1));
David Majnemeraaf2b842015-03-18 07:53:18 +0000752
David Majnemerb710a932015-05-11 03:57:49 +0000753 if (Opts.CPlusPlus11 && Opts.isCompatibleWithMSVC(LangOptions::MSVC2015))
David Majnemeraaf2b842015-03-18 07:53:18 +0000754 Builder.defineMacro("_HAS_CHAR16_T_LANGUAGE_SUPPORT", Twine(1));
David Majnemer017cf352016-06-28 03:13:16 +0000755
756 if (Opts.isCompatibleWithMSVC(LangOptions::MSVC2015)) {
757 if (Opts.CPlusPlus1z)
758 Builder.defineMacro("_MSVC_LANG", "201403L");
759 else if (Opts.CPlusPlus14)
760 Builder.defineMacro("_MSVC_LANG", "201402L");
761 }
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000762 }
Reid Kleckner6f6e76d2014-04-16 20:10:16 +0000763
764 if (Opts.MicrosoftExt) {
765 Builder.defineMacro("_MSC_EXTENSIONS");
766
767 if (Opts.CPlusPlus11) {
768 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
769 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
770 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
771 }
772 }
773
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000774 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000775 }
776
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000777public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000778 WindowsTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
779 : OSTargetInfo<Target>(Triple, Opts) {}
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000780};
781
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000782template <typename Target>
783class NaClTargetInfo : public OSTargetInfo<Target> {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000784protected:
Craig Topper3164f332014-03-11 03:39:26 +0000785 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
786 MacroBuilder &Builder) const override {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000787 if (Opts.POSIXThreads)
788 Builder.defineMacro("_REENTRANT");
789 if (Opts.CPlusPlus)
790 Builder.defineMacro("_GNU_SOURCE");
791
Saleem Abdulrasool56027092017-02-07 19:00:06 +0000792 DefineStd(Builder, "unix", Opts);
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000793 Builder.defineMacro("__ELF__");
794 Builder.defineMacro("__native_client__");
795 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000796
797public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000798 NaClTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
799 : OSTargetInfo<Target>(Triple, Opts) {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000800 this->LongAlign = 32;
801 this->LongWidth = 32;
802 this->PointerAlign = 32;
803 this->PointerWidth = 32;
804 this->IntMaxType = TargetInfo::SignedLongLong;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000805 this->Int64Type = TargetInfo::SignedLongLong;
806 this->DoubleAlign = 64;
807 this->LongDoubleWidth = 64;
808 this->LongDoubleAlign = 64;
Jan Wen Voung1f9c4ee2014-01-15 21:42:41 +0000809 this->LongLongWidth = 64;
810 this->LongLongAlign = 64;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000811 this->SizeType = TargetInfo::UnsignedInt;
812 this->PtrDiffType = TargetInfo::SignedInt;
813 this->IntPtrType = TargetInfo::SignedInt;
Guy Blank294cbbd2016-08-18 08:44:33 +0000814 // RegParmMax is inherited from the underlying architecture.
Stephan Bergmann17c7f702016-12-14 11:57:17 +0000815 this->LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Rafael Espindola1c09b262013-12-18 23:41:04 +0000816 if (Triple.getArch() == llvm::Triple::arm) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +0000817 // Handled in ARM's setABI().
Rafael Espindola1c09b262013-12-18 23:41:04 +0000818 } else if (Triple.getArch() == llvm::Triple::x86) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000819 this->resetDataLayout("e-m:e-p:32:32-i64:64-n8:16:32-S128");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000820 } else if (Triple.getArch() == llvm::Triple::x86_64) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000821 this->resetDataLayout("e-m:e-p:32:32-i64:64-n8:16:32:64-S128");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000822 } else if (Triple.getArch() == llvm::Triple::mipsel) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000823 // Handled on mips' setDataLayout.
Rafael Espindola1c09b262013-12-18 23:41:04 +0000824 } else {
825 assert(Triple.getArch() == llvm::Triple::le32);
James Y Knightb214cbc2016-03-04 19:00:41 +0000826 this->resetDataLayout("e-p:32:32-i64:64");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000827 }
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000828 }
829};
Torok Edwinb2b37c62009-06-30 17:10:35 +0000830
Petr Hosek62e1d232016-10-06 06:08:09 +0000831// Fuchsia Target
832template<typename Target>
833class FuchsiaTargetInfo : public OSTargetInfo<Target> {
834protected:
835 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
836 MacroBuilder &Builder) const override {
837 Builder.defineMacro("__Fuchsia__");
838 Builder.defineMacro("__ELF__");
839 if (Opts.POSIXThreads)
840 Builder.defineMacro("_REENTRANT");
841 // Required by the libc++ locale support.
842 if (Opts.CPlusPlus)
843 Builder.defineMacro("_GNU_SOURCE");
844 }
845public:
846 FuchsiaTargetInfo(const llvm::Triple &Triple,
847 const TargetOptions &Opts)
848 : OSTargetInfo<Target>(Triple, Opts) {
849 this->MCountName = "__mcount";
850 }
851};
852
Dan Gohmanc2853072015-09-03 22:51:53 +0000853// WebAssembly target
854template <typename Target>
855class WebAssemblyOSTargetInfo : public OSTargetInfo<Target> {
856 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Hans Wennborg7eb54642015-09-10 17:07:54 +0000857 MacroBuilder &Builder) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +0000858 // A common platform macro.
859 if (Opts.POSIXThreads)
860 Builder.defineMacro("_REENTRANT");
861 // Follow g++ convention and predefine _GNU_SOURCE for C++.
862 if (Opts.CPlusPlus)
863 Builder.defineMacro("_GNU_SOURCE");
864 }
865
866 // As an optimization, group static init code together in a section.
Hans Wennborg7eb54642015-09-10 17:07:54 +0000867 const char *getStaticInitSectionSpecifier() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +0000868 return ".text.__startup";
869 }
870
871public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000872 explicit WebAssemblyOSTargetInfo(const llvm::Triple &Triple,
873 const TargetOptions &Opts)
874 : OSTargetInfo<Target>(Triple, Opts) {
Dan Gohmanc2853072015-09-03 22:51:53 +0000875 this->MCountName = "__mcount";
Dan Gohmanc2853072015-09-03 22:51:53 +0000876 this->TheCXXABI.set(TargetCXXABI::WebAssembly);
877 }
878};
Dan Gohmanc2853072015-09-03 22:51:53 +0000879
Chris Lattner09d98f52008-10-05 21:50:58 +0000880//===----------------------------------------------------------------------===//
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000881// Specific target implementations.
882//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000883
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000884// PPC abstract base class
885class PPCTargetInfo : public TargetInfo {
886 static const Builtin::Info BuiltinInfo[];
887 static const char * const GCCRegNames[];
888 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Hal Finkel8eb59282012-06-11 22:35:19 +0000889 std::string CPU;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000890
891 // Target cpu features.
Eric Christopher758aad72017-03-21 22:06:18 +0000892 bool HasAltivec;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000893 bool HasVSX;
Bill Schmidt8c184e32014-10-10 17:21:23 +0000894 bool HasP8Vector;
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +0000895 bool HasP8Crypto;
Nemanja Ivanovic35458c22015-04-11 10:43:36 +0000896 bool HasDirectMove;
Hal Finkel0d0a1a52015-03-11 19:14:15 +0000897 bool HasQPX;
Kit Barton8246f282015-03-25 19:41:41 +0000898 bool HasHTM;
Nemanja Ivanovic239eec72015-04-09 23:58:16 +0000899 bool HasBPERMD;
900 bool HasExtDiv;
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +0000901 bool HasP9Vector;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000902
Ulrich Weigand8afad612014-07-28 13:17:52 +0000903protected:
904 std::string ABI;
905
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000906public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000907 PPCTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Eric Christopher758aad72017-03-21 22:06:18 +0000908 : TargetInfo(Triple), HasAltivec(false), HasVSX(false), HasP8Vector(false),
Saleem Abdulrasool10a49722016-04-08 16:52:00 +0000909 HasP8Crypto(false), HasDirectMove(false), HasQPX(false), HasHTM(false),
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +0000910 HasBPERMD(false), HasExtDiv(false), HasP9Vector(false) {
Eric Christopher153dad42017-03-25 02:55:21 +0000911 SuitableAlign = 128;
Alexey Bataev00396512015-07-02 03:40:19 +0000912 SimdDefaultAlign = 128;
Nico Weber3435ede2012-01-31 02:07:33 +0000913 LongDoubleWidth = LongDoubleAlign = 128;
Stephan Bergmann17c7f702016-12-14 11:57:17 +0000914 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble();
Nico Weber3435ede2012-01-31 02:07:33 +0000915 }
Eli Friedman9ffd4a92009-06-05 07:05:05 +0000916
Hal Finkel6b984f02012-07-03 16:51:04 +0000917 /// \brief Flags for architecture specific defines.
918 typedef enum {
919 ArchDefineNone = 0,
920 ArchDefineName = 1 << 0, // <name> is substituted for arch name.
921 ArchDefinePpcgr = 1 << 1,
922 ArchDefinePpcsq = 1 << 2,
923 ArchDefine440 = 1 << 3,
924 ArchDefine603 = 1 << 4,
925 ArchDefine604 = 1 << 5,
926 ArchDefinePwr4 = 1 << 6,
Bill Schmidt38378a02013-02-01 20:23:10 +0000927 ArchDefinePwr5 = 1 << 7,
928 ArchDefinePwr5x = 1 << 8,
929 ArchDefinePwr6 = 1 << 9,
930 ArchDefinePwr6x = 1 << 10,
931 ArchDefinePwr7 = 1 << 11,
Will Schmidtf0487512014-06-26 13:34:10 +0000932 ArchDefinePwr8 = 1 << 12,
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +0000933 ArchDefinePwr9 = 1 << 13,
934 ArchDefineA2 = 1 << 14,
935 ArchDefineA2q = 1 << 15
Hal Finkel6b984f02012-07-03 16:51:04 +0000936 } ArchDefineTypes;
937
Eric Christopher3646e622017-03-22 06:36:09 +0000938 // Set the language option for altivec based on our value.
939 void adjust(LangOptions &Opts) override {
940 if (HasAltivec)
941 Opts.AltiVec = 1;
942 TargetInfo::adjust(Opts);
943 }
944
Bill Schmidt38378a02013-02-01 20:23:10 +0000945 // Note: GCC recognizes the following additional cpus:
946 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
947 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
948 // titan, rs64.
Craig Topper3164f332014-03-11 03:39:26 +0000949 bool setCPU(const std::string &Name) override {
Hal Finkel8eb59282012-06-11 22:35:19 +0000950 bool CPUKnown = llvm::StringSwitch<bool>(Name)
951 .Case("generic", true)
952 .Case("440", true)
953 .Case("450", true)
954 .Case("601", true)
955 .Case("602", true)
956 .Case("603", true)
957 .Case("603e", true)
958 .Case("603ev", true)
959 .Case("604", true)
960 .Case("604e", true)
961 .Case("620", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000962 .Case("630", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000963 .Case("g3", true)
964 .Case("7400", true)
965 .Case("g4", true)
966 .Case("7450", true)
967 .Case("g4+", true)
968 .Case("750", true)
969 .Case("970", true)
970 .Case("g5", true)
971 .Case("a2", true)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +0000972 .Case("a2q", true)
Hal Finkelf6d6cb02012-09-18 22:25:03 +0000973 .Case("e500mc", true)
974 .Case("e5500", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000975 .Case("power3", true)
976 .Case("pwr3", true)
977 .Case("power4", true)
978 .Case("pwr4", true)
979 .Case("power5", true)
980 .Case("pwr5", true)
981 .Case("power5x", true)
982 .Case("pwr5x", true)
983 .Case("power6", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000984 .Case("pwr6", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000985 .Case("power6x", true)
986 .Case("pwr6x", true)
987 .Case("power7", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000988 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +0000989 .Case("power8", true)
990 .Case("pwr8", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +0000991 .Case("power9", true)
992 .Case("pwr9", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000993 .Case("powerpc", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000994 .Case("ppc", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000995 .Case("powerpc64", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000996 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +0000997 .Case("powerpc64le", true)
998 .Case("ppc64le", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000999 .Default(false);
1000
1001 if (CPUKnown)
1002 CPU = Name;
1003
1004 return CPUKnown;
1005 }
1006
Ulrich Weigand8afad612014-07-28 13:17:52 +00001007
1008 StringRef getABI() const override { return ABI; }
1009
Craig Topper6c03a542015-10-19 04:51:35 +00001010 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
1011 return llvm::makeArrayRef(BuiltinInfo,
1012 clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner10a5b382007-01-29 05:24:35 +00001013 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001014
Craig Topper3164f332014-03-11 03:39:26 +00001015 bool isCLZForZeroUndef() const override { return false; }
Bob Wilson19a2f2b2012-01-28 18:02:29 +00001016
Craig Topper3164f332014-03-11 03:39:26 +00001017 void getTargetDefines(const LangOptions &Opts,
1018 MacroBuilder &Builder) const override;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001019
Eric Christopher8c47b422015-10-09 18:39:55 +00001020 bool
1021 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
1022 StringRef CPU,
1023 const std::vector<std::string> &FeaturesVec) const override;
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001024
Craig Topper3164f332014-03-11 03:39:26 +00001025 bool handleTargetFeatures(std::vector<std::string> &Features,
1026 DiagnosticsEngine &Diags) override;
1027 bool hasFeature(StringRef Feature) const override;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001028 void setFeatureEnabled(llvm::StringMap<bool> &Features, StringRef Name,
1029 bool Enabled) const override;
Craig Topper3164f332014-03-11 03:39:26 +00001030
Craig Topperf054e3a2015-10-19 03:52:27 +00001031 ArrayRef<const char *> getGCCRegNames() const override;
1032 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00001033 bool validateAsmConstraint(const char *&Name,
1034 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00001035 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +00001036 default: return false;
1037 case 'O': // Zero
John Thompson07a61a42010-06-24 22:44:13 +00001038 break;
Anders Carlssonf511f642007-11-27 04:11:28 +00001039 case 'b': // Base register
1040 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +00001041 Info.setAllowsRegister();
John Thompson07a61a42010-06-24 22:44:13 +00001042 break;
1043 // FIXME: The following are added to allow parsing.
1044 // I just took a guess at what the actions should be.
1045 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001046 case 'd': // Floating point register (containing 64-bit value)
John Thompson07a61a42010-06-24 22:44:13 +00001047 case 'v': // Altivec vector register
1048 Info.setAllowsRegister();
1049 break;
1050 case 'w':
1051 switch (Name[1]) {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001052 case 'd':// VSX vector register to hold vector double data
1053 case 'f':// VSX vector register to hold vector float data
1054 case 's':// VSX vector register to hold scalar float data
1055 case 'a':// Any VSX register
Hal Finkelf7a07a52014-03-02 18:24:18 +00001056 case 'c':// An individual CR bit
John Thompson07a61a42010-06-24 22:44:13 +00001057 break;
1058 default:
1059 return false;
1060 }
1061 Info.setAllowsRegister();
1062 Name++; // Skip over 'w'.
1063 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001064 case 'h': // `MQ', `CTR', or `LINK' register
1065 case 'q': // `MQ' register
1066 case 'c': // `CTR' register
1067 case 'l': // `LINK' register
1068 case 'x': // `CR' register (condition register) number 0
1069 case 'y': // `CR' register (condition register)
1070 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson07a61a42010-06-24 22:44:13 +00001071 Info.setAllowsRegister();
1072 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001073 case 'I': // Signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +00001074 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001075 // (use `L' instead for SImode constants)
1076 case 'K': // Unsigned 16-bit constant
1077 case 'L': // Signed 16-bit constant shifted left 16 bits
1078 case 'M': // Constant larger than 31
1079 case 'N': // Exact power of 2
1080 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +00001081 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001082 // register with one instruction per word
John Thompson07a61a42010-06-24 22:44:13 +00001083 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001084 // into a register using three instructions
John Thompson07a61a42010-06-24 22:44:13 +00001085 break;
1086 case 'm': // Memory operand. Note that on PowerPC targets, m can
1087 // include addresses that update the base register. It
1088 // is therefore only safe to use `m' in an asm statement
1089 // if that asm statement accesses the operand exactly once.
1090 // The asm statement must also use `%U<opno>' as a
Sebastian Redldd008712010-08-17 22:42:34 +00001091 // placeholder for the "update" flag in the corresponding
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001092 // load or store instruction. For example:
John Thompson07a61a42010-06-24 22:44:13 +00001093 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001094 // is correct but:
John Thompson07a61a42010-06-24 22:44:13 +00001095 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
1096 // is not. Use es rather than m if you don't want the base
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001097 // register to be updated.
1098 case 'e':
John Thompsonceebdf12010-06-25 00:02:05 +00001099 if (Name[1] != 's')
1100 return false;
Sebastian Redldd008712010-08-17 22:42:34 +00001101 // es: A "stable" memory operand; that is, one which does not
John Thompson07a61a42010-06-24 22:44:13 +00001102 // include any automodification of the base register. Unlike
1103 // `m', this constraint can be used in asm statements that
1104 // might access the operand several times, or that might not
John Thompsonceebdf12010-06-25 00:02:05 +00001105 // access it at all.
John Thompson07a61a42010-06-24 22:44:13 +00001106 Info.setAllowsMemory();
John Thompsonceebdf12010-06-25 00:02:05 +00001107 Name++; // Skip over 'e'.
John Thompson07a61a42010-06-24 22:44:13 +00001108 break;
1109 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001110 // usually better to use `m' or `es' in asm statements)
John Thompson07a61a42010-06-24 22:44:13 +00001111 case 'Z': // Memory operand that is an indexed or indirect from a
1112 // register (it is usually better to use `m' or `es' in
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001113 // asm statements)
John Thompson07a61a42010-06-24 22:44:13 +00001114 Info.setAllowsMemory();
1115 Info.setAllowsRegister();
1116 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001117 case 'R': // AIX TOC entry
John Thompson07a61a42010-06-24 22:44:13 +00001118 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001119 // register (`p' is preferable for asm statements)
1120 case 'S': // Constant suitable as a 64-bit mask operand
1121 case 'T': // Constant suitable as a 32-bit mask operand
1122 case 'U': // System V Release 4 small data area reference
John Thompson07a61a42010-06-24 22:44:13 +00001123 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001124 // instructions
1125 case 'W': // Vector constant that does not require memory
1126 case 'j': // Vector constant that is all zeros.
John Thompson07a61a42010-06-24 22:44:13 +00001127 break;
1128 // End FIXME.
Anders Carlssonf511f642007-11-27 04:11:28 +00001129 }
John Thompson07a61a42010-06-24 22:44:13 +00001130 return true;
Anders Carlssonf511f642007-11-27 04:11:28 +00001131 }
Craig Topper3164f332014-03-11 03:39:26 +00001132 std::string convertConstraint(const char *&Constraint) const override {
Hal Finkelf7a07a52014-03-02 18:24:18 +00001133 std::string R;
1134 switch (*Constraint) {
1135 case 'e':
1136 case 'w':
1137 // Two-character constraint; add "^" hint for later parsing.
1138 R = std::string("^") + std::string(Constraint, 2);
1139 Constraint++;
1140 break;
1141 default:
1142 return TargetInfo::convertConstraint(Constraint);
1143 }
1144 return R;
1145 }
Craig Topper3164f332014-03-11 03:39:26 +00001146 const char *getClobbers() const override {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001147 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +00001148 }
Craig Topper3164f332014-03-11 03:39:26 +00001149 int getEHDataRegisterNumber(unsigned RegNo) const override {
Adhemerval Zanella5d874ae2013-01-22 20:02:45 +00001150 if (RegNo == 0) return 3;
1151 if (RegNo == 1) return 4;
1152 return -1;
1153 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00001154
1155 bool hasSjLjLowering() const override {
1156 return true;
1157 }
David Majnemer2617ea62015-06-09 18:05:33 +00001158
1159 bool useFloat128ManglingForLongDouble() const override {
1160 return LongDoubleWidth == 128 &&
Stephan Bergmann17c7f702016-12-14 11:57:17 +00001161 LongDoubleFormat == &llvm::APFloat::PPCDoubleDouble() &&
David Majnemer2617ea62015-06-09 18:05:33 +00001162 getTriple().isOSBinFormatELF();
1163 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001164};
Anders Carlssonf511f642007-11-27 04:11:28 +00001165
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001166const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00001167#define BUILTIN(ID, TYPE, ATTRS) \
1168 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1169#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1170 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5abdec72009-06-14 01:05:48 +00001171#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001172};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001173
Eric Christopher917e9522014-11-18 22:36:15 +00001174/// handleTargetFeatures - Perform initialization based on the user
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001175/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00001176bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001177 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00001178 for (const auto &Feature : Features) {
Eric Christopher758aad72017-03-21 22:06:18 +00001179 if (Feature == "+altivec") {
1180 HasAltivec = true;
1181 } else if (Feature == "+vsx") {
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001182 HasVSX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001183 } else if (Feature == "+bpermd") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001184 HasBPERMD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001185 } else if (Feature == "+extdiv") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001186 HasExtDiv = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001187 } else if (Feature == "+power8-vector") {
Bill Schmidt8c184e32014-10-10 17:21:23 +00001188 HasP8Vector = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001189 } else if (Feature == "+crypto") {
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001190 HasP8Crypto = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001191 } else if (Feature == "+direct-move") {
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001192 HasDirectMove = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001193 } else if (Feature == "+qpx") {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001194 HasQPX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001195 } else if (Feature == "+htm") {
Kit Barton8246f282015-03-25 19:41:41 +00001196 HasHTM = true;
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001197 } else if (Feature == "+float128") {
1198 HasFloat128 = true;
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001199 } else if (Feature == "+power9-vector") {
1200 HasP9Vector = true;
Kit Barton8246f282015-03-25 19:41:41 +00001201 }
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001202 // TODO: Finish this list and add an assert that we've handled them
1203 // all.
1204 }
Eric Christopher02c33352015-08-25 00:59:11 +00001205
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001206 return true;
1207}
1208
Chris Lattnerecd49032009-03-02 22:27:17 +00001209/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
1210/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001211void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001212 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00001213 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001214 Builder.defineMacro("__ppc__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001215 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001216 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001217 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001218 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001219 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001220 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001221 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001222 Builder.defineMacro("__ppc64__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001223 Builder.defineMacro("__PPC64__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001224 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001225
Chris Lattnerecd49032009-03-02 22:27:17 +00001226 // Target properties.
Bill Schmidt778d3872013-07-26 01:36:11 +00001227 if (getTriple().getArch() == llvm::Triple::ppc64le) {
1228 Builder.defineMacro("_LITTLE_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001229 } else {
1230 if (getTriple().getOS() != llvm::Triple::NetBSD &&
1231 getTriple().getOS() != llvm::Triple::OpenBSD)
1232 Builder.defineMacro("_BIG_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001233 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001234
Ulrich Weigand8afad612014-07-28 13:17:52 +00001235 // ABI options.
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001236 if (ABI == "elfv1" || ABI == "elfv1-qpx")
Ulrich Weigand8afad612014-07-28 13:17:52 +00001237 Builder.defineMacro("_CALL_ELF", "1");
1238 if (ABI == "elfv2")
1239 Builder.defineMacro("_CALL_ELF", "2");
1240
Eric Christopher2fd2eda2017-03-25 03:33:59 +00001241 // This typically is only for a new enough linker (bfd >= 2.16.2 or gold), but
Eric Christopher1e6fedb2017-03-25 19:26:04 +00001242 // our suppport post-dates this and it should work on all 64-bit ppc linux
1243 // platforms. It is guaranteed to work on all elfv2 platforms.
1244 if (getTriple().getOS() == llvm::Triple::Linux && PointerWidth == 64)
Eric Christopher2fd2eda2017-03-25 03:33:59 +00001245 Builder.defineMacro("_CALL_LINUX", "1");
1246
Chris Lattnerecd49032009-03-02 22:27:17 +00001247 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001248 Builder.defineMacro("__NATURAL_ALIGNMENT__");
1249 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001250
Chris Lattnerecd49032009-03-02 22:27:17 +00001251 // FIXME: Should be controlled by command line option.
Eric Christopheree214102017-03-25 06:37:23 +00001252 if (LongDoubleWidth == 128) {
Roman Divacky13b586f2013-07-03 19:45:54 +00001253 Builder.defineMacro("__LONG_DOUBLE_128__");
Eric Christopheree214102017-03-25 06:37:23 +00001254 Builder.defineMacro("__LONGDOUBLE128");
1255 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001256
Eric Christopher32ac5e42017-02-15 07:50:11 +00001257 // Define this for elfv2 (64-bit only) or 64-bit darwin.
1258 if (ABI == "elfv2" ||
1259 (getTriple().getOS() == llvm::Triple::Darwin && PointerWidth == 64))
1260 Builder.defineMacro("__STRUCT_PARM_ALIGN__", "16");
1261
Hal Finkel8eb59282012-06-11 22:35:19 +00001262 // CPU identification.
Eric Christopherb70819e2017-03-25 02:29:18 +00001263 ArchDefineTypes defs =
1264 (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
1265 .Case("440", ArchDefineName)
1266 .Case("450", ArchDefineName | ArchDefine440)
1267 .Case("601", ArchDefineName)
1268 .Case("602", ArchDefineName | ArchDefinePpcgr)
1269 .Case("603", ArchDefineName | ArchDefinePpcgr)
1270 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1271 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1272 .Case("604", ArchDefineName | ArchDefinePpcgr)
1273 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
1274 .Case("620", ArchDefineName | ArchDefinePpcgr)
1275 .Case("630", ArchDefineName | ArchDefinePpcgr)
1276 .Case("7400", ArchDefineName | ArchDefinePpcgr)
1277 .Case("7450", ArchDefineName | ArchDefinePpcgr)
1278 .Case("750", ArchDefineName | ArchDefinePpcgr)
1279 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr |
1280 ArchDefinePpcsq)
1281 .Case("a2", ArchDefineA2)
1282 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
1283 .Case("pwr3", ArchDefinePpcgr)
1284 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
1285 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr |
1286 ArchDefinePpcsq)
1287 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4 |
1288 ArchDefinePpcgr | ArchDefinePpcsq)
1289 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5 |
1290 ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1291 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x |
1292 ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr |
1293 ArchDefinePpcsq)
1294 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6 |
1295 ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4 |
1296 ArchDefinePpcgr | ArchDefinePpcsq)
1297 .Case("pwr8", ArchDefineName | ArchDefinePwr7 | ArchDefinePwr6x |
1298 ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5 |
1299 ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1300 .Case("pwr9", ArchDefineName | ArchDefinePwr8 | ArchDefinePwr7 |
1301 ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x |
1302 ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr |
1303 ArchDefinePpcsq)
1304 .Case("power3", ArchDefinePpcgr)
1305 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1306 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr |
1307 ArchDefinePpcsq)
1308 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4 |
1309 ArchDefinePpcgr | ArchDefinePpcsq)
1310 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5 |
1311 ArchDefinePwr4 | ArchDefinePpcgr |
1312 ArchDefinePpcsq)
1313 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x |
1314 ArchDefinePwr5 | ArchDefinePwr4 |
1315 ArchDefinePpcgr | ArchDefinePpcsq)
1316 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6 |
1317 ArchDefinePwr5x | ArchDefinePwr5 |
1318 ArchDefinePwr4 | ArchDefinePpcgr |
1319 ArchDefinePpcsq)
1320 .Case("power8", ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr6x |
1321 ArchDefinePwr6 | ArchDefinePwr5x |
1322 ArchDefinePwr5 | ArchDefinePwr4 |
1323 ArchDefinePpcgr | ArchDefinePpcsq)
1324 .Case("power9", ArchDefinePwr9 | ArchDefinePwr8 | ArchDefinePwr7 |
1325 ArchDefinePwr6x | ArchDefinePwr6 |
1326 ArchDefinePwr5x | ArchDefinePwr5 |
1327 ArchDefinePwr4 | ArchDefinePpcgr |
1328 ArchDefinePpcsq)
1329 // powerpc64le automatically defaults to at least power8.
1330 .Case("ppc64le", ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr6x |
1331 ArchDefinePwr6 | ArchDefinePwr5x |
1332 ArchDefinePwr5 | ArchDefinePwr4 |
1333 ArchDefinePpcgr | ArchDefinePpcsq)
1334 .Default(ArchDefineNone);
Hal Finkel6b984f02012-07-03 16:51:04 +00001335
1336 if (defs & ArchDefineName)
1337 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
1338 if (defs & ArchDefinePpcgr)
1339 Builder.defineMacro("_ARCH_PPCGR");
1340 if (defs & ArchDefinePpcsq)
1341 Builder.defineMacro("_ARCH_PPCSQ");
1342 if (defs & ArchDefine440)
Hal Finkel8eb59282012-06-11 22:35:19 +00001343 Builder.defineMacro("_ARCH_440");
Hal Finkel6b984f02012-07-03 16:51:04 +00001344 if (defs & ArchDefine603)
1345 Builder.defineMacro("_ARCH_603");
1346 if (defs & ArchDefine604)
1347 Builder.defineMacro("_ARCH_604");
Bill Schmidt38378a02013-02-01 20:23:10 +00001348 if (defs & ArchDefinePwr4)
Hal Finkel6b984f02012-07-03 16:51:04 +00001349 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt38378a02013-02-01 20:23:10 +00001350 if (defs & ArchDefinePwr5)
Hal Finkel6b984f02012-07-03 16:51:04 +00001351 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt38378a02013-02-01 20:23:10 +00001352 if (defs & ArchDefinePwr5x)
1353 Builder.defineMacro("_ARCH_PWR5X");
1354 if (defs & ArchDefinePwr6)
Hal Finkel8eb59282012-06-11 22:35:19 +00001355 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt38378a02013-02-01 20:23:10 +00001356 if (defs & ArchDefinePwr6x)
1357 Builder.defineMacro("_ARCH_PWR6X");
1358 if (defs & ArchDefinePwr7)
1359 Builder.defineMacro("_ARCH_PWR7");
Will Schmidtf0487512014-06-26 13:34:10 +00001360 if (defs & ArchDefinePwr8)
1361 Builder.defineMacro("_ARCH_PWR8");
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001362 if (defs & ArchDefinePwr9)
1363 Builder.defineMacro("_ARCH_PWR9");
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001364 if (defs & ArchDefineA2)
1365 Builder.defineMacro("_ARCH_A2");
1366 if (defs & ArchDefineA2q) {
1367 Builder.defineMacro("_ARCH_A2Q");
1368 Builder.defineMacro("_ARCH_QP");
1369 }
1370
1371 if (getTriple().getVendor() == llvm::Triple::BGQ) {
1372 Builder.defineMacro("__bg__");
1373 Builder.defineMacro("__THW_BLUEGENE__");
1374 Builder.defineMacro("__bgq__");
1375 Builder.defineMacro("__TOS_BGQ__");
1376 }
Bill Schmidt38378a02013-02-01 20:23:10 +00001377
Eric Christopher758aad72017-03-21 22:06:18 +00001378 if (HasAltivec) {
1379 Builder.defineMacro("__VEC__", "10206");
1380 Builder.defineMacro("__ALTIVEC__");
1381 }
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001382 if (HasVSX)
1383 Builder.defineMacro("__VSX__");
Bill Schmidt8c184e32014-10-10 17:21:23 +00001384 if (HasP8Vector)
Bill Schmidt59eb7672014-10-10 15:09:43 +00001385 Builder.defineMacro("__POWER8_VECTOR__");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001386 if (HasP8Crypto)
1387 Builder.defineMacro("__CRYPTO__");
Kit Barton8246f282015-03-25 19:41:41 +00001388 if (HasHTM)
1389 Builder.defineMacro("__HTM__");
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001390 if (HasFloat128)
1391 Builder.defineMacro("__FLOAT128__");
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001392 if (HasP9Vector)
1393 Builder.defineMacro("__POWER9_VECTOR__");
Hal Finkela57b8902015-10-01 13:39:49 +00001394
1395 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
1396 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
1397 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
1398 if (PointerWidth == 64)
1399 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001400
Eric Christopher0d361162017-03-25 05:40:13 +00001401 // We have support for the bswap intrinsics so we can define this.
1402 Builder.defineMacro("__HAVE_BSWAP__", "1");
1403
Bill Schmidt38378a02013-02-01 20:23:10 +00001404 // FIXME: The following are not yet generated here by Clang, but are
1405 // generated by GCC:
1406 //
1407 // _SOFT_FLOAT_
1408 // __RECIP_PRECISION__
1409 // __APPLE_ALTIVEC__
Bill Schmidt38378a02013-02-01 20:23:10 +00001410 // __RECIP__
1411 // __RECIPF__
1412 // __RSQRTE__
1413 // __RSQRTEF__
1414 // _SOFT_DOUBLE_
1415 // __NO_LWSYNC__
Bill Schmidt38378a02013-02-01 20:23:10 +00001416 // __CMODEL_MEDIUM__
1417 // __CMODEL_LARGE__
1418 // _CALL_SYSV
1419 // _CALL_DARWIN
1420 // __NO_FPRS__
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001421}
1422
Eric Christophera8a14c32015-08-31 18:39:16 +00001423// Handle explicit options being passed to the compiler here: if we've
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001424// explicitly turned off vsx and turned on any of:
1425// - power8-vector
1426// - direct-move
1427// - float128
1428// - power9-vector
1429// then go ahead and error since the customer has expressed an incompatible
Eric Christophera8a14c32015-08-31 18:39:16 +00001430// set of options.
1431static bool ppcUserFeaturesCheck(DiagnosticsEngine &Diags,
Eric Christopher8c47b422015-10-09 18:39:55 +00001432 const std::vector<std::string> &FeaturesVec) {
Eric Christophera8a14c32015-08-31 18:39:16 +00001433
1434 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "-vsx") !=
1435 FeaturesVec.end()) {
1436 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+power8-vector") !=
1437 FeaturesVec.end()) {
1438 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mpower8-vector"
1439 << "-mno-vsx";
1440 return false;
1441 }
1442
1443 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+direct-move") !=
1444 FeaturesVec.end()) {
1445 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mdirect-move"
1446 << "-mno-vsx";
1447 return false;
1448 }
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001449
1450 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+float128") !=
1451 FeaturesVec.end()) {
1452 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mfloat128"
1453 << "-mno-vsx";
1454 return false;
1455 }
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001456
1457 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+power9-vector") !=
1458 FeaturesVec.end()) {
1459 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mpower9-vector"
1460 << "-mno-vsx";
1461 return false;
1462 }
Eric Christophera8a14c32015-08-31 18:39:16 +00001463 }
1464
1465 return true;
1466}
1467
Eric Christopher8c47b422015-10-09 18:39:55 +00001468bool PPCTargetInfo::initFeatureMap(
1469 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
1470 const std::vector<std::string> &FeaturesVec) const {
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001471 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1472 .Case("7400", true)
1473 .Case("g4", true)
1474 .Case("7450", true)
1475 .Case("g4+", true)
1476 .Case("970", true)
1477 .Case("g5", true)
1478 .Case("pwr6", true)
1479 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +00001480 .Case("pwr8", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001481 .Case("pwr9", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001482 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +00001483 .Case("ppc64le", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001484 .Default(false);
Hal Finkelb58ce852013-02-01 18:44:19 +00001485
1486 Features["qpx"] = (CPU == "a2q");
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001487 Features["power9-vector"] = (CPU == "pwr9");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001488 Features["crypto"] = llvm::StringSwitch<bool>(CPU)
1489 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001490 .Case("pwr9", true)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001491 .Case("pwr8", true)
1492 .Default(false);
1493 Features["power8-vector"] = llvm::StringSwitch<bool>(CPU)
1494 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001495 .Case("pwr9", true)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001496 .Case("pwr8", true)
1497 .Default(false);
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001498 Features["bpermd"] = llvm::StringSwitch<bool>(CPU)
1499 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001500 .Case("pwr9", true)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001501 .Case("pwr8", true)
1502 .Case("pwr7", true)
1503 .Default(false);
1504 Features["extdiv"] = llvm::StringSwitch<bool>(CPU)
1505 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001506 .Case("pwr9", true)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001507 .Case("pwr8", true)
1508 .Case("pwr7", true)
1509 .Default(false);
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001510 Features["direct-move"] = llvm::StringSwitch<bool>(CPU)
1511 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001512 .Case("pwr9", true)
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001513 .Case("pwr8", true)
1514 .Default(false);
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001515 Features["vsx"] = llvm::StringSwitch<bool>(CPU)
1516 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001517 .Case("pwr9", true)
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001518 .Case("pwr8", true)
1519 .Case("pwr7", true)
1520 .Default(false);
Eric Christopher74fa24f2017-03-20 21:12:53 +00001521 Features["htm"] = llvm::StringSwitch<bool>(CPU)
1522 .Case("ppc64le", true)
1523 .Case("pwr9", true)
1524 .Case("pwr8", true)
1525 .Default(false);
Eric Christopheref1e2952015-08-28 02:13:58 +00001526
Eric Christophera8a14c32015-08-31 18:39:16 +00001527 if (!ppcUserFeaturesCheck(Diags, FeaturesVec))
1528 return false;
Eric Christopher007b0a02015-08-28 22:32:01 +00001529
Eric Christopher007b0a02015-08-28 22:32:01 +00001530 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001531}
1532
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001533bool PPCTargetInfo::hasFeature(StringRef Feature) const {
Bill Schmidte6e9d152014-11-02 14:56:41 +00001534 return llvm::StringSwitch<bool>(Feature)
Eric Christopher758aad72017-03-21 22:06:18 +00001535 .Case("powerpc", true)
1536 .Case("altivec", HasAltivec)
1537 .Case("vsx", HasVSX)
1538 .Case("power8-vector", HasP8Vector)
1539 .Case("crypto", HasP8Crypto)
1540 .Case("direct-move", HasDirectMove)
1541 .Case("qpx", HasQPX)
1542 .Case("htm", HasHTM)
1543 .Case("bpermd", HasBPERMD)
1544 .Case("extdiv", HasExtDiv)
1545 .Case("float128", HasFloat128)
1546 .Case("power9-vector", HasP9Vector)
1547 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001548}
Chris Lattner17df24e2008-04-21 18:56:49 +00001549
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001550void PPCTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
1551 StringRef Name, bool Enabled) const {
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001552 if (Enabled) {
Eric Christopherd26d8832017-04-15 06:15:00 +00001553 // If we're enabling any of the vsx based features then enable vsx and
1554 // altivec. We'll diagnose any problems later.
1555 bool FeatureHasVSX = llvm::StringSwitch<bool>(Name)
1556 .Case("vsx", true)
1557 .Case("direct-move", true)
1558 .Case("power8-vector", true)
1559 .Case("power9-vector", true)
1560 .Case("float128", true)
1561 .Default(false);
1562 if (FeatureHasVSX)
1563 Features["vsx"] = Features["altivec"] = true;
1564 if (Name == "power9-vector")
1565 Features["power8-vector"] = true;
1566 Features[Name] = true;
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001567 } else {
Eric Christopherd26d8832017-04-15 06:15:00 +00001568 // If we're disabling altivec or vsx go ahead and disable all of the vsx
1569 // features.
1570 if ((Name == "altivec") || (Name == "vsx"))
1571 Features["vsx"] = Features["direct-move"] = Features["power8-vector"] =
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001572 Features["float128"] = Features["power9-vector"] = false;
Eric Christopherd26d8832017-04-15 06:15:00 +00001573 if (Name == "power8-vector")
1574 Features["power9-vector"] = false;
1575 Features[Name] = false;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001576 }
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001577}
1578
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001579const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001580 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1581 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1582 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1583 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1584 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1585 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1586 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1587 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001588 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001589 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001590 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001591 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1592 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1593 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1594 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001595 "vrsave", "vscr",
1596 "spe_acc", "spefscr",
1597 "sfp"
1598};
Chris Lattner10a5b382007-01-29 05:24:35 +00001599
Craig Topperf054e3a2015-10-19 03:52:27 +00001600ArrayRef<const char*> PPCTargetInfo::getGCCRegNames() const {
1601 return llvm::makeArrayRef(GCCRegNames);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001602}
Chris Lattner5ba61f02006-10-14 07:39:34 +00001603
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001604const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1605 // While some of these aliases do map to different registers
1606 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001607 { { "0" }, "r0" },
1608 { { "1"}, "r1" },
1609 { { "2" }, "r2" },
1610 { { "3" }, "r3" },
1611 { { "4" }, "r4" },
1612 { { "5" }, "r5" },
1613 { { "6" }, "r6" },
1614 { { "7" }, "r7" },
1615 { { "8" }, "r8" },
1616 { { "9" }, "r9" },
1617 { { "10" }, "r10" },
1618 { { "11" }, "r11" },
1619 { { "12" }, "r12" },
1620 { { "13" }, "r13" },
1621 { { "14" }, "r14" },
1622 { { "15" }, "r15" },
1623 { { "16" }, "r16" },
1624 { { "17" }, "r17" },
1625 { { "18" }, "r18" },
1626 { { "19" }, "r19" },
1627 { { "20" }, "r20" },
1628 { { "21" }, "r21" },
1629 { { "22" }, "r22" },
1630 { { "23" }, "r23" },
1631 { { "24" }, "r24" },
1632 { { "25" }, "r25" },
1633 { { "26" }, "r26" },
1634 { { "27" }, "r27" },
1635 { { "28" }, "r28" },
1636 { { "29" }, "r29" },
1637 { { "30" }, "r30" },
1638 { { "31" }, "r31" },
1639 { { "fr0" }, "f0" },
1640 { { "fr1" }, "f1" },
1641 { { "fr2" }, "f2" },
1642 { { "fr3" }, "f3" },
1643 { { "fr4" }, "f4" },
1644 { { "fr5" }, "f5" },
1645 { { "fr6" }, "f6" },
1646 { { "fr7" }, "f7" },
1647 { { "fr8" }, "f8" },
1648 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +00001649 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001650 { { "fr11" }, "f11" },
1651 { { "fr12" }, "f12" },
1652 { { "fr13" }, "f13" },
1653 { { "fr14" }, "f14" },
1654 { { "fr15" }, "f15" },
1655 { { "fr16" }, "f16" },
1656 { { "fr17" }, "f17" },
1657 { { "fr18" }, "f18" },
1658 { { "fr19" }, "f19" },
1659 { { "fr20" }, "f20" },
1660 { { "fr21" }, "f21" },
1661 { { "fr22" }, "f22" },
1662 { { "fr23" }, "f23" },
1663 { { "fr24" }, "f24" },
1664 { { "fr25" }, "f25" },
1665 { { "fr26" }, "f26" },
1666 { { "fr27" }, "f27" },
1667 { { "fr28" }, "f28" },
1668 { { "fr29" }, "f29" },
1669 { { "fr30" }, "f30" },
1670 { { "fr31" }, "f31" },
1671 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001672};
1673
Craig Topperf054e3a2015-10-19 03:52:27 +00001674ArrayRef<TargetInfo::GCCRegAlias> PPCTargetInfo::getGCCRegAliases() const {
1675 return llvm::makeArrayRef(GCCRegAliases);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001676}
Chris Lattner02dffbd2006-10-14 07:50:21 +00001677
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001678class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001679public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001680 PPC32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1681 : PPCTargetInfo(Triple, Opts) {
James Y Knightb214cbc2016-03-04 19:00:41 +00001682 resetDataLayout("E-m:e-p:32:32-i64:64-n32");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001683
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001684 switch (getTriple().getOS()) {
Nico Weber3435ede2012-01-31 02:07:33 +00001685 case llvm::Triple::Linux:
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001686 case llvm::Triple::FreeBSD:
1687 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001688 SizeType = UnsignedInt;
Hal Finkel26908382012-03-02 20:54:36 +00001689 PtrDiffType = SignedInt;
1690 IntPtrType = SignedInt;
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001691 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +00001692 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001693 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001694 }
Roman Divacky816dcd12012-03-13 16:53:54 +00001695
Roman Divacky3ffe7462012-03-13 19:20:17 +00001696 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1697 LongDoubleWidth = LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00001698 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Roman Divacky3ffe7462012-03-13 19:20:17 +00001699 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001700
1701 // PPC32 supports atomics up to 4 bytes.
1702 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divacky965b0b72011-01-06 08:27:10 +00001703 }
1704
Craig Topper3164f332014-03-11 03:39:26 +00001705 BuiltinVaListKind getBuiltinVaListKind() const override {
Roman Divacky965b0b72011-01-06 08:27:10 +00001706 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Inge5d3fb222012-06-16 03:34:49 +00001707 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman873f65a2008-08-21 00:13:15 +00001708 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001709};
Chris Lattner5ba61f02006-10-14 07:39:34 +00001710
Bill Schmidt778d3872013-07-26 01:36:11 +00001711// Note: ABI differences may eventually require us to have a separate
1712// TargetInfo for little endian.
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001713class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001714public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001715 PPC64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1716 : PPCTargetInfo(Triple, Opts) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001717 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001718 IntMaxType = SignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001719 Int64Type = SignedLong;
Roman Divacky816dcd12012-03-13 16:53:54 +00001720
Eric Christopherf6ee1f32017-02-10 04:35:21 +00001721 if ((Triple.getArch() == llvm::Triple::ppc64le)) {
1722 resetDataLayout("e-m:e-i64:64-n32:64");
Eric Christopher4855ba82017-02-10 03:32:34 +00001723 ABI = "elfv2";
Eric Christopherf6ee1f32017-02-10 04:35:21 +00001724 } else {
1725 resetDataLayout("E-m:e-i64:64-n32:64");
Eric Christopher4855ba82017-02-10 03:32:34 +00001726 ABI = "elfv1";
Eric Christopherf6ee1f32017-02-10 04:35:21 +00001727 }
Eric Christopher4855ba82017-02-10 03:32:34 +00001728
Eric Christopherf6ee1f32017-02-10 04:35:21 +00001729 switch (getTriple().getOS()) {
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001730 case llvm::Triple::FreeBSD:
Roman Divacky3ffe7462012-03-13 19:20:17 +00001731 LongDoubleWidth = LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00001732 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001733 break;
Joerg Sonnenbergeraac82c42014-10-15 19:52:03 +00001734 case llvm::Triple::NetBSD:
1735 IntMaxType = SignedLongLong;
1736 Int64Type = SignedLongLong;
1737 break;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001738 default:
1739 break;
Ulrich Weigand8afad612014-07-28 13:17:52 +00001740 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001741
1742 // PPC64 supports atomics up to 8 bytes.
1743 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001744 }
Craig Topper3164f332014-03-11 03:39:26 +00001745 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001746 return TargetInfo::CharPtrBuiltinVaList;
Roman Divacky965b0b72011-01-06 08:27:10 +00001747 }
Eric Christophere6b7cf42015-07-10 18:25:52 +00001748 // PPC64 Linux-specific ABI options.
Ulrich Weigand8afad612014-07-28 13:17:52 +00001749 bool setABI(const std::string &Name) override {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001750 if (Name == "elfv1" || Name == "elfv1-qpx" || Name == "elfv2") {
Ulrich Weigand8afad612014-07-28 13:17:52 +00001751 ABI = Name;
1752 return true;
1753 }
1754 return false;
1755 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001756};
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001757
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001758class DarwinPPC32TargetInfo : public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001759public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001760 DarwinPPC32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1761 : DarwinTargetInfo<PPC32TargetInfo>(Triple, Opts) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001762 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +00001763 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Eric Christopher917e9522014-11-18 22:36:15 +00001764 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev68d773c2012-01-17 22:40:00 +00001765 LongLongAlign = 32;
James Y Knightb214cbc2016-03-04 19:00:41 +00001766 resetDataLayout("E-m:o-p:32:32-f64:32:64-n32");
Roman Divacky965b0b72011-01-06 08:27:10 +00001767 }
Craig Topper3164f332014-03-11 03:39:26 +00001768 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001769 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001770 }
1771};
1772
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001773class DarwinPPC64TargetInfo : public DarwinTargetInfo<PPC64TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001774public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001775 DarwinPPC64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1776 : DarwinTargetInfo<PPC64TargetInfo>(Triple, Opts) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001777 HasAlignMac68kSupport = true;
James Y Knightb214cbc2016-03-04 19:00:41 +00001778 resetDataLayout("E-m:o-i64:64-n32:64");
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001779 }
1780};
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001781
Eric Christopherc48497a2015-09-18 21:26:24 +00001782static const unsigned NVPTXAddrSpaceMap[] = {
Yaxun Liub34ec822017-04-11 17:24:23 +00001783 0, // Default
Eric Christopherc48497a2015-09-18 21:26:24 +00001784 1, // opencl_global
1785 3, // opencl_local
1786 4, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00001787 // FIXME: generic has to be added to the target
Eric Christopherc48497a2015-09-18 21:26:24 +00001788 0, // opencl_generic
1789 1, // cuda_device
1790 4, // cuda_constant
1791 3, // cuda_shared
1792};
1793
1794class NVPTXTargetInfo : public TargetInfo {
1795 static const char *const GCCRegNames[];
1796 static const Builtin::Info BuiltinInfo[];
Justin Lebar62907612016-07-06 21:21:39 +00001797 CudaArch GPU;
Justin Lebarb6626592017-01-05 16:53:21 +00001798 std::unique_ptr<TargetInfo> HostTarget;
Reid Klecknerbbc01782014-12-03 21:53:36 +00001799
Eric Christopherc48497a2015-09-18 21:26:24 +00001800public:
Justin Lebarb6626592017-01-05 16:53:21 +00001801 NVPTXTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts,
1802 unsigned TargetPointerWidth)
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001803 : TargetInfo(Triple) {
Justin Lebarb6626592017-01-05 16:53:21 +00001804 assert((TargetPointerWidth == 32 || TargetPointerWidth == 64) &&
1805 "NVPTX only supports 32- and 64-bit modes.");
1806
Eric Christopherc48497a2015-09-18 21:26:24 +00001807 TLSSupported = false;
Eric Christopherc48497a2015-09-18 21:26:24 +00001808 AddrSpaceMap = &NVPTXAddrSpaceMap;
1809 UseAddrSpaceMapMangling = true;
Justin Lebarb6626592017-01-05 16:53:21 +00001810
Eric Christopherc48497a2015-09-18 21:26:24 +00001811 // Define available target features
1812 // These must be defined in sorted order!
1813 NoAsmVariants = true;
Justin Lebar62907612016-07-06 21:21:39 +00001814 GPU = CudaArch::SM_20;
Justin Lebar76945b22016-04-29 23:05:19 +00001815
Justin Lebarb6626592017-01-05 16:53:21 +00001816 if (TargetPointerWidth == 32)
1817 resetDataLayout("e-p:32:32-i64:64-v16:16-v32:32-n16:32:64");
1818 else
1819 resetDataLayout("e-i64:64-v16:16-v32:32-n16:32:64");
1820
Justin Lebar76945b22016-04-29 23:05:19 +00001821 // If possible, get a TargetInfo for our host triple, so we can match its
1822 // types.
1823 llvm::Triple HostTriple(Opts.HostTriple);
Justin Lebarb6626592017-01-05 16:53:21 +00001824 if (!HostTriple.isNVPTX())
1825 HostTarget.reset(AllocateTarget(llvm::Triple(Opts.HostTriple), Opts));
1826
1827 // If no host target, make some guesses about the data layout and return.
Justin Lebar76945b22016-04-29 23:05:19 +00001828 if (!HostTarget) {
Justin Lebarb6626592017-01-05 16:53:21 +00001829 LongWidth = LongAlign = TargetPointerWidth;
1830 PointerWidth = PointerAlign = TargetPointerWidth;
1831 switch (TargetPointerWidth) {
1832 case 32:
1833 SizeType = TargetInfo::UnsignedInt;
1834 PtrDiffType = TargetInfo::SignedInt;
1835 IntPtrType = TargetInfo::SignedInt;
1836 break;
1837 case 64:
1838 SizeType = TargetInfo::UnsignedLong;
1839 PtrDiffType = TargetInfo::SignedLong;
1840 IntPtrType = TargetInfo::SignedLong;
1841 break;
1842 default:
1843 llvm_unreachable("TargetPointerWidth must be 32 or 64");
1844 }
Justin Lebar76945b22016-04-29 23:05:19 +00001845 return;
1846 }
1847
Justin Lebarb6626592017-01-05 16:53:21 +00001848 // Copy properties from host target.
Justin Lebar76945b22016-04-29 23:05:19 +00001849 PointerWidth = HostTarget->getPointerWidth(/* AddrSpace = */ 0);
1850 PointerAlign = HostTarget->getPointerAlign(/* AddrSpace = */ 0);
1851 BoolWidth = HostTarget->getBoolWidth();
1852 BoolAlign = HostTarget->getBoolAlign();
1853 IntWidth = HostTarget->getIntWidth();
1854 IntAlign = HostTarget->getIntAlign();
1855 HalfWidth = HostTarget->getHalfWidth();
1856 HalfAlign = HostTarget->getHalfAlign();
1857 FloatWidth = HostTarget->getFloatWidth();
1858 FloatAlign = HostTarget->getFloatAlign();
1859 DoubleWidth = HostTarget->getDoubleWidth();
1860 DoubleAlign = HostTarget->getDoubleAlign();
1861 LongWidth = HostTarget->getLongWidth();
1862 LongAlign = HostTarget->getLongAlign();
1863 LongLongWidth = HostTarget->getLongLongWidth();
1864 LongLongAlign = HostTarget->getLongLongAlign();
1865 MinGlobalAlign = HostTarget->getMinGlobalAlign();
Richard Smith59139022016-09-30 22:41:36 +00001866 NewAlign = HostTarget->getNewAlign();
Justin Lebar76945b22016-04-29 23:05:19 +00001867 DefaultAlignForAttributeAligned =
1868 HostTarget->getDefaultAlignForAttributeAligned();
1869 SizeType = HostTarget->getSizeType();
1870 IntMaxType = HostTarget->getIntMaxType();
1871 PtrDiffType = HostTarget->getPtrDiffType(/* AddrSpace = */ 0);
1872 IntPtrType = HostTarget->getIntPtrType();
1873 WCharType = HostTarget->getWCharType();
1874 WIntType = HostTarget->getWIntType();
1875 Char16Type = HostTarget->getChar16Type();
1876 Char32Type = HostTarget->getChar32Type();
1877 Int64Type = HostTarget->getInt64Type();
1878 SigAtomicType = HostTarget->getSigAtomicType();
1879 ProcessIDType = HostTarget->getProcessIDType();
1880
1881 UseBitFieldTypeAlignment = HostTarget->useBitFieldTypeAlignment();
1882 UseZeroLengthBitfieldAlignment =
1883 HostTarget->useZeroLengthBitfieldAlignment();
1884 UseExplicitBitFieldAlignment = HostTarget->useExplicitBitFieldAlignment();
1885 ZeroLengthBitfieldBoundary = HostTarget->getZeroLengthBitfieldBoundary();
1886
Justin Lebar5057f172016-09-09 20:35:43 +00001887 // This is a bit of a lie, but it controls __GCC_ATOMIC_XXX_LOCK_FREE, and
1888 // we need those macros to be identical on host and device, because (among
1889 // other things) they affect which standard library classes are defined, and
1890 // we need all classes to be defined on both the host and device.
1891 MaxAtomicInlineWidth = HostTarget->getMaxAtomicInlineWidth();
1892
Justin Lebar76945b22016-04-29 23:05:19 +00001893 // Properties intentionally not copied from host:
1894 // - LargeArrayMinWidth, LargeArrayAlign: Not visible across the
1895 // host/device boundary.
1896 // - SuitableAlign: Not visible across the host/device boundary, and may
1897 // correctly be different on host/device, e.g. if host has wider vector
1898 // types than device.
1899 // - LongDoubleWidth, LongDoubleAlign: nvptx's long double type is the same
1900 // as its double type, but that's not necessarily true on the host.
1901 // TODO: nvcc emits a warning when using long double on device; we should
1902 // do the same.
Eric Christopherc48497a2015-09-18 21:26:24 +00001903 }
1904 void getTargetDefines(const LangOptions &Opts,
1905 MacroBuilder &Builder) const override {
1906 Builder.defineMacro("__PTX__");
1907 Builder.defineMacro("__NVPTX__");
1908 if (Opts.CUDAIsDevice) {
1909 // Set __CUDA_ARCH__ for the GPU specified.
Justin Lebaref1aaac2016-07-06 21:21:14 +00001910 std::string CUDAArchCode = [this] {
1911 switch (GPU) {
Simon Pilgrim13dff572016-07-07 22:32:26 +00001912 case CudaArch::UNKNOWN:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001913 assert(false && "No GPU arch when compiling CUDA device code.");
1914 return "";
Justin Lebar62907612016-07-06 21:21:39 +00001915 case CudaArch::SM_20:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001916 return "200";
Justin Lebar62907612016-07-06 21:21:39 +00001917 case CudaArch::SM_21:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001918 return "210";
Justin Lebar62907612016-07-06 21:21:39 +00001919 case CudaArch::SM_30:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001920 return "300";
Justin Lebar62907612016-07-06 21:21:39 +00001921 case CudaArch::SM_32:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001922 return "320";
Justin Lebar62907612016-07-06 21:21:39 +00001923 case CudaArch::SM_35:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001924 return "350";
Justin Lebar62907612016-07-06 21:21:39 +00001925 case CudaArch::SM_37:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001926 return "370";
Justin Lebar62907612016-07-06 21:21:39 +00001927 case CudaArch::SM_50:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001928 return "500";
Justin Lebar62907612016-07-06 21:21:39 +00001929 case CudaArch::SM_52:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001930 return "520";
Justin Lebar62907612016-07-06 21:21:39 +00001931 case CudaArch::SM_53:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001932 return "530";
Justin Lebar62907612016-07-06 21:21:39 +00001933 case CudaArch::SM_60:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001934 return "600";
Justin Lebar62907612016-07-06 21:21:39 +00001935 case CudaArch::SM_61:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001936 return "610";
Justin Lebar62907612016-07-06 21:21:39 +00001937 case CudaArch::SM_62:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001938 return "620";
1939 }
Simon Pilgrim13dff572016-07-07 22:32:26 +00001940 llvm_unreachable("unhandled CudaArch");
Justin Lebaref1aaac2016-07-06 21:21:14 +00001941 }();
Eric Christopherc48497a2015-09-18 21:26:24 +00001942 Builder.defineMacro("__CUDA_ARCH__", CUDAArchCode);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001943 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001944 }
Craig Topper6c03a542015-10-19 04:51:35 +00001945 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
1946 return llvm::makeArrayRef(BuiltinInfo,
1947 clang::NVPTX::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eric Christopherc48497a2015-09-18 21:26:24 +00001948 }
Artem Belevichfda99052016-09-28 17:47:35 +00001949 bool
1950 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
1951 StringRef CPU,
1952 const std::vector<std::string> &FeaturesVec) const override {
1953 Features["satom"] = GPU >= CudaArch::SM_60;
1954 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
1955 }
1956
Eric Christopherc48497a2015-09-18 21:26:24 +00001957 bool hasFeature(StringRef Feature) const override {
Artem Belevichfda99052016-09-28 17:47:35 +00001958 return llvm::StringSwitch<bool>(Feature)
1959 .Cases("ptx", "nvptx", true)
1960 .Case("satom", GPU >= CudaArch::SM_60) // Atomics w/ scope.
1961 .Default(false);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001962 }
1963
Craig Topperf054e3a2015-10-19 03:52:27 +00001964 ArrayRef<const char *> getGCCRegNames() const override;
1965 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00001966 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00001967 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00001968 }
1969 bool validateAsmConstraint(const char *&Name,
1970 TargetInfo::ConstraintInfo &Info) const override {
1971 switch (*Name) {
1972 default:
1973 return false;
1974 case 'c':
1975 case 'h':
1976 case 'r':
1977 case 'l':
1978 case 'f':
1979 case 'd':
1980 Info.setAllowsRegister();
1981 return true;
Eli Bendersky13467172015-04-01 20:29:18 +00001982 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001983 }
1984 const char *getClobbers() const override {
1985 // FIXME: Is this really right?
1986 return "";
1987 }
1988 BuiltinVaListKind getBuiltinVaListKind() const override {
1989 // FIXME: implement
1990 return TargetInfo::CharPtrBuiltinVaList;
1991 }
1992 bool setCPU(const std::string &Name) override {
Justin Lebar62907612016-07-06 21:21:39 +00001993 GPU = StringToCudaArch(Name);
1994 return GPU != CudaArch::UNKNOWN;
Eric Christopherc48497a2015-09-18 21:26:24 +00001995 }
Jan Vesely9674bd42016-06-17 19:02:14 +00001996 void setSupportedOpenCLOpts() override {
1997 auto &Opts = getSupportedOpenCLOpts();
Yaxun Liu5b746652016-12-18 05:18:55 +00001998 Opts.support("cl_clang_storage_class_specifiers");
1999 Opts.support("cl_khr_gl_sharing");
2000 Opts.support("cl_khr_icd");
Jan Vesely9674bd42016-06-17 19:02:14 +00002001
Yaxun Liu5b746652016-12-18 05:18:55 +00002002 Opts.support("cl_khr_fp64");
2003 Opts.support("cl_khr_byte_addressable_store");
2004 Opts.support("cl_khr_global_int32_base_atomics");
2005 Opts.support("cl_khr_global_int32_extended_atomics");
2006 Opts.support("cl_khr_local_int32_base_atomics");
2007 Opts.support("cl_khr_local_int32_extended_atomics");
Jan Vesely9674bd42016-06-17 19:02:14 +00002008 }
Justin Lebar86c4e632017-01-05 16:53:38 +00002009
2010 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
2011 // CUDA compilations support all of the host's calling conventions.
2012 //
2013 // TODO: We should warn if you apply a non-default CC to anything other than
2014 // a host function.
2015 if (HostTarget)
2016 return HostTarget->checkCallingConvention(CC);
2017 return CCCR_Warning;
2018 }
Eric Christopherc48497a2015-09-18 21:26:24 +00002019};
2020
2021const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
2022#define BUILTIN(ID, TYPE, ATTRS) \
2023 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
2024#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
2025 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Artem Belevichfda99052016-09-28 17:47:35 +00002026#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
2027 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Eric Christopherc48497a2015-09-18 21:26:24 +00002028#include "clang/Basic/BuiltinsNVPTX.def"
2029};
2030
2031const char *const NVPTXTargetInfo::GCCRegNames[] = {"r0"};
2032
Craig Topperf054e3a2015-10-19 03:52:27 +00002033ArrayRef<const char *> NVPTXTargetInfo::getGCCRegNames() const {
2034 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00002035}
2036
Yaxun Liu3464f922017-03-25 03:46:25 +00002037static const LangAS::Map AMDGPUPrivateIsZeroMap = {
Yaxun Liub34ec822017-04-11 17:24:23 +00002038 4, // Default
Yaxun Liu3464f922017-03-25 03:46:25 +00002039 1, // opencl_global
2040 3, // opencl_local
2041 2, // opencl_constant
2042 4, // opencl_generic
2043 1, // cuda_device
2044 2, // cuda_constant
2045 3 // cuda_shared
2046};
2047static const LangAS::Map AMDGPUGenericIsZeroMap = {
Yaxun Liub34ec822017-04-11 17:24:23 +00002048 0, // Default
Yaxun Liu3464f922017-03-25 03:46:25 +00002049 1, // opencl_global
2050 3, // opencl_local
Yaxun Liub122ed92017-04-06 19:18:36 +00002051 2, // opencl_constant
Yaxun Liu3464f922017-03-25 03:46:25 +00002052 0, // opencl_generic
2053 1, // cuda_device
Yaxun Liub122ed92017-04-06 19:18:36 +00002054 2, // cuda_constant
Yaxun Liu3464f922017-03-25 03:46:25 +00002055 3 // cuda_shared
Eli Friedmand13b41e2012-10-12 23:32:00 +00002056};
2057
Tom Stellarda96344b2014-08-21 13:58:40 +00002058// If you edit the description strings, make sure you update
2059// getPointerWidthV().
2060
Craig Topper273dbc62015-10-18 05:29:26 +00002061static const char *const DataLayoutStringR600 =
Rafael Espindola29db13a2014-01-03 18:13:17 +00002062 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
2063 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00002064
Yaxun Liu3464f922017-03-25 03:46:25 +00002065static const char *const DataLayoutStringSIPrivateIsZero =
Matt Arsenault6dc455f2016-05-31 16:58:18 +00002066 "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 +00002067 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
2068 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00002069
Yaxun Liu3464f922017-03-25 03:46:25 +00002070static const char *const DataLayoutStringSIGenericIsZero =
Yaxun Liub122ed92017-04-06 19:18:36 +00002071 "e-p:64:64-p1:64:64-p2:64:64-p3:32:32-p4:32:32-p5:32:32"
Yaxun Liu3464f922017-03-25 03:46:25 +00002072 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
Yaxun Liub34ec822017-04-11 17:24:23 +00002073 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64-A5";
Yaxun Liu3464f922017-03-25 03:46:25 +00002074
Matt Arsenault250024f2016-06-08 01:56:42 +00002075class AMDGPUTargetInfo final : public TargetInfo {
Matt Arsenault56f008d2014-06-24 20:45:01 +00002076 static const Builtin::Info BuiltinInfo[];
Tom Stellard7b1059b2015-04-14 14:36:56 +00002077 static const char * const GCCRegNames[];
Matt Arsenault56f008d2014-06-24 20:45:01 +00002078
Yaxun Liu3464f922017-03-25 03:46:25 +00002079 struct AddrSpace {
2080 unsigned Generic, Global, Local, Constant, Private;
2081 AddrSpace(bool IsGenericZero_ = false){
2082 if (IsGenericZero_) {
2083 Generic = 0;
2084 Global = 1;
2085 Local = 3;
Yaxun Liub122ed92017-04-06 19:18:36 +00002086 Constant = 2;
Yaxun Liu3464f922017-03-25 03:46:25 +00002087 Private = 5;
2088 } else {
2089 Generic = 4;
2090 Global = 1;
2091 Local = 3;
2092 Constant = 2;
2093 Private = 0;
2094 }
2095 }
2096 };
2097
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002098 /// \brief The GPU profiles supported by the AMDGPU target.
Tom Stellardc74b1e02013-03-04 17:40:53 +00002099 enum GPUKind {
2100 GK_NONE,
2101 GK_R600,
2102 GK_R600_DOUBLE_OPS,
2103 GK_R700,
2104 GK_R700_DOUBLE_OPS,
2105 GK_EVERGREEN,
2106 GK_EVERGREEN_DOUBLE_OPS,
2107 GK_NORTHERN_ISLANDS,
2108 GK_CAYMAN,
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002109 GK_GFX6,
2110 GK_GFX7,
Matt Arsenaulteb952fd2017-02-18 19:02:41 +00002111 GK_GFX8,
2112 GK_GFX9
Tom Stellardc74b1e02013-03-04 17:40:53 +00002113 } GPU;
2114
Jan Veselyeebeaea2015-05-04 19:53:36 +00002115 bool hasFP64:1;
2116 bool hasFMAF:1;
2117 bool hasLDEXPF:1;
Yaxun Liu354097b2017-03-25 11:34:41 +00002118 const AddrSpace AS;
Jan Veselya3abd6d2015-05-01 17:38:13 +00002119
Konstantin Zhuravlyove668b1c2017-04-14 05:33:57 +00002120 static bool hasFullSpeedFMAF32(StringRef GPUName) {
2121 return parseAMDGCNName(GPUName) >= GK_GFX9;
2122 }
2123
Matt Arsenault250024f2016-06-08 01:56:42 +00002124 static bool isAMDGCN(const llvm::Triple &TT) {
2125 return TT.getArch() == llvm::Triple::amdgcn;
2126 }
2127
Yaxun Liu3464f922017-03-25 03:46:25 +00002128 static bool isGenericZero(const llvm::Triple &TT) {
2129 return TT.getEnvironmentName() == "amdgiz" ||
2130 TT.getEnvironmentName() == "amdgizcl";
2131 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00002132public:
Yaxun Liu2c17e822016-08-09 19:43:38 +00002133 AMDGPUTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Matt Arsenault250024f2016-06-08 01:56:42 +00002134 : TargetInfo(Triple) ,
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002135 GPU(isAMDGCN(Triple) ? GK_GFX6 : GK_R600),
Matt Arsenault250024f2016-06-08 01:56:42 +00002136 hasFP64(false),
2137 hasFMAF(false),
Yaxun Liu2c17e822016-08-09 19:43:38 +00002138 hasLDEXPF(false),
Yaxun Liu3464f922017-03-25 03:46:25 +00002139 AS(isGenericZero(Triple)){
Matt Arsenault250024f2016-06-08 01:56:42 +00002140 if (getTriple().getArch() == llvm::Triple::amdgcn) {
Jan Veselya3abd6d2015-05-01 17:38:13 +00002141 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00002142 hasFMAF = true;
2143 hasLDEXPF = true;
Tom Stellardd99fb952015-01-28 15:38:44 +00002144 }
Yaxun Liu3464f922017-03-25 03:46:25 +00002145 auto IsGenericZero = isGenericZero(Triple);
Matt Arsenault250024f2016-06-08 01:56:42 +00002146 resetDataLayout(getTriple().getArch() == llvm::Triple::amdgcn ?
Yaxun Liu3464f922017-03-25 03:46:25 +00002147 (IsGenericZero ? DataLayoutStringSIGenericIsZero :
2148 DataLayoutStringSIPrivateIsZero)
2149 : DataLayoutStringR600);
Yaxun Liub34ec822017-04-11 17:24:23 +00002150 assert(DataLayout->getAllocaAddrSpace() == AS.Private);
Matt Arsenault250024f2016-06-08 01:56:42 +00002151
Yaxun Liu3464f922017-03-25 03:46:25 +00002152 AddrSpaceMap = IsGenericZero ? &AMDGPUGenericIsZeroMap :
2153 &AMDGPUPrivateIsZeroMap;
David Tweed31d09b02013-09-13 12:04:22 +00002154 UseAddrSpaceMapMangling = true;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002155 }
2156
Tom Stellarda96344b2014-08-21 13:58:40 +00002157 uint64_t getPointerWidthV(unsigned AddrSpace) const override {
2158 if (GPU <= GK_CAYMAN)
2159 return 32;
2160
Yaxun Liu3464f922017-03-25 03:46:25 +00002161 if (AddrSpace == AS.Private || AddrSpace == AS.Local) {
2162 return 32;
Tom Stellarda96344b2014-08-21 13:58:40 +00002163 }
Yaxun Liu3464f922017-03-25 03:46:25 +00002164 return 64;
Tom Stellarda96344b2014-08-21 13:58:40 +00002165 }
2166
Yaxun Liu26f75662016-08-19 05:17:25 +00002167 uint64_t getMaxPointerWidth() const override {
2168 return getTriple().getArch() == llvm::Triple::amdgcn ? 64 : 32;
2169 }
2170
Craig Topper3164f332014-03-11 03:39:26 +00002171 const char * getClobbers() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00002172 return "";
2173 }
2174
Craig Topperf054e3a2015-10-19 03:52:27 +00002175 ArrayRef<const char *> getGCCRegNames() const override;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002176
Craig Topperf054e3a2015-10-19 03:52:27 +00002177 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
2178 return None;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002179 }
2180
Craig Topper3164f332014-03-11 03:39:26 +00002181 bool validateAsmConstraint(const char *&Name,
Tom Stellardd097e942015-11-19 22:11:58 +00002182 TargetInfo::ConstraintInfo &Info) const override {
2183 switch (*Name) {
2184 default: break;
2185 case 'v': // vgpr
2186 case 's': // sgpr
2187 Info.setAllowsRegister();
2188 return true;
2189 }
2190 return false;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002191 }
2192
Matt Arsenault250024f2016-06-08 01:56:42 +00002193 bool initFeatureMap(llvm::StringMap<bool> &Features,
2194 DiagnosticsEngine &Diags, StringRef CPU,
2195 const std::vector<std::string> &FeatureVec) const override;
2196
Yaxun Liu2c17e822016-08-09 19:43:38 +00002197 void adjustTargetOptions(const CodeGenOptions &CGOpts,
2198 TargetOptions &TargetOpts) const override {
Yaxun Liu2c17e822016-08-09 19:43:38 +00002199 bool hasFP32Denormals = false;
2200 bool hasFP64Denormals = false;
2201 for (auto &I : TargetOpts.FeaturesAsWritten) {
2202 if (I == "+fp32-denormals" || I == "-fp32-denormals")
2203 hasFP32Denormals = true;
Matt Arsenault09cca092017-01-23 22:31:14 +00002204 if (I == "+fp64-fp16-denormals" || I == "-fp64-fp16-denormals")
Yaxun Liu2c17e822016-08-09 19:43:38 +00002205 hasFP64Denormals = true;
2206 }
2207 if (!hasFP32Denormals)
Konstantin Zhuravlyove668b1c2017-04-14 05:33:57 +00002208 TargetOpts.Features.push_back(
2209 (Twine(hasFullSpeedFMAF32(TargetOpts.CPU) &&
Yaxun Liud3e85b92016-09-13 17:37:09 +00002210 !CGOpts.FlushDenorm ? '+' : '-') + Twine("fp32-denormals")).str());
Matt Arsenault09cca092017-01-23 22:31:14 +00002211 // Always do not flush fp64 or fp16 denorms.
Yaxun Liu2c17e822016-08-09 19:43:38 +00002212 if (!hasFP64Denormals && hasFP64)
Matt Arsenault09cca092017-01-23 22:31:14 +00002213 TargetOpts.Features.push_back("+fp64-fp16-denormals");
Yaxun Liu2c17e822016-08-09 19:43:38 +00002214 }
2215
Craig Topper6c03a542015-10-19 04:51:35 +00002216 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
2217 return llvm::makeArrayRef(BuiltinInfo,
2218 clang::AMDGPU::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eli Friedmand13b41e2012-10-12 23:32:00 +00002219 }
2220
Craig Topper3164f332014-03-11 03:39:26 +00002221 void getTargetDefines(const LangOptions &Opts,
2222 MacroBuilder &Builder) const override {
Matt Arsenault5e020b22016-02-27 09:06:26 +00002223 if (getTriple().getArch() == llvm::Triple::amdgcn)
2224 Builder.defineMacro("__AMDGCN__");
2225 else
2226 Builder.defineMacro("__R600__");
2227
Jan Veselyeebeaea2015-05-04 19:53:36 +00002228 if (hasFMAF)
2229 Builder.defineMacro("__HAS_FMAF__");
2230 if (hasLDEXPF)
2231 Builder.defineMacro("__HAS_LDEXPF__");
Jan Vesely211ba782016-06-17 02:25:03 +00002232 if (hasFP64)
2233 Builder.defineMacro("__HAS_FP64__");
Eli Friedmand13b41e2012-10-12 23:32:00 +00002234 }
2235
Craig Topper3164f332014-03-11 03:39:26 +00002236 BuiltinVaListKind getBuiltinVaListKind() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00002237 return TargetInfo::CharPtrBuiltinVaList;
2238 }
2239
Matt Arsenault250024f2016-06-08 01:56:42 +00002240 static GPUKind parseR600Name(StringRef Name) {
2241 return llvm::StringSwitch<GPUKind>(Name)
Tom Stellardc74b1e02013-03-04 17:40:53 +00002242 .Case("r600" , GK_R600)
2243 .Case("rv610", GK_R600)
2244 .Case("rv620", GK_R600)
2245 .Case("rv630", GK_R600)
2246 .Case("rv635", GK_R600)
2247 .Case("rs780", GK_R600)
2248 .Case("rs880", GK_R600)
2249 .Case("rv670", GK_R600_DOUBLE_OPS)
2250 .Case("rv710", GK_R700)
2251 .Case("rv730", GK_R700)
2252 .Case("rv740", GK_R700_DOUBLE_OPS)
2253 .Case("rv770", GK_R700_DOUBLE_OPS)
2254 .Case("palm", GK_EVERGREEN)
2255 .Case("cedar", GK_EVERGREEN)
2256 .Case("sumo", GK_EVERGREEN)
2257 .Case("sumo2", GK_EVERGREEN)
2258 .Case("redwood", GK_EVERGREEN)
2259 .Case("juniper", GK_EVERGREEN)
2260 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
2261 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
2262 .Case("barts", GK_NORTHERN_ISLANDS)
2263 .Case("turks", GK_NORTHERN_ISLANDS)
2264 .Case("caicos", GK_NORTHERN_ISLANDS)
2265 .Case("cayman", GK_CAYMAN)
2266 .Case("aruba", GK_CAYMAN)
Matt Arsenault250024f2016-06-08 01:56:42 +00002267 .Default(GK_NONE);
2268 }
2269
2270 static GPUKind parseAMDGCNName(StringRef Name) {
2271 return llvm::StringSwitch<GPUKind>(Name)
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002272 .Case("tahiti", GK_GFX6)
2273 .Case("pitcairn", GK_GFX6)
2274 .Case("verde", GK_GFX6)
2275 .Case("oland", GK_GFX6)
2276 .Case("hainan", GK_GFX6)
2277 .Case("bonaire", GK_GFX7)
2278 .Case("kabini", GK_GFX7)
2279 .Case("kaveri", GK_GFX7)
2280 .Case("hawaii", GK_GFX7)
2281 .Case("mullins", GK_GFX7)
Yaxun Liue59a0bc2016-10-26 16:40:21 +00002282 .Case("gfx700", GK_GFX7)
2283 .Case("gfx701", GK_GFX7)
2284 .Case("gfx702", GK_GFX7)
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002285 .Case("tonga", GK_GFX8)
2286 .Case("iceland", GK_GFX8)
2287 .Case("carrizo", GK_GFX8)
2288 .Case("fiji", GK_GFX8)
2289 .Case("stoney", GK_GFX8)
2290 .Case("polaris10", GK_GFX8)
2291 .Case("polaris11", GK_GFX8)
Yaxun Liue59a0bc2016-10-26 16:40:21 +00002292 .Case("gfx800", GK_GFX8)
2293 .Case("gfx801", GK_GFX8)
2294 .Case("gfx802", GK_GFX8)
2295 .Case("gfx803", GK_GFX8)
2296 .Case("gfx804", GK_GFX8)
2297 .Case("gfx810", GK_GFX8)
Matt Arsenaulteb952fd2017-02-18 19:02:41 +00002298 .Case("gfx900", GK_GFX9)
2299 .Case("gfx901", GK_GFX9)
Tom Stellardc74b1e02013-03-04 17:40:53 +00002300 .Default(GK_NONE);
Matt Arsenault250024f2016-06-08 01:56:42 +00002301 }
Tom Stellardc74b1e02013-03-04 17:40:53 +00002302
Matt Arsenault250024f2016-06-08 01:56:42 +00002303 bool setCPU(const std::string &Name) override {
2304 if (getTriple().getArch() == llvm::Triple::amdgcn)
2305 GPU = parseAMDGCNName(Name);
2306 else
2307 GPU = parseR600Name(Name);
Tom Stellardc74b1e02013-03-04 17:40:53 +00002308
Matt Arsenault250024f2016-06-08 01:56:42 +00002309 return GPU != GK_NONE;
Tom Stellardc74b1e02013-03-04 17:40:53 +00002310 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002311
Jan Vesely211ba782016-06-17 02:25:03 +00002312 void setSupportedOpenCLOpts() override {
2313 auto &Opts = getSupportedOpenCLOpts();
Yaxun Liu5b746652016-12-18 05:18:55 +00002314 Opts.support("cl_clang_storage_class_specifiers");
2315 Opts.support("cl_khr_icd");
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002316
Jan Vesely211ba782016-06-17 02:25:03 +00002317 if (hasFP64)
Yaxun Liu5b746652016-12-18 05:18:55 +00002318 Opts.support("cl_khr_fp64");
Jan Vesely211ba782016-06-17 02:25:03 +00002319 if (GPU >= GK_EVERGREEN) {
Yaxun Liu5b746652016-12-18 05:18:55 +00002320 Opts.support("cl_khr_byte_addressable_store");
2321 Opts.support("cl_khr_global_int32_base_atomics");
2322 Opts.support("cl_khr_global_int32_extended_atomics");
2323 Opts.support("cl_khr_local_int32_base_atomics");
2324 Opts.support("cl_khr_local_int32_extended_atomics");
Jan Vesely211ba782016-06-17 02:25:03 +00002325 }
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002326 if (GPU >= GK_GFX6) {
Yaxun Liu5b746652016-12-18 05:18:55 +00002327 Opts.support("cl_khr_fp16");
2328 Opts.support("cl_khr_int64_base_atomics");
2329 Opts.support("cl_khr_int64_extended_atomics");
2330 Opts.support("cl_khr_mipmap_image");
2331 Opts.support("cl_khr_subgroups");
2332 Opts.support("cl_khr_3d_image_writes");
2333 Opts.support("cl_amd_media_ops");
2334 Opts.support("cl_amd_media_ops2");
Jan Vesely211ba782016-06-17 02:25:03 +00002335 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002336 }
Nikolay Haustov8c6538b2016-06-30 09:06:33 +00002337
Yaxun Liu99444cb2016-08-03 20:38:06 +00002338 LangAS::ID getOpenCLImageAddrSpace() const override {
2339 return LangAS::opencl_constant;
2340 }
2341
Konstantin Zhuravlyovd1ba16e2017-03-08 23:56:48 +00002342 /// \returns Target specific vtbl ptr address space.
2343 unsigned getVtblPtrAddressSpace() const override {
2344 // \todo: We currently have address spaces defined in AMDGPU Backend. It
2345 // would be nice if we could use it here instead of using bare numbers (same
2346 // applies to getDWARFAddressSpace).
2347 return 2; // constant.
2348 }
2349
2350 /// \returns If a target requires an address within a target specific address
2351 /// space \p AddressSpace to be converted in order to be used, then return the
2352 /// corresponding target specific DWARF address space.
2353 ///
2354 /// \returns Otherwise return None and no conversion will be emitted in the
2355 /// DWARF.
2356 Optional<unsigned> getDWARFAddressSpace(
2357 unsigned AddressSpace) const override {
Yaxun Liu3464f922017-03-25 03:46:25 +00002358 const unsigned DWARF_Private = 1;
2359 const unsigned DWARF_Local = 2;
2360 if (AddressSpace == AS.Private) {
2361 return DWARF_Private;
2362 } else if (AddressSpace == AS.Local) {
2363 return DWARF_Local;
2364 } else {
Konstantin Zhuravlyovd1ba16e2017-03-08 23:56:48 +00002365 return None;
2366 }
2367 }
2368
Nikolay Haustov8c6538b2016-06-30 09:06:33 +00002369 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
2370 switch (CC) {
2371 default:
2372 return CCCR_Warning;
2373 case CC_C:
2374 case CC_OpenCLKernel:
2375 return CCCR_OK;
2376 }
2377 }
Yaxun Liu402804b2016-12-15 08:09:08 +00002378
2379 // In amdgcn target the null pointer in global, constant, and generic
2380 // address space has value 0 but in private and local address space has
2381 // value ~0.
2382 uint64_t getNullPointerValue(unsigned AS) const override {
Matt Arsenaultbf5e3e42017-03-13 19:47:53 +00002383 return AS == LangAS::opencl_local ? ~0 : 0;
Yaxun Liu402804b2016-12-15 08:09:08 +00002384 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00002385};
2386
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002387const Builtin::Info AMDGPUTargetInfo::BuiltinInfo[] = {
Matt Arsenault56f008d2014-06-24 20:45:01 +00002388#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00002389 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Matt Arsenault250024f2016-06-08 01:56:42 +00002390#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
2391 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002392#include "clang/Basic/BuiltinsAMDGPU.def"
Matt Arsenault56f008d2014-06-24 20:45:01 +00002393};
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002394const char * const AMDGPUTargetInfo::GCCRegNames[] = {
Tom Stellard7b1059b2015-04-14 14:36:56 +00002395 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
2396 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
2397 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
2398 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
2399 "v32", "v33", "v34", "v35", "v36", "v37", "v38", "v39",
2400 "v40", "v41", "v42", "v43", "v44", "v45", "v46", "v47",
2401 "v48", "v49", "v50", "v51", "v52", "v53", "v54", "v55",
2402 "v56", "v57", "v58", "v59", "v60", "v61", "v62", "v63",
2403 "v64", "v65", "v66", "v67", "v68", "v69", "v70", "v71",
2404 "v72", "v73", "v74", "v75", "v76", "v77", "v78", "v79",
2405 "v80", "v81", "v82", "v83", "v84", "v85", "v86", "v87",
2406 "v88", "v89", "v90", "v91", "v92", "v93", "v94", "v95",
2407 "v96", "v97", "v98", "v99", "v100", "v101", "v102", "v103",
2408 "v104", "v105", "v106", "v107", "v108", "v109", "v110", "v111",
2409 "v112", "v113", "v114", "v115", "v116", "v117", "v118", "v119",
2410 "v120", "v121", "v122", "v123", "v124", "v125", "v126", "v127",
2411 "v128", "v129", "v130", "v131", "v132", "v133", "v134", "v135",
2412 "v136", "v137", "v138", "v139", "v140", "v141", "v142", "v143",
2413 "v144", "v145", "v146", "v147", "v148", "v149", "v150", "v151",
2414 "v152", "v153", "v154", "v155", "v156", "v157", "v158", "v159",
2415 "v160", "v161", "v162", "v163", "v164", "v165", "v166", "v167",
2416 "v168", "v169", "v170", "v171", "v172", "v173", "v174", "v175",
2417 "v176", "v177", "v178", "v179", "v180", "v181", "v182", "v183",
2418 "v184", "v185", "v186", "v187", "v188", "v189", "v190", "v191",
2419 "v192", "v193", "v194", "v195", "v196", "v197", "v198", "v199",
2420 "v200", "v201", "v202", "v203", "v204", "v205", "v206", "v207",
2421 "v208", "v209", "v210", "v211", "v212", "v213", "v214", "v215",
2422 "v216", "v217", "v218", "v219", "v220", "v221", "v222", "v223",
2423 "v224", "v225", "v226", "v227", "v228", "v229", "v230", "v231",
2424 "v232", "v233", "v234", "v235", "v236", "v237", "v238", "v239",
2425 "v240", "v241", "v242", "v243", "v244", "v245", "v246", "v247",
2426 "v248", "v249", "v250", "v251", "v252", "v253", "v254", "v255",
2427 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
2428 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
2429 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
2430 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
2431 "s32", "s33", "s34", "s35", "s36", "s37", "s38", "s39",
2432 "s40", "s41", "s42", "s43", "s44", "s45", "s46", "s47",
2433 "s48", "s49", "s50", "s51", "s52", "s53", "s54", "s55",
2434 "s56", "s57", "s58", "s59", "s60", "s61", "s62", "s63",
2435 "s64", "s65", "s66", "s67", "s68", "s69", "s70", "s71",
2436 "s72", "s73", "s74", "s75", "s76", "s77", "s78", "s79",
2437 "s80", "s81", "s82", "s83", "s84", "s85", "s86", "s87",
2438 "s88", "s89", "s90", "s91", "s92", "s93", "s94", "s95",
2439 "s96", "s97", "s98", "s99", "s100", "s101", "s102", "s103",
2440 "s104", "s105", "s106", "s107", "s108", "s109", "s110", "s111",
2441 "s112", "s113", "s114", "s115", "s116", "s117", "s118", "s119",
Etienne Bergerone8ae26f2016-03-24 18:29:24 +00002442 "s120", "s121", "s122", "s123", "s124", "s125", "s126", "s127",
Matt Arsenaultb015d622016-02-27 09:06:22 +00002443 "exec", "vcc", "scc", "m0", "flat_scratch", "exec_lo", "exec_hi",
2444 "vcc_lo", "vcc_hi", "flat_scratch_lo", "flat_scratch_hi"
Tom Stellard7b1059b2015-04-14 14:36:56 +00002445};
2446
Craig Topperf054e3a2015-10-19 03:52:27 +00002447ArrayRef<const char *> AMDGPUTargetInfo::getGCCRegNames() const {
2448 return llvm::makeArrayRef(GCCRegNames);
Tom Stellard7b1059b2015-04-14 14:36:56 +00002449}
Matt Arsenault56f008d2014-06-24 20:45:01 +00002450
Matt Arsenault250024f2016-06-08 01:56:42 +00002451bool AMDGPUTargetInfo::initFeatureMap(
2452 llvm::StringMap<bool> &Features,
2453 DiagnosticsEngine &Diags, StringRef CPU,
2454 const std::vector<std::string> &FeatureVec) const {
2455
2456 // XXX - What does the member GPU mean if device name string passed here?
2457 if (getTriple().getArch() == llvm::Triple::amdgcn) {
2458 if (CPU.empty())
2459 CPU = "tahiti";
2460
2461 switch (parseAMDGCNName(CPU)) {
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002462 case GK_GFX6:
2463 case GK_GFX7:
Matt Arsenault250024f2016-06-08 01:56:42 +00002464 break;
2465
Matt Arsenaulta0c6dca2017-02-22 20:55:59 +00002466 case GK_GFX9:
2467 Features["gfx9-insts"] = true;
2468 LLVM_FALLTHROUGH;
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002469 case GK_GFX8:
Matt Arsenault250024f2016-06-08 01:56:42 +00002470 Features["s-memrealtime"] = true;
2471 Features["16-bit-insts"] = true;
Yaxun Liu4d867992017-03-10 01:30:46 +00002472 Features["dpp"] = true;
Matt Arsenault250024f2016-06-08 01:56:42 +00002473 break;
2474
2475 case GK_NONE:
2476 return false;
2477 default:
2478 llvm_unreachable("unhandled subtarget");
2479 }
2480 } else {
2481 if (CPU.empty())
2482 CPU = "r600";
2483
2484 switch (parseR600Name(CPU)) {
2485 case GK_R600:
2486 case GK_R700:
2487 case GK_EVERGREEN:
2488 case GK_NORTHERN_ISLANDS:
2489 break;
2490 case GK_R600_DOUBLE_OPS:
2491 case GK_R700_DOUBLE_OPS:
2492 case GK_EVERGREEN_DOUBLE_OPS:
2493 case GK_CAYMAN:
2494 Features["fp64"] = true;
2495 break;
2496 case GK_NONE:
2497 return false;
2498 default:
2499 llvm_unreachable("unhandled subtarget");
2500 }
2501 }
2502
2503 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeatureVec);
2504}
2505
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00002506const Builtin::Info BuiltinInfoX86[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00002507#define BUILTIN(ID, TYPE, ATTRS) \
2508 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002509#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
Craig Topper07d3b622015-08-07 05:14:44 +00002510 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Albert Gutowski727ab8a2016-09-14 21:19:43 +00002511#define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANGS, FEATURE) \
2512 { #ID, TYPE, ATTRS, HEADER, LANGS, FEATURE },
Chris Lattner5abdec72009-06-14 01:05:48 +00002513#include "clang/Basic/BuiltinsX86.def"
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00002514
2515#define BUILTIN(ID, TYPE, ATTRS) \
2516 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Albert Gutowski0fd6e962016-10-12 17:28:44 +00002517#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
2518 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00002519#define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANGS, FEATURE) \
2520 { #ID, TYPE, ATTRS, HEADER, LANGS, FEATURE },
2521#include "clang/Basic/BuiltinsX86_64.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00002522};
Eli Friedmanb5366062008-05-20 14:21:01 +00002523
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00002524
Nuno Lopescfca1f02009-12-23 17:49:57 +00002525static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002526 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
2527 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00002528 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002529 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
2530 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
2531 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00002532 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00002533 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
2534 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Marina Yatsina41c45fa2016-02-03 11:32:08 +00002535 "xmm16", "xmm17", "xmm18", "xmm19", "xmm20", "xmm21", "xmm22", "xmm23",
2536 "xmm24", "xmm25", "xmm26", "xmm27", "xmm28", "xmm29", "xmm30", "xmm31",
2537 "ymm16", "ymm17", "ymm18", "ymm19", "ymm20", "ymm21", "ymm22", "ymm23",
2538 "ymm24", "ymm25", "ymm26", "ymm27", "ymm28", "ymm29", "ymm30", "ymm31",
2539 "zmm0", "zmm1", "zmm2", "zmm3", "zmm4", "zmm5", "zmm6", "zmm7",
2540 "zmm8", "zmm9", "zmm10", "zmm11", "zmm12", "zmm13", "zmm14", "zmm15",
2541 "zmm16", "zmm17", "zmm18", "zmm19", "zmm20", "zmm21", "zmm22", "zmm23",
2542 "zmm24", "zmm25", "zmm26", "zmm27", "zmm28", "zmm29", "zmm30", "zmm31",
Michael Zuckerman15604b92016-10-31 14:16:57 +00002543 "k0", "k1", "k2", "k3", "k4", "k5", "k6", "k7",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002544};
2545
Eric Christophercdd36352011-06-21 00:05:20 +00002546const TargetInfo::AddlRegName AddlRegNames[] = {
2547 { { "al", "ah", "eax", "rax" }, 0 },
2548 { { "bl", "bh", "ebx", "rbx" }, 3 },
2549 { { "cl", "ch", "ecx", "rcx" }, 2 },
2550 { { "dl", "dh", "edx", "rdx" }, 1 },
2551 { { "esi", "rsi" }, 4 },
2552 { { "edi", "rdi" }, 5 },
2553 { { "esp", "rsp" }, 7 },
2554 { { "ebp", "rbp" }, 6 },
Alexey Bataeva7ab1b42015-09-04 03:42:23 +00002555 { { "r8d", "r8w", "r8b" }, 38 },
2556 { { "r9d", "r9w", "r9b" }, 39 },
2557 { { "r10d", "r10w", "r10b" }, 40 },
2558 { { "r11d", "r11w", "r11b" }, 41 },
2559 { { "r12d", "r12w", "r12b" }, 42 },
2560 { { "r13d", "r13w", "r13b" }, 43 },
2561 { { "r14d", "r14w", "r14b" }, 44 },
2562 { { "r15d", "r15w", "r15b" }, 45 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00002563};
2564
2565// X86 target abstract base class; x86-32 and x86-64 are very close, so
2566// most of the implementation can be shared.
2567class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00002568 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002569 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Craig Topper543f3bd2015-10-14 23:47:57 +00002570 } SSELevel = NoSSE;
Eli Friedman33465822011-07-08 23:31:17 +00002571 enum MMX3DNowEnum {
2572 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
Craig Topper543f3bd2015-10-14 23:47:57 +00002573 } MMX3DNowLevel = NoMMX3DNow;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002574 enum XOPEnum {
2575 NoXOP,
2576 SSE4A,
2577 FMA4,
2578 XOP
Craig Topper543f3bd2015-10-14 23:47:57 +00002579 } XOPLevel = NoXOP;
Anders Carlssone437c682010-01-27 03:47:49 +00002580
Craig Topper543f3bd2015-10-14 23:47:57 +00002581 bool HasAES = false;
2582 bool HasPCLMUL = false;
2583 bool HasLZCNT = false;
2584 bool HasRDRND = false;
2585 bool HasFSGSBASE = false;
2586 bool HasBMI = false;
2587 bool HasBMI2 = false;
2588 bool HasPOPCNT = false;
2589 bool HasRTM = false;
2590 bool HasPRFCHW = false;
2591 bool HasRDSEED = false;
2592 bool HasADX = false;
2593 bool HasTBM = false;
2594 bool HasFMA = false;
2595 bool HasF16C = false;
2596 bool HasAVX512CD = false;
2597 bool HasAVX512ER = false;
2598 bool HasAVX512PF = false;
2599 bool HasAVX512DQ = false;
2600 bool HasAVX512BW = false;
2601 bool HasAVX512VL = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002602 bool HasAVX512VBMI = false;
2603 bool HasAVX512IFMA = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002604 bool HasSHA = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002605 bool HasMPX = false;
2606 bool HasSGX = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002607 bool HasCX16 = false;
Craig Toppere33f51f2015-10-16 06:22:36 +00002608 bool HasFXSR = false;
Craig Topperda9fe562015-10-15 05:23:38 +00002609 bool HasXSAVE = false;
2610 bool HasXSAVEOPT = false;
2611 bool HasXSAVEC = false;
2612 bool HasXSAVES = false;
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00002613 bool HasMWAITX = false;
Craig Topper45742262017-02-09 06:10:14 +00002614 bool HasCLZERO = false;
Asaf Badouha9d1e182015-12-31 14:14:07 +00002615 bool HasPKU = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002616 bool HasCLFLUSHOPT = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002617 bool HasCLWB = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002618 bool HasMOVBE = false;
2619 bool HasPREFETCHWT1 = false;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00002620
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002621 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
2622 ///
2623 /// Each enumeration represents a particular CPU supported by Clang. These
2624 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
2625 enum CPUKind {
2626 CK_Generic,
2627
2628 /// \name i386
2629 /// i386-generation processors.
2630 //@{
2631 CK_i386,
2632 //@}
2633
2634 /// \name i486
2635 /// i486-generation processors.
2636 //@{
2637 CK_i486,
2638 CK_WinChipC6,
2639 CK_WinChip2,
2640 CK_C3,
2641 //@}
2642
2643 /// \name i586
2644 /// i586-generation processors, P5 microarchitecture based.
2645 //@{
2646 CK_i586,
2647 CK_Pentium,
2648 CK_PentiumMMX,
2649 //@}
2650
2651 /// \name i686
2652 /// i686-generation processors, P6 / Pentium M microarchitecture based.
2653 //@{
2654 CK_i686,
2655 CK_PentiumPro,
2656 CK_Pentium2,
2657 CK_Pentium3,
2658 CK_Pentium3M,
2659 CK_PentiumM,
2660 CK_C3_2,
2661
2662 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
2663 /// Clang however has some logic to suport this.
2664 // FIXME: Warn, deprecate, and potentially remove this.
2665 CK_Yonah,
2666 //@}
2667
2668 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00002669 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002670 //@{
2671 CK_Pentium4,
2672 CK_Pentium4M,
2673 CK_Prescott,
2674 CK_Nocona,
2675 //@}
2676
2677 /// \name Core
2678 /// Core microarchitecture based processors.
2679 //@{
2680 CK_Core2,
2681
2682 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
2683 /// codename which GCC no longer accepts as an option to -march, but Clang
2684 /// has some logic for recognizing it.
2685 // FIXME: Warn, deprecate, and potentially remove this.
2686 CK_Penryn,
2687 //@}
2688
2689 /// \name Atom
2690 /// Atom processors
2691 //@{
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002692 CK_Bonnell,
Preston Gurda3c58c02013-09-13 19:27:17 +00002693 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002694 //@}
2695
2696 /// \name Nehalem
2697 /// Nehalem microarchitecture based processors.
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002698 CK_Nehalem,
2699
2700 /// \name Westmere
2701 /// Westmere microarchitecture based processors.
2702 CK_Westmere,
2703
2704 /// \name Sandy Bridge
2705 /// Sandy Bridge microarchitecture based processors.
2706 CK_SandyBridge,
2707
2708 /// \name Ivy Bridge
2709 /// Ivy Bridge microarchitecture based processors.
2710 CK_IvyBridge,
2711
2712 /// \name Haswell
2713 /// Haswell microarchitecture based processors.
2714 CK_Haswell,
2715
2716 /// \name Broadwell
2717 /// Broadwell microarchitecture based processors.
Robert Khasanov50e6f582014-09-19 09:53:48 +00002718 CK_Broadwell,
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002719
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002720 /// \name Skylake Client
2721 /// Skylake client microarchitecture based processors.
2722 CK_SkylakeClient,
2723
2724 /// \name Skylake Server
2725 /// Skylake server microarchitecture based processors.
2726 CK_SkylakeServer,
2727
2728 /// \name Cannonlake Client
2729 /// Cannonlake client microarchitecture based processors.
2730 CK_Cannonlake,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002731
Craig Topper449314e2013-08-20 07:09:39 +00002732 /// \name Knights Landing
2733 /// Knights Landing processor.
2734 CK_KNL,
2735
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002736 /// \name Lakemont
2737 /// Lakemont microarchitecture based processors.
2738 CK_Lakemont,
2739
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002740 /// \name K6
2741 /// K6 architecture processors.
2742 //@{
2743 CK_K6,
2744 CK_K6_2,
2745 CK_K6_3,
2746 //@}
2747
2748 /// \name K7
2749 /// K7 architecture processors.
2750 //@{
2751 CK_Athlon,
2752 CK_AthlonThunderbird,
2753 CK_Athlon4,
2754 CK_AthlonXP,
2755 CK_AthlonMP,
2756 //@}
2757
2758 /// \name K8
2759 /// K8 architecture processors.
2760 //@{
2761 CK_Athlon64,
2762 CK_Athlon64SSE3,
2763 CK_AthlonFX,
2764 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00002765 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002766 CK_Opteron,
2767 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00002768 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002769 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002770
Benjamin Kramer569f2152012-01-10 11:50:18 +00002771 /// \name Bobcat
2772 /// Bobcat architecture processors.
2773 //@{
2774 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002775 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002776 //@}
2777
2778 /// \name Bulldozer
2779 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002780 //@{
2781 CK_BDVER1,
2782 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002783 CK_BDVER3,
Benjamin Kramer56c58222014-05-02 15:47:51 +00002784 CK_BDVER4,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002785 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002786
Craig Topperc45744a2017-01-10 06:02:12 +00002787 /// \name zen
2788 /// Zen architecture processors.
2789 //@{
2790 CK_ZNVER1,
2791 //@}
2792
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002793 /// This specification is deprecated and will be removed in the future.
2794 /// Users should prefer \see CK_K8.
2795 // FIXME: Warn on this when the CPU is set to it.
Saleem Abdulrasoolcb29c1a2014-11-17 18:40:15 +00002796 //@{
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002797 CK_x86_64,
2798 //@}
2799
2800 /// \name Geode
2801 /// Geode processors.
2802 //@{
2803 CK_Geode
2804 //@}
Craig Topper543f3bd2015-10-14 23:47:57 +00002805 } CPU = CK_Generic;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002806
Eric Christopherc50738f2015-08-27 00:05:50 +00002807 CPUKind getCPUKind(StringRef CPU) const {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002808 return llvm::StringSwitch<CPUKind>(CPU)
2809 .Case("i386", CK_i386)
2810 .Case("i486", CK_i486)
2811 .Case("winchip-c6", CK_WinChipC6)
2812 .Case("winchip2", CK_WinChip2)
2813 .Case("c3", CK_C3)
2814 .Case("i586", CK_i586)
2815 .Case("pentium", CK_Pentium)
2816 .Case("pentium-mmx", CK_PentiumMMX)
2817 .Case("i686", CK_i686)
2818 .Case("pentiumpro", CK_PentiumPro)
2819 .Case("pentium2", CK_Pentium2)
2820 .Case("pentium3", CK_Pentium3)
2821 .Case("pentium3m", CK_Pentium3M)
2822 .Case("pentium-m", CK_PentiumM)
2823 .Case("c3-2", CK_C3_2)
2824 .Case("yonah", CK_Yonah)
2825 .Case("pentium4", CK_Pentium4)
2826 .Case("pentium4m", CK_Pentium4M)
2827 .Case("prescott", CK_Prescott)
2828 .Case("nocona", CK_Nocona)
2829 .Case("core2", CK_Core2)
2830 .Case("penryn", CK_Penryn)
2831 .Case("bonnell", CK_Bonnell)
2832 .Case("atom", CK_Bonnell) // Legacy name.
2833 .Case("silvermont", CK_Silvermont)
2834 .Case("slm", CK_Silvermont) // Legacy name.
2835 .Case("nehalem", CK_Nehalem)
2836 .Case("corei7", CK_Nehalem) // Legacy name.
2837 .Case("westmere", CK_Westmere)
2838 .Case("sandybridge", CK_SandyBridge)
2839 .Case("corei7-avx", CK_SandyBridge) // Legacy name.
2840 .Case("ivybridge", CK_IvyBridge)
2841 .Case("core-avx-i", CK_IvyBridge) // Legacy name.
2842 .Case("haswell", CK_Haswell)
2843 .Case("core-avx2", CK_Haswell) // Legacy name.
2844 .Case("broadwell", CK_Broadwell)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002845 .Case("skylake", CK_SkylakeClient)
2846 .Case("skylake-avx512", CK_SkylakeServer)
2847 .Case("skx", CK_SkylakeServer) // Legacy name.
2848 .Case("cannonlake", CK_Cannonlake)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002849 .Case("knl", CK_KNL)
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002850 .Case("lakemont", CK_Lakemont)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002851 .Case("k6", CK_K6)
2852 .Case("k6-2", CK_K6_2)
2853 .Case("k6-3", CK_K6_3)
2854 .Case("athlon", CK_Athlon)
2855 .Case("athlon-tbird", CK_AthlonThunderbird)
2856 .Case("athlon-4", CK_Athlon4)
2857 .Case("athlon-xp", CK_AthlonXP)
2858 .Case("athlon-mp", CK_AthlonMP)
2859 .Case("athlon64", CK_Athlon64)
2860 .Case("athlon64-sse3", CK_Athlon64SSE3)
2861 .Case("athlon-fx", CK_AthlonFX)
2862 .Case("k8", CK_K8)
2863 .Case("k8-sse3", CK_K8SSE3)
2864 .Case("opteron", CK_Opteron)
2865 .Case("opteron-sse3", CK_OpteronSSE3)
2866 .Case("barcelona", CK_AMDFAM10)
2867 .Case("amdfam10", CK_AMDFAM10)
2868 .Case("btver1", CK_BTVER1)
2869 .Case("btver2", CK_BTVER2)
2870 .Case("bdver1", CK_BDVER1)
2871 .Case("bdver2", CK_BDVER2)
2872 .Case("bdver3", CK_BDVER3)
2873 .Case("bdver4", CK_BDVER4)
Craig Topperc45744a2017-01-10 06:02:12 +00002874 .Case("znver1", CK_ZNVER1)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002875 .Case("x86-64", CK_x86_64)
2876 .Case("geode", CK_Geode)
2877 .Default(CK_Generic);
2878 }
2879
Rafael Espindolaeb265472013-08-21 21:59:03 +00002880 enum FPMathKind {
2881 FP_Default,
2882 FP_SSE,
2883 FP_387
Craig Topper543f3bd2015-10-14 23:47:57 +00002884 } FPMath = FP_Default;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002885
Eli Friedman3fd920a2008-08-20 02:34:37 +00002886public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00002887 X86TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
2888 : TargetInfo(Triple) {
Stephan Bergmann17c7f702016-12-14 11:57:17 +00002889 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended();
Chris Lattner1f5ad112006-10-14 18:32:12 +00002890 }
Craig Topper3164f332014-03-11 03:39:26 +00002891 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00002892 // X87 evaluates with 80 bits "long double" precision.
2893 return SSELevel == NoSSE ? 2 : 0;
2894 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002895 ArrayRef<const char *> getGCCRegNames() const override {
2896 return llvm::makeArrayRef(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00002897 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002898 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
2899 return None;
Eric Christophercdd36352011-06-21 00:05:20 +00002900 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002901 ArrayRef<TargetInfo::AddlRegName> getGCCAddlRegNames() const override {
2902 return llvm::makeArrayRef(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00002903 }
Eric Christopherd9832702015-06-29 21:00:05 +00002904 bool validateCpuSupports(StringRef Name) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002905 bool validateAsmConstraint(const char *&Name,
Eric Christopher917e9522014-11-18 22:36:15 +00002906 TargetInfo::ConstraintInfo &info) const override;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002907
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00002908 bool validateGlobalRegisterVariable(StringRef RegName,
2909 unsigned RegSize,
2910 bool &HasSizeMismatch) const override {
2911 // esp and ebp are the only 32-bit registers the x86 backend can currently
2912 // handle.
2913 if (RegName.equals("esp") || RegName.equals("ebp")) {
2914 // Check that the register size is 32-bit.
2915 HasSizeMismatch = RegSize != 32;
2916 return true;
2917 }
2918
2919 return false;
2920 }
2921
Akira Hatanaka974131e2014-09-18 18:17:18 +00002922 bool validateOutputSize(StringRef Constraint, unsigned Size) const override;
2923
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002924 bool validateInputSize(StringRef Constraint, unsigned Size) const override;
2925
Akira Hatanaka974131e2014-09-18 18:17:18 +00002926 virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const;
2927
Craig Topper3164f332014-03-11 03:39:26 +00002928 std::string convertConstraint(const char *&Constraint) const override;
2929 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002930 return "~{dirflag},~{fpsr},~{flags}";
2931 }
Marina Yatsinac42fd032016-12-26 12:23:42 +00002932
2933 StringRef getConstraintRegister(const StringRef &Constraint,
2934 const StringRef &Expression) const override {
2935 StringRef::iterator I, E;
2936 for (I = Constraint.begin(), E = Constraint.end(); I != E; ++I) {
2937 if (isalpha(*I))
2938 break;
2939 }
2940 if (I == E)
2941 return "";
2942 switch (*I) {
2943 // For the register constraints, return the matching register name
2944 case 'a':
2945 return "ax";
2946 case 'b':
2947 return "bx";
2948 case 'c':
2949 return "cx";
2950 case 'd':
2951 return "dx";
2952 case 'S':
2953 return "si";
2954 case 'D':
2955 return "di";
2956 // In case the constraint is 'r' we need to return Expression
2957 case 'r':
2958 return Expression;
2959 default:
2960 // Default value if there is no constraint for the register
2961 return "";
2962 }
2963 return "";
2964 }
2965
Craig Topper3164f332014-03-11 03:39:26 +00002966 void getTargetDefines(const LangOptions &Opts,
2967 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00002968 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
2969 bool Enabled);
2970 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
2971 bool Enabled);
2972 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
2973 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002974 void setFeatureEnabled(llvm::StringMap<bool> &Features,
2975 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00002976 setFeatureEnabledImpl(Features, Name, Enabled);
2977 }
2978 // This exists purely to cut down on the number of virtual calls in
Eric Christopheref1e2952015-08-28 02:13:58 +00002979 // initFeatureMap which calls this repeatedly.
Craig Topper86d79ef2013-09-17 04:51:29 +00002980 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2981 StringRef Name, bool Enabled);
Eric Christopher8c47b422015-10-09 18:39:55 +00002982 bool
2983 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
2984 StringRef CPU,
2985 const std::vector<std::string> &FeaturesVec) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002986 bool hasFeature(StringRef Feature) const override;
2987 bool handleTargetFeatures(std::vector<std::string> &Features,
2988 DiagnosticsEngine &Diags) override;
Alp Toker4925ba72014-06-07 23:30:42 +00002989 StringRef getABI() const override {
Ahmed Bougacha0b938282015-06-22 21:31:43 +00002990 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX512F)
2991 return "avx512";
Craig Topperd945d502015-10-20 00:00:17 +00002992 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002993 return "avx";
Craig Topperd945d502015-10-20 00:00:17 +00002994 if (getTriple().getArch() == llvm::Triple::x86 &&
Derek Schuffc7dd7222012-10-11 15:52:22 +00002995 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002996 return "no-mmx";
2997 return "";
Eli Friedman33465822011-07-08 23:31:17 +00002998 }
Craig Topper3164f332014-03-11 03:39:26 +00002999 bool setCPU(const std::string &Name) override {
Eric Christopherb39e44b2015-08-26 23:42:18 +00003000 CPU = getCPUKind(Name);
Chandler Carruth212334f2011-09-28 08:55:37 +00003001
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00003002 // Perform any per-CPU checks necessary to determine if this CPU is
3003 // acceptable.
3004 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
3005 // invalid without explaining *why*.
3006 switch (CPU) {
3007 case CK_Generic:
3008 // No processor selected!
3009 return false;
3010
3011 case CK_i386:
3012 case CK_i486:
3013 case CK_WinChipC6:
3014 case CK_WinChip2:
3015 case CK_C3:
3016 case CK_i586:
3017 case CK_Pentium:
3018 case CK_PentiumMMX:
3019 case CK_i686:
3020 case CK_PentiumPro:
3021 case CK_Pentium2:
3022 case CK_Pentium3:
3023 case CK_Pentium3M:
3024 case CK_PentiumM:
3025 case CK_Yonah:
3026 case CK_C3_2:
3027 case CK_Pentium4:
3028 case CK_Pentium4M:
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003029 case CK_Lakemont:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00003030 case CK_Prescott:
3031 case CK_K6:
3032 case CK_K6_2:
3033 case CK_K6_3:
3034 case CK_Athlon:
3035 case CK_AthlonThunderbird:
3036 case CK_Athlon4:
3037 case CK_AthlonXP:
3038 case CK_AthlonMP:
3039 case CK_Geode:
3040 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00003041 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00003042 return false;
3043
3044 // Fallthrough
3045 case CK_Nocona:
3046 case CK_Core2:
3047 case CK_Penryn:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003048 case CK_Bonnell:
Preston Gurda3c58c02013-09-13 19:27:17 +00003049 case CK_Silvermont:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003050 case CK_Nehalem:
3051 case CK_Westmere:
3052 case CK_SandyBridge:
3053 case CK_IvyBridge:
3054 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00003055 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003056 case CK_SkylakeClient:
3057 case CK_SkylakeServer:
3058 case CK_Cannonlake:
Craig Topper449314e2013-08-20 07:09:39 +00003059 case CK_KNL:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00003060 case CK_Athlon64:
3061 case CK_Athlon64SSE3:
3062 case CK_AthlonFX:
3063 case CK_K8:
3064 case CK_K8SSE3:
3065 case CK_Opteron:
3066 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00003067 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00003068 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003069 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003070 case CK_BDVER1:
3071 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003072 case CK_BDVER3:
Benjamin Kramer56c58222014-05-02 15:47:51 +00003073 case CK_BDVER4:
Craig Topperc45744a2017-01-10 06:02:12 +00003074 case CK_ZNVER1:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00003075 case CK_x86_64:
3076 return true;
3077 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00003078 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003079 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003080
Craig Topper3164f332014-03-11 03:39:26 +00003081 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00003082
Craig Topper3164f332014-03-11 03:39:26 +00003083 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00003084 // Most of the non-ARM calling conventions are i386 conventions.
3085 switch (CC) {
3086 case CC_X86ThisCall:
3087 case CC_X86FastCall:
3088 case CC_X86StdCall:
3089 case CC_X86VectorCall:
Erich Keane757d3172016-11-02 18:29:35 +00003090 case CC_X86RegCall:
John McCall477f2bb2016-03-03 06:39:32 +00003091 case CC_C:
3092 case CC_Swift:
3093 case CC_X86Pascal:
3094 case CC_IntelOclBicc:
3095 return CCCR_OK;
3096 default:
3097 return CCCR_Warning;
3098 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003099 }
3100
Craig Topper3164f332014-03-11 03:39:26 +00003101 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00003102 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003103 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00003104
3105 bool hasSjLjLowering() const override {
3106 return true;
3107 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00003108
3109 void setSupportedOpenCLOpts() override {
Yaxun Liu5b746652016-12-18 05:18:55 +00003110 getSupportedOpenCLOpts().supportAll();
Yaxun Liu39cf40f2016-05-16 17:06:34 +00003111 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00003112};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00003113
Rafael Espindolaeb265472013-08-21 21:59:03 +00003114bool X86TargetInfo::setFPMath(StringRef Name) {
3115 if (Name == "387") {
3116 FPMath = FP_387;
3117 return true;
3118 }
3119 if (Name == "sse") {
3120 FPMath = FP_SSE;
3121 return true;
3122 }
3123 return false;
3124}
3125
Eric Christopher007b0a02015-08-28 22:32:01 +00003126bool X86TargetInfo::initFeatureMap(
3127 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
Eric Christopher8c47b422015-10-09 18:39:55 +00003128 const std::vector<std::string> &FeaturesVec) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003129 // FIXME: This *really* should not be here.
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003130 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00003131 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00003132 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003133
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003134 const CPUKind Kind = getCPUKind(CPU);
Andrey Turetskiy5f1cf5f2016-03-23 11:15:10 +00003135
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003136 // Enable X87 for all X86 processors but Lakemont.
3137 if (Kind != CK_Lakemont)
3138 setFeatureEnabledImpl(Features, "x87", true);
3139
3140 switch (Kind) {
Chandler Carruth212334f2011-09-28 08:55:37 +00003141 case CK_Generic:
3142 case CK_i386:
3143 case CK_i486:
3144 case CK_i586:
3145 case CK_Pentium:
3146 case CK_i686:
3147 case CK_PentiumPro:
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003148 case CK_Lakemont:
Chandler Carruth212334f2011-09-28 08:55:37 +00003149 break;
3150 case CK_PentiumMMX:
3151 case CK_Pentium2:
Craig Topperdb4dc082014-11-06 05:52:19 +00003152 case CK_K6:
3153 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00003154 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003155 break;
3156 case CK_Pentium3:
3157 case CK_Pentium3M:
Craig Topperdb4dc082014-11-06 05:52:19 +00003158 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00003159 setFeatureEnabledImpl(Features, "sse", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003160 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003161 break;
3162 case CK_PentiumM:
3163 case CK_Pentium4:
3164 case CK_Pentium4M:
3165 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00003166 setFeatureEnabledImpl(Features, "sse2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003167 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003168 break;
3169 case CK_Yonah:
3170 case CK_Prescott:
3171 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00003172 setFeatureEnabledImpl(Features, "sse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003173 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003174 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003175 break;
3176 case CK_Core2:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003177 case CK_Bonnell:
Craig Topper86d79ef2013-09-17 04:51:29 +00003178 setFeatureEnabledImpl(Features, "ssse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003179 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003180 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003181 break;
3182 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00003183 setFeatureEnabledImpl(Features, "sse4.1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003184 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003185 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003186 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003187 case CK_Cannonlake:
3188 setFeatureEnabledImpl(Features, "avx512ifma", true);
3189 setFeatureEnabledImpl(Features, "avx512vbmi", true);
3190 setFeatureEnabledImpl(Features, "sha", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003191 LLVM_FALLTHROUGH;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003192 case CK_SkylakeServer:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003193 setFeatureEnabledImpl(Features, "avx512f", true);
3194 setFeatureEnabledImpl(Features, "avx512cd", true);
3195 setFeatureEnabledImpl(Features, "avx512dq", true);
3196 setFeatureEnabledImpl(Features, "avx512bw", true);
3197 setFeatureEnabledImpl(Features, "avx512vl", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003198 setFeatureEnabledImpl(Features, "pku", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003199 setFeatureEnabledImpl(Features, "clwb", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003200 LLVM_FALLTHROUGH;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003201 case CK_SkylakeClient:
Craig Topperda9fe562015-10-15 05:23:38 +00003202 setFeatureEnabledImpl(Features, "xsavec", true);
3203 setFeatureEnabledImpl(Features, "xsaves", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003204 setFeatureEnabledImpl(Features, "mpx", true);
3205 setFeatureEnabledImpl(Features, "sgx", true);
3206 setFeatureEnabledImpl(Features, "clflushopt", true);
Eric Christopherfc6ffed2017-03-28 23:03:19 +00003207 setFeatureEnabledImpl(Features, "rtm", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003208 LLVM_FALLTHROUGH;
Craig Topperdb4dc082014-11-06 05:52:19 +00003209 case CK_Broadwell:
3210 setFeatureEnabledImpl(Features, "rdseed", true);
3211 setFeatureEnabledImpl(Features, "adx", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003212 LLVM_FALLTHROUGH;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003213 case CK_Haswell:
Craig Topperdb4dc082014-11-06 05:52:19 +00003214 setFeatureEnabledImpl(Features, "avx2", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003215 setFeatureEnabledImpl(Features, "lzcnt", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003216 setFeatureEnabledImpl(Features, "bmi", true);
3217 setFeatureEnabledImpl(Features, "bmi2", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003218 setFeatureEnabledImpl(Features, "fma", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003219 setFeatureEnabledImpl(Features, "movbe", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003220 LLVM_FALLTHROUGH;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003221 case CK_IvyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00003222 setFeatureEnabledImpl(Features, "rdrnd", true);
3223 setFeatureEnabledImpl(Features, "f16c", true);
3224 setFeatureEnabledImpl(Features, "fsgsbase", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003225 LLVM_FALLTHROUGH;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003226 case CK_SandyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00003227 setFeatureEnabledImpl(Features, "avx", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003228 setFeatureEnabledImpl(Features, "xsave", true);
3229 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003230 LLVM_FALLTHROUGH;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003231 case CK_Westmere:
Craig Topperdb4dc082014-11-06 05:52:19 +00003232 case CK_Silvermont:
3233 setFeatureEnabledImpl(Features, "aes", true);
3234 setFeatureEnabledImpl(Features, "pclmul", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003235 LLVM_FALLTHROUGH;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003236 case CK_Nehalem:
Craig Topperdb4dc082014-11-06 05:52:19 +00003237 setFeatureEnabledImpl(Features, "sse4.2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003238 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00003239 setFeatureEnabledImpl(Features, "cx16", true);
3240 break;
3241 case CK_KNL:
3242 setFeatureEnabledImpl(Features, "avx512f", true);
3243 setFeatureEnabledImpl(Features, "avx512cd", true);
3244 setFeatureEnabledImpl(Features, "avx512er", true);
3245 setFeatureEnabledImpl(Features, "avx512pf", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003246 setFeatureEnabledImpl(Features, "prefetchwt1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003247 setFeatureEnabledImpl(Features, "fxsr", true);
Robert Khasanov50e6f582014-09-19 09:53:48 +00003248 setFeatureEnabledImpl(Features, "rdseed", true);
3249 setFeatureEnabledImpl(Features, "adx", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00003250 setFeatureEnabledImpl(Features, "lzcnt", true);
3251 setFeatureEnabledImpl(Features, "bmi", true);
3252 setFeatureEnabledImpl(Features, "bmi2", true);
3253 setFeatureEnabledImpl(Features, "rtm", true);
3254 setFeatureEnabledImpl(Features, "fma", true);
3255 setFeatureEnabledImpl(Features, "rdrnd", true);
3256 setFeatureEnabledImpl(Features, "f16c", true);
3257 setFeatureEnabledImpl(Features, "fsgsbase", true);
3258 setFeatureEnabledImpl(Features, "aes", true);
3259 setFeatureEnabledImpl(Features, "pclmul", true);
3260 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003261 setFeatureEnabledImpl(Features, "xsaveopt", true);
3262 setFeatureEnabledImpl(Features, "xsave", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003263 setFeatureEnabledImpl(Features, "movbe", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003264 break;
3265 case CK_K6_2:
3266 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00003267 case CK_WinChip2:
3268 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00003269 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003270 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00003271 case CK_Athlon:
3272 case CK_AthlonThunderbird:
3273 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00003274 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00003275 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003276 case CK_Athlon4:
3277 case CK_AthlonXP:
3278 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00003279 setFeatureEnabledImpl(Features, "sse", true);
3280 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003281 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003282 break;
3283 case CK_K8:
3284 case CK_Opteron:
3285 case CK_Athlon64:
3286 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00003287 setFeatureEnabledImpl(Features, "sse2", true);
3288 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003289 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003290 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00003291 case CK_AMDFAM10:
3292 setFeatureEnabledImpl(Features, "sse4a", true);
3293 setFeatureEnabledImpl(Features, "lzcnt", true);
3294 setFeatureEnabledImpl(Features, "popcnt", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003295 LLVM_FALLTHROUGH;
Chandler Carruth212334f2011-09-28 08:55:37 +00003296 case CK_K8SSE3:
3297 case CK_OpteronSSE3:
3298 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00003299 setFeatureEnabledImpl(Features, "sse3", true);
3300 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003301 setFeatureEnabledImpl(Features, "fxsr", true);
Roman Divackyce253d82011-10-30 13:47:56 +00003302 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00003303 case CK_BTVER2:
3304 setFeatureEnabledImpl(Features, "avx", true);
3305 setFeatureEnabledImpl(Features, "aes", true);
3306 setFeatureEnabledImpl(Features, "pclmul", true);
3307 setFeatureEnabledImpl(Features, "bmi", true);
3308 setFeatureEnabledImpl(Features, "f16c", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003309 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003310 LLVM_FALLTHROUGH;
Benjamin Kramer569f2152012-01-10 11:50:18 +00003311 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00003312 setFeatureEnabledImpl(Features, "ssse3", true);
3313 setFeatureEnabledImpl(Features, "sse4a", true);
3314 setFeatureEnabledImpl(Features, "lzcnt", true);
3315 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00003316 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003317 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003318 setFeatureEnabledImpl(Features, "fxsr", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003319 break;
Craig Topperc45744a2017-01-10 06:02:12 +00003320 case CK_ZNVER1:
3321 setFeatureEnabledImpl(Features, "adx", true);
3322 setFeatureEnabledImpl(Features, "aes", true);
3323 setFeatureEnabledImpl(Features, "avx2", true);
3324 setFeatureEnabledImpl(Features, "bmi", true);
3325 setFeatureEnabledImpl(Features, "bmi2", true);
3326 setFeatureEnabledImpl(Features, "clflushopt", true);
Craig Topper45742262017-02-09 06:10:14 +00003327 setFeatureEnabledImpl(Features, "clzero", true);
Craig Topperc45744a2017-01-10 06:02:12 +00003328 setFeatureEnabledImpl(Features, "cx16", true);
3329 setFeatureEnabledImpl(Features, "f16c", true);
3330 setFeatureEnabledImpl(Features, "fma", true);
3331 setFeatureEnabledImpl(Features, "fsgsbase", true);
3332 setFeatureEnabledImpl(Features, "fxsr", true);
3333 setFeatureEnabledImpl(Features, "lzcnt", true);
3334 setFeatureEnabledImpl(Features, "mwaitx", true);
3335 setFeatureEnabledImpl(Features, "movbe", true);
3336 setFeatureEnabledImpl(Features, "pclmul", true);
3337 setFeatureEnabledImpl(Features, "popcnt", true);
3338 setFeatureEnabledImpl(Features, "prfchw", true);
3339 setFeatureEnabledImpl(Features, "rdrnd", true);
3340 setFeatureEnabledImpl(Features, "rdseed", true);
3341 setFeatureEnabledImpl(Features, "sha", true);
3342 setFeatureEnabledImpl(Features, "sse4a", true);
3343 setFeatureEnabledImpl(Features, "xsave", true);
3344 setFeatureEnabledImpl(Features, "xsavec", true);
3345 setFeatureEnabledImpl(Features, "xsaveopt", true);
3346 setFeatureEnabledImpl(Features, "xsaves", true);
3347 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003348 case CK_BDVER4:
3349 setFeatureEnabledImpl(Features, "avx2", true);
3350 setFeatureEnabledImpl(Features, "bmi2", true);
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003351 setFeatureEnabledImpl(Features, "mwaitx", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003352 LLVM_FALLTHROUGH;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003353 case CK_BDVER3:
Craig Topper8c7f2512014-11-03 06:51:41 +00003354 setFeatureEnabledImpl(Features, "fsgsbase", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003355 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003356 LLVM_FALLTHROUGH;
Craig Topper8c7f2512014-11-03 06:51:41 +00003357 case CK_BDVER2:
Andrea Di Biagio9760a442014-11-06 12:08:57 +00003358 setFeatureEnabledImpl(Features, "bmi", true);
3359 setFeatureEnabledImpl(Features, "fma", true);
3360 setFeatureEnabledImpl(Features, "f16c", true);
3361 setFeatureEnabledImpl(Features, "tbm", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003362 LLVM_FALLTHROUGH;
Andrea Di Biagio9760a442014-11-06 12:08:57 +00003363 case CK_BDVER1:
3364 // xop implies avx, sse4a and fma4.
Craig Topper86d79ef2013-09-17 04:51:29 +00003365 setFeatureEnabledImpl(Features, "xop", true);
3366 setFeatureEnabledImpl(Features, "lzcnt", true);
3367 setFeatureEnabledImpl(Features, "aes", true);
3368 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00003369 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003370 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003371 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003372 setFeatureEnabledImpl(Features, "xsave", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003373 break;
Eli Friedman33465822011-07-08 23:31:17 +00003374 }
Eric Christopherbbd746d2015-10-08 20:10:14 +00003375 if (!TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec))
3376 return false;
3377
3378 // Can't do this earlier because we need to be able to explicitly enable
3379 // or disable these features and the things that they depend upon.
3380
3381 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
3382 auto I = Features.find("sse4.2");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003383 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00003384 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-popcnt") ==
3385 FeaturesVec.end())
3386 Features["popcnt"] = true;
3387
3388 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
3389 I = Features.find("3dnow");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003390 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00003391 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-prfchw") ==
3392 FeaturesVec.end())
3393 Features["prfchw"] = true;
3394
Eric Christophera7260af2015-10-08 20:10:18 +00003395 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
3396 // then enable MMX.
3397 I = Features.find("sse");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003398 if (I != Features.end() && I->getValue() &&
Eric Christophera7260af2015-10-08 20:10:18 +00003399 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-mmx") ==
3400 FeaturesVec.end())
3401 Features["mmx"] = true;
3402
Eric Christopherbbd746d2015-10-08 20:10:14 +00003403 return true;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003404}
3405
Rafael Espindolae62e2792013-08-20 13:44:29 +00003406void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00003407 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003408 if (Enabled) {
3409 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003410 case AVX512F:
3411 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003412 case AVX2:
3413 Features["avx2"] = true;
3414 case AVX:
3415 Features["avx"] = true;
Craig Topperda9fe562015-10-15 05:23:38 +00003416 Features["xsave"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003417 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00003418 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003419 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00003420 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003421 case SSSE3:
3422 Features["ssse3"] = true;
3423 case SSE3:
3424 Features["sse3"] = true;
3425 case SSE2:
3426 Features["sse2"] = true;
3427 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00003428 Features["sse"] = true;
3429 case NoSSE:
3430 break;
3431 }
3432 return;
3433 }
3434
3435 switch (Level) {
3436 case NoSSE:
3437 case SSE1:
3438 Features["sse"] = false;
3439 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00003440 Features["sse2"] = Features["pclmul"] = Features["aes"] =
3441 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003442 case SSE3:
3443 Features["sse3"] = false;
3444 setXOPLevel(Features, NoXOP, false);
3445 case SSSE3:
3446 Features["ssse3"] = false;
3447 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00003448 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003449 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00003450 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003451 case AVX:
Craig Topperda9fe562015-10-15 05:23:38 +00003452 Features["fma"] = Features["avx"] = Features["f16c"] = Features["xsave"] =
3453 Features["xsaveopt"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00003454 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003455 case AVX2:
3456 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00003457 case AVX512F:
Eric Christopher917e9522014-11-18 22:36:15 +00003458 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
Craig Toppera31a5da2014-12-27 06:59:37 +00003459 Features["avx512pf"] = Features["avx512dq"] = Features["avx512bw"] =
Craig Topperb4f83a02016-02-29 06:51:38 +00003460 Features["avx512vl"] = Features["avx512vbmi"] =
3461 Features["avx512ifma"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003462 }
3463}
3464
3465void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00003466 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003467 if (Enabled) {
3468 switch (Level) {
3469 case AMD3DNowAthlon:
3470 Features["3dnowa"] = true;
3471 case AMD3DNow:
3472 Features["3dnow"] = true;
3473 case MMX:
3474 Features["mmx"] = true;
3475 case NoMMX3DNow:
3476 break;
3477 }
3478 return;
3479 }
3480
3481 switch (Level) {
3482 case NoMMX3DNow:
3483 case MMX:
3484 Features["mmx"] = false;
3485 case AMD3DNow:
3486 Features["3dnow"] = false;
3487 case AMD3DNowAthlon:
3488 Features["3dnowa"] = false;
3489 }
3490}
3491
3492void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00003493 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003494 if (Enabled) {
3495 switch (Level) {
3496 case XOP:
3497 Features["xop"] = true;
3498 case FMA4:
3499 Features["fma4"] = true;
3500 setSSELevel(Features, AVX, true);
3501 case SSE4A:
3502 Features["sse4a"] = true;
3503 setSSELevel(Features, SSE3, true);
3504 case NoXOP:
3505 break;
3506 }
3507 return;
3508 }
3509
3510 switch (Level) {
3511 case NoXOP:
3512 case SSE4A:
3513 Features["sse4a"] = false;
3514 case FMA4:
3515 Features["fma4"] = false;
3516 case XOP:
3517 Features["xop"] = false;
3518 }
3519}
3520
Craig Topper86d79ef2013-09-17 04:51:29 +00003521void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
3522 StringRef Name, bool Enabled) {
Eric Christopher298ac302015-07-01 00:08:32 +00003523 // This is a bit of a hack to deal with the sse4 target feature when used
3524 // as part of the target attribute. We handle sse4 correctly everywhere
3525 // else. See below for more information on how we handle the sse4 options.
3526 if (Name != "sse4")
3527 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00003528
Craig Topper29561122013-09-19 01:13:07 +00003529 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003530 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003531 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003532 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003533 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003534 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003535 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003536 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003537 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003538 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003539 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003540 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003541 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003542 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003543 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003544 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003545 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003546 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003547 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003548 if (Enabled)
3549 setSSELevel(Features, SSE2, Enabled);
3550 } else if (Name == "pclmul") {
3551 if (Enabled)
3552 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003553 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003554 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003555 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003556 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003557 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003558 setSSELevel(Features, AVX512F, Enabled);
Craig Topperb4f83a02016-02-29 06:51:38 +00003559 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf" ||
3560 Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl" ||
3561 Name == "avx512vbmi" || Name == "avx512ifma") {
Craig Topper679b53a2013-08-21 05:29:10 +00003562 if (Enabled)
3563 setSSELevel(Features, AVX512F, Enabled);
Craig Topper6c7ecc52016-11-09 04:51:03 +00003564 // Enable BWI instruction if VBMI is being enabled.
3565 if (Name == "avx512vbmi" && Enabled)
3566 Features["avx512bw"] = true;
3567 // Also disable VBMI if BWI is being disabled.
3568 if (Name == "avx512bw" && !Enabled)
3569 Features["avx512vbmi"] = false;
Craig Topper679b53a2013-08-21 05:29:10 +00003570 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003571 if (Enabled)
3572 setSSELevel(Features, AVX, Enabled);
3573 } else if (Name == "fma4") {
3574 setXOPLevel(Features, FMA4, Enabled);
3575 } else if (Name == "xop") {
3576 setXOPLevel(Features, XOP, Enabled);
3577 } else if (Name == "sse4a") {
3578 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00003579 } else if (Name == "f16c") {
3580 if (Enabled)
3581 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00003582 } else if (Name == "sha") {
3583 if (Enabled)
3584 setSSELevel(Features, SSE2, Enabled);
Eric Christopher298ac302015-07-01 00:08:32 +00003585 } else if (Name == "sse4") {
3586 // We can get here via the __target__ attribute since that's not controlled
3587 // via the -msse4/-mno-sse4 command line alias. Handle this the same way
3588 // here - turn on the sse4.2 if enabled, turn off the sse4.1 level if
3589 // disabled.
3590 if (Enabled)
3591 setSSELevel(Features, SSE42, Enabled);
3592 else
3593 setSSELevel(Features, SSE41, Enabled);
Craig Topperda9fe562015-10-15 05:23:38 +00003594 } else if (Name == "xsave") {
Craig Topper840927e2016-02-29 06:51:34 +00003595 if (!Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003596 Features["xsaveopt"] = false;
3597 } else if (Name == "xsaveopt" || Name == "xsavec" || Name == "xsaves") {
Craig Topper840927e2016-02-29 06:51:34 +00003598 if (Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003599 Features["xsave"] = true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003600 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003601}
3602
Eric Christopher3ff21b32013-10-16 21:26:26 +00003603/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003604/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00003605bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00003606 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00003607 for (const auto &Feature : Features) {
3608 if (Feature[0] != '+')
Daniel Dunbar979586e2009-11-11 09:38:56 +00003609 continue;
3610
Eric Christopher610fe112015-08-26 08:21:55 +00003611 if (Feature == "+aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00003612 HasAES = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003613 } else if (Feature == "+pclmul") {
Craig Topper3f122a72012-05-31 05:18:48 +00003614 HasPCLMUL = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003615 } else if (Feature == "+lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00003616 HasLZCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003617 } else if (Feature == "+rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00003618 HasRDRND = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003619 } else if (Feature == "+fsgsbase") {
Craig Topper8c7f2512014-11-03 06:51:41 +00003620 HasFSGSBASE = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003621 } else if (Feature == "+bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00003622 HasBMI = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003623 } else if (Feature == "+bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00003624 HasBMI2 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003625 } else if (Feature == "+popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00003626 HasPOPCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003627 } else if (Feature == "+rtm") {
Michael Liao625a8752012-11-10 05:17:46 +00003628 HasRTM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003629 } else if (Feature == "+prfchw") {
Michael Liao74f4eaf2013-03-26 17:52:08 +00003630 HasPRFCHW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003631 } else if (Feature == "+rdseed") {
Michael Liaoffaae352013-03-29 05:17:55 +00003632 HasRDSEED = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003633 } else if (Feature == "+adx") {
Robert Khasanov50e6f582014-09-19 09:53:48 +00003634 HasADX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003635 } else if (Feature == "+tbm") {
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003636 HasTBM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003637 } else if (Feature == "+fma") {
Craig Topperbba778b2012-06-03 21:46:30 +00003638 HasFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003639 } else if (Feature == "+f16c") {
Manman Rena45358c2012-10-11 00:59:55 +00003640 HasF16C = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003641 } else if (Feature == "+avx512cd") {
Craig Topper679b53a2013-08-21 05:29:10 +00003642 HasAVX512CD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003643 } else if (Feature == "+avx512er") {
Craig Topper679b53a2013-08-21 05:29:10 +00003644 HasAVX512ER = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003645 } else if (Feature == "+avx512pf") {
Craig Topper679b53a2013-08-21 05:29:10 +00003646 HasAVX512PF = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003647 } else if (Feature == "+avx512dq") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003648 HasAVX512DQ = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003649 } else if (Feature == "+avx512bw") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003650 HasAVX512BW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003651 } else if (Feature == "+avx512vl") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003652 HasAVX512VL = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003653 } else if (Feature == "+avx512vbmi") {
3654 HasAVX512VBMI = true;
3655 } else if (Feature == "+avx512ifma") {
3656 HasAVX512IFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003657 } else if (Feature == "+sha") {
Ben Langmuir58078d02013-09-19 13:22:04 +00003658 HasSHA = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003659 } else if (Feature == "+mpx") {
3660 HasMPX = true;
3661 } else if (Feature == "+movbe") {
3662 HasMOVBE = true;
3663 } else if (Feature == "+sgx") {
3664 HasSGX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003665 } else if (Feature == "+cx16") {
Nick Lewycky50e8f482013-10-05 20:14:27 +00003666 HasCX16 = true;
Craig Toppere33f51f2015-10-16 06:22:36 +00003667 } else if (Feature == "+fxsr") {
3668 HasFXSR = true;
Craig Topperda9fe562015-10-15 05:23:38 +00003669 } else if (Feature == "+xsave") {
3670 HasXSAVE = true;
3671 } else if (Feature == "+xsaveopt") {
3672 HasXSAVEOPT = true;
3673 } else if (Feature == "+xsavec") {
3674 HasXSAVEC = true;
3675 } else if (Feature == "+xsaves") {
3676 HasXSAVES = true;
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003677 } else if (Feature == "+mwaitx") {
3678 HasMWAITX = true;
Asaf Badouha9d1e182015-12-31 14:14:07 +00003679 } else if (Feature == "+pku") {
3680 HasPKU = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003681 } else if (Feature == "+clflushopt") {
3682 HasCLFLUSHOPT = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003683 } else if (Feature == "+clwb") {
3684 HasCLWB = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003685 } else if (Feature == "+prefetchwt1") {
3686 HasPREFETCHWT1 = true;
Craig Topper45742262017-02-09 06:10:14 +00003687 } else if (Feature == "+clzero") {
3688 HasCLZERO = true;
Nick Lewycky50e8f482013-10-05 20:14:27 +00003689 }
3690
Benjamin Kramer27402c62012-03-05 15:10:44 +00003691 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003692 .Case("+avx512f", AVX512F)
3693 .Case("+avx2", AVX2)
3694 .Case("+avx", AVX)
3695 .Case("+sse4.2", SSE42)
3696 .Case("+sse4.1", SSE41)
3697 .Case("+ssse3", SSSE3)
3698 .Case("+sse3", SSE3)
3699 .Case("+sse2", SSE2)
3700 .Case("+sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00003701 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003702 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003703
Eli Friedman33465822011-07-08 23:31:17 +00003704 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00003705 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003706 .Case("+3dnowa", AMD3DNowAthlon)
3707 .Case("+3dnow", AMD3DNow)
3708 .Case("+mmx", MMX)
Eli Friedman33465822011-07-08 23:31:17 +00003709 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00003710 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003711
3712 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003713 .Case("+xop", XOP)
3714 .Case("+fma4", FMA4)
3715 .Case("+sse4a", SSE4A)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003716 .Default(NoXOP);
3717 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003718 }
Eli Friedman33465822011-07-08 23:31:17 +00003719
Rafael Espindolaeb265472013-08-21 21:59:03 +00003720 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
3721 // matches the selected sse level.
Craig Topperd945d502015-10-20 00:00:17 +00003722 if ((FPMath == FP_SSE && SSELevel < SSE1) ||
3723 (FPMath == FP_387 && SSELevel >= SSE1)) {
3724 Diags.Report(diag::err_target_unsupported_fpmath) <<
3725 (FPMath == FP_SSE ? "sse" : "387");
Rafael Espindolaeb265472013-08-21 21:59:03 +00003726 return false;
3727 }
3728
Alexey Bataev00396512015-07-02 03:40:19 +00003729 SimdDefaultAlign =
Ahmed Bougacha68bf64e2015-08-27 22:24:56 +00003730 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Rafael Espindolaeb265472013-08-21 21:59:03 +00003731 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00003732}
Chris Lattnerecd49032009-03-02 22:27:17 +00003733
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003734/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
3735/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00003736void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003737 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00003738 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00003739 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003740 Builder.defineMacro("__amd64__");
3741 Builder.defineMacro("__amd64");
3742 Builder.defineMacro("__x86_64");
3743 Builder.defineMacro("__x86_64__");
Bob Wilsona2acb1e2014-08-08 23:46:28 +00003744 if (getTriple().getArchName() == "x86_64h") {
3745 Builder.defineMacro("__x86_64h");
3746 Builder.defineMacro("__x86_64h__");
3747 }
Chris Lattnerecd49032009-03-02 22:27:17 +00003748 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003749 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00003750 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003751
Chris Lattnerecd49032009-03-02 22:27:17 +00003752 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003753 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
3754 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00003755 switch (CPU) {
3756 case CK_Generic:
3757 break;
3758 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003759 // The rest are coming from the i386 define above.
3760 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003761 break;
3762 case CK_i486:
3763 case CK_WinChipC6:
3764 case CK_WinChip2:
3765 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003766 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00003767 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003768 case CK_PentiumMMX:
3769 Builder.defineMacro("__pentium_mmx__");
3770 Builder.defineMacro("__tune_pentium_mmx__");
3771 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003772 case CK_i586:
3773 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003774 defineCPUMacros(Builder, "i586");
3775 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00003776 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003777 case CK_Pentium3:
3778 case CK_Pentium3M:
3779 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003780 Builder.defineMacro("__tune_pentium3__");
3781 // Fallthrough
3782 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00003783 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003784 Builder.defineMacro("__tune_pentium2__");
3785 // Fallthrough
3786 case CK_PentiumPro:
3787 Builder.defineMacro("__tune_i686__");
3788 Builder.defineMacro("__tune_pentiumpro__");
3789 // Fallthrough
3790 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003791 Builder.defineMacro("__i686");
3792 Builder.defineMacro("__i686__");
3793 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
3794 Builder.defineMacro("__pentiumpro");
3795 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003796 break;
3797 case CK_Pentium4:
3798 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003799 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00003800 break;
3801 case CK_Yonah:
3802 case CK_Prescott:
3803 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003804 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00003805 break;
3806 case CK_Core2:
3807 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003808 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00003809 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003810 case CK_Bonnell:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003811 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00003812 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00003813 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00003814 defineCPUMacros(Builder, "slm");
3815 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003816 case CK_Nehalem:
3817 case CK_Westmere:
3818 case CK_SandyBridge:
3819 case CK_IvyBridge:
3820 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00003821 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003822 case CK_SkylakeClient:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003823 // FIXME: Historically, we defined this legacy name, it would be nice to
3824 // remove it at some point. We've never exposed fine-grained names for
3825 // recent primary x86 CPUs, and we should keep it that way.
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003826 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00003827 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003828 case CK_SkylakeServer:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003829 defineCPUMacros(Builder, "skx");
3830 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003831 case CK_Cannonlake:
3832 break;
Craig Topper449314e2013-08-20 07:09:39 +00003833 case CK_KNL:
3834 defineCPUMacros(Builder, "knl");
3835 break;
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003836 case CK_Lakemont:
3837 Builder.defineMacro("__tune_lakemont__");
3838 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003839 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003840 Builder.defineMacro("__k6_2__");
3841 Builder.defineMacro("__tune_k6_2__");
3842 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003843 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003844 if (CPU != CK_K6_2) { // In case of fallthrough
3845 // FIXME: GCC may be enabling these in cases where some other k6
3846 // architecture is specified but -m3dnow is explicitly provided. The
3847 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003848 Builder.defineMacro("__k6_3__");
3849 Builder.defineMacro("__tune_k6_3__");
3850 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003851 // Fallthrough
3852 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003853 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00003854 break;
3855 case CK_Athlon:
3856 case CK_AthlonThunderbird:
3857 case CK_Athlon4:
3858 case CK_AthlonXP:
3859 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003860 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003861 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003862 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003863 Builder.defineMacro("__tune_athlon_sse__");
3864 }
Chandler Carruth212334f2011-09-28 08:55:37 +00003865 break;
3866 case CK_K8:
3867 case CK_K8SSE3:
3868 case CK_x86_64:
3869 case CK_Opteron:
3870 case CK_OpteronSSE3:
3871 case CK_Athlon64:
3872 case CK_Athlon64SSE3:
3873 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003874 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00003875 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00003876 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003877 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00003878 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00003879 case CK_BTVER1:
3880 defineCPUMacros(Builder, "btver1");
3881 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003882 case CK_BTVER2:
3883 defineCPUMacros(Builder, "btver2");
3884 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003885 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003886 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003887 break;
3888 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003889 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003890 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003891 case CK_BDVER3:
3892 defineCPUMacros(Builder, "bdver3");
3893 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003894 case CK_BDVER4:
3895 defineCPUMacros(Builder, "bdver4");
3896 break;
Craig Topperc45744a2017-01-10 06:02:12 +00003897 case CK_ZNVER1:
3898 defineCPUMacros(Builder, "znver1");
3899 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003900 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003901 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00003902 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003903 }
Chris Lattner96e43572009-03-02 22:40:39 +00003904
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003905 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003906 Builder.defineMacro("__REGISTER_PREFIX__", "");
3907
Chris Lattner6df41af2009-04-19 17:32:33 +00003908 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
3909 // functions in glibc header files that use FP Stack inline asm which the
3910 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003911 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003912
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003913 if (HasAES)
3914 Builder.defineMacro("__AES__");
3915
Craig Topper3f122a72012-05-31 05:18:48 +00003916 if (HasPCLMUL)
3917 Builder.defineMacro("__PCLMUL__");
3918
Craig Topper22967d42011-12-25 05:06:45 +00003919 if (HasLZCNT)
3920 Builder.defineMacro("__LZCNT__");
3921
Benjamin Kramer1e250392012-07-07 09:39:18 +00003922 if (HasRDRND)
3923 Builder.defineMacro("__RDRND__");
3924
Craig Topper8c7f2512014-11-03 06:51:41 +00003925 if (HasFSGSBASE)
3926 Builder.defineMacro("__FSGSBASE__");
3927
Craig Topper22967d42011-12-25 05:06:45 +00003928 if (HasBMI)
3929 Builder.defineMacro("__BMI__");
3930
3931 if (HasBMI2)
3932 Builder.defineMacro("__BMI2__");
3933
Craig Topper1de83482011-12-29 16:10:46 +00003934 if (HasPOPCNT)
3935 Builder.defineMacro("__POPCNT__");
3936
Michael Liao625a8752012-11-10 05:17:46 +00003937 if (HasRTM)
3938 Builder.defineMacro("__RTM__");
3939
Michael Liao74f4eaf2013-03-26 17:52:08 +00003940 if (HasPRFCHW)
3941 Builder.defineMacro("__PRFCHW__");
3942
Michael Liaoffaae352013-03-29 05:17:55 +00003943 if (HasRDSEED)
3944 Builder.defineMacro("__RDSEED__");
3945
Robert Khasanov50e6f582014-09-19 09:53:48 +00003946 if (HasADX)
3947 Builder.defineMacro("__ADX__");
3948
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003949 if (HasTBM)
3950 Builder.defineMacro("__TBM__");
3951
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003952 if (HasMWAITX)
3953 Builder.defineMacro("__MWAITX__");
3954
Rafael Espindolae62e2792013-08-20 13:44:29 +00003955 switch (XOPLevel) {
3956 case XOP:
3957 Builder.defineMacro("__XOP__");
3958 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00003959 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00003960 case SSE4A:
3961 Builder.defineMacro("__SSE4A__");
3962 case NoXOP:
3963 break;
3964 }
Craig Topperffdb46c2011-12-30 07:33:42 +00003965
Craig Topperbba778b2012-06-03 21:46:30 +00003966 if (HasFMA)
3967 Builder.defineMacro("__FMA__");
3968
Manman Rena45358c2012-10-11 00:59:55 +00003969 if (HasF16C)
3970 Builder.defineMacro("__F16C__");
3971
Craig Topper679b53a2013-08-21 05:29:10 +00003972 if (HasAVX512CD)
3973 Builder.defineMacro("__AVX512CD__");
3974 if (HasAVX512ER)
3975 Builder.defineMacro("__AVX512ER__");
3976 if (HasAVX512PF)
3977 Builder.defineMacro("__AVX512PF__");
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003978 if (HasAVX512DQ)
3979 Builder.defineMacro("__AVX512DQ__");
3980 if (HasAVX512BW)
3981 Builder.defineMacro("__AVX512BW__");
3982 if (HasAVX512VL)
3983 Builder.defineMacro("__AVX512VL__");
Craig Topperb4f83a02016-02-29 06:51:38 +00003984 if (HasAVX512VBMI)
3985 Builder.defineMacro("__AVX512VBMI__");
3986 if (HasAVX512IFMA)
3987 Builder.defineMacro("__AVX512IFMA__");
Craig Topper679b53a2013-08-21 05:29:10 +00003988
Ben Langmuir58078d02013-09-19 13:22:04 +00003989 if (HasSHA)
3990 Builder.defineMacro("__SHA__");
3991
Craig Toppere33f51f2015-10-16 06:22:36 +00003992 if (HasFXSR)
3993 Builder.defineMacro("__FXSR__");
Craig Topperda9fe562015-10-15 05:23:38 +00003994 if (HasXSAVE)
3995 Builder.defineMacro("__XSAVE__");
3996 if (HasXSAVEOPT)
3997 Builder.defineMacro("__XSAVEOPT__");
3998 if (HasXSAVEC)
3999 Builder.defineMacro("__XSAVEC__");
4000 if (HasXSAVES)
4001 Builder.defineMacro("__XSAVES__");
Asaf Badouha9d1e182015-12-31 14:14:07 +00004002 if (HasPKU)
4003 Builder.defineMacro("__PKU__");
Nick Lewycky50e8f482013-10-05 20:14:27 +00004004 if (HasCX16)
4005 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
Craig Topper78b47872017-02-08 06:48:58 +00004006 if (HasCLFLUSHOPT)
4007 Builder.defineMacro("__CLFLUSHOPT__");
Craig Topper8c708cf2017-02-08 07:36:58 +00004008 if (HasCLWB)
4009 Builder.defineMacro("__CLWB__");
Craig Topperb16cb822017-02-08 07:56:42 +00004010 if (HasMPX)
4011 Builder.defineMacro("__MPX__");
Craig Topper204ecff2017-02-08 08:23:17 +00004012 if (HasSGX)
4013 Builder.defineMacro("__SGX__");
Craig Topperd2bf7b02017-02-08 08:23:40 +00004014 if (HasPREFETCHWT1)
4015 Builder.defineMacro("__PREFETCHWT1__");
Craig Topper45742262017-02-09 06:10:14 +00004016 if (HasCLZERO)
4017 Builder.defineMacro("__CLZERO__");
Nick Lewycky50e8f482013-10-05 20:14:27 +00004018
Chris Lattner96e43572009-03-02 22:40:39 +00004019 // Each case falls through to the previous one here.
4020 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00004021 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00004022 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00004023 case AVX2:
4024 Builder.defineMacro("__AVX2__");
4025 case AVX:
4026 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00004027 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004028 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00004029 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004030 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00004031 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004032 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00004033 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004034 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00004035 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004036 Builder.defineMacro("__SSE2__");
4037 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00004038 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004039 Builder.defineMacro("__SSE__");
4040 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00004041 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00004042 break;
4043 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004044
Derek Schuffc7dd7222012-10-11 15:52:22 +00004045 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004046 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00004047 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00004048 case AVX2:
4049 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004050 case SSE42:
4051 case SSE41:
4052 case SSSE3:
4053 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004054 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004055 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004056 break;
4057 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004058 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004059 break;
4060 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004061 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004062 }
4063 }
4064
Anders Carlssone437c682010-01-27 03:47:49 +00004065 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00004066 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00004067 case AMD3DNowAthlon:
4068 Builder.defineMacro("__3dNOW_A__");
4069 case AMD3DNow:
4070 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00004071 case MMX:
4072 Builder.defineMacro("__MMX__");
4073 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00004074 break;
4075 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00004076
4077 if (CPU >= CK_i486) {
4078 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
4079 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
4080 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
4081 }
4082 if (CPU >= CK_i586)
4083 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00004084}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004085
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004086bool X86TargetInfo::hasFeature(StringRef Feature) const {
4087 return llvm::StringSwitch<bool>(Feature)
4088 .Case("aes", HasAES)
4089 .Case("avx", SSELevel >= AVX)
4090 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00004091 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00004092 .Case("avx512cd", HasAVX512CD)
4093 .Case("avx512er", HasAVX512ER)
4094 .Case("avx512pf", HasAVX512PF)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00004095 .Case("avx512dq", HasAVX512DQ)
4096 .Case("avx512bw", HasAVX512BW)
4097 .Case("avx512vl", HasAVX512VL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00004098 .Case("avx512vbmi", HasAVX512VBMI)
4099 .Case("avx512ifma", HasAVX512IFMA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004100 .Case("bmi", HasBMI)
4101 .Case("bmi2", HasBMI2)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00004102 .Case("clflushopt", HasCLFLUSHOPT)
4103 .Case("clwb", HasCLWB)
Craig Topper45742262017-02-09 06:10:14 +00004104 .Case("clzero", HasCLZERO)
Nick Lewycky50e8f482013-10-05 20:14:27 +00004105 .Case("cx16", HasCX16)
4106 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00004107 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00004108 .Case("fma4", XOPLevel >= FMA4)
Craig Topper8c7f2512014-11-03 06:51:41 +00004109 .Case("fsgsbase", HasFSGSBASE)
Craig Toppere33f51f2015-10-16 06:22:36 +00004110 .Case("fxsr", HasFXSR)
Craig Topper8dbc5842014-11-03 07:05:26 +00004111 .Case("lzcnt", HasLZCNT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004112 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
4113 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
4114 .Case("mmx", MMX3DNowLevel >= MMX)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00004115 .Case("movbe", HasMOVBE)
4116 .Case("mpx", HasMPX)
Craig Topper3f122a72012-05-31 05:18:48 +00004117 .Case("pclmul", HasPCLMUL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00004118 .Case("pku", HasPKU)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004119 .Case("popcnt", HasPOPCNT)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00004120 .Case("prefetchwt1", HasPREFETCHWT1)
Michael Liao74f4eaf2013-03-26 17:52:08 +00004121 .Case("prfchw", HasPRFCHW)
Craig Topper8dbc5842014-11-03 07:05:26 +00004122 .Case("rdrnd", HasRDRND)
Michael Liaoffaae352013-03-29 05:17:55 +00004123 .Case("rdseed", HasRDSEED)
Craig Topper8dbc5842014-11-03 07:05:26 +00004124 .Case("rtm", HasRTM)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00004125 .Case("sgx", HasSGX)
Ben Langmuir58078d02013-09-19 13:22:04 +00004126 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004127 .Case("sse", SSELevel >= SSE1)
4128 .Case("sse2", SSELevel >= SSE2)
4129 .Case("sse3", SSELevel >= SSE3)
4130 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00004131 .Case("sse4.1", SSELevel >= SSE41)
4132 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00004133 .Case("sse4a", XOPLevel >= SSE4A)
Craig Topper8dbc5842014-11-03 07:05:26 +00004134 .Case("tbm", HasTBM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004135 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00004136 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
4137 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00004138 .Case("xop", XOPLevel >= XOP)
Craig Topperda9fe562015-10-15 05:23:38 +00004139 .Case("xsave", HasXSAVE)
4140 .Case("xsavec", HasXSAVEC)
4141 .Case("xsaves", HasXSAVES)
4142 .Case("xsaveopt", HasXSAVEOPT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004143 .Default(false);
4144}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004145
Eric Christopherd9832702015-06-29 21:00:05 +00004146// We can't use a generic validation scheme for the features accepted here
4147// versus subtarget features accepted in the target attribute because the
4148// bitfield structure that's initialized in the runtime only supports the
4149// below currently rather than the full range of subtarget features. (See
4150// X86TargetInfo::hasFeature for a somewhat comprehensive list).
4151bool X86TargetInfo::validateCpuSupports(StringRef FeatureStr) const {
4152 return llvm::StringSwitch<bool>(FeatureStr)
4153 .Case("cmov", true)
4154 .Case("mmx", true)
4155 .Case("popcnt", true)
4156 .Case("sse", true)
4157 .Case("sse2", true)
4158 .Case("sse3", true)
Benjamin Kramerf4c520d2016-05-20 15:21:08 +00004159 .Case("ssse3", true)
Eric Christopherd9832702015-06-29 21:00:05 +00004160 .Case("sse4.1", true)
4161 .Case("sse4.2", true)
4162 .Case("avx", true)
4163 .Case("avx2", true)
4164 .Case("sse4a", true)
4165 .Case("fma4", true)
4166 .Case("xop", true)
4167 .Case("fma", true)
4168 .Case("avx512f", true)
4169 .Case("bmi", true)
4170 .Case("bmi2", true)
Benjamin Kramerf4c520d2016-05-20 15:21:08 +00004171 .Case("aes", true)
4172 .Case("pclmul", true)
4173 .Case("avx512vl", true)
4174 .Case("avx512bw", true)
4175 .Case("avx512dq", true)
4176 .Case("avx512cd", true)
4177 .Case("avx512er", true)
4178 .Case("avx512pf", true)
4179 .Case("avx512vbmi", true)
4180 .Case("avx512ifma", true)
Eric Christopherd9832702015-06-29 21:00:05 +00004181 .Default(false);
4182}
4183
Eli Friedman3fd920a2008-08-20 02:34:37 +00004184bool
Anders Carlsson58436352009-02-28 17:11:49 +00004185X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00004186 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00004187 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004188 default: return false;
Alexey Bataev91e58602015-07-20 12:08:00 +00004189 // Constant constraints.
4190 case 'e': // 32-bit signed integer constant for use with sign-extending x86_64
4191 // instructions.
4192 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
4193 // x86_64 instructions.
4194 case 's':
4195 Info.setRequiresImmediate();
4196 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00004197 case 'I':
4198 Info.setRequiresImmediate(0, 31);
4199 return true;
4200 case 'J':
4201 Info.setRequiresImmediate(0, 63);
4202 return true;
4203 case 'K':
4204 Info.setRequiresImmediate(-128, 127);
4205 return true;
4206 case 'L':
Alexey Bataev91e58602015-07-20 12:08:00 +00004207 Info.setRequiresImmediate({ int(0xff), int(0xffff), int(0xffffffff) });
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00004208 return true;
4209 case 'M':
4210 Info.setRequiresImmediate(0, 3);
4211 return true;
4212 case 'N':
4213 Info.setRequiresImmediate(0, 255);
4214 return true;
4215 case 'O':
4216 Info.setRequiresImmediate(0, 127);
4217 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00004218 // Register constraints.
4219 case 'Y': // 'Y' is the first character for several 2-character constraints.
4220 // Shift the pointer to the second character of the constraint.
4221 Name++;
4222 switch (*Name) {
4223 default:
4224 return false;
4225 case '0': // First SSE register.
4226 case 't': // Any SSE register, when SSE2 is enabled.
4227 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
4228 case 'm': // Any MMX register, when inter-unit moves enabled.
Michael Zuckerman849a6a52016-10-31 17:23:52 +00004229 case 'k': // AVX512 arch mask registers: k1-k7.
Alexey Bataev91e58602015-07-20 12:08:00 +00004230 Info.setAllowsRegister();
4231 return true;
4232 }
4233 case 'f': // Any x87 floating point stack register.
Akira Hatanaka88ef7282014-07-18 23:30:30 +00004234 // Constraint 'f' cannot be used for output operands.
4235 if (Info.ConstraintStr[0] == '=')
4236 return false;
Akira Hatanaka88ef7282014-07-18 23:30:30 +00004237 Info.setAllowsRegister();
4238 return true;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004239 case 'a': // eax.
4240 case 'b': // ebx.
4241 case 'c': // ecx.
4242 case 'd': // edx.
4243 case 'S': // esi.
4244 case 'D': // edi.
4245 case 'A': // edx:eax.
Alexey Bataev91e58602015-07-20 12:08:00 +00004246 case 't': // Top of floating point stack.
4247 case 'u': // Second from top of floating point stack.
Eli Friedman3fd920a2008-08-20 02:34:37 +00004248 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00004249 case 'y': // Any MMX register.
Michael Zuckerman62f516f2016-11-01 13:16:44 +00004250 case 'v': // Any {X,Y,Z}MM register (Arch & context dependent)
Anders Carlsson5f7ee682008-10-06 19:17:39 +00004251 case 'x': // Any SSE register.
Michael Zuckerman849a6a52016-10-31 17:23:52 +00004252 case 'k': // Any AVX512 mask register (same as Yk, additionaly allows k0
4253 // for intermideate k reg operations).
Eli Friedman3fd920a2008-08-20 02:34:37 +00004254 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00004255 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
4256 case 'l': // "Index" registers: any general register that can be used as an
4257 // index in a base+index memory access.
4258 Info.setAllowsRegister();
4259 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00004260 // Floating point constant constraints.
Dale Johannesen46742a42010-08-24 22:33:12 +00004261 case 'C': // SSE floating point constant.
4262 case 'G': // x87 floating point constant.
Eli Friedman3fd920a2008-08-20 02:34:37 +00004263 return true;
4264 }
4265}
4266
Akira Hatanaka974131e2014-09-18 18:17:18 +00004267bool X86TargetInfo::validateOutputSize(StringRef Constraint,
4268 unsigned Size) const {
4269 // Strip off constraint modifiers.
4270 while (Constraint[0] == '=' ||
4271 Constraint[0] == '+' ||
4272 Constraint[0] == '&')
4273 Constraint = Constraint.substr(1);
4274
4275 return validateOperandSize(Constraint, Size);
4276}
4277
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004278bool X86TargetInfo::validateInputSize(StringRef Constraint,
4279 unsigned Size) const {
Akira Hatanaka974131e2014-09-18 18:17:18 +00004280 return validateOperandSize(Constraint, Size);
4281}
4282
4283bool X86TargetInfo::validateOperandSize(StringRef Constraint,
4284 unsigned Size) const {
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004285 switch (Constraint[0]) {
4286 default: break;
Michael Zuckerman849a6a52016-10-31 17:23:52 +00004287 case 'k':
4288 // Registers k0-k7 (AVX512) size limit is 64 bit.
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004289 case 'y':
4290 return Size <= 64;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004291 case 'f':
4292 case 't':
4293 case 'u':
4294 return Size <= 128;
Michael Zuckerman62f516f2016-11-01 13:16:44 +00004295 case 'v':
Hans Wennborg3c619a42014-09-18 20:24:04 +00004296 case 'x':
Alexey Bataev91e58602015-07-20 12:08:00 +00004297 if (SSELevel >= AVX512F)
4298 // 512-bit zmm registers can be used if target supports AVX512F.
4299 return Size <= 512U;
4300 else if (SSELevel >= AVX)
4301 // 256-bit ymm registers can be used if target supports AVX.
4302 return Size <= 256U;
4303 return Size <= 128U;
4304 case 'Y':
4305 // 'Y' is the first character for several 2-character constraints.
4306 switch (Constraint[1]) {
4307 default: break;
4308 case 'm':
4309 // 'Ym' is synonymous with 'y'.
Michael Zuckerman849a6a52016-10-31 17:23:52 +00004310 case 'k':
Alexey Bataev91e58602015-07-20 12:08:00 +00004311 return Size <= 64;
4312 case 'i':
4313 case 't':
4314 // 'Yi' and 'Yt' are synonymous with 'x' when SSE2 is enabled.
4315 if (SSELevel >= AVX512F)
4316 return Size <= 512U;
4317 else if (SSELevel >= AVX)
4318 return Size <= 256U;
4319 return SSELevel >= SSE2 && Size <= 128U;
4320 }
4321
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004322 }
4323
4324 return true;
4325}
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00004326
Eli Friedman3fd920a2008-08-20 02:34:37 +00004327std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004328X86TargetInfo::convertConstraint(const char *&Constraint) const {
4329 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004330 case 'a': return std::string("{ax}");
4331 case 'b': return std::string("{bx}");
4332 case 'c': return std::string("{cx}");
4333 case 'd': return std::string("{dx}");
4334 case 'S': return std::string("{si}");
4335 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00004336 case 'p': // address
4337 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00004338 case 't': // top of floating point stack.
4339 return std::string("{st}");
4340 case 'u': // second from top of floating point stack.
4341 return std::string("{st(1)}"); // second from top of floating point stack.
Michael Zuckerman849a6a52016-10-31 17:23:52 +00004342 case 'Y':
4343 switch (Constraint[1]) {
4344 default:
4345 // Break from inner switch and fall through (copy single char),
4346 // continue parsing after copying the current constraint into
4347 // the return string.
4348 break;
4349 case 'k':
4350 // "^" hints llvm that this is a 2 letter constraint.
4351 // "Constraint++" is used to promote the string iterator
4352 // to the next constraint.
4353 return std::string("^") + std::string(Constraint++, 2);
4354 }
4355 LLVM_FALLTHROUGH;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004356 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004357 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00004358 }
4359}
Chris Lattner5ba61f02006-10-14 07:39:34 +00004360
Eli Friedman3fd920a2008-08-20 02:34:37 +00004361// X86-32 generic target
4362class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00004363public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004364 X86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4365 : X86TargetInfo(Triple, Opts) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004366 DoubleAlign = LongLongAlign = 32;
4367 LongDoubleWidth = 96;
4368 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00004369 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00004370 resetDataLayout("e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128");
Eli Friedman32ca82a2009-03-29 20:31:09 +00004371 SizeType = UnsignedInt;
4372 PtrDiffType = SignedInt;
4373 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00004374 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00004375
4376 // Use fpret for all types.
4377 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
4378 (1 << TargetInfo::Double) |
4379 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004380
4381 // x86-32 has atomics up to 8 bytes
4382 // FIXME: Check that we actually have cmpxchg8b before setting
4383 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
4384 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004385 }
Craig Topper3164f332014-03-11 03:39:26 +00004386 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004387 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004388 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004389
Craig Topper3164f332014-03-11 03:39:26 +00004390 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00004391 if (RegNo == 0) return 0;
4392 if (RegNo == 1) return 2;
4393 return -1;
4394 }
Akira Hatanaka974131e2014-09-18 18:17:18 +00004395 bool validateOperandSize(StringRef Constraint,
4396 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00004397 switch (Constraint[0]) {
4398 default: break;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004399 case 'R':
4400 case 'q':
4401 case 'Q':
Bill Wendling887b4852012-11-12 06:42:51 +00004402 case 'a':
4403 case 'b':
4404 case 'c':
4405 case 'd':
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004406 case 'S':
4407 case 'D':
Bill Wendling3c7fed82012-11-12 18:52:32 +00004408 return Size <= 32;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004409 case 'A':
4410 return Size <= 64;
Bill Wendling887b4852012-11-12 06:42:51 +00004411 }
4412
Akira Hatanaka974131e2014-09-18 18:17:18 +00004413 return X86TargetInfo::validateOperandSize(Constraint, Size);
Bill Wendling887b4852012-11-12 06:42:51 +00004414 }
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00004415 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
4416 return llvm::makeArrayRef(BuiltinInfoX86, clang::X86::LastX86CommonBuiltin -
4417 Builtin::FirstTSBuiltin + 1);
4418 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004419};
Eli Friedman3fd920a2008-08-20 02:34:37 +00004420
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004421class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
4422public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004423 NetBSDI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4424 : NetBSDTargetInfo<X86_32TargetInfo>(Triple, Opts) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004425
Craig Topper3164f332014-03-11 03:39:26 +00004426 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00004427 unsigned Major, Minor, Micro;
4428 getTriple().getOSVersion(Major, Minor, Micro);
4429 // New NetBSD uses the default rounding mode.
4430 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
4431 return X86_32TargetInfo::getFloatEvalMethod();
4432 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004433 return 1;
4434 }
4435};
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004436
Eli Friedmane3aa4542009-07-05 18:47:56 +00004437class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
4438public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004439 OpenBSDI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4440 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00004441 SizeType = UnsignedLong;
4442 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004443 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00004444 }
4445};
Eli Friedmane3aa4542009-07-05 18:47:56 +00004446
Eli Friedman9fa28852012-08-08 23:57:20 +00004447class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
4448public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004449 BitrigI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4450 : BitrigTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman9fa28852012-08-08 23:57:20 +00004451 SizeType = UnsignedLong;
4452 IntPtrType = SignedLong;
4453 PtrDiffType = SignedLong;
4454 }
4455};
Eli Friedman9fa28852012-08-08 23:57:20 +00004456
Torok Edwinb2b37c62009-06-30 17:10:35 +00004457class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004458public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004459 DarwinI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4460 : DarwinTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004461 LongDoubleWidth = 128;
4462 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004463 SuitableAlign = 128;
Tim Northover5627d392015-10-30 16:30:45 +00004464 MaxVectorAlign = 256;
4465 // The watchOS simulator uses the builtin bool type for Objective-C.
4466 llvm::Triple T = llvm::Triple(Triple);
4467 if (T.isWatchOS())
4468 UseSignedCharForObjCBool = false;
Eli Friedman32ca82a2009-03-29 20:31:09 +00004469 SizeType = UnsignedLong;
4470 IntPtrType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00004471 resetDataLayout("e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128");
Daniel Dunbarbd606522010-05-27 00:35:16 +00004472 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00004473 }
4474
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004475 bool handleTargetFeatures(std::vector<std::string> &Features,
4476 DiagnosticsEngine &Diags) override {
4477 if (!DarwinTargetInfo<X86_32TargetInfo>::handleTargetFeatures(Features,
4478 Diags))
4479 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004480 // We now know the features we have: we can decide how to align vectors.
4481 MaxVectorAlign =
4482 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004483 return true;
4484 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004485};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004486
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004487// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004488class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004489public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004490 WindowsX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4491 : WindowsTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Chris Lattner46be2e12009-06-24 17:12:15 +00004492 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00004493 DoubleAlign = LongLongAlign = 64;
Reid Kleckner7510c092015-04-01 16:45:06 +00004494 bool IsWinCOFF =
4495 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
James Y Knightb214cbc2016-03-04 19:00:41 +00004496 resetDataLayout(IsWinCOFF
4497 ? "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
4498 : "e-m:e-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32");
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004499 }
Craig Topper3164f332014-03-11 03:39:26 +00004500 void getTargetDefines(const LangOptions &Opts,
4501 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004502 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
4503 }
4504};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004505
4506// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004507class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004508public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004509 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple,
4510 const TargetOptions &Opts)
4511 : WindowsX86_32TargetInfo(Triple, Opts) {
Eli Friedman015d6282011-03-22 21:25:11 +00004512 LongDoubleWidth = LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00004513 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004514 }
Craig Topper3164f332014-03-11 03:39:26 +00004515 void getTargetDefines(const LangOptions &Opts,
4516 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004517 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
4518 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
4519 // The value of the following reflects processor type.
4520 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
4521 // We lost the original triple, so we use the default.
4522 Builder.defineMacro("_M_IX86", "600");
4523 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004524};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004525
David Majnemerae1ed0e2015-05-28 04:36:18 +00004526static void addCygMingDefines(const LangOptions &Opts, MacroBuilder &Builder) {
Eric Christopherb093d692015-10-09 18:39:59 +00004527 // Mingw and cygwin define __declspec(a) to __attribute__((a)). Clang
4528 // supports __declspec natively under -fms-extensions, but we define a no-op
4529 // __declspec macro anyway for pre-processor compatibility.
Reid Kleckner47606832014-04-21 20:58:00 +00004530 if (Opts.MicrosoftExt)
4531 Builder.defineMacro("__declspec", "__declspec");
4532 else
4533 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
4534
4535 if (!Opts.MicrosoftExt) {
4536 // Provide macros for all the calling convention keywords. Provide both
4537 // single and double underscore prefixed variants. These are available on
4538 // x64 as well as x86, even though they have no effect.
4539 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
4540 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00004541 std::string GCCSpelling = "__attribute__((__";
4542 GCCSpelling += CC;
4543 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00004544 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
4545 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
4546 }
4547 }
4548}
4549
David Majnemerae1ed0e2015-05-28 04:36:18 +00004550static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
4551 Builder.defineMacro("__MSVCRT__");
4552 Builder.defineMacro("__MINGW32__");
4553 addCygMingDefines(Opts, Builder);
4554}
4555
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004556// x86-32 MinGW target
4557class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
4558public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004559 MinGWX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4560 : WindowsX86_32TargetInfo(Triple, Opts) {}
Craig Topper3164f332014-03-11 03:39:26 +00004561 void getTargetDefines(const LangOptions &Opts,
4562 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004563 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004564 DefineStd(Builder, "WIN32", Opts);
4565 DefineStd(Builder, "WINNT", Opts);
4566 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00004567 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004568 }
4569};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004570
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004571// x86-32 Cygwin target
4572class CygwinX86_32TargetInfo : public X86_32TargetInfo {
4573public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004574 CygwinX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4575 : X86_32TargetInfo(Triple, Opts) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004576 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004577 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00004578 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 +00004579 }
Craig Topper3164f332014-03-11 03:39:26 +00004580 void getTargetDefines(const LangOptions &Opts,
4581 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004582 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00004583 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004584 Builder.defineMacro("__CYGWIN__");
4585 Builder.defineMacro("__CYGWIN32__");
David Majnemerae1ed0e2015-05-28 04:36:18 +00004586 addCygMingDefines(Opts, Builder);
Saleem Abdulrasool56027092017-02-07 19:00:06 +00004587 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00004588 if (Opts.CPlusPlus)
4589 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00004590 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004591};
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004592
Chris Lattnerb986aba2010-04-11 19:29:39 +00004593// x86-32 Haiku target
Reid Kleckner330fb172016-05-11 16:19:05 +00004594class HaikuX86_32TargetInfo : public HaikuTargetInfo<X86_32TargetInfo> {
Chris Lattnerb986aba2010-04-11 19:29:39 +00004595public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004596 HaikuX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Reid Kleckner330fb172016-05-11 16:19:05 +00004597 : HaikuTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman04831922010-08-22 01:00:03 +00004598 }
Craig Topper3164f332014-03-11 03:39:26 +00004599 void getTargetDefines(const LangOptions &Opts,
4600 MacroBuilder &Builder) const override {
Reid Kleckner330fb172016-05-11 16:19:05 +00004601 HaikuTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
Chris Lattnerb986aba2010-04-11 19:29:39 +00004602 Builder.defineMacro("__INTEL__");
Chris Lattnerb986aba2010-04-11 19:29:39 +00004603 }
4604};
Chris Lattnerb986aba2010-04-11 19:29:39 +00004605
Alexey Bataevc99b0492015-11-25 09:24:26 +00004606// X86-32 MCU target
4607class MCUX86_32TargetInfo : public X86_32TargetInfo {
4608public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004609 MCUX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4610 : X86_32TargetInfo(Triple, Opts) {
Alexey Bataevc99b0492015-11-25 09:24:26 +00004611 LongDoubleWidth = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00004612 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
James Y Knightb214cbc2016-03-04 19:00:41 +00004613 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 +00004614 WIntType = UnsignedInt;
Alexey Bataevc99b0492015-11-25 09:24:26 +00004615 }
4616
4617 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
4618 // On MCU we support only C calling convention.
4619 return CC == CC_C ? CCCR_OK : CCCR_Warning;
4620 }
4621
4622 void getTargetDefines(const LangOptions &Opts,
4623 MacroBuilder &Builder) const override {
4624 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4625 Builder.defineMacro("__iamcu");
4626 Builder.defineMacro("__iamcu__");
4627 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00004628
4629 bool allowsLargerPreferedTypeAlignment() const override {
4630 return false;
4631 }
Alexey Bataevc99b0492015-11-25 09:24:26 +00004632};
4633
Douglas Gregor9fabd852011-07-01 22:41:14 +00004634// RTEMS Target
4635template<typename Target>
4636class RTEMSTargetInfo : public OSTargetInfo<Target> {
4637protected:
Craig Topper3164f332014-03-11 03:39:26 +00004638 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4639 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004640 // RTEMS defines; list based off of gcc output
4641
Douglas Gregor9fabd852011-07-01 22:41:14 +00004642 Builder.defineMacro("__rtems__");
4643 Builder.defineMacro("__ELF__");
4644 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004645
Douglas Gregor9fabd852011-07-01 22:41:14 +00004646public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004647 RTEMSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4648 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004649 switch (Triple.getArch()) {
4650 default:
4651 case llvm::Triple::x86:
4652 // this->MCountName = ".mcount";
4653 break;
4654 case llvm::Triple::mips:
4655 case llvm::Triple::mipsel:
4656 case llvm::Triple::ppc:
4657 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00004658 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004659 // this->MCountName = "_mcount";
4660 break;
4661 case llvm::Triple::arm:
4662 // this->MCountName = "__mcount";
4663 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004664 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004665 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00004666};
4667
Douglas Gregor9fabd852011-07-01 22:41:14 +00004668// x86-32 RTEMS target
4669class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
4670public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004671 RTEMSX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4672 : X86_32TargetInfo(Triple, Opts) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004673 SizeType = UnsignedLong;
4674 IntPtrType = SignedLong;
4675 PtrDiffType = SignedLong;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004676 }
Craig Topper3164f332014-03-11 03:39:26 +00004677 void getTargetDefines(const LangOptions &Opts,
4678 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004679 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4680 Builder.defineMacro("__INTEL__");
4681 Builder.defineMacro("__rtems__");
4682 }
4683};
Douglas Gregor9fabd852011-07-01 22:41:14 +00004684
Eli Friedman3fd920a2008-08-20 02:34:37 +00004685// x86-64 generic target
4686class X86_64TargetInfo : public X86TargetInfo {
4687public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004688 X86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4689 : X86TargetInfo(Triple, Opts) {
David Blaikie40f842d2014-07-10 18:46:15 +00004690 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
David Majnemer8fa8c382015-03-17 23:55:00 +00004691 bool IsWinCOFF =
4692 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Zinovy Nis1db95732014-07-10 15:27:19 +00004693 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00004694 LongDoubleWidth = 128;
4695 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00004696 LargeArrayMinWidth = 128;
4697 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004698 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00004699 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
4700 PtrDiffType = IsX32 ? SignedInt : SignedLong;
4701 IntPtrType = IsX32 ? SignedInt : SignedLong;
4702 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00004703 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00004704 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00004705
Eric Christopher917e9522014-11-18 22:36:15 +00004706 // Pointers are 32-bit in x32.
Eric Christopherf6ee1f32017-02-10 04:35:21 +00004707 resetDataLayout(IsX32
4708 ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128"
4709 : IsWinCOFF ? "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
4710 : "e-m:e-i64:64-f80:128-n8:16:32:64-S128");
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00004711
4712 // Use fpret only for long double.
4713 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004714
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00004715 // Use fp2ret for _Complex long double.
4716 ComplexLongDoubleUsesFP2Ret = true;
4717
Charles Davisc7d5c942015-09-17 20:55:33 +00004718 // Make __builtin_ms_va_list available.
4719 HasBuiltinMSVaList = true;
4720
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004721 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004722 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00004723 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00004724 }
Craig Topper3164f332014-03-11 03:39:26 +00004725 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004726 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00004727 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004728
Craig Topper3164f332014-03-11 03:39:26 +00004729 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00004730 if (RegNo == 0) return 0;
4731 if (RegNo == 1) return 1;
4732 return -1;
4733 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004734
Craig Topper3164f332014-03-11 03:39:26 +00004735 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00004736 switch (CC) {
4737 case CC_C:
4738 case CC_Swift:
4739 case CC_X86VectorCall:
4740 case CC_IntelOclBicc:
4741 case CC_X86_64Win64:
Roman Levenstein35aa5ce2016-03-16 18:00:46 +00004742 case CC_PreserveMost:
4743 case CC_PreserveAll:
Erich Keane757d3172016-11-02 18:29:35 +00004744 case CC_X86RegCall:
John McCall477f2bb2016-03-03 06:39:32 +00004745 return CCCR_OK;
4746 default:
4747 return CCCR_Warning;
4748 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004749 }
4750
Craig Topper3164f332014-03-11 03:39:26 +00004751 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00004752 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004753 }
4754
Pavel Chupinfd223e12014-08-04 12:39:43 +00004755 // for x32 we need it here explicitly
4756 bool hasInt128Type() const override { return true; }
Reid Klecknerf27e7522016-02-01 18:58:24 +00004757 unsigned getUnwindWordWidth() const override { return 64; }
4758 unsigned getRegisterWidth() const override { return 64; }
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00004759
4760 bool validateGlobalRegisterVariable(StringRef RegName,
4761 unsigned RegSize,
4762 bool &HasSizeMismatch) const override {
4763 // rsp and rbp are the only 64-bit registers the x86 backend can currently
4764 // handle.
4765 if (RegName.equals("rsp") || RegName.equals("rbp")) {
4766 // Check that the register size is 64-bit.
4767 HasSizeMismatch = RegSize != 64;
4768 return true;
4769 }
4770
4771 // Check if the register is a 32-bit register the backend can handle.
4772 return X86TargetInfo::validateGlobalRegisterVariable(RegName, RegSize,
4773 HasSizeMismatch);
4774 }
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00004775 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
4776 return llvm::makeArrayRef(BuiltinInfoX86,
4777 X86::LastTSBuiltin - Builtin::FirstTSBuiltin);
4778 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004779};
Eli Friedman3fd920a2008-08-20 02:34:37 +00004780
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004781// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004782class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004783public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004784 WindowsX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4785 : WindowsTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004786 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00004787 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004788 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004789 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004790 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00004791 SizeType = UnsignedLongLong;
4792 PtrDiffType = SignedLongLong;
4793 IntPtrType = SignedLongLong;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004794 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004795
Craig Topper3164f332014-03-11 03:39:26 +00004796 void getTargetDefines(const LangOptions &Opts,
4797 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004798 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004799 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004800 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004801
Craig Topper3164f332014-03-11 03:39:26 +00004802 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004803 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00004804 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004805
Craig Topper3164f332014-03-11 03:39:26 +00004806 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004807 switch (CC) {
4808 case CC_X86StdCall:
4809 case CC_X86ThisCall:
4810 case CC_X86FastCall:
4811 return CCCR_Ignore;
4812 case CC_C:
4813 case CC_X86VectorCall:
4814 case CC_IntelOclBicc:
4815 case CC_X86_64SysV:
Arnold Schwaighofer4fc955e2016-10-12 18:59:24 +00004816 case CC_Swift:
Erich Keane757d3172016-11-02 18:29:35 +00004817 case CC_X86RegCall:
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004818 return CCCR_OK;
4819 default:
4820 return CCCR_Warning;
4821 }
Charles Davisb5a214e2013-08-30 04:39:01 +00004822 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004823};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004824
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004825// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004826class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004827public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004828 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple,
4829 const TargetOptions &Opts)
4830 : WindowsX86_64TargetInfo(Triple, Opts) {
Eli Friedman015d6282011-03-22 21:25:11 +00004831 LongDoubleWidth = LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00004832 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004833 }
Craig Topper3164f332014-03-11 03:39:26 +00004834 void getTargetDefines(const LangOptions &Opts,
4835 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004836 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
4837 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
David Majnemerb856e8f2015-07-26 23:17:29 +00004838 Builder.defineMacro("_M_X64", "100");
4839 Builder.defineMacro("_M_AMD64", "100");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004840 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004841};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004842
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004843// x86-64 MinGW target
4844class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
4845public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004846 MinGWX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4847 : WindowsX86_64TargetInfo(Triple, Opts) {
Reid Kleckner11a17192015-10-28 22:29:52 +00004848 // Mingw64 rounds long double size and alignment up to 16 bytes, but sticks
4849 // with x86 FP ops. Weird.
4850 LongDoubleWidth = LongDoubleAlign = 128;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00004851 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended();
Reid Kleckner11a17192015-10-28 22:29:52 +00004852 }
4853
Craig Topper3164f332014-03-11 03:39:26 +00004854 void getTargetDefines(const LangOptions &Opts,
4855 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004856 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004857 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004858 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00004859 addMinGWDefines(Opts, Builder);
Reid Klecknere070b992014-11-14 02:01:10 +00004860
4861 // GCC defines this macro when it is using __gxx_personality_seh0.
4862 if (!Opts.SjLjExceptions)
4863 Builder.defineMacro("__SEH__");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004864 }
4865};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004866
Yaron Kerend030d112015-07-22 17:38:19 +00004867// x86-64 Cygwin target
4868class CygwinX86_64TargetInfo : public X86_64TargetInfo {
4869public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004870 CygwinX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4871 : X86_64TargetInfo(Triple, Opts) {
Yaron Kerend030d112015-07-22 17:38:19 +00004872 TLSSupported = false;
4873 WCharType = UnsignedShort;
4874 }
4875 void getTargetDefines(const LangOptions &Opts,
4876 MacroBuilder &Builder) const override {
4877 X86_64TargetInfo::getTargetDefines(Opts, Builder);
4878 Builder.defineMacro("__x86_64__");
4879 Builder.defineMacro("__CYGWIN__");
4880 Builder.defineMacro("__CYGWIN64__");
4881 addCygMingDefines(Opts, Builder);
Saleem Abdulrasool56027092017-02-07 19:00:06 +00004882 DefineStd(Builder, "unix", Opts);
Yaron Kerend030d112015-07-22 17:38:19 +00004883 if (Opts.CPlusPlus)
4884 Builder.defineMacro("_GNU_SOURCE");
4885
4886 // GCC defines this macro when it is using __gxx_personality_seh0.
4887 if (!Opts.SjLjExceptions)
4888 Builder.defineMacro("__SEH__");
4889 }
4890};
4891
Eli Friedman2857ccb2009-07-01 03:36:11 +00004892class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
4893public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004894 DarwinX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4895 : DarwinTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00004896 Int64Type = SignedLongLong;
Tim Northovera2ee4332014-03-29 15:09:45 +00004897 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
4898 llvm::Triple T = llvm::Triple(Triple);
Bob Wilson946c04c2014-10-19 02:19:27 +00004899 if (T.isiOS())
Tim Northovera2ee4332014-03-29 15:09:45 +00004900 UseSignedCharForObjCBool = false;
James Y Knightb214cbc2016-03-04 19:00:41 +00004901 resetDataLayout("e-m:o-i64:64-f80:128-n8:16:32:64-S128");
Eli Friedman2857ccb2009-07-01 03:36:11 +00004902 }
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004903
4904 bool handleTargetFeatures(std::vector<std::string> &Features,
4905 DiagnosticsEngine &Diags) override {
4906 if (!DarwinTargetInfo<X86_64TargetInfo>::handleTargetFeatures(Features,
4907 Diags))
4908 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004909 // We now know the features we have: we can decide how to align vectors.
4910 MaxVectorAlign =
4911 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004912 return true;
4913 }
Eli Friedman2857ccb2009-07-01 03:36:11 +00004914};
Eli Friedman2857ccb2009-07-01 03:36:11 +00004915
Eli Friedman245f2292009-07-05 22:31:18 +00004916class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
4917public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004918 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4919 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Eli Friedman245f2292009-07-05 22:31:18 +00004920 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004921 Int64Type = SignedLongLong;
4922 }
4923};
Eli Friedman245f2292009-07-05 22:31:18 +00004924
Eli Friedman9fa28852012-08-08 23:57:20 +00004925class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
4926public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004927 BitrigX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4928 : BitrigTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004929 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004930 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00004931 }
4932};
Tim Northover9bb857a2013-01-31 12:13:10 +00004933
Eli Friedmanf05b7722008-08-20 07:44:10 +00004934class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004935 // Possible FPU choices.
4936 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004937 VFP2FPU = (1 << 0),
4938 VFP3FPU = (1 << 1),
4939 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00004940 NeonFPU = (1 << 3),
4941 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004942 };
4943
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004944 // Possible HWDiv features.
4945 enum HWDivMode {
4946 HWDivThumb = (1 << 0),
4947 HWDivARM = (1 << 1)
4948 };
4949
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004950 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004951 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004952 }
4953
4954 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4955 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004956
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004957 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004958
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004959 StringRef CPUProfile;
4960 StringRef CPUAttr;
4961
Rafael Espindolaeb265472013-08-21 21:59:03 +00004962 enum {
4963 FP_Default,
4964 FP_VFP,
4965 FP_Neon
4966 } FPMath;
4967
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004968 unsigned ArchISA;
Renato Goline84b0002015-10-08 16:43:26 +00004969 unsigned ArchKind = llvm::ARM::AK_ARMV4T;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004970 unsigned ArchProfile;
4971 unsigned ArchVersion;
4972
Bernard Ogdenda13af32013-10-24 18:32:51 +00004973 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004974
Logan Chien57086ce2012-10-10 06:56:20 +00004975 unsigned IsAAPCS : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004976 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004977
4978 // Initialized via features.
4979 unsigned SoftFloat : 1;
4980 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004981
Bernard Ogden18b57012013-10-29 09:47:51 +00004982 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00004983 unsigned Crypto : 1;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004984 unsigned DSP : 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004985 unsigned Unaligned : 1;
4986
4987 enum {
4988 LDREX_B = (1 << 0), /// byte (8-bit)
4989 LDREX_H = (1 << 1), /// half (16-bit)
4990 LDREX_W = (1 << 2), /// word (32-bit)
4991 LDREX_D = (1 << 3), /// double (64-bit)
4992 };
4993
4994 uint32_t LDREX;
Bernard Ogden18b57012013-10-29 09:47:51 +00004995
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004996 // ACLE 6.5.1 Hardware floating point
4997 enum {
4998 HW_FP_HP = (1 << 1), /// half (16-bit)
4999 HW_FP_SP = (1 << 2), /// single (32-bit)
5000 HW_FP_DP = (1 << 3), /// double (64-bit)
5001 };
5002 uint32_t HW_FP;
5003
Chris Lattner5cc15e02010-03-03 19:03:45 +00005004 static const Builtin::Info BuiltinInfo[];
5005
Rafael Espindolad6c2b722013-12-18 19:47:32 +00005006 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00005007 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00005008
5009 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00005010 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00005011
Renato Golin0201a9e2016-09-22 19:28:20 +00005012 // size_t is unsigned long on MachO-derived environments, NetBSD,
5013 // OpenBSD and Bitrig.
Renato Golin9ba39232015-02-27 16:35:48 +00005014 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD ||
Renato Golin0201a9e2016-09-22 19:28:20 +00005015 T.getOS() == llvm::Triple::OpenBSD ||
Renato Golin9ba39232015-02-27 16:35:48 +00005016 T.getOS() == llvm::Triple::Bitrig)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00005017 SizeType = UnsignedLong;
5018 else
5019 SizeType = UnsignedInt;
5020
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00005021 switch (T.getOS()) {
5022 case llvm::Triple::NetBSD:
Renato Golin0201a9e2016-09-22 19:28:20 +00005023 case llvm::Triple::OpenBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00005024 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00005025 break;
5026 case llvm::Triple::Win32:
5027 WCharType = UnsignedShort;
5028 break;
5029 case llvm::Triple::Linux:
5030 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00005031 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
5032 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00005033 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00005034 }
5035
5036 UseBitFieldTypeAlignment = true;
5037
5038 ZeroLengthBitfieldBoundary = 0;
5039
Tim Northover147cd2f2014-10-14 22:12:21 +00005040 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
5041 // so set preferred for small types to 32.
5042 if (T.isOSBinFormatMachO()) {
James Y Knightb214cbc2016-03-04 19:00:41 +00005043 resetDataLayout(BigEndian
5044 ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
5045 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Tim Northover147cd2f2014-10-14 22:12:21 +00005046 } else if (T.isOSWindows()) {
Tim Northover147cd2f2014-10-14 22:12:21 +00005047 assert(!BigEndian && "Windows on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00005048 resetDataLayout("e"
5049 "-m:w"
5050 "-p:32:32"
5051 "-i64:64"
5052 "-v128:64:128"
5053 "-a:0:32"
5054 "-n32"
5055 "-S64");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00005056 } else if (T.isOSNaCl()) {
5057 assert(!BigEndian && "NaCl on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00005058 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00005059 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00005060 resetDataLayout(BigEndian
5061 ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
5062 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00005063 }
5064
5065 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00005066 }
5067
Tim Northover5627d392015-10-30 16:30:45 +00005068 void setABIAPCS(bool IsAAPCS16) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00005069 const llvm::Triple &T = getTriple();
5070
Rafael Espindolaafa854c2013-12-18 20:24:51 +00005071 IsAAPCS = false;
5072
Tim Northover5627d392015-10-30 16:30:45 +00005073 if (IsAAPCS16)
5074 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
5075 else
5076 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00005077
Rafael Espindolad6c2b722013-12-18 19:47:32 +00005078 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00005079 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00005080 SizeType = UnsignedInt;
5081 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00005082 SizeType = UnsignedLong;
5083
5084 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
5085 WCharType = SignedInt;
5086
5087 // Do not respect the alignment of bit-field types when laying out
5088 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
5089 UseBitFieldTypeAlignment = false;
5090
5091 /// gcc forces the alignment to 4 bytes, regardless of the type of the
5092 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
5093 /// gcc.
5094 ZeroLengthBitfieldBoundary = 32;
5095
Tim Northover5627d392015-10-30 16:30:45 +00005096 if (T.isOSBinFormatMachO() && IsAAPCS16) {
5097 assert(!BigEndian && "AAPCS16 does not support big-endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00005098 resetDataLayout("e-m:o-p:32:32-i64:64-a:0:32-n32-S128");
Tim Northover5627d392015-10-30 16:30:45 +00005099 } else if (T.isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00005100 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00005101 BigEndian
5102 ? "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 +00005103 : "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 +00005104 else
James Y Knightb214cbc2016-03-04 19:00:41 +00005105 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00005106 BigEndian
5107 ? "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 +00005108 : "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 +00005109
5110 // FIXME: Override "preferred align" for double and long long.
5111 }
5112
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005113 void setArchInfo() {
5114 StringRef ArchName = getTriple().getArchName();
5115
Renato Goline84b0002015-10-08 16:43:26 +00005116 ArchISA = llvm::ARM::parseArchISA(ArchName);
5117 CPU = llvm::ARM::getDefaultCPU(ArchName);
5118 unsigned AK = llvm::ARM::parseArch(ArchName);
5119 if (AK != llvm::ARM::AK_INVALID)
5120 ArchKind = AK;
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005121 setArchInfo(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005122 }
5123
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005124 void setArchInfo(unsigned Kind) {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005125 StringRef SubArch;
5126
5127 // cache TargetParser info
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005128 ArchKind = Kind;
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00005129 SubArch = llvm::ARM::getSubArch(ArchKind);
5130 ArchProfile = llvm::ARM::parseArchProfile(SubArch);
5131 ArchVersion = llvm::ARM::parseArchVersion(SubArch);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005132
5133 // cache CPU related strings
5134 CPUAttr = getCPUAttr();
5135 CPUProfile = getCPUProfile();
5136 }
5137
5138 void setAtomic() {
Eric Christopherb093d692015-10-09 18:39:59 +00005139 // when triple does not specify a sub arch,
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005140 // then we are not using inline atomics
Renato Goline84b0002015-10-08 16:43:26 +00005141 bool ShouldUseInlineAtomic =
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005142 (ArchISA == llvm::ARM::IK_ARM && ArchVersion >= 6) ||
5143 (ArchISA == llvm::ARM::IK_THUMB && ArchVersion >= 7);
Eric Christopherb093d692015-10-09 18:39:59 +00005144 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005145 if (ArchProfile == llvm::ARM::PK_M) {
5146 MaxAtomicPromoteWidth = 32;
5147 if (ShouldUseInlineAtomic)
5148 MaxAtomicInlineWidth = 32;
5149 }
5150 else {
5151 MaxAtomicPromoteWidth = 64;
5152 if (ShouldUseInlineAtomic)
5153 MaxAtomicInlineWidth = 64;
Eric Christopherb093d692015-10-09 18:39:59 +00005154 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005155 }
5156
5157 bool isThumb() const {
5158 return (ArchISA == llvm::ARM::IK_THUMB);
5159 }
5160
5161 bool supportsThumb() const {
5162 return CPUAttr.count('T') || ArchVersion >= 6;
5163 }
5164
5165 bool supportsThumb2() const {
Bradley Smithf4affc12016-03-03 13:52:22 +00005166 return CPUAttr.equals("6T2") ||
5167 (ArchVersion >= 7 && !CPUAttr.equals("8M_BASE"));
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005168 }
5169
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005170 StringRef getCPUAttr() const {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005171 // For most sub-arches, the build attribute CPU name is enough.
5172 // For Cortex variants, it's slightly different.
5173 switch(ArchKind) {
5174 default:
Chandler Carruthd96f37a2015-08-30 07:51:18 +00005175 return llvm::ARM::getCPUAttr(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005176 case llvm::ARM::AK_ARMV6M:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005177 return "6M";
Tim Northover525c73c2015-07-21 21:47:33 +00005178 case llvm::ARM::AK_ARMV7S:
5179 return "7S";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005180 case llvm::ARM::AK_ARMV7A:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005181 return "7A";
5182 case llvm::ARM::AK_ARMV7R:
5183 return "7R";
5184 case llvm::ARM::AK_ARMV7M:
5185 return "7M";
5186 case llvm::ARM::AK_ARMV7EM:
5187 return "7EM";
George Burgess IVfc970562017-02-09 23:30:10 +00005188 case llvm::ARM::AK_ARMV7VE:
5189 return "7VE";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005190 case llvm::ARM::AK_ARMV8A:
5191 return "8A";
5192 case llvm::ARM::AK_ARMV8_1A:
5193 return "8_1A";
Oliver Stannard3086c042016-02-11 16:05:52 +00005194 case llvm::ARM::AK_ARMV8_2A:
5195 return "8_2A";
Bradley Smithf4affc12016-03-03 13:52:22 +00005196 case llvm::ARM::AK_ARMV8MBaseline:
5197 return "8M_BASE";
5198 case llvm::ARM::AK_ARMV8MMainline:
5199 return "8M_MAIN";
Javed Absar00b74442016-10-07 12:08:41 +00005200 case llvm::ARM::AK_ARMV8R:
5201 return "8R";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005202 }
5203 }
5204
5205 StringRef getCPUProfile() const {
5206 switch(ArchProfile) {
5207 case llvm::ARM::PK_A:
5208 return "A";
5209 case llvm::ARM::PK_R:
5210 return "R";
5211 case llvm::ARM::PK_M:
5212 return "M";
5213 default:
5214 return "";
5215 }
5216 }
5217
Chris Lattner17df24e2008-04-21 18:56:49 +00005218public:
Matt Arsenaultf333de32016-09-07 07:08:02 +00005219 ARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005220 : TargetInfo(Triple), FPMath(FP_Default), IsAAPCS(true), LDREX(0),
5221 HW_FP(0) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005222
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00005223 switch (getTriple().getOS()) {
5224 case llvm::Triple::NetBSD:
Renato Golin0201a9e2016-09-22 19:28:20 +00005225 case llvm::Triple::OpenBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00005226 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00005227 break;
5228 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00005229 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00005230 break;
5231 }
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00005232
Renato Goline84b0002015-10-08 16:43:26 +00005233 // Cache arch related info.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005234 setArchInfo();
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00005235
Chris Lattner1a8f3942010-04-23 16:29:58 +00005236 // {} in inline assembly are neon specifiers, not assembly variant
5237 // specifiers.
5238 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005239
Eric Christopher0e261882014-12-05 01:06:59 +00005240 // FIXME: This duplicates code from the driver that sets the -target-abi
5241 // option - this code is used if -target-abi isn't passed and should
5242 // be unified in some way.
5243 if (Triple.isOSBinFormatMachO()) {
5244 // The backend is hardwired to assume AAPCS for M-class processors, ensure
5245 // the frontend matches that.
5246 if (Triple.getEnvironment() == llvm::Triple::EABI ||
5247 Triple.getOS() == llvm::Triple::UnknownOS ||
Zijiao Ma56a83722016-08-17 02:13:33 +00005248 ArchProfile == llvm::ARM::PK_M) {
Eric Christopher0e261882014-12-05 01:06:59 +00005249 setABI("aapcs");
Tim Northoverd88ecb32016-01-27 19:32:40 +00005250 } else if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00005251 setABI("aapcs16");
Eric Christopher0e261882014-12-05 01:06:59 +00005252 } else {
5253 setABI("apcs-gnu");
5254 }
5255 } else if (Triple.isOSWindows()) {
5256 // FIXME: this is invalid for WindowsCE
5257 setABI("aapcs");
5258 } else {
5259 // Select the default based on the platform.
5260 switch (Triple.getEnvironment()) {
5261 case llvm::Triple::Android:
5262 case llvm::Triple::GNUEABI:
5263 case llvm::Triple::GNUEABIHF:
Rafael Espindola0fa66802016-06-24 21:35:06 +00005264 case llvm::Triple::MuslEABI:
5265 case llvm::Triple::MuslEABIHF:
Eric Christopher0e261882014-12-05 01:06:59 +00005266 setABI("aapcs-linux");
5267 break;
5268 case llvm::Triple::EABIHF:
5269 case llvm::Triple::EABI:
5270 setABI("aapcs");
5271 break;
Eric Christopher560cc4f2014-12-18 02:08:55 +00005272 case llvm::Triple::GNU:
Renato Goline84b0002015-10-08 16:43:26 +00005273 setABI("apcs-gnu");
5274 break;
Eric Christopher0e261882014-12-05 01:06:59 +00005275 default:
5276 if (Triple.getOS() == llvm::Triple::NetBSD)
5277 setABI("apcs-gnu");
Brad Smith3d648b32017-02-28 03:20:26 +00005278 else if (Triple.getOS() == llvm::Triple::OpenBSD)
5279 setABI("aapcs-linux");
Eric Christopher0e261882014-12-05 01:06:59 +00005280 else
5281 setABI("aapcs");
5282 break;
5283 }
5284 }
John McCall86353412010-08-21 22:46:04 +00005285
5286 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00005287 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005288
Renato Golin15b86152015-07-03 16:41:13 +00005289 // ARM has atomics up to 8 bytes
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005290 setAtomic();
Rafael Espindola5ab8e2e2015-07-02 15:14:10 +00005291
James Molloya7139222012-03-12 09:14:10 +00005292 // Do force alignment of members that follow zero length bitfields. If
Eric Christopher917e9522014-11-18 22:36:15 +00005293 // the alignment of the zero-length bitfield is greater than the member
5294 // that follows it, `bar', `bar' will be aligned as the type of the
James Molloya7139222012-03-12 09:14:10 +00005295 // zero length bitfield.
5296 UseZeroLengthBitfieldAlignment = true;
Saleem Abdulrasool9b5ba542016-04-10 03:19:47 +00005297
5298 if (Triple.getOS() == llvm::Triple::Linux ||
5299 Triple.getOS() == llvm::Triple::UnknownOS)
5300 this->MCountName =
5301 Opts.EABIVersion == "gnu" ? "\01__gnu_mcount_nc" : "\01mcount";
Eli Friedmanb5366062008-05-20 14:21:01 +00005302 }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00005303
Alp Toker4925ba72014-06-07 23:30:42 +00005304 StringRef getABI() const override { return ABI; }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00005305
Craig Topper3164f332014-03-11 03:39:26 +00005306 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00005307 ABI = Name;
5308
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00005309 // The defaults (above) are for AAPCS, check if we need to change them.
5310 //
5311 // FIXME: We need support for -meabi... we could just mangle it into the
5312 // name.
Tim Northover756447a2015-10-30 16:30:36 +00005313 if (Name == "apcs-gnu" || Name == "aapcs16") {
Tim Northover5627d392015-10-30 16:30:45 +00005314 setABIAPCS(Name == "aapcs16");
Rafael Espindolad6c2b722013-12-18 19:47:32 +00005315 return true;
5316 }
5317 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
5318 setABIAAPCS();
5319 return true;
5320 }
5321 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00005322 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00005323
Renato Golinf5c4dec2015-05-27 13:33:00 +00005324 // FIXME: This should be based on Arch attributes, not CPU names.
Eric Christopher8c47b422015-10-09 18:39:55 +00005325 bool
5326 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
5327 StringRef CPU,
5328 const std::vector<std::string> &FeaturesVec) const override {
5329
Mehdi Aminia0016ec2016-10-07 08:37:29 +00005330 std::vector<StringRef> TargetFeatures;
Bradley Smithb3501962015-11-16 11:16:36 +00005331 unsigned Arch = llvm::ARM::parseArch(getTriple().getArchName());
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005332
5333 // get default FPU features
Bradley Smithb3501962015-11-16 11:16:36 +00005334 unsigned FPUKind = llvm::ARM::getDefaultFPU(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005335 llvm::ARM::getFPUFeatures(FPUKind, TargetFeatures);
5336
5337 // get default Extension features
Bradley Smithb3501962015-11-16 11:16:36 +00005338 unsigned Extensions = llvm::ARM::getDefaultExtensions(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005339 llvm::ARM::getExtensionFeatures(Extensions, TargetFeatures);
5340
Mehdi Aminia0016ec2016-10-07 08:37:29 +00005341 for (auto Feature : TargetFeatures)
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005342 if (Feature[0] == '+')
Mehdi Aminia0016ec2016-10-07 08:37:29 +00005343 Features[Feature.drop_front(1)] = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005344
Eric Christopher007b0a02015-08-28 22:32:01 +00005345 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005346 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005347
Craig Topper3164f332014-03-11 03:39:26 +00005348 bool handleTargetFeatures(std::vector<std::string> &Features,
5349 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005350 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00005351 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00005352 Crypto = 0;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005353 DSP = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005354 Unaligned = 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005355 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005356 HWDiv = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005357
Ranjeet Singhac08e532015-06-24 23:39:25 +00005358 // This does not diagnose illegal cases like having both
5359 // "+vfpv2" and "+vfpv3" or having "+neon" and "+fp-only-sp".
5360 uint32_t HW_FP_remove = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005361 for (const auto &Feature : Features) {
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005362 if (Feature == "+soft-float") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00005363 SoftFloat = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005364 } else if (Feature == "+soft-float-abi") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00005365 SoftFloatABI = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005366 } else if (Feature == "+vfp2") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005367 FPU |= VFP2FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005368 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005369 } else if (Feature == "+vfp3") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005370 FPU |= VFP3FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005371 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005372 } else if (Feature == "+vfp4") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005373 FPU |= VFP4FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005374 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005375 } else if (Feature == "+fp-armv8") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00005376 FPU |= FPARMV8;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005377 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005378 } else if (Feature == "+neon") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005379 FPU |= NeonFPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005380 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005381 } else if (Feature == "+hwdiv") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005382 HWDiv |= HWDivThumb;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005383 } else if (Feature == "+hwdiv-arm") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005384 HWDiv |= HWDivARM;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005385 } else if (Feature == "+crc") {
Bernard Ogden18b57012013-10-29 09:47:51 +00005386 CRC = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005387 } else if (Feature == "+crypto") {
Tim Northover02e38602014-02-03 17:28:04 +00005388 Crypto = 1;
Artyom Skrobov05d85ae2015-10-23 17:19:02 +00005389 } else if (Feature == "+dsp") {
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005390 DSP = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005391 } else if (Feature == "+fp-only-sp") {
Matt Arsenault250024f2016-06-08 01:56:42 +00005392 HW_FP_remove |= HW_FP_DP;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005393 } else if (Feature == "+strict-align") {
5394 Unaligned = 0;
5395 } else if (Feature == "+fp16") {
5396 HW_FP |= HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005397 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00005398 }
Ranjeet Singhac08e532015-06-24 23:39:25 +00005399 HW_FP &= ~HW_FP_remove;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005400
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005401 switch (ArchVersion) {
5402 case 6:
5403 if (ArchProfile == llvm::ARM::PK_M)
5404 LDREX = 0;
5405 else if (ArchKind == llvm::ARM::AK_ARMV6K)
5406 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5407 else
5408 LDREX = LDREX_W;
5409 break;
5410 case 7:
5411 if (ArchProfile == llvm::ARM::PK_M)
5412 LDREX = LDREX_W | LDREX_H | LDREX_B ;
5413 else
5414 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5415 break;
5416 case 8:
5417 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5418 }
5419
Rafael Espindolaeb265472013-08-21 21:59:03 +00005420 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
5421 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
5422 return false;
5423 }
5424
5425 if (FPMath == FP_Neon)
5426 Features.push_back("+neonfp");
5427 else if (FPMath == FP_VFP)
5428 Features.push_back("-neonfp");
5429
Daniel Dunbar893d4752009-12-19 04:15:38 +00005430 // Remove front-end specific options which the backend handles differently.
Eric Christopher9e172d22015-05-12 01:26:21 +00005431 auto Feature =
5432 std::find(Features.begin(), Features.end(), "+soft-float-abi");
5433 if (Feature != Features.end())
5434 Features.erase(Feature);
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005435
Rafael Espindolaeb265472013-08-21 21:59:03 +00005436 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005437 }
5438
Craig Topper3164f332014-03-11 03:39:26 +00005439 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005440 return llvm::StringSwitch<bool>(Feature)
5441 .Case("arm", true)
Ben Langmuir587aeaf2015-08-07 01:59:56 +00005442 .Case("aarch32", true)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005443 .Case("softfloat", SoftFloat)
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005444 .Case("thumb", isThumb())
Amara Emerson8c3de542013-09-16 18:07:35 +00005445 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005446 .Case("hwdiv", HWDiv & HWDivThumb)
5447 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005448 .Default(false);
5449 }
Renato Golin15b86152015-07-03 16:41:13 +00005450
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005451 bool setCPU(const std::string &Name) override {
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005452 if (Name != "generic")
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00005453 setArchInfo(llvm::ARM::parseCPUArch(Name));
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005454
Renato Golin15b86152015-07-03 16:41:13 +00005455 if (ArchKind == llvm::ARM::AK_INVALID)
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005456 return false;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005457 setAtomic();
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005458 CPU = Name;
5459 return true;
5460 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005461
Craig Topper3164f332014-03-11 03:39:26 +00005462 bool setFPMath(StringRef Name) override;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005463
Craig Topper3164f332014-03-11 03:39:26 +00005464 void getTargetDefines(const LangOptions &Opts,
5465 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00005466 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005467 Builder.defineMacro("__arm");
5468 Builder.defineMacro("__arm__");
Weiming Zhaob0613132016-04-18 16:25:46 +00005469 // For bare-metal none-eabi.
5470 if (getTriple().getOS() == llvm::Triple::UnknownOS &&
Oliver Stannard233310f2017-04-18 13:12:36 +00005471 (getTriple().getEnvironment() == llvm::Triple::EABI ||
5472 getTriple().getEnvironment() == llvm::Triple::EABIHF))
Weiming Zhaob0613132016-04-18 16:25:46 +00005473 Builder.defineMacro("__ELF__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00005474
Oliver Stannard233310f2017-04-18 13:12:36 +00005475
Chris Lattnerecd49032009-03-02 22:27:17 +00005476 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005477 Builder.defineMacro("__REGISTER_PREFIX__", "");
Tim Northover5627d392015-10-30 16:30:45 +00005478
5479 // Unfortunately, __ARM_ARCH_7K__ is now more of an ABI descriptor. The CPU
5480 // happens to be Cortex-A7 though, so it should still get __ARM_ARCH_7A__.
Tim Northoverd88ecb32016-01-27 19:32:40 +00005481 if (getTriple().isWatchABI())
Tim Northover5627d392015-10-30 16:30:45 +00005482 Builder.defineMacro("__ARM_ARCH_7K__", "2");
5483
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005484 if (!CPUAttr.empty())
5485 Builder.defineMacro("__ARM_ARCH_" + CPUAttr + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005486
5487 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005488 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
Benjamin Kramerb42d9a52015-12-24 10:07:37 +00005489 Builder.defineMacro("__ARM_ARCH", Twine(ArchVersion));
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005490
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005491 if (ArchVersion >= 8) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005492 // ACLE 6.5.7 Crypto Extension
5493 if (Crypto)
5494 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
5495 // ACLE 6.5.8 CRC32 Extension
5496 if (CRC)
5497 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
5498 // ACLE 6.5.10 Numeric Maximum and Minimum
5499 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
5500 // ACLE 6.5.9 Directed Rounding
5501 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
James Molloy0ffb0932014-09-15 11:25:38 +00005502 }
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005503
5504 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
5505 // is not defined for the M-profile.
Bradley Smithf4affc12016-03-03 13:52:22 +00005506 // NOTE that the default profile is assumed to be 'A'
5507 if (CPUProfile.empty() || ArchProfile != llvm::ARM::PK_M)
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005508 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
5509
Bradley Smithf4affc12016-03-03 13:52:22 +00005510 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supports the original
5511 // Thumb ISA (including v6-M and v8-M Baseline). It is set to 2 if the
5512 // core supports the Thumb-2 ISA as found in the v6T2 architecture and all
5513 // v7 and v8 architectures excluding v8-M Baseline.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005514 if (supportsThumb2())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005515 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005516 else if (supportsThumb())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005517 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
5518
5519 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
5520 // instruction set such as ARM or Thumb.
5521 Builder.defineMacro("__ARM_32BIT_STATE", "1");
5522
5523 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
5524
5525 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005526 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005527 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00005528
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005529 // ACLE 6.4.3 Unaligned access supported in hardware
Eric Christopherb093d692015-10-09 18:39:59 +00005530 if (Unaligned)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005531 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Eric Christopherb093d692015-10-09 18:39:59 +00005532
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005533 // ACLE 6.4.4 LDREX/STREX
5534 if (LDREX)
5535 Builder.defineMacro("__ARM_FEATURE_LDREX", "0x" + llvm::utohexstr(LDREX));
5536
5537 // ACLE 6.4.5 CLZ
Eric Christopherb093d692015-10-09 18:39:59 +00005538 if (ArchVersion == 5 ||
5539 (ArchVersion == 6 && CPUProfile != "M") ||
5540 ArchVersion > 6)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005541 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
5542
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005543 // ACLE 6.5.1 Hardware Floating Point
5544 if (HW_FP)
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +00005545 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005546
Yi Konga44c4d72014-06-27 21:25:42 +00005547 // ACLE predefines.
5548 Builder.defineMacro("__ARM_ACLE", "200");
5549
Oliver Stannarddc2854c2015-09-03 12:40:58 +00005550 // FP16 support (we currently only support IEEE format).
5551 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
5552 Builder.defineMacro("__ARM_FP16_ARGS", "1");
5553
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005554 // ACLE 6.5.3 Fused multiply-accumulate (FMA)
Silviu Baranga632fdc52016-04-28 11:29:08 +00005555 if (ArchVersion >= 7 && (FPU & VFP4FPU))
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005556 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
5557
Mike Stump9d54bd72009-04-08 02:07:04 +00005558 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005559
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005560 // FIXME: It's more complicated than this and we don't really support
5561 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005562 // Windows on ARM does not "support" interworking
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005563 if (5 <= ArchVersion && ArchVersion <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005564 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005565
David Tweed8f676532012-10-25 13:33:01 +00005566 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00005567 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005568 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
Tim Northover862eaf82016-05-13 21:26:45 +00005569 if (!getTriple().isOSBinFormatMachO() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00005570 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005571 Builder.defineMacro("__ARM_PCS", "1");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005572 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005573
Tim Northover28fc0e12016-04-28 13:59:55 +00005574 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp" ||
5575 ABI == "aapcs16")
5576 Builder.defineMacro("__ARM_PCS_VFP", "1");
5577
Daniel Dunbar893d4752009-12-19 04:15:38 +00005578 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005579 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005580
Zijiao Ma56a83722016-08-17 02:13:33 +00005581 if (ArchKind == llvm::ARM::AK_XSCALE)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005582 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005583
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005584 if (isThumb()) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005585 Builder.defineMacro("__THUMBEL__");
5586 Builder.defineMacro("__thumb__");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005587 if (supportsThumb2())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005588 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005589 }
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005590
5591 // ACLE 6.4.9 32-bit SIMD instructions
5592 if (ArchVersion >= 6 && (CPUProfile != "M" || CPUAttr == "7EM"))
5593 Builder.defineMacro("__ARM_FEATURE_SIMD32", "1");
5594
5595 // ACLE 6.4.10 Hardware Integer Divide
Eric Christopherb093d692015-10-09 18:39:59 +00005596 if (((HWDiv & HWDivThumb) && isThumb()) ||
5597 ((HWDiv & HWDivARM) && !isThumb())) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005598 Builder.defineMacro("__ARM_FEATURE_IDIV", "1");
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005599 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005600 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005601
5602 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005603 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005604
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005605 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005606 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005607 if (FPU & VFP2FPU)
5608 Builder.defineMacro("__ARM_VFPV2__");
5609 if (FPU & VFP3FPU)
5610 Builder.defineMacro("__ARM_VFPV3__");
5611 if (FPU & VFP4FPU)
5612 Builder.defineMacro("__ARM_VFPV4__");
Tim Northoverc67803f2016-12-21 20:49:43 +00005613 if (FPU & FPARMV8)
5614 Builder.defineMacro("__ARM_FPV5__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005615 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00005616
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005617 // This only gets set when Neon instructions are actually available, unlike
5618 // the VFP define, hence the soft float and arch check. This is subtly
5619 // different from gcc, we follow the intent which was that it should be set
5620 // when Neon instructions are actually available.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005621 if ((FPU & NeonFPU) && !SoftFloat && ArchVersion >= 7) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005622 Builder.defineMacro("__ARM_NEON", "1");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005623 Builder.defineMacro("__ARM_NEON__");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005624 // current AArch32 NEON implementations do not support double-precision
5625 // floating-point even when it is present in VFP.
Eric Christopherb093d692015-10-09 18:39:59 +00005626 Builder.defineMacro("__ARM_NEON_FP",
5627 "0x" + llvm::utohexstr(HW_FP & ~HW_FP_DP));
Tim Northover5bb34ca2013-11-21 12:36:34 +00005628 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00005629
Bradley Smith0f28f0c2014-01-20 10:52:00 +00005630 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
5631 Opts.ShortWChar ? "2" : "4");
5632
5633 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5634 Opts.ShortEnums ? "1" : "4");
5635
Bradley Smithf4affc12016-03-03 13:52:22 +00005636 if (ArchVersion >= 6 && CPUAttr != "6M" && CPUAttr != "8M_BASE") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00005637 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5638 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5639 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5640 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
5641 }
Sergey Dmitrouk745f5302014-11-25 08:57:36 +00005642
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005643 // ACLE 6.4.7 DSP instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005644 if (DSP) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005645 Builder.defineMacro("__ARM_FEATURE_DSP", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005646 }
5647
5648 // ACLE 6.4.8 Saturation instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005649 bool SAT = false;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005650 if ((ArchVersion == 6 && CPUProfile != "M") || ArchVersion > 6 ) {
5651 Builder.defineMacro("__ARM_FEATURE_SAT", "1");
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005652 SAT = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005653 }
5654
5655 // ACLE 6.4.6 Q (saturation) flag
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005656 if (DSP || SAT)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005657 Builder.defineMacro("__ARM_FEATURE_QBIT", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005658
5659 if (Opts.UnsafeFPMath)
5660 Builder.defineMacro("__ARM_FP_FAST", "1");
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005661
5662 if (ArchKind == llvm::ARM::AK_ARMV8_1A)
5663 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
Chris Lattner17df24e2008-04-21 18:56:49 +00005664 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005665
Craig Topper6c03a542015-10-19 04:51:35 +00005666 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5667 return llvm::makeArrayRef(BuiltinInfo,
5668 clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner17df24e2008-04-21 18:56:49 +00005669 }
Craig Topper3164f332014-03-11 03:39:26 +00005670 bool isCLZForZeroUndef() const override { return false; }
5671 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northover5627d392015-10-30 16:30:45 +00005672 return IsAAPCS
5673 ? AAPCSABIBuiltinVaList
Tim Northoverd88ecb32016-01-27 19:32:40 +00005674 : (getTriple().isWatchABI() ? TargetInfo::CharPtrBuiltinVaList
5675 : TargetInfo::VoidPtrBuiltinVaList);
Chris Lattner17df24e2008-04-21 18:56:49 +00005676 }
Craig Topperf054e3a2015-10-19 03:52:27 +00005677 ArrayRef<const char *> getGCCRegNames() const override;
5678 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00005679 bool validateAsmConstraint(const char *&Name,
5680 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00005681 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00005682 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00005683 case 'l': // r0-r7
5684 case 'h': // r8-r15
JF Bastien750caef2016-02-19 06:54:45 +00005685 case 't': // VFP Floating point register single precision
5686 case 'w': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00005687 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00005688 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005689 case 'I':
5690 case 'J':
5691 case 'K':
5692 case 'L':
5693 case 'M':
5694 // FIXME
5695 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00005696 case 'Q': // A memory address that is a single base register.
5697 Info.setAllowsMemory();
5698 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005699 case 'U': // a memory reference...
5700 switch (Name[1]) {
5701 case 'q': // ...ARMV4 ldrsb
5702 case 'v': // ...VFP load/store (reg+constant offset)
5703 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00005704 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00005705 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00005706 case 'n': // valid address for Neon doubleword vector load/store
5707 case 'm': // valid address for Neon element and structure load/store
5708 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00005709 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005710 Info.setAllowsMemory();
5711 Name++;
5712 return true;
5713 }
Nate Begeman2908fa02008-04-22 05:03:19 +00005714 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005715 return false;
5716 }
Craig Topper3164f332014-03-11 03:39:26 +00005717 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005718 std::string R;
5719 switch (*Constraint) {
5720 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00005721 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005722 Constraint++;
5723 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00005724 case 'p': // 'p' should be translated to 'r' by default.
5725 R = std::string("r");
5726 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005727 default:
5728 return std::string(1, *Constraint);
5729 }
5730 return R;
5731 }
Akira Hatanaka987f1862014-08-22 06:05:21 +00005732 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005733 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005734 std::string &SuggestedModifier) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00005735 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00005736 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00005737
Bill Wendling9d1ee112012-10-25 23:28:48 +00005738 // Strip off constraint modifiers.
5739 while (Constraint[0] == '=' ||
5740 Constraint[0] == '+' ||
5741 Constraint[0] == '&')
5742 Constraint = Constraint.substr(1);
5743
5744 switch (Constraint[0]) {
5745 default: break;
5746 case 'r': {
5747 switch (Modifier) {
5748 default:
Tim Northover8f24b172013-12-08 15:24:55 +00005749 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00005750 case 'q':
5751 // A register of size 32 cannot fit a vector type.
5752 return false;
5753 }
5754 }
5755 }
5756
5757 return true;
5758 }
Craig Topper3164f332014-03-11 03:39:26 +00005759 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00005760 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00005761 return "";
5762 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005763
Craig Topper3164f332014-03-11 03:39:26 +00005764 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00005765 switch (CC) {
5766 case CC_AAPCS:
5767 case CC_AAPCS_VFP:
5768 case CC_Swift:
5769 return CCCR_OK;
5770 default:
5771 return CCCR_Warning;
5772 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005773 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00005774
Craig Topper3164f332014-03-11 03:39:26 +00005775 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00005776 if (RegNo == 0) return 0;
5777 if (RegNo == 1) return 1;
5778 return -1;
5779 }
Matthias Braund1e2fad2015-07-17 00:15:22 +00005780
5781 bool hasSjLjLowering() const override {
5782 return true;
5783 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005784};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005785
Rafael Espindolaeb265472013-08-21 21:59:03 +00005786bool ARMTargetInfo::setFPMath(StringRef Name) {
5787 if (Name == "neon") {
5788 FPMath = FP_Neon;
5789 return true;
5790 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
5791 Name == "vfp4") {
5792 FPMath = FP_VFP;
5793 return true;
5794 }
5795 return false;
5796}
5797
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005798const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005799 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005800 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005801 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
5802
5803 // Float registers
5804 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
5805 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
5806 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005807 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005808
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005809 // Double registers
5810 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
5811 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005812 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
5813 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005814
5815 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005816 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
5817 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005818};
5819
Craig Topperf054e3a2015-10-19 03:52:27 +00005820ArrayRef<const char *> ARMTargetInfo::getGCCRegNames() const {
5821 return llvm::makeArrayRef(GCCRegNames);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005822}
5823
5824const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005825 { { "a1" }, "r0" },
5826 { { "a2" }, "r1" },
5827 { { "a3" }, "r2" },
5828 { { "a4" }, "r3" },
5829 { { "v1" }, "r4" },
5830 { { "v2" }, "r5" },
5831 { { "v3" }, "r6" },
5832 { { "v4" }, "r7" },
5833 { { "v5" }, "r8" },
5834 { { "v6", "rfp" }, "r9" },
5835 { { "sl" }, "r10" },
5836 { { "fp" }, "r11" },
5837 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00005838 { { "r13" }, "sp" },
5839 { { "r14" }, "lr" },
5840 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005841 // The S, D and Q registers overlap, but aren't really aliases; we
5842 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005843};
5844
Craig Topperf054e3a2015-10-19 03:52:27 +00005845ArrayRef<TargetInfo::GCCRegAlias> ARMTargetInfo::getGCCRegAliases() const {
5846 return llvm::makeArrayRef(GCCRegAliases);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005847}
Chris Lattner5cc15e02010-03-03 19:03:45 +00005848
5849const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00005850#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005851 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005852#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5853 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00005854#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00005855
Craig Topper07d3b622015-08-07 05:14:44 +00005856#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005857 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005858#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005859 { #ID, TYPE, ATTRS, nullptr, LANG, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005860#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5861 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Albert Gutowski2a0621e2016-10-12 22:01:05 +00005862#define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANGS, FEATURE) \
5863 { #ID, TYPE, ATTRS, HEADER, LANGS, FEATURE },
Chris Lattner5cc15e02010-03-03 19:03:45 +00005864#include "clang/Basic/BuiltinsARM.def"
5865};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005866
5867class ARMleTargetInfo : public ARMTargetInfo {
5868public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005869 ARMleTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Matt Arsenaultf333de32016-09-07 07:08:02 +00005870 : ARMTargetInfo(Triple, Opts) {}
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005871 void getTargetDefines(const LangOptions &Opts,
5872 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005873 Builder.defineMacro("__ARMEL__");
5874 ARMTargetInfo::getTargetDefines(Opts, Builder);
5875 }
5876};
5877
5878class ARMbeTargetInfo : public ARMTargetInfo {
5879public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005880 ARMbeTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Matt Arsenaultf333de32016-09-07 07:08:02 +00005881 : ARMTargetInfo(Triple, Opts) {}
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005882 void getTargetDefines(const LangOptions &Opts,
5883 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005884 Builder.defineMacro("__ARMEB__");
5885 Builder.defineMacro("__ARM_BIG_ENDIAN");
5886 ARMTargetInfo::getTargetDefines(Opts, Builder);
5887 }
5888};
Chris Lattner17df24e2008-04-21 18:56:49 +00005889
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005890class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
5891 const llvm::Triple Triple;
5892public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005893 WindowsARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5894 : WindowsTargetInfo<ARMleTargetInfo>(Triple, Opts), Triple(Triple) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005895 WCharType = UnsignedShort;
5896 SizeType = UnsignedInt;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005897 }
5898 void getVisualStudioDefines(const LangOptions &Opts,
5899 MacroBuilder &Builder) const {
5900 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
5901
5902 // FIXME: this is invalid for WindowsCE
5903 Builder.defineMacro("_M_ARM_NT", "1");
5904 Builder.defineMacro("_M_ARMT", "_M_ARM");
5905 Builder.defineMacro("_M_THUMB", "_M_ARM");
5906
5907 assert((Triple.getArch() == llvm::Triple::arm ||
5908 Triple.getArch() == llvm::Triple::thumb) &&
5909 "invalid architecture for Windows ARM target info");
5910 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
5911 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
5912
5913 // TODO map the complete set of values
5914 // 31: VFPv3 40: VFPv4
5915 Builder.defineMacro("_M_ARM_FP", "31");
5916 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00005917 BuiltinVaListKind getBuiltinVaListKind() const override {
5918 return TargetInfo::CharPtrBuiltinVaList;
5919 }
Martell Malone7ccda3c2015-08-14 18:00:09 +00005920 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5921 switch (CC) {
5922 case CC_X86StdCall:
5923 case CC_X86ThisCall:
5924 case CC_X86FastCall:
5925 case CC_X86VectorCall:
5926 return CCCR_Ignore;
5927 case CC_C:
5928 return CCCR_OK;
5929 default:
5930 return CCCR_Warning;
5931 }
5932 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005933};
5934
5935// Windows ARM + Itanium C++ ABI Target
5936class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
5937public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005938 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple,
5939 const TargetOptions &Opts)
5940 : WindowsARMTargetInfo(Triple, Opts) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005941 TheCXXABI.set(TargetCXXABI::GenericARM);
5942 }
5943
5944 void getTargetDefines(const LangOptions &Opts,
5945 MacroBuilder &Builder) const override {
5946 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5947
5948 if (Opts.MSVCCompat)
5949 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5950 }
5951};
5952
5953// Windows ARM, MS (C++) ABI
5954class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
5955public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005956 MicrosoftARMleTargetInfo(const llvm::Triple &Triple,
5957 const TargetOptions &Opts)
5958 : WindowsARMTargetInfo(Triple, Opts) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005959 TheCXXABI.set(TargetCXXABI::Microsoft);
5960 }
5961
5962 void getTargetDefines(const LangOptions &Opts,
5963 MacroBuilder &Builder) const override {
5964 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5965 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5966 }
5967};
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005968
Yaron Keren321249c2015-07-15 13:32:23 +00005969// ARM MinGW target
5970class MinGWARMTargetInfo : public WindowsARMTargetInfo {
5971public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005972 MinGWARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5973 : WindowsARMTargetInfo(Triple, Opts) {
Yaron Keren321249c2015-07-15 13:32:23 +00005974 TheCXXABI.set(TargetCXXABI::GenericARM);
5975 }
5976
5977 void getTargetDefines(const LangOptions &Opts,
5978 MacroBuilder &Builder) const override {
5979 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5980 DefineStd(Builder, "WIN32", Opts);
5981 DefineStd(Builder, "WINNT", Opts);
5982 Builder.defineMacro("_ARM_");
5983 addMinGWDefines(Opts, Builder);
5984 }
5985};
5986
5987// ARM Cygwin target
5988class CygwinARMTargetInfo : public ARMleTargetInfo {
5989public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005990 CygwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5991 : ARMleTargetInfo(Triple, Opts) {
Yaron Keren321249c2015-07-15 13:32:23 +00005992 TLSSupported = false;
5993 WCharType = UnsignedShort;
5994 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00005995 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Yaron Keren321249c2015-07-15 13:32:23 +00005996 }
5997 void getTargetDefines(const LangOptions &Opts,
5998 MacroBuilder &Builder) const override {
5999 ARMleTargetInfo::getTargetDefines(Opts, Builder);
6000 Builder.defineMacro("_ARM_");
6001 Builder.defineMacro("__CYGWIN__");
6002 Builder.defineMacro("__CYGWIN32__");
Saleem Abdulrasool56027092017-02-07 19:00:06 +00006003 DefineStd(Builder, "unix", Opts);
Yaron Keren321249c2015-07-15 13:32:23 +00006004 if (Opts.CPlusPlus)
6005 Builder.defineMacro("_GNU_SOURCE");
6006 }
6007};
6008
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006009class DarwinARMTargetInfo : public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00006010protected:
Craig Topper3164f332014-03-11 03:39:26 +00006011 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
6012 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00006013 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00006014 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00006015
Torok Edwinb2b37c62009-06-30 17:10:35 +00006016public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006017 DarwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6018 : DarwinTargetInfo<ARMleTargetInfo>(Triple, Opts) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00006019 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00006020 // iOS always has 64-bit atomic instructions.
Eric Christopher917e9522014-11-18 22:36:15 +00006021 // FIXME: This should be based off of the target features in
6022 // ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00006023 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00006024
Tim Northoverd88ecb32016-01-27 19:32:40 +00006025 if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00006026 // Darwin on iOS uses a variant of the ARM C++ ABI.
6027 TheCXXABI.set(TargetCXXABI::WatchOS);
6028
6029 // The 32-bit ABI is silent on what ptrdiff_t should be, but given that
6030 // size_t is long, it's a bit weird for it to be int.
6031 PtrDiffType = SignedLong;
6032
6033 // BOOL should be a real boolean on the new ABI
6034 UseSignedCharForObjCBool = false;
6035 } else
6036 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00006037 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00006038};
Eli Friedmanf05b7722008-08-20 07:44:10 +00006039
Tim Northover573cbee2014-05-24 12:52:07 +00006040class AArch64TargetInfo : public TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00006041 virtual void setDataLayout() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00006042 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6043 static const char *const GCCRegNames[];
6044
James Molloy75f5f9e2014-04-16 15:33:48 +00006045 enum FPUModeEnum {
6046 FPUMode,
6047 NeonMode
6048 };
6049
6050 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00006051 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00006052 unsigned Crypto;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006053 unsigned Unaligned;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00006054 unsigned V8_1A;
James Molloy75f5f9e2014-04-16 15:33:48 +00006055
Tim Northovera2ee4332014-03-29 15:09:45 +00006056 static const Builtin::Info BuiltinInfo[];
6057
6058 std::string ABI;
6059
6060public:
Saleem Abdulrasool9b5ba542016-04-10 03:19:47 +00006061 AArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Tim Northovera2ee4332014-03-29 15:09:45 +00006062 : TargetInfo(Triple), ABI("aapcs") {
Brad Smith9aa2bf22017-02-21 23:13:09 +00006063 if (getTriple().getOS() == llvm::Triple::NetBSD ||
6064 getTriple().getOS() == llvm::Triple::OpenBSD) {
Tim Northover25e8a672014-05-24 12:51:25 +00006065 WCharType = SignedInt;
6066
6067 // NetBSD apparently prefers consistency across ARM targets to consistency
6068 // across 64-bit targets.
6069 Int64Type = SignedLongLong;
6070 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00006071 } else {
6072 WCharType = UnsignedInt;
6073 Int64Type = SignedLong;
6074 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00006075 }
6076
Tim Northovera2ee4332014-03-29 15:09:45 +00006077 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00006078 MaxVectorAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00006079 MaxAtomicInlineWidth = 128;
6080 MaxAtomicPromoteWidth = 128;
6081
Tim Northovera6a19f12015-02-06 01:25:07 +00006082 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 128;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00006083 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Tim Northovera2ee4332014-03-29 15:09:45 +00006084
Tim Northovera2ee4332014-03-29 15:09:45 +00006085 // {} in inline assembly are neon specifiers, not assembly variant
6086 // specifiers.
6087 NoAsmVariants = true;
6088
Tim Northover7ad87af2015-01-16 18:44:04 +00006089 // AAPCS gives rules for bitfields. 7.1.7 says: "The container type
6090 // contributes to the alignment of the containing aggregate in the same way
6091 // a plain (non bit-field) member of that type would, without exception for
6092 // zero-sized or anonymous bit-fields."
Tim Northover5627d392015-10-30 16:30:45 +00006093 assert(UseBitFieldTypeAlignment && "bitfields affect type alignment");
Tim Northover7ad87af2015-01-16 18:44:04 +00006094 UseZeroLengthBitfieldAlignment = true;
6095
Tim Northover573cbee2014-05-24 12:52:07 +00006096 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00006097 TheCXXABI.set(TargetCXXABI::GenericAArch64);
Saleem Abdulrasoolc066d9c2016-04-12 03:05:03 +00006098
Eric Christopherfb834a82017-02-28 17:22:05 +00006099 if (Triple.getOS() == llvm::Triple::Linux)
6100 this->MCountName = "\01_mcount";
6101 else if (Triple.getOS() == llvm::Triple::UnknownOS)
Saleem Abdulrasoolc066d9c2016-04-12 03:05:03 +00006102 this->MCountName = Opts.EABIVersion == "gnu" ? "\01_mcount" : "mcount";
Tim Northovera2ee4332014-03-29 15:09:45 +00006103 }
6104
Alp Toker4925ba72014-06-07 23:30:42 +00006105 StringRef getABI() const override { return ABI; }
David Blaikie1cbb9712014-11-14 19:09:44 +00006106 bool setABI(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006107 if (Name != "aapcs" && Name != "darwinpcs")
6108 return false;
6109
6110 ABI = Name;
6111 return true;
6112 }
6113
David Blaikie1cbb9712014-11-14 19:09:44 +00006114 bool setCPU(const std::string &Name) override {
Zijiao Ma33e95212016-07-28 06:24:48 +00006115 return Name == "generic" ||
6116 llvm::AArch64::parseCPUArch(Name) !=
6117 static_cast<unsigned>(llvm::AArch64::ArchKind::AK_INVALID);
Tim Northovera2ee4332014-03-29 15:09:45 +00006118 }
6119
Alexander Kornienko34eb2072015-04-11 02:00:23 +00006120 void getTargetDefines(const LangOptions &Opts,
6121 MacroBuilder &Builder) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006122 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00006123 Builder.defineMacro("__aarch64__");
Oliver Stannard233310f2017-04-18 13:12:36 +00006124 // For bare-metal none-eabi.
6125 if (getTriple().getOS() == llvm::Triple::UnknownOS &&
6126 (getTriple().getEnvironment() == llvm::Triple::EABI ||
6127 getTriple().getEnvironment() == llvm::Triple::EABIHF))
6128 Builder.defineMacro("__ELF__");
Tim Northovera2ee4332014-03-29 15:09:45 +00006129
6130 // Target properties.
6131 Builder.defineMacro("_LP64");
6132 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00006133
6134 // ACLE predefines. Many can only have one possible value on v8 AArch64.
6135 Builder.defineMacro("__ARM_ACLE", "200");
6136 Builder.defineMacro("__ARM_ARCH", "8");
6137 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
6138
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006139 Builder.defineMacro("__ARM_64BIT_STATE", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00006140 Builder.defineMacro("__ARM_PCS_AAPCS64", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006141 Builder.defineMacro("__ARM_ARCH_ISA_A64", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00006142
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006143 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
6144 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
6145 Builder.defineMacro("__ARM_FEATURE_LDREX", "0xF");
6146 Builder.defineMacro("__ARM_FEATURE_IDIV", "1"); // As specified in ACLE
James Molloy0ffb0932014-09-15 11:25:38 +00006147 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006148 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
6149 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00006150
6151 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
6152
6153 // 0xe implies support for half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006154 Builder.defineMacro("__ARM_FP", "0xE");
Tim Northovera2ee4332014-03-29 15:09:45 +00006155
6156 // PCS specifies this for SysV variants, which is all we support. Other ABIs
6157 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006158 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
6159 Builder.defineMacro("__ARM_FP16_ARGS", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00006160
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00006161 if (Opts.UnsafeFPMath)
6162 Builder.defineMacro("__ARM_FP_FAST", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00006163
6164 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
6165
6166 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
6167 Opts.ShortEnums ? "1" : "4");
6168
James Molloy75f5f9e2014-04-16 15:33:48 +00006169 if (FPU == NeonMode) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006170 Builder.defineMacro("__ARM_NEON", "1");
James Molloy75f5f9e2014-04-16 15:33:48 +00006171 // 64-bit NEON supports half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006172 Builder.defineMacro("__ARM_NEON_FP", "0xE");
James Molloy75f5f9e2014-04-16 15:33:48 +00006173 }
Tim Northovera2ee4332014-03-29 15:09:45 +00006174
Bradley Smith418c5932014-05-02 15:17:51 +00006175 if (CRC)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006176 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
Bradley Smith418c5932014-05-02 15:17:51 +00006177
James Molloy75f5f9e2014-04-16 15:33:48 +00006178 if (Crypto)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006179 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
6180
6181 if (Unaligned)
6182 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Reid Klecknerd167d422015-05-06 15:31:46 +00006183
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00006184 if (V8_1A)
6185 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
6186
Reid Klecknerd167d422015-05-06 15:31:46 +00006187 // All of the __sync_(bool|val)_compare_and_swap_(1|2|4|8) builtins work.
6188 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
6189 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
6190 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
6191 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Tim Northovera2ee4332014-03-29 15:09:45 +00006192 }
6193
Craig Topper6c03a542015-10-19 04:51:35 +00006194 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6195 return llvm::makeArrayRef(BuiltinInfo,
6196 clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin);
Tim Northovera2ee4332014-03-29 15:09:45 +00006197 }
6198
David Blaikie1cbb9712014-11-14 19:09:44 +00006199 bool hasFeature(StringRef Feature) const override {
James Molloy75f5f9e2014-04-16 15:33:48 +00006200 return Feature == "aarch64" ||
6201 Feature == "arm64" ||
Ben Langmuir587aeaf2015-08-07 01:59:56 +00006202 Feature == "arm" ||
James Molloy75f5f9e2014-04-16 15:33:48 +00006203 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00006204 }
6205
James Molloy5e73df52014-04-16 15:06:20 +00006206 bool handleTargetFeatures(std::vector<std::string> &Features,
6207 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00006208 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00006209 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00006210 Crypto = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006211 Unaligned = 1;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00006212 V8_1A = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006213
Eric Christopher610fe112015-08-26 08:21:55 +00006214 for (const auto &Feature : Features) {
6215 if (Feature == "+neon")
James Molloy75f5f9e2014-04-16 15:33:48 +00006216 FPU = NeonMode;
Eric Christopher610fe112015-08-26 08:21:55 +00006217 if (Feature == "+crc")
Bradley Smith418c5932014-05-02 15:17:51 +00006218 CRC = 1;
Eric Christopher610fe112015-08-26 08:21:55 +00006219 if (Feature == "+crypto")
James Molloy75f5f9e2014-04-16 15:33:48 +00006220 Crypto = 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006221 if (Feature == "+strict-align")
6222 Unaligned = 0;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00006223 if (Feature == "+v8.1a")
6224 V8_1A = 1;
James Molloy75f5f9e2014-04-16 15:33:48 +00006225 }
6226
James Y Knightb214cbc2016-03-04 19:00:41 +00006227 setDataLayout();
James Molloy5e73df52014-04-16 15:06:20 +00006228
6229 return true;
6230 }
6231
John McCall477f2bb2016-03-03 06:39:32 +00006232 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
6233 switch (CC) {
6234 case CC_C:
6235 case CC_Swift:
Roman Levenstein35aa5ce2016-03-16 18:00:46 +00006236 case CC_PreserveMost:
6237 case CC_PreserveAll:
John McCall477f2bb2016-03-03 06:39:32 +00006238 return CCCR_OK;
6239 default:
6240 return CCCR_Warning;
6241 }
6242 }
6243
David Blaikie1cbb9712014-11-14 19:09:44 +00006244 bool isCLZForZeroUndef() const override { return false; }
Tim Northovera2ee4332014-03-29 15:09:45 +00006245
David Blaikie1cbb9712014-11-14 19:09:44 +00006246 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006247 return TargetInfo::AArch64ABIBuiltinVaList;
6248 }
6249
Craig Topperf054e3a2015-10-19 03:52:27 +00006250 ArrayRef<const char *> getGCCRegNames() const override;
6251 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00006252
Alexander Kornienko34eb2072015-04-11 02:00:23 +00006253 bool validateAsmConstraint(const char *&Name,
6254 TargetInfo::ConstraintInfo &Info) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006255 switch (*Name) {
6256 default:
6257 return false;
6258 case 'w': // Floating point and SIMD registers (V0-V31)
6259 Info.setAllowsRegister();
6260 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00006261 case 'I': // Constant that can be used with an ADD instruction
6262 case 'J': // Constant that can be used with a SUB instruction
6263 case 'K': // Constant that can be used with a 32-bit logical instruction
6264 case 'L': // Constant that can be used with a 64-bit logical instruction
6265 case 'M': // Constant that can be used as a 32-bit MOV immediate
6266 case 'N': // Constant that can be used as a 64-bit MOV immediate
6267 case 'Y': // Floating point constant zero
6268 case 'Z': // Integer constant zero
6269 return true;
6270 case 'Q': // A memory reference with base register and no offset
6271 Info.setAllowsMemory();
6272 return true;
6273 case 'S': // A symbolic address
6274 Info.setAllowsRegister();
6275 return true;
6276 case 'U':
Eric Christopher917e9522014-11-18 22:36:15 +00006277 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
6278 // Utf: A memory address suitable for ldp/stp in TF mode.
6279 // Usa: An absolute symbolic address.
6280 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
6281 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
Tim Northovera2ee4332014-03-29 15:09:45 +00006282 case 'z': // Zero register, wzr or xzr
6283 Info.setAllowsRegister();
6284 return true;
6285 case 'x': // Floating point and SIMD registers (V0-V15)
6286 Info.setAllowsRegister();
6287 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00006288 }
6289 return false;
6290 }
6291
Akira Hatanaka987f1862014-08-22 06:05:21 +00006292 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00006293 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00006294 std::string &SuggestedModifier) const override {
James Molloy8a157bf2014-07-25 10:19:47 +00006295 // Strip off constraint modifiers.
6296 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
6297 Constraint = Constraint.substr(1);
6298
6299 switch (Constraint[0]) {
6300 default:
6301 return true;
6302 case 'z':
6303 case 'r': {
6304 switch (Modifier) {
6305 case 'x':
6306 case 'w':
6307 // For now assume that the person knows what they're
6308 // doing with the modifier.
6309 return true;
6310 default:
6311 // By default an 'r' constraint will be in the 'x'
6312 // registers.
Akira Hatanaka987f1862014-08-22 06:05:21 +00006313 if (Size == 64)
6314 return true;
6315
6316 SuggestedModifier = "w";
6317 return false;
James Molloy8a157bf2014-07-25 10:19:47 +00006318 }
6319 }
6320 }
6321 }
6322
David Blaikie1cbb9712014-11-14 19:09:44 +00006323 const char *getClobbers() const override { return ""; }
Tim Northovera2ee4332014-03-29 15:09:45 +00006324
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00006325 int getEHDataRegisterNumber(unsigned RegNo) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006326 if (RegNo == 0)
6327 return 0;
6328 if (RegNo == 1)
6329 return 1;
6330 return -1;
6331 }
6332};
6333
Tim Northover573cbee2014-05-24 12:52:07 +00006334const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00006335 // 32-bit Integer registers
6336 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
6337 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
6338 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
6339
6340 // 64-bit Integer registers
6341 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
6342 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
6343 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
6344
6345 // 32-bit floating point regsisters
6346 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
6347 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
6348 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
6349
6350 // 64-bit floating point regsisters
6351 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
6352 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
6353 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
6354
6355 // Vector registers
6356 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
6357 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
6358 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
6359};
6360
Craig Topperf054e3a2015-10-19 03:52:27 +00006361ArrayRef<const char *> AArch64TargetInfo::getGCCRegNames() const {
6362 return llvm::makeArrayRef(GCCRegNames);
Tim Northovera2ee4332014-03-29 15:09:45 +00006363}
6364
Tim Northover573cbee2014-05-24 12:52:07 +00006365const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00006366 { { "w31" }, "wsp" },
6367 { { "x29" }, "fp" },
6368 { { "x30" }, "lr" },
6369 { { "x31" }, "sp" },
6370 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
6371 // don't want to substitute one of these for a different-sized one.
6372};
6373
Craig Topperf054e3a2015-10-19 03:52:27 +00006374ArrayRef<TargetInfo::GCCRegAlias> AArch64TargetInfo::getGCCRegAliases() const {
6375 return llvm::makeArrayRef(GCCRegAliases);
Tim Northovera2ee4332014-03-29 15:09:45 +00006376}
6377
Tim Northover573cbee2014-05-24 12:52:07 +00006378const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00006379#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006380 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00006381#include "clang/Basic/BuiltinsNEON.def"
6382
6383#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006384 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northover573cbee2014-05-24 12:52:07 +00006385#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00006386};
James Molloy5e73df52014-04-16 15:06:20 +00006387
Tim Northover573cbee2014-05-24 12:52:07 +00006388class AArch64leTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00006389 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00006390 if (getTriple().isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00006391 resetDataLayout("e-m:o-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006392 else
Chad Rosier4c077aa2016-07-07 20:02:25 +00006393 resetDataLayout("e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006394 }
6395
6396public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006397 AArch64leTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6398 : AArch64TargetInfo(Triple, Opts) {
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006399 }
James Molloy5e73df52014-04-16 15:06:20 +00006400 void getTargetDefines(const LangOptions &Opts,
6401 MacroBuilder &Builder) const override {
6402 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00006403 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00006404 }
6405};
6406
Tim Northover573cbee2014-05-24 12:52:07 +00006407class AArch64beTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00006408 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00006409 assert(!getTriple().isOSBinFormatMachO());
Chad Rosier4c077aa2016-07-07 20:02:25 +00006410 resetDataLayout("E-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006411 }
6412
6413public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006414 AArch64beTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6415 : AArch64TargetInfo(Triple, Opts) {}
James Molloy5e73df52014-04-16 15:06:20 +00006416 void getTargetDefines(const LangOptions &Opts,
6417 MacroBuilder &Builder) const override {
6418 Builder.defineMacro("__AARCH64EB__");
6419 Builder.defineMacro("__AARCH_BIG_ENDIAN");
6420 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00006421 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00006422 }
6423};
Tim Northovera2ee4332014-03-29 15:09:45 +00006424
Tim Northover573cbee2014-05-24 12:52:07 +00006425class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00006426protected:
6427 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
6428 MacroBuilder &Builder) const override {
6429 Builder.defineMacro("__AARCH64_SIMD__");
6430 Builder.defineMacro("__ARM64_ARCH_8__");
6431 Builder.defineMacro("__ARM_NEON__");
6432 Builder.defineMacro("__LITTLE_ENDIAN__");
6433 Builder.defineMacro("__REGISTER_PREFIX__", "");
6434 Builder.defineMacro("__arm64", "1");
6435 Builder.defineMacro("__arm64__", "1");
6436
6437 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
6438 }
6439
Tim Northovera2ee4332014-03-29 15:09:45 +00006440public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006441 DarwinAArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6442 : DarwinTargetInfo<AArch64leTargetInfo>(Triple, Opts) {
Tim Northovera2ee4332014-03-29 15:09:45 +00006443 Int64Type = SignedLongLong;
6444 WCharType = SignedInt;
6445 UseSignedCharForObjCBool = false;
6446
Tim Northovera6a19f12015-02-06 01:25:07 +00006447 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00006448 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Tim Northovera2ee4332014-03-29 15:09:45 +00006449
6450 TheCXXABI.set(TargetCXXABI::iOS64);
6451 }
6452
David Blaikie1cbb9712014-11-14 19:09:44 +00006453 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006454 return TargetInfo::CharPtrBuiltinVaList;
6455 }
6456};
Tim Northovera2ee4332014-03-29 15:09:45 +00006457
Tony Linthicum76329bf2011-12-12 21:14:55 +00006458// Hexagon abstract base class
6459class HexagonTargetInfo : public TargetInfo {
6460 static const Builtin::Info BuiltinInfo[];
6461 static const char * const GCCRegNames[];
6462 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6463 std::string CPU;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006464 bool HasHVX, HasHVXDouble;
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006465 bool UseLongCalls;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006466
Tony Linthicum76329bf2011-12-12 21:14:55 +00006467public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006468 HexagonTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6469 : TargetInfo(Triple) {
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00006470 // Specify the vector alignment explicitly. For v512x1, the calculated
6471 // alignment would be 512*alignment(i1), which is 512 bytes, instead of
6472 // the required minimum of 64 bytes.
James Y Knightb214cbc2016-03-04 19:00:41 +00006473 resetDataLayout("e-m:e-p:32:32:32-a:0-n16:32-"
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00006474 "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 +00006475 "v32:32:32-v64:64:64-v512:512:512-v1024:1024:1024-v2048:2048:2048");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006476 SizeType = UnsignedInt;
6477 PtrDiffType = SignedInt;
6478 IntPtrType = SignedInt;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006479
6480 // {} in inline assembly are packet specifiers, not assembly variant
6481 // specifiers.
6482 NoAsmVariants = true;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006483
6484 LargeArrayMinWidth = 64;
6485 LargeArrayAlign = 64;
6486 UseBitFieldTypeAlignment = true;
6487 ZeroLengthBitfieldBoundary = 32;
6488 HasHVX = HasHVXDouble = false;
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006489 UseLongCalls = false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006490 }
6491
Craig Topper6c03a542015-10-19 04:51:35 +00006492 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6493 return llvm::makeArrayRef(BuiltinInfo,
6494 clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006495 }
6496
Craig Topper3164f332014-03-11 03:39:26 +00006497 bool validateAsmConstraint(const char *&Name,
6498 TargetInfo::ConstraintInfo &Info) const override {
Krzysztof Parzyszeke0026e42016-05-18 14:56:14 +00006499 switch (*Name) {
6500 case 'v':
6501 case 'q':
6502 if (HasHVX) {
6503 Info.setAllowsRegister();
6504 return true;
6505 }
6506 break;
Krzysztof Parzyszek89fb4412016-05-20 13:50:32 +00006507 case 's':
6508 // Relocatable constant.
6509 return true;
Krzysztof Parzyszeke0026e42016-05-18 14:56:14 +00006510 }
6511 return false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006512 }
6513
Craig Topper3164f332014-03-11 03:39:26 +00006514 void getTargetDefines(const LangOptions &Opts,
6515 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006516
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006517 bool isCLZForZeroUndef() const override { return false; }
6518
Craig Topper3164f332014-03-11 03:39:26 +00006519 bool hasFeature(StringRef Feature) const override {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006520 return llvm::StringSwitch<bool>(Feature)
6521 .Case("hexagon", true)
6522 .Case("hvx", HasHVX)
6523 .Case("hvx-double", HasHVXDouble)
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006524 .Case("long-calls", UseLongCalls)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006525 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006526 }
Craig Topper3164f332014-03-11 03:39:26 +00006527
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006528 bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6529 StringRef CPU, const std::vector<std::string> &FeaturesVec)
6530 const override;
6531
6532 bool handleTargetFeatures(std::vector<std::string> &Features,
6533 DiagnosticsEngine &Diags) override;
6534
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006535 void setFeatureEnabled(llvm::StringMap<bool> &Features, StringRef Name,
6536 bool Enabled) const override;
6537
Craig Topper3164f332014-03-11 03:39:26 +00006538 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006539 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006540 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006541 ArrayRef<const char *> getGCCRegNames() const override;
6542 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00006543 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006544 return "";
6545 }
Sebastian Pop86500282012-01-13 20:37:10 +00006546
6547 static const char *getHexagonCPUSuffix(StringRef Name) {
6548 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00006549 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006550 .Case("hexagonv5", "5")
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006551 .Case("hexagonv55", "55")
6552 .Case("hexagonv60", "60")
Krzysztof Parzyszekff7f6672017-03-14 20:29:23 +00006553 .Case("hexagonv62", "62")
Craig Topperf1186c52014-05-08 06:41:40 +00006554 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00006555 }
6556
Craig Topper3164f332014-03-11 03:39:26 +00006557 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00006558 if (!getHexagonCPUSuffix(Name))
6559 return false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006560 CPU = Name;
6561 return true;
6562 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006563
6564 int getEHDataRegisterNumber(unsigned RegNo) const override {
6565 return RegNo < 2 ? RegNo : -1;
6566 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006567};
6568
6569void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006570 MacroBuilder &Builder) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006571 Builder.defineMacro("__qdsp6__", "1");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006572 Builder.defineMacro("__hexagon__", "1");
6573
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006574 if (CPU == "hexagonv4") {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006575 Builder.defineMacro("__HEXAGON_V4__");
6576 Builder.defineMacro("__HEXAGON_ARCH__", "4");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006577 if (Opts.HexagonQdsp6Compat) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006578 Builder.defineMacro("__QDSP6_V4__");
6579 Builder.defineMacro("__QDSP6_ARCH__", "4");
6580 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006581 } else if (CPU == "hexagonv5") {
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006582 Builder.defineMacro("__HEXAGON_V5__");
6583 Builder.defineMacro("__HEXAGON_ARCH__", "5");
6584 if(Opts.HexagonQdsp6Compat) {
6585 Builder.defineMacro("__QDSP6_V5__");
6586 Builder.defineMacro("__QDSP6_ARCH__", "5");
6587 }
Krzysztof Parzyszeka58ff512016-04-21 14:30:04 +00006588 } else if (CPU == "hexagonv55") {
6589 Builder.defineMacro("__HEXAGON_V55__");
6590 Builder.defineMacro("__HEXAGON_ARCH__", "55");
6591 Builder.defineMacro("__QDSP6_V55__");
6592 Builder.defineMacro("__QDSP6_ARCH__", "55");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006593 } else if (CPU == "hexagonv60") {
6594 Builder.defineMacro("__HEXAGON_V60__");
6595 Builder.defineMacro("__HEXAGON_ARCH__", "60");
6596 Builder.defineMacro("__QDSP6_V60__");
6597 Builder.defineMacro("__QDSP6_ARCH__", "60");
Krzysztof Parzyszekff7f6672017-03-14 20:29:23 +00006598 } else if (CPU == "hexagonv62") {
6599 Builder.defineMacro("__HEXAGON_V62__");
6600 Builder.defineMacro("__HEXAGON_ARCH__", "62");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006601 }
Krzysztof Parzyszek7f0756c2016-04-18 18:38:11 +00006602
6603 if (hasFeature("hvx")) {
6604 Builder.defineMacro("__HVX__");
6605 if (hasFeature("hvx-double"))
6606 Builder.defineMacro("__HVXDBL__");
6607 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006608}
6609
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006610bool HexagonTargetInfo::initFeatureMap(llvm::StringMap<bool> &Features,
6611 DiagnosticsEngine &Diags, StringRef CPU,
6612 const std::vector<std::string> &FeaturesVec) const {
6613 // Default for v60: -hvx, -hvx-double.
6614 Features["hvx"] = false;
6615 Features["hvx-double"] = false;
6616 Features["long-calls"] = false;
6617
6618 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
6619}
6620
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006621bool HexagonTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
6622 DiagnosticsEngine &Diags) {
6623 for (auto &F : Features) {
6624 if (F == "+hvx")
6625 HasHVX = true;
6626 else if (F == "-hvx")
6627 HasHVX = HasHVXDouble = false;
6628 else if (F == "+hvx-double")
6629 HasHVX = HasHVXDouble = true;
6630 else if (F == "-hvx-double")
6631 HasHVXDouble = false;
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006632
6633 if (F == "+long-calls")
6634 UseLongCalls = true;
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006635 else if (F == "-long-calls")
6636 UseLongCalls = false;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006637 }
6638 return true;
6639}
6640
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006641void HexagonTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
6642 StringRef Name, bool Enabled) const {
6643 if (Enabled) {
6644 if (Name == "hvx-double")
6645 Features["hvx"] = true;
6646 } else {
6647 if (Name == "hvx")
6648 Features["hvx-double"] = false;
6649 }
6650 Features[Name] = Enabled;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006651}
6652
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006653const char *const HexagonTargetInfo::GCCRegNames[] = {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006654 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6655 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6656 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6657 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
6658 "p0", "p1", "p2", "p3",
6659 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
6660};
6661
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006662ArrayRef<const char*> HexagonTargetInfo::getGCCRegNames() const {
Craig Topperf054e3a2015-10-19 03:52:27 +00006663 return llvm::makeArrayRef(GCCRegNames);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006664}
6665
Tony Linthicum76329bf2011-12-12 21:14:55 +00006666const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
6667 { { "sp" }, "r29" },
6668 { { "fp" }, "r30" },
6669 { { "lr" }, "r31" },
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006670};
Tony Linthicum76329bf2011-12-12 21:14:55 +00006671
Craig Topperf054e3a2015-10-19 03:52:27 +00006672ArrayRef<TargetInfo::GCCRegAlias> HexagonTargetInfo::getGCCRegAliases() const {
6673 return llvm::makeArrayRef(GCCRegAliases);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006674}
6675
6676
6677const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00006678#define BUILTIN(ID, TYPE, ATTRS) \
6679 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
6680#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
6681 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tony Linthicum76329bf2011-12-12 21:14:55 +00006682#include "clang/Basic/BuiltinsHexagon.def"
6683};
Tony Linthicum76329bf2011-12-12 21:14:55 +00006684
Jacques Pienaard964cc22016-03-28 21:02:54 +00006685class LanaiTargetInfo : public TargetInfo {
6686 // Class for Lanai (32-bit).
6687 // The CPU profiles supported by the Lanai backend
6688 enum CPUKind {
6689 CK_NONE,
6690 CK_V11,
6691 } CPU;
6692
6693 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6694 static const char *const GCCRegNames[];
6695
6696public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006697 LanaiTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6698 : TargetInfo(Triple) {
Jacques Pienaard964cc22016-03-28 21:02:54 +00006699 // Description string has to be kept in sync with backend.
6700 resetDataLayout("E" // Big endian
6701 "-m:e" // ELF name manging
6702 "-p:32:32" // 32 bit pointers, 32 bit aligned
6703 "-i64:64" // 64 bit integers, 64 bit aligned
6704 "-a:0:32" // 32 bit alignment of objects of aggregate type
6705 "-n32" // 32 bit native integer width
6706 "-S64" // 64 bit natural stack alignment
6707 );
6708
6709 // Setting RegParmMax equal to what mregparm was set to in the old
6710 // toolchain
6711 RegParmMax = 4;
6712
6713 // Set the default CPU to V11
6714 CPU = CK_V11;
6715
6716 // Temporary approach to make everything at least word-aligned and allow for
6717 // safely casting between pointers with different alignment requirements.
6718 // TODO: Remove this when there are no more cast align warnings on the
6719 // firmware.
6720 MinGlobalAlign = 32;
6721 }
6722
6723 void getTargetDefines(const LangOptions &Opts,
6724 MacroBuilder &Builder) const override {
6725 // Define __lanai__ when building for target lanai.
6726 Builder.defineMacro("__lanai__");
6727
6728 // Set define for the CPU specified.
6729 switch (CPU) {
6730 case CK_V11:
6731 Builder.defineMacro("__LANAI_V11__");
6732 break;
6733 case CK_NONE:
6734 llvm_unreachable("Unhandled target CPU");
6735 }
6736 }
6737
6738 bool setCPU(const std::string &Name) override {
6739 CPU = llvm::StringSwitch<CPUKind>(Name)
6740 .Case("v11", CK_V11)
6741 .Default(CK_NONE);
6742
6743 return CPU != CK_NONE;
6744 }
6745
6746 bool hasFeature(StringRef Feature) const override {
6747 return llvm::StringSwitch<bool>(Feature).Case("lanai", true).Default(false);
6748 }
6749
6750 ArrayRef<const char *> getGCCRegNames() const override;
6751
6752 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
6753
6754 BuiltinVaListKind getBuiltinVaListKind() const override {
6755 return TargetInfo::VoidPtrBuiltinVaList;
6756 }
6757
6758 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
6759
6760 bool validateAsmConstraint(const char *&Name,
6761 TargetInfo::ConstraintInfo &info) const override {
6762 return false;
6763 }
6764
6765 const char *getClobbers() const override { return ""; }
6766};
6767
6768const char *const LanaiTargetInfo::GCCRegNames[] = {
6769 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10",
6770 "r11", "r12", "r13", "r14", "r15", "r16", "r17", "r18", "r19", "r20", "r21",
6771 "r22", "r23", "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"};
6772
6773ArrayRef<const char *> LanaiTargetInfo::getGCCRegNames() const {
6774 return llvm::makeArrayRef(GCCRegNames);
6775}
6776
6777const TargetInfo::GCCRegAlias LanaiTargetInfo::GCCRegAliases[] = {
6778 {{"pc"}, "r2"},
6779 {{"sp"}, "r4"},
6780 {{"fp"}, "r5"},
6781 {{"rv"}, "r8"},
6782 {{"rr1"}, "r10"},
6783 {{"rr2"}, "r11"},
6784 {{"rca"}, "r15"},
6785};
6786
6787ArrayRef<TargetInfo::GCCRegAlias> LanaiTargetInfo::getGCCRegAliases() const {
6788 return llvm::makeArrayRef(GCCRegAliases);
6789}
6790
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006791// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
6792class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00006793 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6794 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006795 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00006796public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006797 SparcTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
James Y Knighta3518ad2016-01-27 01:04:51 +00006798 : TargetInfo(Triple), SoftFloat(false) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006799
Joerg Sonnenbergerd0be8dc2016-03-07 17:19:15 +00006800 int getEHDataRegisterNumber(unsigned RegNo) const override {
6801 if (RegNo == 0) return 24;
6802 if (RegNo == 1) return 25;
6803 return -1;
6804 }
6805
Craig Topper3164f332014-03-11 03:39:26 +00006806 bool handleTargetFeatures(std::vector<std::string> &Features,
6807 DiagnosticsEngine &Diags) override {
Jacob Baungard Hansen13a49372016-05-24 08:30:08 +00006808 // Check if software floating point is enabled
Eric Christopherfb481a42015-04-29 23:32:17 +00006809 auto Feature = std::find(Features.begin(), Features.end(), "+soft-float");
6810 if (Feature != Features.end()) {
6811 SoftFloat = true;
Eric Christopherfb481a42015-04-29 23:32:17 +00006812 }
Rafael Espindolaeb265472013-08-21 21:59:03 +00006813 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006814 }
Craig Topper3164f332014-03-11 03:39:26 +00006815 void getTargetDefines(const LangOptions &Opts,
6816 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006817 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006818 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006819
6820 if (SoftFloat)
6821 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00006822 }
Craig Topper3164f332014-03-11 03:39:26 +00006823
6824 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006825 return llvm::StringSwitch<bool>(Feature)
6826 .Case("softfloat", SoftFloat)
6827 .Case("sparc", true)
6828 .Default(false);
6829 }
Craig Topper3164f332014-03-11 03:39:26 +00006830
Chris Dewhurst0381cd72016-06-15 12:44:47 +00006831 bool hasSjLjLowering() const override {
6832 return true;
6833 }
6834
Craig Topper6c03a542015-10-19 04:51:35 +00006835 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006836 // FIXME: Implement!
Craig Topper6c03a542015-10-19 04:51:35 +00006837 return None;
Gabor Greif49991682008-02-21 16:29:08 +00006838 }
Craig Topper3164f332014-03-11 03:39:26 +00006839 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006840 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00006841 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006842 ArrayRef<const char *> getGCCRegNames() const override;
6843 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00006844 bool validateAsmConstraint(const char *&Name,
6845 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006846 // FIXME: Implement!
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00006847 switch (*Name) {
6848 case 'I': // Signed 13-bit constant
6849 case 'J': // Zero
6850 case 'K': // 32-bit constant with the low 12 bits clear
6851 case 'L': // A constant in the range supported by movcc (11-bit signed imm)
6852 case 'M': // A constant in the range supported by movrcc (19-bit signed imm)
6853 case 'N': // Same as 'K' but zext (required for SIMode)
6854 case 'O': // The constant 4096
6855 return true;
6856 }
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006857 return false;
Gabor Greif49991682008-02-21 16:29:08 +00006858 }
Craig Topper3164f332014-03-11 03:39:26 +00006859 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006860 // FIXME: Implement!
6861 return "";
Gabor Greif49991682008-02-21 16:29:08 +00006862 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006863
6864 // No Sparc V7 for now, the backend doesn't support it anyway.
6865 enum CPUKind {
6866 CK_GENERIC,
6867 CK_V8,
6868 CK_SUPERSPARC,
6869 CK_SPARCLITE,
6870 CK_F934,
6871 CK_HYPERSPARC,
6872 CK_SPARCLITE86X,
6873 CK_SPARCLET,
6874 CK_TSC701,
6875 CK_V9,
6876 CK_ULTRASPARC,
6877 CK_ULTRASPARC3,
6878 CK_NIAGARA,
6879 CK_NIAGARA2,
6880 CK_NIAGARA3,
Douglas Katzman6871afc2016-03-15 22:34:02 +00006881 CK_NIAGARA4,
Douglas Katzman87da5f42016-07-25 16:36:02 +00006882 CK_MYRIAD2100,
6883 CK_MYRIAD2150,
6884 CK_MYRIAD2450,
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006885 CK_LEON2,
6886 CK_LEON2_AT697E,
6887 CK_LEON2_AT697F,
6888 CK_LEON3,
6889 CK_LEON3_UT699,
6890 CK_LEON3_GR712RC,
6891 CK_LEON4,
6892 CK_LEON4_GR740
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006893 } CPU = CK_GENERIC;
6894
6895 enum CPUGeneration {
6896 CG_V8,
6897 CG_V9,
6898 };
6899
6900 CPUGeneration getCPUGeneration(CPUKind Kind) const {
6901 switch (Kind) {
6902 case CK_GENERIC:
6903 case CK_V8:
6904 case CK_SUPERSPARC:
6905 case CK_SPARCLITE:
6906 case CK_F934:
6907 case CK_HYPERSPARC:
6908 case CK_SPARCLITE86X:
6909 case CK_SPARCLET:
6910 case CK_TSC701:
Douglas Katzman87da5f42016-07-25 16:36:02 +00006911 case CK_MYRIAD2100:
6912 case CK_MYRIAD2150:
6913 case CK_MYRIAD2450:
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006914 case CK_LEON2:
6915 case CK_LEON2_AT697E:
6916 case CK_LEON2_AT697F:
6917 case CK_LEON3:
6918 case CK_LEON3_UT699:
6919 case CK_LEON3_GR712RC:
6920 case CK_LEON4:
6921 case CK_LEON4_GR740:
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006922 return CG_V8;
6923 case CK_V9:
6924 case CK_ULTRASPARC:
6925 case CK_ULTRASPARC3:
6926 case CK_NIAGARA:
6927 case CK_NIAGARA2:
6928 case CK_NIAGARA3:
6929 case CK_NIAGARA4:
6930 return CG_V9;
6931 }
Aaron Ballmana9a72852015-11-11 13:42:02 +00006932 llvm_unreachable("Unexpected CPU kind");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006933 }
6934
6935 CPUKind getCPUKind(StringRef Name) const {
6936 return llvm::StringSwitch<CPUKind>(Name)
6937 .Case("v8", CK_V8)
6938 .Case("supersparc", CK_SUPERSPARC)
6939 .Case("sparclite", CK_SPARCLITE)
6940 .Case("f934", CK_F934)
6941 .Case("hypersparc", CK_HYPERSPARC)
6942 .Case("sparclite86x", CK_SPARCLITE86X)
6943 .Case("sparclet", CK_SPARCLET)
6944 .Case("tsc701", CK_TSC701)
6945 .Case("v9", CK_V9)
6946 .Case("ultrasparc", CK_ULTRASPARC)
6947 .Case("ultrasparc3", CK_ULTRASPARC3)
6948 .Case("niagara", CK_NIAGARA)
6949 .Case("niagara2", CK_NIAGARA2)
6950 .Case("niagara3", CK_NIAGARA3)
6951 .Case("niagara4", CK_NIAGARA4)
Douglas Katzman87da5f42016-07-25 16:36:02 +00006952 .Case("ma2100", CK_MYRIAD2100)
6953 .Case("ma2150", CK_MYRIAD2150)
6954 .Case("ma2450", CK_MYRIAD2450)
6955 // FIXME: the myriad2[.n] spellings are obsolete,
6956 // but a grace period is needed to allow updating dependent builds.
6957 .Case("myriad2", CK_MYRIAD2100)
6958 .Case("myriad2.1", CK_MYRIAD2100)
6959 .Case("myriad2.2", CK_MYRIAD2150)
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006960 .Case("leon2", CK_LEON2)
6961 .Case("at697e", CK_LEON2_AT697E)
6962 .Case("at697f", CK_LEON2_AT697F)
6963 .Case("leon3", CK_LEON3)
6964 .Case("ut699", CK_LEON3_UT699)
6965 .Case("gr712rc", CK_LEON3_GR712RC)
6966 .Case("leon4", CK_LEON4)
6967 .Case("gr740", CK_LEON4_GR740)
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006968 .Default(CK_GENERIC);
6969 }
6970
6971 bool setCPU(const std::string &Name) override {
6972 CPU = getCPUKind(Name);
6973 return CPU != CK_GENERIC;
6974 }
Gabor Greif49991682008-02-21 16:29:08 +00006975};
6976
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006977const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00006978 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6979 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6980 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6981 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
6982};
6983
Craig Topperf054e3a2015-10-19 03:52:27 +00006984ArrayRef<const char *> SparcTargetInfo::getGCCRegNames() const {
6985 return llvm::makeArrayRef(GCCRegNames);
Chris Lattner9b415d62009-01-27 01:58:38 +00006986}
6987
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006988const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00006989 { { "g0" }, "r0" },
6990 { { "g1" }, "r1" },
6991 { { "g2" }, "r2" },
6992 { { "g3" }, "r3" },
6993 { { "g4" }, "r4" },
6994 { { "g5" }, "r5" },
6995 { { "g6" }, "r6" },
6996 { { "g7" }, "r7" },
6997 { { "o0" }, "r8" },
6998 { { "o1" }, "r9" },
6999 { { "o2" }, "r10" },
7000 { { "o3" }, "r11" },
7001 { { "o4" }, "r12" },
7002 { { "o5" }, "r13" },
7003 { { "o6", "sp" }, "r14" },
7004 { { "o7" }, "r15" },
7005 { { "l0" }, "r16" },
7006 { { "l1" }, "r17" },
7007 { { "l2" }, "r18" },
7008 { { "l3" }, "r19" },
7009 { { "l4" }, "r20" },
7010 { { "l5" }, "r21" },
7011 { { "l6" }, "r22" },
7012 { { "l7" }, "r23" },
7013 { { "i0" }, "r24" },
7014 { { "i1" }, "r25" },
7015 { { "i2" }, "r26" },
7016 { { "i3" }, "r27" },
7017 { { "i4" }, "r28" },
7018 { { "i5" }, "r29" },
7019 { { "i6", "fp" }, "r30" },
7020 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00007021};
7022
Craig Topperf054e3a2015-10-19 03:52:27 +00007023ArrayRef<TargetInfo::GCCRegAlias> SparcTargetInfo::getGCCRegAliases() const {
7024 return llvm::makeArrayRef(GCCRegAliases);
Chris Lattner9b415d62009-01-27 01:58:38 +00007025}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007026
7027// SPARC v8 is the 32-bit mode selected by Triple::sparc.
7028class SparcV8TargetInfo : public SparcTargetInfo {
7029public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007030 SparcV8TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7031 : SparcTargetInfo(Triple, Opts) {
James Y Knightb214cbc2016-03-04 19:00:41 +00007032 resetDataLayout("E-m:e-p:32:32-i64:64-f128:64-n32-S64");
Brad Smith73859112015-08-13 21:45:57 +00007033 // NetBSD / OpenBSD use long (same as llvm default); everyone else uses int.
7034 switch (getTriple().getOS()) {
7035 default:
James Y Knight4b4d19e2015-06-04 15:36:29 +00007036 SizeType = UnsignedInt;
7037 IntPtrType = SignedInt;
7038 PtrDiffType = SignedInt;
Brad Smith73859112015-08-13 21:45:57 +00007039 break;
7040 case llvm::Triple::NetBSD:
7041 case llvm::Triple::OpenBSD:
7042 SizeType = UnsignedLong;
7043 IntPtrType = SignedLong;
7044 PtrDiffType = SignedLong;
7045 break;
Brad Smith56495d52015-08-13 22:00:53 +00007046 }
Douglas Katzman13f4a912016-11-09 15:43:51 +00007047 // Up to 32 bits are lock-free atomic, but we're willing to do atomic ops
7048 // on up to 64 bits.
7049 MaxAtomicPromoteWidth = 64;
7050 MaxAtomicInlineWidth = 32;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007051 }
7052
Craig Topper3164f332014-03-11 03:39:26 +00007053 void getTargetDefines(const LangOptions &Opts,
7054 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007055 SparcTargetInfo::getTargetDefines(Opts, Builder);
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00007056 switch (getCPUGeneration(CPU)) {
7057 case CG_V8:
7058 Builder.defineMacro("__sparcv8");
7059 if (getTriple().getOS() != llvm::Triple::Solaris)
7060 Builder.defineMacro("__sparcv8__");
7061 break;
7062 case CG_V9:
7063 Builder.defineMacro("__sparcv9");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00007064 if (getTriple().getOS() != llvm::Triple::Solaris) {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00007065 Builder.defineMacro("__sparcv9__");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00007066 Builder.defineMacro("__sparc_v9__");
7067 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00007068 break;
7069 }
Douglas Katzman6871afc2016-03-15 22:34:02 +00007070 if (getTriple().getVendor() == llvm::Triple::Myriad) {
Douglas Katzman87da5f42016-07-25 16:36:02 +00007071 std::string MyriadArchValue, Myriad2Value;
7072 Builder.defineMacro("__sparc_v8__");
7073 Builder.defineMacro("__leon__");
Douglas Katzman6871afc2016-03-15 22:34:02 +00007074 switch (CPU) {
Douglas Katzman87da5f42016-07-25 16:36:02 +00007075 case CK_MYRIAD2150:
7076 MyriadArchValue = "__ma2150";
7077 Myriad2Value = "2";
Douglas Katzman6871afc2016-03-15 22:34:02 +00007078 break;
Douglas Katzman87da5f42016-07-25 16:36:02 +00007079 case CK_MYRIAD2450:
7080 MyriadArchValue = "__ma2450";
7081 Myriad2Value = "2";
Douglas Katzman6871afc2016-03-15 22:34:02 +00007082 break;
7083 default:
Douglas Katzman87da5f42016-07-25 16:36:02 +00007084 MyriadArchValue = "__ma2100";
7085 Myriad2Value = "1";
Douglas Katzman6871afc2016-03-15 22:34:02 +00007086 break;
7087 }
Douglas Katzman87da5f42016-07-25 16:36:02 +00007088 Builder.defineMacro(MyriadArchValue, "1");
7089 Builder.defineMacro(MyriadArchValue+"__", "1");
7090 Builder.defineMacro("__myriad2__", Myriad2Value);
7091 Builder.defineMacro("__myriad2", Myriad2Value);
Douglas Katzman6871afc2016-03-15 22:34:02 +00007092 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007093 }
Chris Dewhurst69fa1922016-05-04 09:33:30 +00007094
7095 bool hasSjLjLowering() const override {
7096 return true;
7097 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007098};
7099
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007100// SPARCV8el is the 32-bit little-endian mode selected by Triple::sparcel.
7101class SparcV8elTargetInfo : public SparcV8TargetInfo {
7102 public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007103 SparcV8elTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7104 : SparcV8TargetInfo(Triple, Opts) {
7105 resetDataLayout("e-m:e-p:32:32-i64:64-f128:64-n32-S64");
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007106 }
7107};
7108
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007109// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
7110class SparcV9TargetInfo : public SparcTargetInfo {
7111public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007112 SparcV9TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7113 : SparcTargetInfo(Triple, Opts) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007114 // FIXME: Support Sparc quad-precision long double?
James Y Knightb214cbc2016-03-04 19:00:41 +00007115 resetDataLayout("E-m:e-i64:64-n32:64-S128");
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00007116 // This is an LP64 platform.
7117 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00007118
7119 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00007120 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00007121 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00007122 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00007123 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00007124 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00007125
7126 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
7127 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
7128 LongDoubleWidth = 128;
7129 LongDoubleAlign = 128;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007130 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00007131 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007132 }
7133
Craig Topper3164f332014-03-11 03:39:26 +00007134 void getTargetDefines(const LangOptions &Opts,
7135 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007136 SparcTargetInfo::getTargetDefines(Opts, Builder);
7137 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00007138 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00007139 // Solaris doesn't need these variants, but the BSDs do.
7140 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00007141 Builder.defineMacro("__sparc64__");
7142 Builder.defineMacro("__sparc_v9__");
7143 Builder.defineMacro("__sparcv9__");
7144 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007145 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00007146
Craig Topper3164f332014-03-11 03:39:26 +00007147 bool setCPU(const std::string &Name) override {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00007148 if (!SparcTargetInfo::setCPU(Name))
7149 return false;
7150 return getCPUGeneration(CPU) == CG_V9;
Roman Divackyb1ae3d42014-02-25 18:35:30 +00007151 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007152};
7153
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007154class SystemZTargetInfo : public TargetInfo {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007155 static const Builtin::Info BuiltinInfo[];
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007156 static const char *const GCCRegNames[];
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007157 std::string CPU;
7158 bool HasTransactionalExecution;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007159 bool HasVector;
Ulrich Weigand47445072013-05-06 16:26:41 +00007160
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007161public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007162 SystemZTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Eric Christopherb093d692015-10-09 18:39:59 +00007163 : TargetInfo(Triple), CPU("z10"), HasTransactionalExecution(false),
7164 HasVector(false) {
Ulrich Weigand881497a2015-03-30 13:50:21 +00007165 IntMaxType = SignedLong;
7166 Int64Type = SignedLong;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007167 TLSSupported = true;
7168 IntWidth = IntAlign = 32;
7169 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
7170 PointerWidth = PointerAlign = 64;
7171 LongDoubleWidth = 128;
7172 LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007173 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Ulrich Weigandca3cb7f2015-04-21 17:29:35 +00007174 DefaultAlignForAttributeAligned = 64;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007175 MinGlobalAlign = 16;
James Y Knightb214cbc2016-03-04 19:00:41 +00007176 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 +00007177 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
7178 }
7179 void getTargetDefines(const LangOptions &Opts,
7180 MacroBuilder &Builder) const override {
7181 Builder.defineMacro("__s390__");
7182 Builder.defineMacro("__s390x__");
7183 Builder.defineMacro("__zarch__");
7184 Builder.defineMacro("__LONG_DOUBLE_128__");
Ulrich Weigandb038a522016-02-05 21:34:28 +00007185
Ulrich Weigand82a86cb2017-02-06 17:04:22 +00007186 const std::string ISARev = llvm::StringSwitch<std::string>(CPU)
7187 .Cases("arch8", "z10", "8")
7188 .Cases("arch9", "z196", "9")
7189 .Cases("arch10", "zEC12", "10")
7190 .Cases("arch11", "z13", "11")
7191 .Default("");
7192 if (!ISARev.empty())
7193 Builder.defineMacro("__ARCH__", ISARev);
7194
Ulrich Weigandb038a522016-02-05 21:34:28 +00007195 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
7196 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
7197 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
7198 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
7199
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007200 if (HasTransactionalExecution)
7201 Builder.defineMacro("__HTM__");
Ulrich Weigand82a86cb2017-02-06 17:04:22 +00007202 if (HasVector)
7203 Builder.defineMacro("__VX__");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00007204 if (Opts.ZVector)
7205 Builder.defineMacro("__VEC__", "10301");
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007206 }
Craig Topper6c03a542015-10-19 04:51:35 +00007207 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7208 return llvm::makeArrayRef(BuiltinInfo,
7209 clang::SystemZ::LastTSBuiltin-Builtin::FirstTSBuiltin);
Ulrich Weigand47445072013-05-06 16:26:41 +00007210 }
7211
Craig Topperf054e3a2015-10-19 03:52:27 +00007212 ArrayRef<const char *> getGCCRegNames() const override;
7213 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007214 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00007215 return None;
Ulrich Weigand47445072013-05-06 16:26:41 +00007216 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007217 bool validateAsmConstraint(const char *&Name,
7218 TargetInfo::ConstraintInfo &info) const override;
7219 const char *getClobbers() const override {
7220 // FIXME: Is this really right?
7221 return "";
7222 }
7223 BuiltinVaListKind getBuiltinVaListKind() const override {
7224 return TargetInfo::SystemZBuiltinVaList;
7225 }
7226 bool setCPU(const std::string &Name) override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007227 CPU = Name;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007228 bool CPUKnown = llvm::StringSwitch<bool>(Name)
7229 .Case("z10", true)
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007230 .Case("arch8", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007231 .Case("z196", true)
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007232 .Case("arch9", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007233 .Case("zEC12", true)
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007234 .Case("arch10", true)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007235 .Case("z13", true)
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007236 .Case("arch11", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007237 .Default(false);
7238
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007239 return CPUKnown;
7240 }
Eric Christopher8c47b422015-10-09 18:39:55 +00007241 bool
7242 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7243 StringRef CPU,
7244 const std::vector<std::string> &FeaturesVec) const override {
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007245 if (CPU == "zEC12" || CPU == "arch10")
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007246 Features["transactional-execution"] = true;
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007247 if (CPU == "z13" || CPU == "arch11") {
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007248 Features["transactional-execution"] = true;
7249 Features["vector"] = true;
7250 }
Eric Christopher007b0a02015-08-28 22:32:01 +00007251 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007252 }
7253
7254 bool handleTargetFeatures(std::vector<std::string> &Features,
7255 DiagnosticsEngine &Diags) override {
7256 HasTransactionalExecution = false;
Eric Christopher610fe112015-08-26 08:21:55 +00007257 for (const auto &Feature : Features) {
7258 if (Feature == "+transactional-execution")
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007259 HasTransactionalExecution = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007260 else if (Feature == "+vector")
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007261 HasVector = true;
7262 }
7263 // If we use the vector ABI, vector types are 64-bit aligned.
7264 if (HasVector) {
7265 MaxVectorAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00007266 resetDataLayout("E-m:e-i1:8:16-i8:8:16-i64:64-f128:64"
7267 "-v128:64-a:8:16-n32:64");
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007268 }
7269 return true;
7270 }
7271
7272 bool hasFeature(StringRef Feature) const override {
7273 return llvm::StringSwitch<bool>(Feature)
Ulrich Weigandcc673442015-04-01 14:15:35 +00007274 .Case("systemz", true)
7275 .Case("htm", HasTransactionalExecution)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007276 .Case("vx", HasVector)
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007277 .Default(false);
7278 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007279
Bryan Chane3f1ed52016-04-28 13:56:43 +00007280 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
7281 switch (CC) {
7282 case CC_C:
7283 case CC_Swift:
7284 return CCCR_OK;
7285 default:
7286 return CCCR_Warning;
7287 }
7288 }
7289
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007290 StringRef getABI() const override {
7291 if (HasVector)
7292 return "vector";
7293 return "";
7294 }
Ulrich Weigand47fd2532015-06-16 15:21:47 +00007295
7296 bool useFloat128ManglingForLongDouble() const override {
7297 return true;
7298 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007299};
7300
7301const Builtin::Info SystemZTargetInfo::BuiltinInfo[] = {
7302#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00007303 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Jonas Paulsson3ace74a2016-03-30 15:51:24 +00007304#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
7305 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007306#include "clang/Basic/BuiltinsSystemZ.def"
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007307};
7308
7309const char *const SystemZTargetInfo::GCCRegNames[] = {
7310 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
7311 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
7312 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
7313 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
7314};
7315
Craig Topperf054e3a2015-10-19 03:52:27 +00007316ArrayRef<const char *> SystemZTargetInfo::getGCCRegNames() const {
7317 return llvm::makeArrayRef(GCCRegNames);
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007318}
7319
7320bool SystemZTargetInfo::
7321validateAsmConstraint(const char *&Name,
7322 TargetInfo::ConstraintInfo &Info) const {
7323 switch (*Name) {
7324 default:
7325 return false;
7326
7327 case 'a': // Address register
7328 case 'd': // Data register (equivalent to 'r')
7329 case 'f': // Floating-point register
7330 Info.setAllowsRegister();
7331 return true;
7332
7333 case 'I': // Unsigned 8-bit constant
7334 case 'J': // Unsigned 12-bit constant
7335 case 'K': // Signed 16-bit constant
7336 case 'L': // Signed 20-bit displacement (on all targets we support)
7337 case 'M': // 0x7fffffff
7338 return true;
7339
7340 case 'Q': // Memory with base and unsigned 12-bit displacement
7341 case 'R': // Likewise, plus an index
7342 case 'S': // Memory with base and signed 20-bit displacement
7343 case 'T': // Likewise, plus an index
7344 Info.setAllowsMemory();
7345 return true;
7346 }
7347}
Ulrich Weigand47445072013-05-06 16:26:41 +00007348
Eric Christopherc48497a2015-09-18 21:26:24 +00007349class MSP430TargetInfo : public TargetInfo {
7350 static const char *const GCCRegNames[];
Anton Korobeynikova0f54372009-05-03 13:43:08 +00007351
Eric Christopherc48497a2015-09-18 21:26:24 +00007352public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007353 MSP430TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7354 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007355 TLSSupported = false;
7356 IntWidth = 16;
7357 IntAlign = 16;
7358 LongWidth = 32;
7359 LongLongWidth = 64;
7360 LongAlign = LongLongAlign = 16;
7361 PointerWidth = 16;
7362 PointerAlign = 16;
7363 SuitableAlign = 16;
7364 SizeType = UnsignedInt;
7365 IntMaxType = SignedLongLong;
7366 IntPtrType = SignedInt;
7367 PtrDiffType = SignedInt;
7368 SigAtomicType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00007369 resetDataLayout("e-m:e-p:16:16-i32:16:32-a:16-n8:16");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00007370 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007371 void getTargetDefines(const LangOptions &Opts,
7372 MacroBuilder &Builder) const override {
7373 Builder.defineMacro("MSP430");
7374 Builder.defineMacro("__MSP430__");
7375 // FIXME: defines for different 'flavours' of MCU
7376 }
Craig Topper6c03a542015-10-19 04:51:35 +00007377 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00007378 // FIXME: Implement.
Craig Topper6c03a542015-10-19 04:51:35 +00007379 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00007380 }
7381 bool hasFeature(StringRef Feature) const override {
7382 return Feature == "msp430";
7383 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007384 ArrayRef<const char *> getGCCRegNames() const override;
7385 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00007386 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00007387 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00007388 }
7389 bool validateAsmConstraint(const char *&Name,
7390 TargetInfo::ConstraintInfo &info) const override {
7391 // FIXME: implement
7392 switch (*Name) {
7393 case 'K': // the constant 1
7394 case 'L': // constant -1^20 .. 1^19
7395 case 'M': // constant 1-4:
Eli Friedmana9c3d712009-08-19 20:47:07 +00007396 return true;
7397 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007398 // No target constraints for now.
7399 return false;
7400 }
7401 const char *getClobbers() const override {
7402 // FIXME: Is this really right?
7403 return "";
7404 }
7405 BuiltinVaListKind getBuiltinVaListKind() const override {
7406 // FIXME: implement
7407 return TargetInfo::CharPtrBuiltinVaList;
7408 }
7409};
7410
7411const char *const MSP430TargetInfo::GCCRegNames[] = {
7412 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
7413 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"};
7414
Craig Topperf054e3a2015-10-19 03:52:27 +00007415ArrayRef<const char *> MSP430TargetInfo::getGCCRegNames() const {
7416 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00007417}
7418
7419// LLVM and Clang cannot be used directly to output native binaries for
7420// target, but is used to compile C code to llvm bitcode with correct
7421// type and alignment information.
7422//
7423// TCE uses the llvm bitcode as input and uses it for generating customized
7424// target processor and program binary. TCE co-design environment is
7425// publicly available in http://tce.cs.tut.fi
7426
7427static const unsigned TCEOpenCLAddrSpaceMap[] = {
Yaxun Liub34ec822017-04-11 17:24:23 +00007428 0, // Default
Eric Christopherc48497a2015-09-18 21:26:24 +00007429 3, // opencl_global
7430 4, // opencl_local
7431 5, // opencl_constant
7432 // FIXME: generic has to be added to the target
7433 0, // opencl_generic
7434 0, // cuda_device
7435 0, // cuda_constant
7436 0 // cuda_shared
7437};
7438
7439class TCETargetInfo : public TargetInfo {
7440public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007441 TCETargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7442 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007443 TLSSupported = false;
7444 IntWidth = 32;
7445 LongWidth = LongLongWidth = 32;
7446 PointerWidth = 32;
7447 IntAlign = 32;
7448 LongAlign = LongLongAlign = 32;
7449 PointerAlign = 32;
7450 SuitableAlign = 32;
7451 SizeType = UnsignedInt;
7452 IntMaxType = SignedLong;
7453 IntPtrType = SignedInt;
7454 PtrDiffType = SignedInt;
7455 FloatWidth = 32;
7456 FloatAlign = 32;
7457 DoubleWidth = 32;
7458 DoubleAlign = 32;
7459 LongDoubleWidth = 32;
7460 LongDoubleAlign = 32;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007461 FloatFormat = &llvm::APFloat::IEEEsingle();
7462 DoubleFormat = &llvm::APFloat::IEEEsingle();
7463 LongDoubleFormat = &llvm::APFloat::IEEEsingle();
Pekka Jaaskelainen67354482016-11-16 15:22:31 +00007464 resetDataLayout("E-p:32:32:32-i1:8:8-i8:8:32-"
7465 "i16:16:32-i32:32:32-i64:32:32-"
7466 "f32:32:32-f64:32:32-v64:32:32-"
7467 "v128:32:32-v256:32:32-v512:32:32-"
7468 "v1024:32:32-a0:0:32-n32");
Eric Christopherc48497a2015-09-18 21:26:24 +00007469 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
7470 UseAddrSpaceMapMangling = true;
7471 }
7472
7473 void getTargetDefines(const LangOptions &Opts,
7474 MacroBuilder &Builder) const override {
7475 DefineStd(Builder, "tce", Opts);
7476 Builder.defineMacro("__TCE__");
7477 Builder.defineMacro("__TCE_V1__");
7478 }
7479 bool hasFeature(StringRef Feature) const override { return Feature == "tce"; }
7480
Craig Topper6c03a542015-10-19 04:51:35 +00007481 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007482 const char *getClobbers() const override { return ""; }
7483 BuiltinVaListKind getBuiltinVaListKind() const override {
7484 return TargetInfo::VoidPtrBuiltinVaList;
7485 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007486 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007487 bool validateAsmConstraint(const char *&Name,
7488 TargetInfo::ConstraintInfo &info) const override {
7489 return true;
7490 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007491 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7492 return None;
7493 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007494};
Eli Friedmana9c3d712009-08-19 20:47:07 +00007495
Pekka Jaaskelainen67354482016-11-16 15:22:31 +00007496class TCELETargetInfo : public TCETargetInfo {
7497public:
7498 TCELETargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7499 : TCETargetInfo(Triple, Opts) {
7500 BigEndian = false;
7501
7502 resetDataLayout("e-p:32:32:32-i1:8:8-i8:8:32-"
7503 "i16:16:32-i32:32:32-i64:32:32-"
7504 "f32:32:32-f64:32:32-v64:32:32-"
7505 "v128:32:32-v256:32:32-v512:32:32-"
7506 "v1024:32:32-a0:0:32-n32");
7507
7508 }
7509
7510 virtual void getTargetDefines(const LangOptions &Opts,
7511 MacroBuilder &Builder) const {
7512 DefineStd(Builder, "tcele", Opts);
7513 Builder.defineMacro("__TCE__");
7514 Builder.defineMacro("__TCE_V1__");
7515 Builder.defineMacro("__TCELE__");
7516 Builder.defineMacro("__TCELE_V1__");
7517 }
7518
7519};
7520
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007521class BPFTargetInfo : public TargetInfo {
7522public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007523 BPFTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7524 : TargetInfo(Triple) {
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007525 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
7526 SizeType = UnsignedLong;
7527 PtrDiffType = SignedLong;
7528 IntPtrType = SignedLong;
7529 IntMaxType = SignedLong;
7530 Int64Type = SignedLong;
7531 RegParmMax = 5;
7532 if (Triple.getArch() == llvm::Triple::bpfeb) {
James Y Knightb214cbc2016-03-04 19:00:41 +00007533 resetDataLayout("E-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007534 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00007535 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007536 }
7537 MaxAtomicPromoteWidth = 64;
7538 MaxAtomicInlineWidth = 64;
7539 TLSSupported = false;
7540 }
7541 void getTargetDefines(const LangOptions &Opts,
7542 MacroBuilder &Builder) const override {
7543 DefineStd(Builder, "bpf", Opts);
7544 Builder.defineMacro("__BPF__");
7545 }
7546 bool hasFeature(StringRef Feature) const override {
7547 return Feature == "bpf";
7548 }
7549
Craig Topper6c03a542015-10-19 04:51:35 +00007550 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007551 const char *getClobbers() const override {
7552 return "";
7553 }
7554 BuiltinVaListKind getBuiltinVaListKind() const override {
7555 return TargetInfo::VoidPtrBuiltinVaList;
7556 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007557 ArrayRef<const char *> getGCCRegNames() const override {
7558 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007559 }
7560 bool validateAsmConstraint(const char *&Name,
7561 TargetInfo::ConstraintInfo &info) const override {
7562 return true;
7563 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007564 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7565 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007566 }
7567};
7568
Daniel Sanders4672af62016-05-27 11:51:02 +00007569class MipsTargetInfo : public TargetInfo {
7570 void setDataLayout() {
Daniel Sanders55e40692016-06-03 10:11:01 +00007571 StringRef Layout;
7572
7573 if (ABI == "o32")
7574 Layout = "m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
7575 else if (ABI == "n32")
Daniel Sanders6a738832016-07-19 10:49:03 +00007576 Layout = "m:e-p:32:32-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Daniel Sanders55e40692016-06-03 10:11:01 +00007577 else if (ABI == "n64")
Daniel Sanders6a738832016-07-19 10:49:03 +00007578 Layout = "m:e-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Daniel Sanders55e40692016-06-03 10:11:01 +00007579 else
7580 llvm_unreachable("Invalid ABI");
7581
7582 if (BigEndian)
7583 resetDataLayout(("E-" + Layout).str());
7584 else
7585 resetDataLayout(("e-" + Layout).str());
Daniel Sanders4672af62016-05-27 11:51:02 +00007586 }
7587
Akira Hatanaka9064e362013-10-29 18:30:33 +00007588
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00007589 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007590 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00007591 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00007592 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007593 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00007594 bool IsSingleFloat;
Simon Dardisdf827a72017-02-21 16:01:00 +00007595 bool IsNoABICalls;
7596 bool CanUseBSDABICalls;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007597 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00007598 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007599 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007600 enum DspRevEnum {
7601 NoDSP, DSP1, DSP2
7602 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00007603 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007604
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007605protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00007606 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007607 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007608
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007609public:
Daniel Sanders4672af62016-05-27 11:51:02 +00007610 MipsTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007611 : TargetInfo(Triple), IsMips16(false), IsMicromips(false),
Simon Dardisdf827a72017-02-21 16:01:00 +00007612 IsNan2008(false), IsSingleFloat(false), IsNoABICalls(false),
7613 CanUseBSDABICalls(false), FloatABI(HardFloat), DspRev(NoDSP),
7614 HasMSA(false), HasFP64(false) {
Zoran Jovanovic26a12162015-02-18 15:21:35 +00007615 TheCXXABI.set(TargetCXXABI::GenericMIPS);
Daniel Sanders4672af62016-05-27 11:51:02 +00007616
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007617 setABI((getTriple().getArch() == llvm::Triple::mips ||
7618 getTriple().getArch() == llvm::Triple::mipsel)
7619 ? "o32"
7620 : "n64");
7621
7622 CPU = ABI == "o32" ? "mips32r2" : "mips64r2";
Simon Dardisdf827a72017-02-21 16:01:00 +00007623
7624 CanUseBSDABICalls = Triple.getOS() == llvm::Triple::FreeBSD ||
7625 Triple.getOS() == llvm::Triple::OpenBSD;
Zoran Jovanovic26a12162015-02-18 15:21:35 +00007626 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007627
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007628 bool isNaN2008Default() const {
7629 return CPU == "mips32r6" || CPU == "mips64r6";
7630 }
7631
7632 bool isFP64Default() const {
7633 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
7634 }
7635
Petar Jovanovicd55ae6b2015-02-26 18:19:22 +00007636 bool isNan2008() const override {
7637 return IsNan2008;
7638 }
7639
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007640 bool processorSupportsGPR64() const {
7641 return llvm::StringSwitch<bool>(CPU)
7642 .Case("mips3", true)
7643 .Case("mips4", true)
7644 .Case("mips5", true)
7645 .Case("mips64", true)
7646 .Case("mips64r2", true)
7647 .Case("mips64r3", true)
7648 .Case("mips64r5", true)
7649 .Case("mips64r6", true)
7650 .Case("octeon", true)
7651 .Default(false);
7652 return false;
7653 }
7654
Alp Toker4925ba72014-06-07 23:30:42 +00007655 StringRef getABI() const override { return ABI; }
Daniel Sanders4672af62016-05-27 11:51:02 +00007656 bool setABI(const std::string &Name) override {
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007657 if (Name == "o32") {
7658 setO32ABITypes();
7659 ABI = Name;
7660 return true;
Daniel Sanders4672af62016-05-27 11:51:02 +00007661 }
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007662
7663 if (Name == "n32") {
7664 setN32ABITypes();
7665 ABI = Name;
7666 return true;
7667 }
7668 if (Name == "n64") {
7669 setN64ABITypes();
7670 ABI = Name;
7671 return true;
Daniel Sanders4672af62016-05-27 11:51:02 +00007672 }
7673 return false;
7674 }
7675
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007676 void setO32ABITypes() {
7677 Int64Type = SignedLongLong;
7678 IntMaxType = Int64Type;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007679 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007680 LongDoubleWidth = LongDoubleAlign = 64;
7681 LongWidth = LongAlign = 32;
7682 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
7683 PointerWidth = PointerAlign = 32;
7684 PtrDiffType = SignedInt;
7685 SizeType = UnsignedInt;
7686 SuitableAlign = 64;
7687 }
7688
7689 void setN32N64ABITypes() {
7690 LongDoubleWidth = LongDoubleAlign = 128;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007691 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007692 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
7693 LongDoubleWidth = LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007694 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007695 }
7696 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
7697 SuitableAlign = 128;
7698 }
7699
Daniel Sanders4672af62016-05-27 11:51:02 +00007700 void setN64ABITypes() {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007701 setN32N64ABITypes();
Brad Smith8e55bd52017-03-06 23:48:31 +00007702 if (getTriple().getOS() == llvm::Triple::OpenBSD) {
7703 Int64Type = SignedLongLong;
7704 } else {
7705 Int64Type = SignedLong;
7706 }
Daniel Sanders4672af62016-05-27 11:51:02 +00007707 IntMaxType = Int64Type;
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007708 LongWidth = LongAlign = 64;
7709 PointerWidth = PointerAlign = 64;
7710 PtrDiffType = SignedLong;
7711 SizeType = UnsignedLong;
Daniel Sanders4672af62016-05-27 11:51:02 +00007712 }
7713
7714 void setN32ABITypes() {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007715 setN32N64ABITypes();
Daniel Sanders4672af62016-05-27 11:51:02 +00007716 Int64Type = SignedLongLong;
7717 IntMaxType = Int64Type;
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007718 LongWidth = LongAlign = 32;
7719 PointerWidth = PointerAlign = 32;
7720 PtrDiffType = SignedInt;
7721 SizeType = UnsignedInt;
Daniel Sanders4672af62016-05-27 11:51:02 +00007722 }
7723
Craig Topper3164f332014-03-11 03:39:26 +00007724 bool setCPU(const std::string &Name) override {
Eric Christopher0b26a612010-03-02 02:41:08 +00007725 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007726 return llvm::StringSwitch<bool>(Name)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007727 .Case("mips1", true)
7728 .Case("mips2", true)
Simon Atanasyan26610c52014-07-04 12:36:56 +00007729 .Case("mips3", true)
7730 .Case("mips4", true)
7731 .Case("mips5", true)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007732 .Case("mips32", true)
7733 .Case("mips32r2", true)
7734 .Case("mips32r3", true)
7735 .Case("mips32r5", true)
7736 .Case("mips32r6", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007737 .Case("mips64", true)
7738 .Case("mips64r2", true)
Simon Atanasyan162feb52015-02-20 23:37:40 +00007739 .Case("mips64r3", true)
7740 .Case("mips64r5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007741 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00007742 .Case("octeon", true)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007743 .Case("p5600", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007744 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00007745 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00007746 const std::string& getCPU() const { return CPU; }
Eric Christopher8c47b422015-10-09 18:39:55 +00007747 bool
7748 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7749 StringRef CPU,
7750 const std::vector<std::string> &FeaturesVec) const override {
Bhushan D. Attardebacb988732016-03-04 06:56:29 +00007751 if (CPU.empty())
7752 CPU = getCPU();
Simon Atanasyan4e16a422014-07-04 12:37:04 +00007753 if (CPU == "octeon")
7754 Features["mips64r2"] = Features["cnmips"] = true;
7755 else
7756 Features[CPU] = true;
Eric Christopher007b0a02015-08-28 22:32:01 +00007757 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Eric Christopher0b26a612010-03-02 02:41:08 +00007758 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007759
Craig Topper3164f332014-03-11 03:39:26 +00007760 void getTargetDefines(const LangOptions &Opts,
7761 MacroBuilder &Builder) const override {
Daniel Sanders4672af62016-05-27 11:51:02 +00007762 if (BigEndian) {
7763 DefineStd(Builder, "MIPSEB", Opts);
7764 Builder.defineMacro("_MIPSEB");
7765 } else {
7766 DefineStd(Builder, "MIPSEL", Opts);
7767 Builder.defineMacro("_MIPSEL");
7768 }
7769
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007770 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00007771 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007772 if (Opts.GNUMode)
7773 Builder.defineMacro("mips");
7774
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007775 if (ABI == "o32") {
Daniel Sanders4672af62016-05-27 11:51:02 +00007776 Builder.defineMacro("__mips", "32");
7777 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
7778 } else {
7779 Builder.defineMacro("__mips", "64");
7780 Builder.defineMacro("__mips64");
7781 Builder.defineMacro("__mips64__");
7782 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
7783 }
7784
7785 const std::string ISARev = llvm::StringSwitch<std::string>(getCPU())
7786 .Cases("mips32", "mips64", "1")
7787 .Cases("mips32r2", "mips64r2", "2")
7788 .Cases("mips32r3", "mips64r3", "3")
7789 .Cases("mips32r5", "mips64r5", "5")
7790 .Cases("mips32r6", "mips64r6", "6")
7791 .Default("");
7792 if (!ISARev.empty())
7793 Builder.defineMacro("__mips_isa_rev", ISARev);
7794
7795 if (ABI == "o32") {
7796 Builder.defineMacro("__mips_o32");
7797 Builder.defineMacro("_ABIO32", "1");
7798 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
Daniel Sanders07c86542016-05-27 14:30:23 +00007799 } else if (ABI == "n32") {
Daniel Sanders4672af62016-05-27 11:51:02 +00007800 Builder.defineMacro("__mips_n32");
7801 Builder.defineMacro("_ABIN32", "2");
7802 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
7803 } else if (ABI == "n64") {
7804 Builder.defineMacro("__mips_n64");
7805 Builder.defineMacro("_ABI64", "3");
7806 Builder.defineMacro("_MIPS_SIM", "_ABI64");
7807 } else
7808 llvm_unreachable("Invalid ABI.");
7809
Simon Dardisdf827a72017-02-21 16:01:00 +00007810 if (!IsNoABICalls) {
7811 Builder.defineMacro("__mips_abicalls");
7812 if (CanUseBSDABICalls)
7813 Builder.defineMacro("__ABICALLS__");
7814 }
7815
Simon Atanasyan683535b2012-08-29 19:14:58 +00007816 Builder.defineMacro("__REGISTER_PREFIX__", "");
7817
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007818 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007819 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00007820 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007821 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007822 case SoftFloat:
7823 Builder.defineMacro("__mips_soft_float", Twine(1));
7824 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00007825 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00007826
Simon Atanasyan16071912013-04-14 14:07:30 +00007827 if (IsSingleFloat)
7828 Builder.defineMacro("__mips_single_float", Twine(1));
7829
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007830 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
7831 Builder.defineMacro("_MIPS_FPSET",
7832 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
7833
Simon Atanasyan72244b62012-07-05 16:06:06 +00007834 if (IsMips16)
7835 Builder.defineMacro("__mips16", Twine(1));
7836
Simon Atanasyan60777612013-04-14 14:07:51 +00007837 if (IsMicromips)
7838 Builder.defineMacro("__mips_micromips", Twine(1));
7839
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007840 if (IsNan2008)
7841 Builder.defineMacro("__mips_nan2008", Twine(1));
7842
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007843 switch (DspRev) {
7844 default:
7845 break;
7846 case DSP1:
7847 Builder.defineMacro("__mips_dsp_rev", Twine(1));
7848 Builder.defineMacro("__mips_dsp", Twine(1));
7849 break;
7850 case DSP2:
7851 Builder.defineMacro("__mips_dsp_rev", Twine(2));
7852 Builder.defineMacro("__mips_dspr2", Twine(1));
7853 Builder.defineMacro("__mips_dsp", Twine(1));
7854 break;
7855 }
7856
Jack Carter44ff1e52013-08-12 17:20:29 +00007857 if (HasMSA)
7858 Builder.defineMacro("__mips_msa", Twine(1));
7859
Simon Atanasyan26f19672012-04-05 19:28:31 +00007860 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
7861 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
7862 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00007863
7864 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
7865 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Daniel Sanders5176f7e2015-12-22 12:59:30 +00007866
7867 // These shouldn't be defined for MIPS-I but there's no need to check
7868 // for that since MIPS-I isn't supported.
7869 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
7870 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
7871 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007872
7873 // 32-bit MIPS processors don't have the necessary lld/scd instructions
7874 // found in 64-bit processors. In the case of O32 on a 64-bit processor,
7875 // the instructions exist but using them violates the ABI since they
7876 // require 64-bit GPRs and O32 only supports 32-bit GPRs.
7877 if (ABI == "n32" || ABI == "n64")
Daniel Sanders4672af62016-05-27 11:51:02 +00007878 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007879 }
7880
Craig Topper6c03a542015-10-19 04:51:35 +00007881 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7882 return llvm::makeArrayRef(BuiltinInfo,
7883 clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin);
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007884 }
Craig Topper3164f332014-03-11 03:39:26 +00007885 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00007886 return llvm::StringSwitch<bool>(Feature)
7887 .Case("mips", true)
7888 .Case("fp64", HasFP64)
7889 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00007890 }
Craig Topper3164f332014-03-11 03:39:26 +00007891 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00007892 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007893 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007894 ArrayRef<const char *> getGCCRegNames() const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00007895 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00007896 // CPU register names
7897 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007898 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
7899 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
7900 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00007901 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
7902 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007903 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
7904 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
7905 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
7906 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00007907 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007908 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Hrvoje Varga14c42ee2016-03-29 12:46:16 +00007909 "$fcc5","$fcc6","$fcc7","$ac1hi","$ac1lo","$ac2hi","$ac2lo",
7910 "$ac3hi","$ac3lo",
Daniel Sanders8b59af12013-11-12 12:56:01 +00007911 // MSA register names
7912 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
7913 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
7914 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
7915 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
7916 // MSA control register names
7917 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
7918 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007919 };
Craig Topperf054e3a2015-10-19 03:52:27 +00007920 return llvm::makeArrayRef(GCCRegNames);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007921 }
Craig Topper3164f332014-03-11 03:39:26 +00007922 bool validateAsmConstraint(const char *&Name,
7923 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007924 switch (*Name) {
7925 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00007926 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007927 case 'r': // CPU registers.
7928 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00007929 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007930 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00007931 case 'c': // $25 for indirect jumps
7932 case 'l': // lo register
7933 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007934 Info.setAllowsRegister();
7935 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00007936 case 'I': // Signed 16-bit constant
7937 case 'J': // Integer 0
7938 case 'K': // Unsigned 16-bit constant
7939 case 'L': // Signed 32-bit constant, lower 16-bit zeros (for lui)
7940 case 'M': // Constants not loadable via lui, addiu, or ori
7941 case 'N': // Constant -1 to -65535
7942 case 'O': // A signed 15-bit constant
7943 case 'P': // A constant between 1 go 65535
7944 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00007945 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00007946 Info.setAllowsMemory();
7947 return true;
Daniel Sanders48fa39e2015-03-30 13:47:23 +00007948 case 'Z':
7949 if (Name[1] == 'C') { // An address usable by ll, and sc.
7950 Info.setAllowsMemory();
7951 Name++; // Skip over 'Z'.
7952 return true;
7953 }
7954 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007955 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007956 }
7957
Daniel Sanders48fa39e2015-03-30 13:47:23 +00007958 std::string convertConstraint(const char *&Constraint) const override {
7959 std::string R;
7960 switch (*Constraint) {
7961 case 'Z': // Two-character constraint; add "^" hint for later parsing.
7962 if (Constraint[1] == 'C') {
7963 R = std::string("^") + std::string(Constraint, 2);
7964 Constraint++;
7965 return R;
7966 }
7967 break;
7968 }
7969 return TargetInfo::convertConstraint(Constraint);
7970 }
7971
Craig Topper3164f332014-03-11 03:39:26 +00007972 const char *getClobbers() const override {
Toma Tabacucfab40f2015-01-12 14:41:30 +00007973 // In GCC, $1 is not widely used in generated code (it's used only in a few
7974 // specific situations), so there is no real need for users to add it to
7975 // the clobbers list if they want to use it in their inline assembly code.
7976 //
7977 // In LLVM, $1 is treated as a normal GPR and is always allocatable during
7978 // code generation, so using it in inline assembly without adding it to the
7979 // clobbers list can cause conflicts between the inline assembly code and
7980 // the surrounding generated code.
7981 //
7982 // Another problem is that LLVM is allowed to choose $1 for inline assembly
7983 // operands, which will conflict with the ".set at" assembler option (which
7984 // we use only for inline assembly, in order to maintain compatibility with
7985 // GCC) and will also conflict with the user's usage of $1.
7986 //
7987 // The easiest way to avoid these conflicts and keep $1 as an allocatable
7988 // register for generated code is to automatically clobber $1 for all inline
7989 // assembly code.
7990 //
7991 // FIXME: We should automatically clobber $1 only for inline assembly code
7992 // which actually uses it. This would allow LLVM to use $1 for inline
7993 // assembly operands if the user's assembly code doesn't use it.
Toma Tabacu99411952014-12-17 12:02:58 +00007994 return "~{$1}";
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007995 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007996
Craig Topper3164f332014-03-11 03:39:26 +00007997 bool handleTargetFeatures(std::vector<std::string> &Features,
7998 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00007999 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00008000 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00008001 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00008002 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00008003 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00008004 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00008005 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00008006
Eric Christopher610fe112015-08-26 08:21:55 +00008007 for (const auto &Feature : Features) {
8008 if (Feature == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00008009 IsSingleFloat = true;
Eric Christopher610fe112015-08-26 08:21:55 +00008010 else if (Feature == "+soft-float")
Simon Atanasyan9f444d52012-07-05 15:32:46 +00008011 FloatABI = SoftFloat;
Eric Christopher610fe112015-08-26 08:21:55 +00008012 else if (Feature == "+mips16")
Simon Atanasyan72244b62012-07-05 16:06:06 +00008013 IsMips16 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00008014 else if (Feature == "+micromips")
Simon Atanasyan60777612013-04-14 14:07:51 +00008015 IsMicromips = true;
Eric Christopher610fe112015-08-26 08:21:55 +00008016 else if (Feature == "+dsp")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00008017 DspRev = std::max(DspRev, DSP1);
Eric Christopher610fe112015-08-26 08:21:55 +00008018 else if (Feature == "+dspr2")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00008019 DspRev = std::max(DspRev, DSP2);
Eric Christopher610fe112015-08-26 08:21:55 +00008020 else if (Feature == "+msa")
Jack Carter44ff1e52013-08-12 17:20:29 +00008021 HasMSA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00008022 else if (Feature == "+fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00008023 HasFP64 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00008024 else if (Feature == "-fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00008025 HasFP64 = false;
Eric Christopher610fe112015-08-26 08:21:55 +00008026 else if (Feature == "+nan2008")
Simon Atanasyan22127ce2013-09-24 09:09:16 +00008027 IsNan2008 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00008028 else if (Feature == "-nan2008")
Daniel Sanders9500d2d2014-07-09 13:56:23 +00008029 IsNan2008 = false;
Simon Dardisdf827a72017-02-21 16:01:00 +00008030 else if (Feature == "+noabicalls")
8031 IsNoABICalls = true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00008032 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00008033
James Y Knightb214cbc2016-03-04 19:00:41 +00008034 setDataLayout();
Akira Hatanaka9064e362013-10-29 18:30:33 +00008035
Rafael Espindolaeb265472013-08-21 21:59:03 +00008036 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00008037 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00008038
Craig Topper3164f332014-03-11 03:39:26 +00008039 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00008040 if (RegNo == 0) return 4;
8041 if (RegNo == 1) return 5;
8042 return -1;
8043 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00008044
8045 bool isCLZForZeroUndef() const override { return false; }
Daniel Sanders4672af62016-05-27 11:51:02 +00008046
8047 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8048 static const TargetInfo::GCCRegAlias O32RegAliases[] = {
8049 {{"at"}, "$1"}, {{"v0"}, "$2"}, {{"v1"}, "$3"},
8050 {{"a0"}, "$4"}, {{"a1"}, "$5"}, {{"a2"}, "$6"},
8051 {{"a3"}, "$7"}, {{"t0"}, "$8"}, {{"t1"}, "$9"},
8052 {{"t2"}, "$10"}, {{"t3"}, "$11"}, {{"t4"}, "$12"},
8053 {{"t5"}, "$13"}, {{"t6"}, "$14"}, {{"t7"}, "$15"},
8054 {{"s0"}, "$16"}, {{"s1"}, "$17"}, {{"s2"}, "$18"},
8055 {{"s3"}, "$19"}, {{"s4"}, "$20"}, {{"s5"}, "$21"},
8056 {{"s6"}, "$22"}, {{"s7"}, "$23"}, {{"t8"}, "$24"},
8057 {{"t9"}, "$25"}, {{"k0"}, "$26"}, {{"k1"}, "$27"},
8058 {{"gp"}, "$28"}, {{"sp", "$sp"}, "$29"}, {{"fp", "$fp"}, "$30"},
8059 {{"ra"}, "$31"}};
8060 static const TargetInfo::GCCRegAlias NewABIRegAliases[] = {
8061 {{"at"}, "$1"}, {{"v0"}, "$2"}, {{"v1"}, "$3"},
8062 {{"a0"}, "$4"}, {{"a1"}, "$5"}, {{"a2"}, "$6"},
8063 {{"a3"}, "$7"}, {{"a4"}, "$8"}, {{"a5"}, "$9"},
8064 {{"a6"}, "$10"}, {{"a7"}, "$11"}, {{"t0"}, "$12"},
8065 {{"t1"}, "$13"}, {{"t2"}, "$14"}, {{"t3"}, "$15"},
8066 {{"s0"}, "$16"}, {{"s1"}, "$17"}, {{"s2"}, "$18"},
8067 {{"s3"}, "$19"}, {{"s4"}, "$20"}, {{"s5"}, "$21"},
8068 {{"s6"}, "$22"}, {{"s7"}, "$23"}, {{"t8"}, "$24"},
8069 {{"t9"}, "$25"}, {{"k0"}, "$26"}, {{"k1"}, "$27"},
8070 {{"gp"}, "$28"}, {{"sp", "$sp"}, "$29"}, {{"fp", "$fp"}, "$30"},
8071 {{"ra"}, "$31"}};
Daniel Sanders26a56ad2016-06-06 09:07:08 +00008072 if (ABI == "o32")
Daniel Sanders4672af62016-05-27 11:51:02 +00008073 return llvm::makeArrayRef(O32RegAliases);
8074 return llvm::makeArrayRef(NewABIRegAliases);
8075 }
8076
8077 bool hasInt128Type() const override {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00008078 return ABI == "n32" || ABI == "n64";
Daniel Sanders4672af62016-05-27 11:51:02 +00008079 }
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00008080
8081 bool validateTarget(DiagnosticsEngine &Diags) const override {
8082 // FIXME: It's valid to use O32 on a 64-bit CPU but the backend can't handle
8083 // this yet. It's better to fail here than on the backend assertion.
8084 if (processorSupportsGPR64() && ABI == "o32") {
8085 Diags.Report(diag::err_target_unsupported_abi) << ABI << CPU;
8086 return false;
8087 }
8088
8089 // 64-bit ABI's require 64-bit CPU's.
8090 if (!processorSupportsGPR64() && (ABI == "n32" || ABI == "n64")) {
8091 Diags.Report(diag::err_target_unsupported_abi) << ABI << CPU;
8092 return false;
8093 }
8094
8095 // FIXME: It's valid to use O32 on a mips64/mips64el triple but the backend
8096 // can't handle this yet. It's better to fail here than on the
8097 // backend assertion.
8098 if ((getTriple().getArch() == llvm::Triple::mips64 ||
8099 getTriple().getArch() == llvm::Triple::mips64el) &&
8100 ABI == "o32") {
8101 Diags.Report(diag::err_target_unsupported_abi_for_triple)
8102 << ABI << getTriple().str();
8103 return false;
8104 }
8105
8106 // FIXME: It's valid to use N32/N64 on a mips/mipsel triple but the backend
8107 // can't handle this yet. It's better to fail here than on the
8108 // backend assertion.
8109 if ((getTriple().getArch() == llvm::Triple::mips ||
8110 getTriple().getArch() == llvm::Triple::mipsel) &&
8111 (ABI == "n32" || ABI == "n64")) {
8112 Diags.Report(diag::err_target_unsupported_abi_for_triple)
8113 << ABI << getTriple().str();
8114 return false;
8115 }
8116
8117 return true;
8118 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008119};
8120
Daniel Sanders4672af62016-05-27 11:51:02 +00008121const Builtin::Info MipsTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00008122#define BUILTIN(ID, TYPE, ATTRS) \
8123 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
8124#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
8125 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00008126#include "clang/Basic/BuiltinsMips.def"
8127};
8128
Ivan Krasindd7403e2011-08-24 20:22:22 +00008129class PNaClTargetInfo : public TargetInfo {
8130public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008131 PNaClTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8132 : TargetInfo(Triple) {
Ivan Krasindd7403e2011-08-24 20:22:22 +00008133 this->LongAlign = 32;
8134 this->LongWidth = 32;
8135 this->PointerAlign = 32;
8136 this->PointerWidth = 32;
8137 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00008138 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00008139 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00008140 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00008141 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00008142 this->SizeType = TargetInfo::UnsignedInt;
8143 this->PtrDiffType = TargetInfo::SignedInt;
8144 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00008145 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00008146 }
8147
Craig Toppere6f17d02014-03-11 04:07:52 +00008148 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00008149 Builder.defineMacro("__le32__");
8150 Builder.defineMacro("__pnacl__");
8151 }
Craig Topper3164f332014-03-11 03:39:26 +00008152 void getTargetDefines(const LangOptions &Opts,
8153 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00008154 getArchDefines(Opts, Builder);
8155 }
Craig Topper3164f332014-03-11 03:39:26 +00008156 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00008157 return Feature == "pnacl";
8158 }
Craig Topper6c03a542015-10-19 04:51:35 +00008159 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Craig Topper3164f332014-03-11 03:39:26 +00008160 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00008161 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00008162 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008163 ArrayRef<const char *> getGCCRegNames() const override;
8164 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00008165 bool validateAsmConstraint(const char *&Name,
8166 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00008167 return false;
8168 }
8169
Craig Topper3164f332014-03-11 03:39:26 +00008170 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00008171 return "";
8172 }
8173};
8174
Craig Topperf054e3a2015-10-19 03:52:27 +00008175ArrayRef<const char *> PNaClTargetInfo::getGCCRegNames() const {
8176 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00008177}
8178
Craig Topperf054e3a2015-10-19 03:52:27 +00008179ArrayRef<TargetInfo::GCCRegAlias> PNaClTargetInfo::getGCCRegAliases() const {
8180 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00008181}
Ivan Krasindd7403e2011-08-24 20:22:22 +00008182
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008183// We attempt to use PNaCl (le32) frontend and Mips32EL backend.
Daniel Sanders4672af62016-05-27 11:51:02 +00008184class NaClMips32TargetInfo : public MipsTargetInfo {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008185public:
Daniel Sanders4672af62016-05-27 11:51:02 +00008186 NaClMips32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8187 : MipsTargetInfo(Triple, Opts) {}
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008188
8189 BuiltinVaListKind getBuiltinVaListKind() const override {
8190 return TargetInfo::PNaClABIBuiltinVaList;
8191 }
8192};
8193
JF Bastien643817d2014-09-12 17:52:47 +00008194class Le64TargetInfo : public TargetInfo {
8195 static const Builtin::Info BuiltinInfo[];
8196
8197public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008198 Le64TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
8199 : TargetInfo(Triple) {
JF Bastien643817d2014-09-12 17:52:47 +00008200 NoAsmVariants = true;
8201 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
8202 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00008203 resetDataLayout("e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128");
JF Bastien643817d2014-09-12 17:52:47 +00008204 }
8205
8206 void getTargetDefines(const LangOptions &Opts,
8207 MacroBuilder &Builder) const override {
Saleem Abdulrasool56027092017-02-07 19:00:06 +00008208 DefineStd(Builder, "unix", Opts);
JF Bastien643817d2014-09-12 17:52:47 +00008209 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
8210 Builder.defineMacro("__ELF__");
8211 }
Craig Topper6c03a542015-10-19 04:51:35 +00008212 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
8213 return llvm::makeArrayRef(BuiltinInfo,
8214 clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin);
JF Bastien643817d2014-09-12 17:52:47 +00008215 }
8216 BuiltinVaListKind getBuiltinVaListKind() const override {
8217 return TargetInfo::PNaClABIBuiltinVaList;
8218 }
8219 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00008220 ArrayRef<const char *> getGCCRegNames() const override {
8221 return None;
JF Bastien643817d2014-09-12 17:52:47 +00008222 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008223 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8224 return None;
JF Bastien643817d2014-09-12 17:52:47 +00008225 }
8226 bool validateAsmConstraint(const char *&Name,
8227 TargetInfo::ConstraintInfo &Info) const override {
8228 return false;
8229 }
8230
8231 bool hasProtectedVisibility() const override { return false; }
JF Bastien643817d2014-09-12 17:52:47 +00008232};
Dan Gohmanc2853072015-09-03 22:51:53 +00008233
8234class WebAssemblyTargetInfo : public TargetInfo {
8235 static const Builtin::Info BuiltinInfo[];
8236
8237 enum SIMDEnum {
8238 NoSIMD,
8239 SIMD128,
8240 } SIMDLevel;
8241
8242public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008243 explicit WebAssemblyTargetInfo(const llvm::Triple &T, const TargetOptions &)
Dan Gohmanc2853072015-09-03 22:51:53 +00008244 : TargetInfo(T), SIMDLevel(NoSIMD) {
Dan Gohmanc2853072015-09-03 22:51:53 +00008245 NoAsmVariants = true;
8246 SuitableAlign = 128;
8247 LargeArrayMinWidth = 128;
8248 LargeArrayAlign = 128;
8249 SimdDefaultAlign = 128;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00008250 SigAtomicType = SignedLong;
Dan Gohman6db46402015-11-10 21:01:46 +00008251 LongDoubleWidth = LongDoubleAlign = 128;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00008252 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Derek Schuffacdc8e62016-09-01 22:38:37 +00008253 SizeType = UnsignedInt;
8254 PtrDiffType = SignedInt;
8255 IntPtrType = SignedInt;
Dan Gohmanc2853072015-09-03 22:51:53 +00008256 }
8257
8258protected:
8259 void getTargetDefines(const LangOptions &Opts,
8260 MacroBuilder &Builder) const override {
8261 defineCPUMacros(Builder, "wasm", /*Tuning=*/false);
8262 if (SIMDLevel >= SIMD128)
8263 Builder.defineMacro("__wasm_simd128__");
8264 }
8265
8266private:
Eric Christopher8c47b422015-10-09 18:39:55 +00008267 bool
8268 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
8269 StringRef CPU,
8270 const std::vector<std::string> &FeaturesVec) const override {
Dan Gohmanc2853072015-09-03 22:51:53 +00008271 if (CPU == "bleeding-edge")
8272 Features["simd128"] = true;
8273 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
8274 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00008275 bool hasFeature(StringRef Feature) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00008276 return llvm::StringSwitch<bool>(Feature)
8277 .Case("simd128", SIMDLevel >= SIMD128)
8278 .Default(false);
8279 }
8280 bool handleTargetFeatures(std::vector<std::string> &Features,
Hans Wennborg7eb54642015-09-10 17:07:54 +00008281 DiagnosticsEngine &Diags) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00008282 for (const auto &Feature : Features) {
8283 if (Feature == "+simd128") {
8284 SIMDLevel = std::max(SIMDLevel, SIMD128);
8285 continue;
8286 }
8287 if (Feature == "-simd128") {
8288 SIMDLevel = std::min(SIMDLevel, SIMDEnum(SIMD128 - 1));
8289 continue;
8290 }
8291
8292 Diags.Report(diag::err_opt_not_valid_with_opt) << Feature
8293 << "-target-feature";
8294 return false;
8295 }
8296 return true;
8297 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00008298 bool setCPU(const std::string &Name) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00008299 return llvm::StringSwitch<bool>(Name)
8300 .Case("mvp", true)
8301 .Case("bleeding-edge", true)
8302 .Case("generic", true)
8303 .Default(false);
8304 }
Craig Topper6c03a542015-10-19 04:51:35 +00008305 ArrayRef<Builtin::Info> getTargetBuiltins() const final {
8306 return llvm::makeArrayRef(BuiltinInfo,
8307 clang::WebAssembly::LastTSBuiltin - Builtin::FirstTSBuiltin);
Dan Gohmanc2853072015-09-03 22:51:53 +00008308 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00008309 BuiltinVaListKind getBuiltinVaListKind() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00008310 return VoidPtrBuiltinVaList;
8311 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008312 ArrayRef<const char *> getGCCRegNames() const final {
8313 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00008314 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008315 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const final {
8316 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00008317 }
8318 bool
8319 validateAsmConstraint(const char *&Name,
Hans Wennborg7eb54642015-09-10 17:07:54 +00008320 TargetInfo::ConstraintInfo &Info) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00008321 return false;
8322 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00008323 const char *getClobbers() const final { return ""; }
8324 bool isCLZForZeroUndef() const final { return false; }
8325 bool hasInt128Type() const final { return true; }
Dan Gohmanab0e31f2015-09-14 21:49:41 +00008326 IntType getIntTypeByWidth(unsigned BitWidth,
8327 bool IsSigned) const final {
8328 // WebAssembly prefers long long for explicitly 64-bit integers.
8329 return BitWidth == 64 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
8330 : TargetInfo::getIntTypeByWidth(BitWidth, IsSigned);
8331 }
8332 IntType getLeastIntTypeByWidth(unsigned BitWidth,
8333 bool IsSigned) const final {
8334 // WebAssembly uses long long for int_least64_t and int_fast64_t.
8335 return BitWidth == 64
8336 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
8337 : TargetInfo::getLeastIntTypeByWidth(BitWidth, IsSigned);
8338 }
Dan Gohmanc2853072015-09-03 22:51:53 +00008339};
8340
8341const Builtin::Info WebAssemblyTargetInfo::BuiltinInfo[] = {
8342#define BUILTIN(ID, TYPE, ATTRS) \
8343 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
8344#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
8345 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
8346#include "clang/Basic/BuiltinsWebAssembly.def"
8347};
8348
8349class WebAssembly32TargetInfo : public WebAssemblyTargetInfo {
8350public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008351 explicit WebAssembly32TargetInfo(const llvm::Triple &T,
8352 const TargetOptions &Opts)
8353 : WebAssemblyTargetInfo(T, Opts) {
Dan Gohmanf1c34e62015-09-14 21:56:37 +00008354 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
James Y Knightb214cbc2016-03-04 19:00:41 +00008355 resetDataLayout("e-m:e-p:32:32-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00008356 }
8357
8358protected:
8359 void getTargetDefines(const LangOptions &Opts,
8360 MacroBuilder &Builder) const override {
8361 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
8362 defineCPUMacros(Builder, "wasm32", /*Tuning=*/false);
8363 }
8364};
8365
8366class WebAssembly64TargetInfo : public WebAssemblyTargetInfo {
8367public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008368 explicit WebAssembly64TargetInfo(const llvm::Triple &T,
8369 const TargetOptions &Opts)
8370 : WebAssemblyTargetInfo(T, Opts) {
Dan Gohmanc2853072015-09-03 22:51:53 +00008371 LongAlign = LongWidth = 64;
8372 PointerAlign = PointerWidth = 64;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00008373 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Derek Schuffacdc8e62016-09-01 22:38:37 +00008374 SizeType = UnsignedLong;
8375 PtrDiffType = SignedLong;
8376 IntPtrType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00008377 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00008378 }
8379
8380protected:
8381 void getTargetDefines(const LangOptions &Opts,
8382 MacroBuilder &Builder) const override {
8383 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
8384 defineCPUMacros(Builder, "wasm64", /*Tuning=*/false);
8385 }
8386};
8387
JF Bastien643817d2014-09-12 17:52:47 +00008388const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
8389#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00008390 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
JF Bastien643817d2014-09-12 17:52:47 +00008391#include "clang/Basic/BuiltinsLe64.def"
8392};
8393
Eric Christopherc48497a2015-09-18 21:26:24 +00008394static const unsigned SPIRAddrSpaceMap[] = {
Yaxun Liub34ec822017-04-11 17:24:23 +00008395 0, // Default
Eric Christopherc48497a2015-09-18 21:26:24 +00008396 1, // opencl_global
8397 3, // opencl_local
8398 2, // opencl_constant
8399 4, // opencl_generic
8400 0, // cuda_device
8401 0, // cuda_constant
8402 0 // cuda_shared
8403};
8404class SPIRTargetInfo : public TargetInfo {
8405public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008406 SPIRTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
8407 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00008408 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
8409 "SPIR target must use unknown OS");
8410 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
8411 "SPIR target must use unknown environment type");
Eric Christopherc48497a2015-09-18 21:26:24 +00008412 TLSSupported = false;
8413 LongWidth = LongAlign = 64;
8414 AddrSpaceMap = &SPIRAddrSpaceMap;
8415 UseAddrSpaceMapMangling = true;
8416 // Define available target features
8417 // These must be defined in sorted order!
8418 NoAsmVariants = true;
8419 }
8420 void getTargetDefines(const LangOptions &Opts,
8421 MacroBuilder &Builder) const override {
8422 DefineStd(Builder, "SPIR", Opts);
8423 }
8424 bool hasFeature(StringRef Feature) const override {
8425 return Feature == "spir";
8426 }
Craig Topper3164f332014-03-11 03:39:26 +00008427
Craig Topper6c03a542015-10-19 04:51:35 +00008428 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00008429 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00008430 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00008431 bool validateAsmConstraint(const char *&Name,
8432 TargetInfo::ConstraintInfo &info) const override {
8433 return true;
8434 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008435 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8436 return None;
8437 }
Eric Christopherc48497a2015-09-18 21:26:24 +00008438 BuiltinVaListKind getBuiltinVaListKind() const override {
8439 return TargetInfo::VoidPtrBuiltinVaList;
8440 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00008441
Eric Christopherc48497a2015-09-18 21:26:24 +00008442 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Nikolay Haustov8c6538b2016-06-30 09:06:33 +00008443 return (CC == CC_SpirFunction || CC == CC_OpenCLKernel) ? CCCR_OK
8444 : CCCR_Warning;
Eric Christopherc48497a2015-09-18 21:26:24 +00008445 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00008446
Eric Christopherc48497a2015-09-18 21:26:24 +00008447 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
8448 return CC_SpirFunction;
8449 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00008450
8451 void setSupportedOpenCLOpts() override {
8452 // Assume all OpenCL extensions and optional core features are supported
8453 // for SPIR since it is a generic target.
Yaxun Liu5b746652016-12-18 05:18:55 +00008454 getSupportedOpenCLOpts().supportAll();
Yaxun Liu39cf40f2016-05-16 17:06:34 +00008455 }
Eric Christopherc48497a2015-09-18 21:26:24 +00008456};
Guy Benyeib798fc92012-12-11 21:38:14 +00008457
Eric Christopherc48497a2015-09-18 21:26:24 +00008458class SPIR32TargetInfo : public SPIRTargetInfo {
8459public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008460 SPIR32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8461 : SPIRTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00008462 PointerWidth = PointerAlign = 32;
8463 SizeType = TargetInfo::UnsignedInt;
8464 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +00008465 resetDataLayout("e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
8466 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00008467 }
8468 void getTargetDefines(const LangOptions &Opts,
8469 MacroBuilder &Builder) const override {
8470 DefineStd(Builder, "SPIR32", Opts);
8471 }
8472};
Guy Benyeib798fc92012-12-11 21:38:14 +00008473
Eric Christopherc48497a2015-09-18 21:26:24 +00008474class SPIR64TargetInfo : public SPIRTargetInfo {
8475public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008476 SPIR64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8477 : SPIRTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00008478 PointerWidth = PointerAlign = 64;
8479 SizeType = TargetInfo::UnsignedLong;
8480 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00008481 resetDataLayout("e-i64:64-v16:16-v24:32-v32:32-v48:64-"
8482 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00008483 }
8484 void getTargetDefines(const LangOptions &Opts,
8485 MacroBuilder &Builder) const override {
8486 DefineStd(Builder, "SPIR64", Opts);
8487 }
8488};
Guy Benyeib798fc92012-12-11 21:38:14 +00008489
Robert Lytton0e076492013-08-13 09:43:10 +00008490class XCoreTargetInfo : public TargetInfo {
8491 static const Builtin::Info BuiltinInfo[];
8492public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008493 XCoreTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
8494 : TargetInfo(Triple) {
Robert Lytton0e076492013-08-13 09:43:10 +00008495 NoAsmVariants = true;
8496 LongLongAlign = 32;
8497 SuitableAlign = 32;
8498 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00008499 SizeType = UnsignedInt;
8500 PtrDiffType = SignedInt;
8501 IntPtrType = SignedInt;
8502 WCharType = UnsignedChar;
8503 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00008504 UseZeroLengthBitfieldAlignment = true;
James Y Knightb214cbc2016-03-04 19:00:41 +00008505 resetDataLayout("e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32"
8506 "-f64:32-a:0:32-n32");
Robert Lytton0e076492013-08-13 09:43:10 +00008507 }
Craig Topper3164f332014-03-11 03:39:26 +00008508 void getTargetDefines(const LangOptions &Opts,
8509 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008510 Builder.defineMacro("__XS1B__");
8511 }
Craig Topper6c03a542015-10-19 04:51:35 +00008512 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
8513 return llvm::makeArrayRef(BuiltinInfo,
8514 clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin);
Robert Lytton0e076492013-08-13 09:43:10 +00008515 }
Craig Topper3164f332014-03-11 03:39:26 +00008516 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008517 return TargetInfo::VoidPtrBuiltinVaList;
8518 }
Craig Topper3164f332014-03-11 03:39:26 +00008519 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008520 return "";
8521 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008522 ArrayRef<const char *> getGCCRegNames() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008523 static const char * const GCCRegNames[] = {
8524 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
8525 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
8526 };
Craig Topperf054e3a2015-10-19 03:52:27 +00008527 return llvm::makeArrayRef(GCCRegNames);
Robert Lytton0e076492013-08-13 09:43:10 +00008528 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008529 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8530 return None;
Robert Lytton0e076492013-08-13 09:43:10 +00008531 }
Craig Topper3164f332014-03-11 03:39:26 +00008532 bool validateAsmConstraint(const char *&Name,
8533 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008534 return false;
8535 }
Craig Topper3164f332014-03-11 03:39:26 +00008536 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00008537 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
8538 return (RegNo < 2)? RegNo : -1;
8539 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00008540 bool allowsLargerPreferedTypeAlignment() const override {
8541 return false;
8542 }
Robert Lytton0e076492013-08-13 09:43:10 +00008543};
8544
8545const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00008546#define BUILTIN(ID, TYPE, ATTRS) \
8547 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
8548#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
8549 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Robert Lytton0e076492013-08-13 09:43:10 +00008550#include "clang/Basic/BuiltinsXCore.def"
8551};
Robert Lytton0e076492013-08-13 09:43:10 +00008552
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008553// x86_32 Android target
8554class AndroidX86_32TargetInfo : public LinuxTargetInfo<X86_32TargetInfo> {
8555public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008556 AndroidX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8557 : LinuxTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008558 SuitableAlign = 32;
8559 LongDoubleWidth = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00008560 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008561 }
8562};
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008563
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008564// x86_64 Android target
8565class AndroidX86_64TargetInfo : public LinuxTargetInfo<X86_64TargetInfo> {
8566public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008567 AndroidX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8568 : LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Stephan Bergmann17c7f702016-12-14 11:57:17 +00008569 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008570 }
Chih-Hung Hsieh0b0eeaa2015-07-24 18:12:54 +00008571
8572 bool useFloat128ManglingForLongDouble() const override {
8573 return true;
8574 }
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008575};
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008576
8577// 32-bit RenderScript is armv7 with width and align of 'long' set to 8-bytes
8578class RenderScript32TargetInfo : public ARMleTargetInfo {
8579public:
8580 RenderScript32TargetInfo(const llvm::Triple &Triple,
8581 const TargetOptions &Opts)
8582 : ARMleTargetInfo(llvm::Triple("armv7", Triple.getVendorName(),
8583 Triple.getOSName(),
8584 Triple.getEnvironmentName()),
8585 Opts) {
Pirama Arumuga Nainarbb846a32016-07-27 19:01:51 +00008586 IsRenderScriptTarget = true;
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008587 LongWidth = LongAlign = 64;
8588 }
8589 void getTargetDefines(const LangOptions &Opts,
8590 MacroBuilder &Builder) const override {
8591 Builder.defineMacro("__RENDERSCRIPT__");
8592 ARMleTargetInfo::getTargetDefines(Opts, Builder);
8593 }
8594};
8595
8596// 64-bit RenderScript is aarch64
8597class RenderScript64TargetInfo : public AArch64leTargetInfo {
8598public:
8599 RenderScript64TargetInfo(const llvm::Triple &Triple,
8600 const TargetOptions &Opts)
8601 : AArch64leTargetInfo(llvm::Triple("aarch64", Triple.getVendorName(),
8602 Triple.getOSName(),
8603 Triple.getEnvironmentName()),
Pirama Arumuga Nainarbb846a32016-07-27 19:01:51 +00008604 Opts) {
8605 IsRenderScriptTarget = true;
8606 }
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008607
8608 void getTargetDefines(const LangOptions &Opts,
8609 MacroBuilder &Builder) const override {
8610 Builder.defineMacro("__RENDERSCRIPT__");
8611 AArch64leTargetInfo::getTargetDefines(Opts, Builder);
8612 }
8613};
8614
Dylan McKayecb6e7b2017-02-07 06:04:18 +00008615/// Information about a specific microcontroller.
8616struct MCUInfo {
8617 const char *Name;
8618 const char *DefineName;
8619};
8620
8621// This list should be kept up-to-date with AVRDevices.td in LLVM.
8622static ArrayRef<MCUInfo> AVRMcus = {
8623 { "at90s1200", "__AVR_AT90S1200__" },
Dylan McKay315edb02017-02-11 21:06:07 +00008624 { "attiny11", "__AVR_ATtiny11__" },
8625 { "attiny12", "__AVR_ATtiny12__" },
8626 { "attiny15", "__AVR_ATtiny15__" },
8627 { "attiny28", "__AVR_ATtiny28__" },
8628 { "at90s2313", "__AVR_AT90S2313__" },
8629 { "at90s2323", "__AVR_AT90S2323__" },
8630 { "at90s2333", "__AVR_AT90S2333__" },
8631 { "at90s2343", "__AVR_AT90S2343__" },
8632 { "attiny22", "__AVR_ATtiny22__" },
8633 { "attiny26", "__AVR_ATtiny26__" },
8634 { "at86rf401", "__AVR_AT86RF401__" },
8635 { "at90s4414", "__AVR_AT90S4414__" },
8636 { "at90s4433", "__AVR_AT90S4433__" },
8637 { "at90s4434", "__AVR_AT90S4434__" },
8638 { "at90s8515", "__AVR_AT90S8515__" },
8639 { "at90c8534", "__AVR_AT90c8534__" },
8640 { "at90s8535", "__AVR_AT90S8535__" },
8641 { "ata5272", "__AVR_ATA5272__" },
8642 { "attiny13", "__AVR_ATtiny13__" },
8643 { "attiny13a", "__AVR_ATtiny13A__" },
8644 { "attiny2313", "__AVR_ATtiny2313__" },
8645 { "attiny2313a", "__AVR_ATtiny2313A__" },
8646 { "attiny24", "__AVR_ATtiny24__" },
8647 { "attiny24a", "__AVR_ATtiny24A__" },
8648 { "attiny4313", "__AVR_ATtiny4313__" },
8649 { "attiny44", "__AVR_ATtiny44__" },
8650 { "attiny44a", "__AVR_ATtiny44A__" },
8651 { "attiny84", "__AVR_ATtiny84__" },
8652 { "attiny84a", "__AVR_ATtiny84A__" },
8653 { "attiny25", "__AVR_ATtiny25__" },
8654 { "attiny45", "__AVR_ATtiny45__" },
8655 { "attiny85", "__AVR_ATtiny85__" },
8656 { "attiny261", "__AVR_ATtiny261__" },
8657 { "attiny261a", "__AVR_ATtiny261A__" },
8658 { "attiny461", "__AVR_ATtiny461__" },
8659 { "attiny461a", "__AVR_ATtiny461A__" },
8660 { "attiny861", "__AVR_ATtiny861__" },
8661 { "attiny861a", "__AVR_ATtiny861A__" },
8662 { "attiny87", "__AVR_ATtiny87__" },
8663 { "attiny43u", "__AVR_ATtiny43U__" },
8664 { "attiny48", "__AVR_ATtiny48__" },
8665 { "attiny88", "__AVR_ATtiny88__" },
8666 { "attiny828", "__AVR_ATtiny828__" },
8667 { "at43usb355", "__AVR_AT43USB355__" },
8668 { "at76c711", "__AVR_AT76C711__" },
8669 { "atmega103", "__AVR_ATmega103__" },
8670 { "at43usb320", "__AVR_AT43USB320__" },
8671 { "attiny167", "__AVR_ATtiny167__" },
8672 { "at90usb82", "__AVR_AT90USB82__" },
8673 { "at90usb162", "__AVR_AT90USB162__" },
8674 { "ata5505", "__AVR_ATA5505__" },
8675 { "atmega8u2", "__AVR_ATmega8U2__" },
8676 { "atmega16u2", "__AVR_ATmega16U2__" },
8677 { "atmega32u2", "__AVR_ATmega32U2__" },
8678 { "attiny1634", "__AVR_ATtiny1634__" },
8679 { "atmega8", "__AVR_ATmega8__" },
8680 { "ata6289", "__AVR_ATA6289__" },
8681 { "atmega8a", "__AVR_ATmega8A__" },
8682 { "ata6285", "__AVR_ATA6285__" },
8683 { "ata6286", "__AVR_ATA6286__" },
8684 { "atmega48", "__AVR_ATmega48__" },
8685 { "atmega48a", "__AVR_ATmega48A__" },
8686 { "atmega48pa", "__AVR_ATmega48PA__" },
8687 { "atmega48p", "__AVR_ATmega48P__" },
8688 { "atmega88", "__AVR_ATmega88__" },
8689 { "atmega88a", "__AVR_ATmega88A__" },
8690 { "atmega88p", "__AVR_ATmega88P__" },
8691 { "atmega88pa", "__AVR_ATmega88PA__" },
8692 { "atmega8515", "__AVR_ATmega8515__" },
8693 { "atmega8535", "__AVR_ATmega8535__" },
8694 { "atmega8hva", "__AVR_ATmega8HVA__" },
8695 { "at90pwm1", "__AVR_AT90PWM1__" },
8696 { "at90pwm2", "__AVR_AT90PWM2__" },
8697 { "at90pwm2b", "__AVR_AT90PWM2B__" },
8698 { "at90pwm3", "__AVR_AT90PWM3__" },
8699 { "at90pwm3b", "__AVR_AT90PWM3B__" },
8700 { "at90pwm81", "__AVR_AT90PWM81__" },
8701 { "ata5790", "__AVR_ATA5790__" },
8702 { "ata5795", "__AVR_ATA5795__" },
8703 { "atmega16", "__AVR_ATmega16__" },
8704 { "atmega16a", "__AVR_ATmega16A__" },
8705 { "atmega161", "__AVR_ATmega161__" },
8706 { "atmega162", "__AVR_ATmega162__" },
8707 { "atmega163", "__AVR_ATmega163__" },
8708 { "atmega164a", "__AVR_ATmega164A__" },
8709 { "atmega164p", "__AVR_ATmega164P__" },
8710 { "atmega164pa", "__AVR_ATmega164PA__" },
8711 { "atmega165", "__AVR_ATmega165__" },
8712 { "atmega165a", "__AVR_ATmega165A__" },
8713 { "atmega165p", "__AVR_ATmega165P__" },
8714 { "atmega165pa", "__AVR_ATmega165PA__" },
8715 { "atmega168", "__AVR_ATmega168__" },
8716 { "atmega168a", "__AVR_ATmega168A__" },
8717 { "atmega168p", "__AVR_ATmega168P__" },
8718 { "atmega168pa", "__AVR_ATmega168PA__" },
8719 { "atmega169", "__AVR_ATmega169__" },
8720 { "atmega169a", "__AVR_ATmega169A__" },
8721 { "atmega169p", "__AVR_ATmega169P__" },
8722 { "atmega169pa", "__AVR_ATmega169PA__" },
8723 { "atmega32", "__AVR_ATmega32__" },
8724 { "atmega32a", "__AVR_ATmega32A__" },
8725 { "atmega323", "__AVR_ATmega323__" },
8726 { "atmega324a", "__AVR_ATmega324A__" },
8727 { "atmega324p", "__AVR_ATmega324P__" },
8728 { "atmega324pa", "__AVR_ATmega324PA__" },
8729 { "atmega325", "__AVR_ATmega325__" },
8730 { "atmega325a", "__AVR_ATmega325A__" },
8731 { "atmega325p", "__AVR_ATmega325P__" },
8732 { "atmega325pa", "__AVR_ATmega325PA__" },
8733 { "atmega3250", "__AVR_ATmega3250__" },
8734 { "atmega3250a", "__AVR_ATmega3250A__" },
8735 { "atmega3250p", "__AVR_ATmega3250P__" },
8736 { "atmega3250pa", "__AVR_ATmega3250PA__" },
8737 { "atmega328", "__AVR_ATmega328__" },
8738 { "atmega328p", "__AVR_ATmega328P__" },
8739 { "atmega329", "__AVR_ATmega329__" },
8740 { "atmega329a", "__AVR_ATmega329A__" },
8741 { "atmega329p", "__AVR_ATmega329P__" },
8742 { "atmega329pa", "__AVR_ATmega329PA__" },
8743 { "atmega3290", "__AVR_ATmega3290__" },
8744 { "atmega3290a", "__AVR_ATmega3290A__" },
8745 { "atmega3290p", "__AVR_ATmega3290P__" },
8746 { "atmega3290pa", "__AVR_ATmega3290PA__" },
8747 { "atmega406", "__AVR_ATmega406__" },
8748 { "atmega64", "__AVR_ATmega64__" },
8749 { "atmega64a", "__AVR_ATmega64A__" },
8750 { "atmega640", "__AVR_ATmega640__" },
8751 { "atmega644", "__AVR_ATmega644__" },
8752 { "atmega644a", "__AVR_ATmega644A__" },
8753 { "atmega644p", "__AVR_ATmega644P__" },
8754 { "atmega644pa", "__AVR_ATmega644PA__" },
8755 { "atmega645", "__AVR_ATmega645__" },
8756 { "atmega645a", "__AVR_ATmega645A__" },
8757 { "atmega645p", "__AVR_ATmega645P__" },
8758 { "atmega649", "__AVR_ATmega649__" },
8759 { "atmega649a", "__AVR_ATmega649A__" },
8760 { "atmega649p", "__AVR_ATmega649P__" },
8761 { "atmega6450", "__AVR_ATmega6450__" },
8762 { "atmega6450a", "__AVR_ATmega6450A__" },
8763 { "atmega6450p", "__AVR_ATmega6450P__" },
8764 { "atmega6490", "__AVR_ATmega6490__" },
8765 { "atmega6490a", "__AVR_ATmega6490A__" },
8766 { "atmega6490p", "__AVR_ATmega6490P__" },
8767 { "atmega64rfr2", "__AVR_ATmega64RFR2__" },
8768 { "atmega644rfr2", "__AVR_ATmega644RFR2__" },
8769 { "atmega16hva", "__AVR_ATmega16HVA__" },
8770 { "atmega16hva2", "__AVR_ATmega16HVA2__" },
8771 { "atmega16hvb", "__AVR_ATmega16HVB__" },
8772 { "atmega16hvbrevb", "__AVR_ATmega16HVBREVB__" },
8773 { "atmega32hvb", "__AVR_ATmega32HVB__" },
8774 { "atmega32hvbrevb", "__AVR_ATmega32HVBREVB__" },
8775 { "atmega64hve", "__AVR_ATmega64HVE__" },
8776 { "at90can32", "__AVR_AT90CAN32__" },
8777 { "at90can64", "__AVR_AT90CAN64__" },
8778 { "at90pwm161", "__AVR_AT90PWM161__" },
8779 { "at90pwm216", "__AVR_AT90PWM216__" },
8780 { "at90pwm316", "__AVR_AT90PWM316__" },
8781 { "atmega32c1", "__AVR_ATmega32C1__" },
8782 { "atmega64c1", "__AVR_ATmega64C1__" },
8783 { "atmega16m1", "__AVR_ATmega16M1__" },
8784 { "atmega32m1", "__AVR_ATmega32M1__" },
8785 { "atmega64m1", "__AVR_ATmega64M1__" },
8786 { "atmega16u4", "__AVR_ATmega16U4__" },
8787 { "atmega32u4", "__AVR_ATmega32U4__" },
8788 { "atmega32u6", "__AVR_ATmega32U6__" },
8789 { "at90usb646", "__AVR_AT90USB646__" },
8790 { "at90usb647", "__AVR_AT90USB647__" },
8791 { "at90scr100", "__AVR_AT90SCR100__" },
8792 { "at94k", "__AVR_AT94K__" },
8793 { "m3000", "__AVR_AT000__" },
8794 { "atmega128", "__AVR_ATmega128__" },
8795 { "atmega128a", "__AVR_ATmega128A__" },
8796 { "atmega1280", "__AVR_ATmega1280__" },
8797 { "atmega1281", "__AVR_ATmega1281__" },
8798 { "atmega1284", "__AVR_ATmega1284__" },
8799 { "atmega1284p", "__AVR_ATmega1284P__" },
8800 { "atmega128rfa1", "__AVR_ATmega128RFA1__" },
8801 { "atmega128rfr2", "__AVR_ATmega128RFR2__" },
8802 { "atmega1284rfr2", "__AVR_ATmega1284RFR2__" },
8803 { "at90can128", "__AVR_AT90CAN128__" },
8804 { "at90usb1286", "__AVR_AT90USB1286__" },
8805 { "at90usb1287", "__AVR_AT90USB1287__" },
8806 { "atmega2560", "__AVR_ATmega2560__" },
8807 { "atmega2561", "__AVR_ATmega2561__" },
8808 { "atmega256rfr2", "__AVR_ATmega256RFR2__" },
8809 { "atmega2564rfr2", "__AVR_ATmega2564RFR2__" },
8810 { "atxmega16a4", "__AVR_ATxmega16A4__" },
8811 { "atxmega16a4u", "__AVR_ATxmega16a4U__" },
8812 { "atxmega16c4", "__AVR_ATxmega16C4__" },
8813 { "atxmega16d4", "__AVR_ATxmega16D4__" },
8814 { "atxmega32a4", "__AVR_ATxmega32A4__" },
8815 { "atxmega32a4u", "__AVR_ATxmega32A4U__" },
8816 { "atxmega32c4", "__AVR_ATxmega32C4__" },
8817 { "atxmega32d4", "__AVR_ATxmega32D4__" },
8818 { "atxmega32e5", "__AVR_ATxmega32E5__" },
8819 { "atxmega16e5", "__AVR_ATxmega16E5__" },
8820 { "atxmega8e5", "__AVR_ATxmega8E5__" },
8821 { "atxmega32x1", "__AVR_ATxmega32X1__" },
8822 { "atxmega64a3", "__AVR_ATxmega64A3__" },
8823 { "atxmega64a3u", "__AVR_ATxmega64A3U__" },
8824 { "atxmega64a4u", "__AVR_ATxmega64A4U__" },
8825 { "atxmega64b1", "__AVR_ATxmega64B1__" },
8826 { "atxmega64b3", "__AVR_ATxmega64B3__" },
8827 { "atxmega64c3", "__AVR_ATxmega64C3__" },
8828 { "atxmega64d3", "__AVR_ATxmega64D3__" },
8829 { "atxmega64d4", "__AVR_ATxmega64D4__" },
8830 { "atxmega64a1", "__AVR_ATxmega64A1__" },
8831 { "atxmega64a1u", "__AVR_ATxmega64A1U__" },
8832 { "atxmega128a3", "__AVR_ATxmega128A3__" },
8833 { "atxmega128a3u", "__AVR_ATxmega128A3U__" },
8834 { "atxmega128b1", "__AVR_ATxmega128B1__" },
8835 { "atxmega128b3", "__AVR_ATxmega128B3__" },
8836 { "atxmega128c3", "__AVR_ATxmega128C3__" },
8837 { "atxmega128d3", "__AVR_ATxmega128D3__" },
8838 { "atxmega128d4", "__AVR_ATxmega128D4__" },
8839 { "atxmega192a3", "__AVR_ATxmega192A3__" },
8840 { "atxmega192a3u", "__AVR_ATxmega192A3U__" },
8841 { "atxmega192c3", "__AVR_ATxmega192C3__" },
8842 { "atxmega192d3", "__AVR_ATxmega192D3__" },
8843 { "atxmega256a3", "__AVR_ATxmega256A3__" },
8844 { "atxmega256a3u", "__AVR_ATxmega256A3U__" },
8845 { "atxmega256a3b", "__AVR_ATxmega256A3B__" },
8846 { "atxmega256a3bu", "__AVR_ATxmega256A3BU__" },
8847 { "atxmega256c3", "__AVR_ATxmega256C3__" },
8848 { "atxmega256d3", "__AVR_ATxmega256D3__" },
8849 { "atxmega384c3", "__AVR_ATxmega384C3__" },
8850 { "atxmega384d3", "__AVR_ATxmega384D3__" },
8851 { "atxmega128a1", "__AVR_ATxmega128A1__" },
8852 { "atxmega128a1u", "__AVR_ATxmega128A1U__" },
8853 { "atxmega128a4u", "__AVR_ATxmega128a4U__" },
8854 { "attiny4", "__AVR_ATtiny4__" },
8855 { "attiny5", "__AVR_ATtiny5__" },
8856 { "attiny9", "__AVR_ATtiny9__" },
8857 { "attiny10", "__AVR_ATtiny10__" },
8858 { "attiny20", "__AVR_ATtiny20__" },
8859 { "attiny40", "__AVR_ATtiny40__" },
8860 { "attiny102", "__AVR_ATtiny102__" },
8861 { "attiny104", "__AVR_ATtiny104__" },
Dylan McKayecb6e7b2017-02-07 06:04:18 +00008862};
Dylan McKay924fa3a2017-01-05 05:20:27 +00008863
8864// AVR Target
8865class AVRTargetInfo : public TargetInfo {
8866public:
8867 AVRTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
8868 : TargetInfo(Triple) {
8869 TLSSupported = false;
8870 PointerWidth = 16;
8871 PointerAlign = 8;
8872 IntWidth = 16;
8873 IntAlign = 8;
8874 LongWidth = 32;
8875 LongAlign = 8;
8876 LongLongWidth = 64;
8877 LongLongAlign = 8;
8878 SuitableAlign = 8;
8879 DefaultAlignForAttributeAligned = 8;
8880 HalfWidth = 16;
8881 HalfAlign = 8;
8882 FloatWidth = 32;
8883 FloatAlign = 8;
8884 DoubleWidth = 32;
8885 DoubleAlign = 8;
8886 DoubleFormat = &llvm::APFloat::IEEEsingle();
8887 LongDoubleWidth = 32;
8888 LongDoubleAlign = 8;
8889 LongDoubleFormat = &llvm::APFloat::IEEEsingle();
8890 SizeType = UnsignedInt;
8891 PtrDiffType = SignedInt;
8892 IntPtrType = SignedInt;
8893 Char16Type = UnsignedInt;
8894 WCharType = SignedInt;
8895 WIntType = SignedInt;
8896 Char32Type = UnsignedLong;
8897 SigAtomicType = SignedChar;
8898 resetDataLayout("e-p:16:16:16-i8:8:8-i16:16:16-i32:32:32-i64:64:64"
8899 "-f32:32:32-f64:64:64-n8");
8900 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008901
Dylan McKay924fa3a2017-01-05 05:20:27 +00008902 void getTargetDefines(const LangOptions &Opts,
8903 MacroBuilder &Builder) const override {
Dylan McKayecb6e7b2017-02-07 06:04:18 +00008904 Builder.defineMacro("AVR");
8905 Builder.defineMacro("__AVR");
Dylan McKay924fa3a2017-01-05 05:20:27 +00008906 Builder.defineMacro("__AVR__");
Dylan McKayecb6e7b2017-02-07 06:04:18 +00008907
8908 if (!this->CPU.empty()) {
8909 auto It = std::find_if(AVRMcus.begin(), AVRMcus.end(),
8910 [&](const MCUInfo &Info) { return Info.Name == this->CPU; });
8911
8912 if (It != AVRMcus.end())
8913 Builder.defineMacro(It->DefineName);
8914 }
Dylan McKay924fa3a2017-01-05 05:20:27 +00008915 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008916
Dylan McKay924fa3a2017-01-05 05:20:27 +00008917 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
8918 return None;
8919 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008920
Dylan McKay924fa3a2017-01-05 05:20:27 +00008921 BuiltinVaListKind getBuiltinVaListKind() const override {
8922 return TargetInfo::VoidPtrBuiltinVaList;
8923 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008924
Dylan McKay924fa3a2017-01-05 05:20:27 +00008925 const char *getClobbers() const override {
8926 return "";
8927 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008928
Dylan McKay924fa3a2017-01-05 05:20:27 +00008929 ArrayRef<const char *> getGCCRegNames() const override {
8930 static const char * const GCCRegNames[] = {
8931 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
8932 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
8933 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
Dylan McKay95aa2652017-01-05 07:17:46 +00008934 "r24", "r25", "X", "Y", "Z", "SP"
Dylan McKay924fa3a2017-01-05 05:20:27 +00008935 };
8936 return llvm::makeArrayRef(GCCRegNames);
8937 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008938
Dylan McKay924fa3a2017-01-05 05:20:27 +00008939 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8940 return None;
8941 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008942
Dylan McKay924fa3a2017-01-05 05:20:27 +00008943 ArrayRef<TargetInfo::AddlRegName> getGCCAddlRegNames() const override {
8944 static const TargetInfo::AddlRegName AddlRegNames[] = {
8945 { { "r26", "r27"}, 26 },
8946 { { "r28", "r29"}, 27 },
8947 { { "r30", "r31"}, 28 },
8948 { { "SPL", "SPH"}, 29 },
8949 };
8950 return llvm::makeArrayRef(AddlRegNames);
8951 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008952
Dylan McKay924fa3a2017-01-05 05:20:27 +00008953 bool validateAsmConstraint(const char *&Name,
8954 TargetInfo::ConstraintInfo &Info) const override {
Dylan McKayd31534c2017-02-06 09:01:59 +00008955 // There aren't any multi-character AVR specific constraints.
8956 if (StringRef(Name).size() > 1) return false;
8957
8958 switch (*Name) {
8959 default: return false;
8960 case 'a': // Simple upper registers
8961 case 'b': // Base pointer registers pairs
8962 case 'd': // Upper register
8963 case 'l': // Lower registers
8964 case 'e': // Pointer register pairs
8965 case 'q': // Stack pointer register
8966 case 'r': // Any register
8967 case 'w': // Special upper register pairs
8968 case 't': // Temporary register
8969 case 'x': case 'X': // Pointer register pair X
8970 case 'y': case 'Y': // Pointer register pair Y
8971 case 'z': case 'Z': // Pointer register pair Z
8972 Info.setAllowsRegister();
8973 return true;
8974 case 'I': // 6-bit positive integer constant
8975 Info.setRequiresImmediate(0, 63);
8976 return true;
8977 case 'J': // 6-bit negative integer constant
8978 Info.setRequiresImmediate(-63, 0);
8979 return true;
8980 case 'K': // Integer constant (Range: 2)
8981 Info.setRequiresImmediate(2);
8982 return true;
8983 case 'L': // Integer constant (Range: 0)
8984 Info.setRequiresImmediate(0);
8985 return true;
8986 case 'M': // 8-bit integer constant
8987 Info.setRequiresImmediate(0, 0xff);
8988 return true;
8989 case 'N': // Integer constant (Range: -1)
8990 Info.setRequiresImmediate(-1);
8991 return true;
8992 case 'O': // Integer constant (Range: 8, 16, 24)
8993 Info.setRequiresImmediate({8, 16, 24});
8994 return true;
8995 case 'P': // Integer constant (Range: 1)
8996 Info.setRequiresImmediate(1);
8997 return true;
8998 case 'R': // Integer constant (Range: -6 to 5)
8999 Info.setRequiresImmediate(-6, 5);
9000 return true;
9001 case 'G': // Floating point constant
9002 case 'Q': // A memory address based on Y or Z pointer with displacement.
9003 return true;
9004 }
9005
Dylan McKay924fa3a2017-01-05 05:20:27 +00009006 return false;
9007 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00009008
Dylan McKay924fa3a2017-01-05 05:20:27 +00009009 IntType getIntTypeByWidth(unsigned BitWidth,
9010 bool IsSigned) const final {
9011 // AVR prefers int for 16-bit integers.
9012 return BitWidth == 16 ? (IsSigned ? SignedInt : UnsignedInt)
9013 : TargetInfo::getIntTypeByWidth(BitWidth, IsSigned);
9014 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00009015
Dylan McKay924fa3a2017-01-05 05:20:27 +00009016 IntType getLeastIntTypeByWidth(unsigned BitWidth,
9017 bool IsSigned) const final {
9018 // AVR uses int for int_least16_t and int_fast16_t.
9019 return BitWidth == 16
9020 ? (IsSigned ? SignedInt : UnsignedInt)
9021 : TargetInfo::getLeastIntTypeByWidth(BitWidth, IsSigned);
9022 }
Dylan McKayecb6e7b2017-02-07 06:04:18 +00009023
9024 bool setCPU(const std::string &Name) override {
9025 bool IsFamily = llvm::StringSwitch<bool>(Name)
9026 .Case("avr1", true)
9027 .Case("avr2", true)
9028 .Case("avr25", true)
9029 .Case("avr3", true)
9030 .Case("avr31", true)
9031 .Case("avr35", true)
9032 .Case("avr4", true)
9033 .Case("avr5", true)
9034 .Case("avr51", true)
9035 .Case("avr6", true)
9036 .Case("avrxmega1", true)
9037 .Case("avrxmega2", true)
9038 .Case("avrxmega3", true)
9039 .Case("avrxmega4", true)
9040 .Case("avrxmega5", true)
9041 .Case("avrxmega6", true)
9042 .Case("avrxmega7", true)
9043 .Case("avrtiny", true)
9044 .Default(false);
9045
9046 if (IsFamily) this->CPU = Name;
9047
9048 bool IsMCU = std::find_if(AVRMcus.begin(), AVRMcus.end(),
9049 [&](const MCUInfo &Info) { return Info.Name == Name; }) != AVRMcus.end();
9050
9051 if (IsMCU) this->CPU = Name;
9052
9053 return IsFamily || IsMCU;
9054 }
9055
9056protected:
9057 std::string CPU;
Dylan McKay924fa3a2017-01-05 05:20:27 +00009058};
9059
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009060} // end anonymous namespace
9061
Chris Lattner5ba61f02006-10-14 07:39:34 +00009062//===----------------------------------------------------------------------===//
9063// Driver code
9064//===----------------------------------------------------------------------===//
9065
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009066static TargetInfo *AllocateTarget(const llvm::Triple &Triple,
9067 const TargetOptions &Opts) {
Daniel Dunbar52322032009-08-18 05:47:58 +00009068 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00009069
Daniel Dunbar52322032009-08-18 05:47:58 +00009070 switch (Triple.getArch()) {
9071 default:
Craig Topperf1186c52014-05-08 06:41:40 +00009072 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00009073
Tim Northover2a0783d2014-05-30 14:14:07 +00009074 case llvm::Triple::xcore:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009075 return new XCoreTargetInfo(Triple, Opts);
Tim Northover2a0783d2014-05-30 14:14:07 +00009076
9077 case llvm::Triple::hexagon:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009078 return new HexagonTargetInfo(Triple, Opts);
Tim Northover2a0783d2014-05-30 14:14:07 +00009079
Jacques Pienaard964cc22016-03-28 21:02:54 +00009080 case llvm::Triple::lanai:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009081 return new LanaiTargetInfo(Triple, Opts);
Jacques Pienaard964cc22016-03-28 21:02:54 +00009082
Tim Northover2a0783d2014-05-30 14:14:07 +00009083 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00009084 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009085 return new DarwinAArch64TargetInfo(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00009086
9087 switch (os) {
Ed Schoutenea9448e2015-10-15 15:07:07 +00009088 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009089 return new CloudABITargetInfo<AArch64leTargetInfo>(Triple, Opts);
Ed Maste6a9eda52014-11-13 16:55:42 +00009090 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009091 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Petr Hosek9834fcd2016-10-24 22:55:57 +00009092 case llvm::Triple::Fuchsia:
9093 return new FuchsiaTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00009094 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009095 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple, Opts);
James Molloy5e73df52014-04-16 15:06:20 +00009096 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009097 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Brad Smith9aa2bf22017-02-21 23:13:09 +00009098 case llvm::Triple::OpenBSD:
9099 return new OpenBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00009100 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009101 return new AArch64leTargetInfo(Triple, Opts);
James Molloy5e73df52014-04-16 15:06:20 +00009102 }
9103
Christian Pirker9b019ae2014-02-25 13:51:00 +00009104 case llvm::Triple::aarch64_be:
9105 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00009106 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009107 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Petr Hosek9834fcd2016-10-24 22:55:57 +00009108 case llvm::Triple::Fuchsia:
9109 return new FuchsiaTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00009110 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009111 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00009112 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009113 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00009114 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009115 return new AArch64beTargetInfo(Triple, Opts);
Tim Northover9bb857a2013-01-31 12:13:10 +00009116 }
9117
Daniel Dunbar52322032009-08-18 05:47:58 +00009118 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00009119 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00009120 if (Triple.isOSBinFormatMachO())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009121 return new DarwinARMTargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00009122
Daniel Dunbar52322032009-08-18 05:47:58 +00009123 switch (os) {
Ed Schoutenc6d1a732016-09-05 18:38:34 +00009124 case llvm::Triple::CloudABI:
9125 return new CloudABITargetInfo<ARMleTargetInfo>(Triple, Opts);
Rafael Espindolaad8fed52010-06-10 00:46:51 +00009126 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009127 return new LinuxTargetInfo<ARMleTargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009128 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009129 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009130 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009131 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00009132 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009133 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00009134 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009135 return new BitrigTargetInfo<ARMleTargetInfo>(Triple, Opts);
Douglas Gregor9fabd852011-07-01 22:41:14 +00009136 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009137 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00009138 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009139 return new NaClTargetInfo<ARMleTargetInfo>(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00009140 case llvm::Triple::Win32:
9141 switch (Triple.getEnvironment()) {
Yaron Keren321249c2015-07-15 13:32:23 +00009142 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009143 return new CygwinARMTargetInfo(Triple, Opts);
Yaron Keren321249c2015-07-15 13:32:23 +00009144 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009145 return new MinGWARMTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00009146 case llvm::Triple::Itanium:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009147 return new ItaniumWindowsARMleTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00009148 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00009149 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009150 return new MicrosoftARMleTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00009151 }
Daniel Dunbar52322032009-08-18 05:47:58 +00009152 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009153 return new ARMleTargetInfo(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009154 }
9155
9156 case llvm::Triple::armeb:
9157 case llvm::Triple::thumbeb:
9158 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009159 return new DarwinARMTargetInfo(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009160
9161 switch (os) {
9162 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009163 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009164 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009165 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009166 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009167 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009168 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009169 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009170 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009171 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009172 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009173 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009174 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009175 return new NaClTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009176 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009177 return new ARMbeTargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009178 }
Eli Friedmanb5366062008-05-20 14:21:01 +00009179
Dylan McKay924fa3a2017-01-05 05:20:27 +00009180 case llvm::Triple::avr:
9181 return new AVRTargetInfo(Triple, Opts);
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00009182 case llvm::Triple::bpfeb:
9183 case llvm::Triple::bpfel:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009184 return new BPFTargetInfo(Triple, Opts);
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00009185
Daniel Dunbar52322032009-08-18 05:47:58 +00009186 case llvm::Triple::msp430:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009187 return new MSP430TargetInfo(Triple, Opts);
Eli Friedmanb5366062008-05-20 14:21:01 +00009188
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00009189 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009190 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009191 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00009192 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009193 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00009194 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009195 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009196 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009197 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009198 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009199 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00009200 return new MipsTargetInfo(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009201 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00009202
9203 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009204 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009205 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00009206 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009207 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00009208 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009209 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009210 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009211 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009212 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00009213 case llvm::Triple::NaCl:
Daniel Sanders4672af62016-05-27 11:51:02 +00009214 return new NaClTargetInfo<NaClMips32TargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009215 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00009216 return new MipsTargetInfo(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009217 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00009218
Akira Hatanakabef17452011-09-20 19:21:49 +00009219 case llvm::Triple::mips64:
9220 switch (os) {
9221 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00009222 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009223 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00009224 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009225 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009226 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009227 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009228 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00009229 case llvm::Triple::OpenBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009230 return new OpenBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009231 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00009232 return new MipsTargetInfo(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009233 }
9234
9235 case llvm::Triple::mips64el:
9236 switch (os) {
9237 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00009238 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009239 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00009240 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009241 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009242 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009243 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009244 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00009245 case llvm::Triple::OpenBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009246 return new OpenBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009247 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00009248 return new MipsTargetInfo(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009249 }
9250
Ivan Krasindd7403e2011-08-24 20:22:22 +00009251 case llvm::Triple::le32:
9252 switch (os) {
Douglas Katzman78d7c542015-05-12 21:18:10 +00009253 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009254 return new NaClTargetInfo<PNaClTargetInfo>(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00009255 default:
9256 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00009257 }
9258
JF Bastien643817d2014-09-12 17:52:47 +00009259 case llvm::Triple::le64:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009260 return new Le64TargetInfo(Triple, Opts);
JF Bastien643817d2014-09-12 17:52:47 +00009261
Daniel Dunbar52322032009-08-18 05:47:58 +00009262 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00009263 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009264 return new DarwinPPC32TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009265 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00009266 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009267 return new LinuxTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009268 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009269 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009270 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009271 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00009272 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009273 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009274 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009275 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009276 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009277 return new PPC32TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009278 }
Daniel Dunbar52322032009-08-18 05:47:58 +00009279
9280 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00009281 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009282 return new DarwinPPC64TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009283 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00009284 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009285 return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009286 case llvm::Triple::Lv2:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009287 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009288 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009289 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009290 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009291 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009292 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009293 return new PPC64TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009294 }
Daniel Dunbar52322032009-08-18 05:47:58 +00009295
Bill Schmidt778d3872013-07-26 01:36:11 +00009296 case llvm::Triple::ppc64le:
9297 switch (os) {
9298 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009299 return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger22a2d992015-04-10 20:53:48 +00009300 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009301 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Bill Schmidt778d3872013-07-26 01:36:11 +00009302 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009303 return new PPC64TargetInfo(Triple, Opts);
Bill Schmidt778d3872013-07-26 01:36:11 +00009304 }
9305
Peter Collingbournec947aae2012-05-20 23:28:41 +00009306 case llvm::Triple::nvptx:
Justin Lebarb6626592017-01-05 16:53:21 +00009307 return new NVPTXTargetInfo(Triple, Opts, /*TargetPointerWidth=*/32);
Peter Collingbournec947aae2012-05-20 23:28:41 +00009308 case llvm::Triple::nvptx64:
Justin Lebarb6626592017-01-05 16:53:21 +00009309 return new NVPTXTargetInfo(Triple, Opts, /*TargetPointerWidth=*/64);
Peter Collingbournec947aae2012-05-20 23:28:41 +00009310
Tom Stellardd8e38a32015-01-06 20:34:47 +00009311 case llvm::Triple::amdgcn:
Eli Friedmand13b41e2012-10-12 23:32:00 +00009312 case llvm::Triple::r600:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009313 return new AMDGPUTargetInfo(Triple, Opts);
Eli Friedmand13b41e2012-10-12 23:32:00 +00009314
Daniel Dunbar52322032009-08-18 05:47:58 +00009315 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009316 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00009317 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009318 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009319 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009320 return new SolarisTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009321 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009322 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00009323 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009324 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009325 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009326 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009327 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009328 return new SparcV8TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009329 }
Daniel Dunbar52322032009-08-18 05:47:58 +00009330
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009331 // The 'sparcel' architecture copies all the above cases except for Solaris.
9332 case llvm::Triple::sparcel:
9333 switch (os) {
9334 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009335 return new LinuxTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009336 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009337 return new NetBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009338 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009339 return new OpenBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009340 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009341 return new RTEMSTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009342 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009343 return new SparcV8elTargetInfo(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009344 }
9345
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009346 case llvm::Triple::sparcv9:
9347 switch (os) {
9348 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009349 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009350 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009351 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009352 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009353 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009354 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009355 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009356 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009357 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009358 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009359 return new SparcV9TargetInfo(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009360 }
9361
Ulrich Weigand47445072013-05-06 16:26:41 +00009362 case llvm::Triple::systemz:
9363 switch (os) {
9364 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009365 return new LinuxTargetInfo<SystemZTargetInfo>(Triple, Opts);
Ulrich Weigand47445072013-05-06 16:26:41 +00009366 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009367 return new SystemZTargetInfo(Triple, Opts);
Ulrich Weigand47445072013-05-06 16:26:41 +00009368 }
9369
Eli Friedmana9c3d712009-08-19 20:47:07 +00009370 case llvm::Triple::tce:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009371 return new TCETargetInfo(Triple, Opts);
Eli Friedmana9c3d712009-08-19 20:47:07 +00009372
Pekka Jaaskelainen67354482016-11-16 15:22:31 +00009373 case llvm::Triple::tcele:
9374 return new TCELETargetInfo(Triple, Opts);
9375
Daniel Dunbar52322032009-08-18 05:47:58 +00009376 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00009377 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009378 return new DarwinI386TargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00009379
Daniel Dunbar52322032009-08-18 05:47:58 +00009380 switch (os) {
Ed Schouten7893e682015-06-13 21:33:49 +00009381 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009382 return new CloudABITargetInfo<X86_32TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009383 case llvm::Triple::Linux: {
9384 switch (Triple.getEnvironment()) {
9385 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009386 return new LinuxTargetInfo<X86_32TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009387 case llvm::Triple::Android:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009388 return new AndroidX86_32TargetInfo(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009389 }
9390 }
Daniel Dunbar52322032009-08-18 05:47:58 +00009391 case llvm::Triple::DragonFly:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009392 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009393 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009394 return new NetBSDI386TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009395 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009396 return new OpenBSDI386TargetInfo(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00009397 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009398 return new BitrigI386TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009399 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009400 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00009401 case llvm::Triple::KFreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009402 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009403 case llvm::Triple::Minix:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009404 return new MinixTargetInfo<X86_32TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009405 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009406 return new SolarisTargetInfo<X86_32TargetInfo>(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009407 case llvm::Triple::Win32: {
9408 switch (Triple.getEnvironment()) {
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009409 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009410 return new CygwinX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009411 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009412 return new MinGWX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00009413 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009414 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00009415 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009416 return new MicrosoftX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009417 }
9418 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00009419 case llvm::Triple::Haiku:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009420 return new HaikuX86_32TargetInfo(Triple, Opts);
Douglas Gregor9fabd852011-07-01 22:41:14 +00009421 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009422 return new RTEMSX86_32TargetInfo(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00009423 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009424 return new NaClTargetInfo<X86_32TargetInfo>(Triple, Opts);
Alexey Bataevc99b0492015-11-25 09:24:26 +00009425 case llvm::Triple::ELFIAMCU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009426 return new MCUX86_32TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009427 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009428 return new X86_32TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009429 }
9430
9431 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009432 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009433 return new DarwinX86_64TargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00009434
Daniel Dunbar52322032009-08-18 05:47:58 +00009435 switch (os) {
Ed Schoutenf33c6072015-03-11 08:42:46 +00009436 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009437 return new CloudABITargetInfo<X86_64TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009438 case llvm::Triple::Linux: {
9439 switch (Triple.getEnvironment()) {
9440 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009441 return new LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009442 case llvm::Triple::Android:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009443 return new AndroidX86_64TargetInfo(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009444 }
9445 }
Chris Lattner002ba6b2010-01-09 05:41:14 +00009446 case llvm::Triple::DragonFly:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009447 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009448 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009449 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009450 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009451 return new OpenBSDX86_64TargetInfo(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00009452 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009453 return new BitrigX86_64TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009454 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009455 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Petr Hosek9834fcd2016-10-24 22:55:57 +00009456 case llvm::Triple::Fuchsia:
9457 return new FuchsiaTargetInfo<X86_64TargetInfo>(Triple, Opts);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00009458 case llvm::Triple::KFreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009459 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009460 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009461 return new SolarisTargetInfo<X86_64TargetInfo>(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009462 case llvm::Triple::Win32: {
9463 switch (Triple.getEnvironment()) {
Yaron Kerend030d112015-07-22 17:38:19 +00009464 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009465 return new CygwinX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009466 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009467 return new MinGWX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009468 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00009469 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009470 return new MicrosoftX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009471 }
9472 }
Reid Kleckner330fb172016-05-11 16:19:05 +00009473 case llvm::Triple::Haiku:
9474 return new HaikuTargetInfo<X86_64TargetInfo>(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00009475 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009476 return new NaClTargetInfo<X86_64TargetInfo>(Triple, Opts);
Alex Rosenberg12207fa2015-01-27 14:47:44 +00009477 case llvm::Triple::PS4:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009478 return new PS4OSTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009479 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009480 return new X86_64TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009481 }
Guy Benyeib798fc92012-12-11 21:38:14 +00009482
Douglas Katzman78d7c542015-05-12 21:18:10 +00009483 case llvm::Triple::spir: {
9484 if (Triple.getOS() != llvm::Triple::UnknownOS ||
9485 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
9486 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009487 return new SPIR32TargetInfo(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00009488 }
9489 case llvm::Triple::spir64: {
9490 if (Triple.getOS() != llvm::Triple::UnknownOS ||
9491 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
9492 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009493 return new SPIR64TargetInfo(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00009494 }
Dan Gohmanc2853072015-09-03 22:51:53 +00009495 case llvm::Triple::wasm32:
Dan Gohman839f2152017-01-17 21:46:38 +00009496 if (Triple.getSubArch() != llvm::Triple::NoSubArch ||
9497 Triple.getVendor() != llvm::Triple::UnknownVendor ||
9498 Triple.getOS() != llvm::Triple::UnknownOS ||
9499 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment ||
9500 !(Triple.isOSBinFormatELF() || Triple.isOSBinFormatWasm()))
Dan Gohmanc2853072015-09-03 22:51:53 +00009501 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009502 return new WebAssemblyOSTargetInfo<WebAssembly32TargetInfo>(Triple, Opts);
Dan Gohmanc2853072015-09-03 22:51:53 +00009503 case llvm::Triple::wasm64:
Dan Gohman839f2152017-01-17 21:46:38 +00009504 if (Triple.getSubArch() != llvm::Triple::NoSubArch ||
9505 Triple.getVendor() != llvm::Triple::UnknownVendor ||
9506 Triple.getOS() != llvm::Triple::UnknownOS ||
9507 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment ||
9508 !(Triple.isOSBinFormatELF() || Triple.isOSBinFormatWasm()))
Dan Gohmanc2853072015-09-03 22:51:53 +00009509 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009510 return new WebAssemblyOSTargetInfo<WebAssembly64TargetInfo>(Triple, Opts);
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00009511
9512 case llvm::Triple::renderscript32:
9513 return new LinuxTargetInfo<RenderScript32TargetInfo>(Triple, Opts);
9514 case llvm::Triple::renderscript64:
9515 return new LinuxTargetInfo<RenderScript64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009516 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00009517}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009518
9519/// CreateTargetInfo - Return the target info object for the specified target
Eric Christophere4f73b32015-08-07 19:07:08 +00009520/// options.
Alp Toker80758082014-07-06 05:26:44 +00009521TargetInfo *
9522TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
Saleem Abdulrasool10a49722016-04-08 16:52:00 +00009523 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00009524 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009525
9526 // Construct the target
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009527 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple, *Opts));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009528 if (!Target) {
9529 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00009530 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009531 }
Alp Toker80758082014-07-06 05:26:44 +00009532 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009533
Daniel Dunbaracde99e2009-12-18 18:42:37 +00009534 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00009535 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
9536 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00009537 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00009538 }
9539
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009540 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00009541 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
9542 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00009543 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009544 }
9545
Rafael Espindolaeb265472013-08-21 21:59:03 +00009546 // Set the fp math unit.
9547 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
9548 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00009549 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00009550 }
9551
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009552 // Compute the default target features, we need the target to handle this
9553 // because features may have dependencies on one another.
9554 llvm::StringMap<bool> Features;
Eric Christopher007b0a02015-08-28 22:32:01 +00009555 if (!Target->initFeatureMap(Features, Diags, Opts->CPU,
9556 Opts->FeaturesAsWritten))
Eric Christopher6b454372015-08-25 13:45:24 +00009557 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009558
9559 // Add the features to the compile options.
Douglas Gregorf8715de2012-11-16 04:24:59 +00009560 Opts->Features.clear();
Aaron Ballmanb226d3d2015-08-12 13:38:59 +00009561 for (const auto &F : Features)
9562 Opts->Features.push_back((F.getValue() ? "+" : "-") + F.getKey().str());
9563
Eric Christopher3ff21b32013-10-16 21:26:26 +00009564 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00009565 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009566
Yaxun Liu39cf40f2016-05-16 17:06:34 +00009567 Target->setSupportedOpenCLOpts();
Alexey Bader0ea07532016-11-01 15:50:52 +00009568 Target->setOpenCLExtensionOpts();
Yaxun Liu39cf40f2016-05-16 17:06:34 +00009569
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00009570 if (!Target->validateTarget(Diags))
9571 return nullptr;
9572
Ahmed Charles9a16beb2014-03-07 19:33:25 +00009573 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009574}