blob: b9d8dc04b32629e6f79a5bd67f4663ce978f497e [file] [log] [blame]
Saleem Abdulrasoolb6e946b2017-05-24 20:27:09 +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
Ed Schouten4dabea22017-06-25 08:29:09 +0000114// Ananas target
115template<typename Target>
116class AnanasTargetInfo : public OSTargetInfo<Target> {
117protected:
118 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
119 MacroBuilder &Builder) const override {
120 // Ananas defines
121 Builder.defineMacro("__Ananas__");
122 Builder.defineMacro("__ELF__");
123 }
124public:
125 AnanasTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
126 : OSTargetInfo<Target>(Triple, Opts) {}
127};
128
Daniel Dunbard86666f2010-01-26 01:44:04 +0000129static void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000130 const llvm::Triple &Triple,
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000131 StringRef &PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000132 VersionTuple &PlatformMinVersion) {
Bob Wilson834400b2013-08-19 20:23:37 +0000133 Builder.defineMacro("__APPLE_CC__", "6000");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000134 Builder.defineMacro("__APPLE__");
Duncan P. N. Exon Smith16b1ac92017-04-27 01:47:22 +0000135 Builder.defineMacro("__STDC_NO_THREADS__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000136 Builder.defineMacro("OBJC_NEW_PROPERTIES");
Alexander Potapenkob4f81902012-09-20 10:10:01 +0000137 // AddressSanitizer doesn't play well with source fortification, which is on
138 // by default on Darwin.
Alexey Samsonovedf99a92014-11-07 22:29:38 +0000139 if (Opts.Sanitize.has(SanitizerKind::Address))
140 Builder.defineMacro("_FORTIFY_SOURCE", "0");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000141
John McCall460ce582015-10-22 18:38:17 +0000142 // Darwin defines __weak, __strong, and __unsafe_unretained even in C mode.
143 if (!Opts.ObjC1) {
John McCall31168b02011-06-15 23:02:42 +0000144 // __weak is always defined, for use in blocks and with objc pointers.
145 Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))");
John McCall460ce582015-10-22 18:38:17 +0000146 Builder.defineMacro("__strong", "");
John McCall31168b02011-06-15 23:02:42 +0000147 Builder.defineMacro("__unsafe_unretained", "");
John McCall31168b02011-06-15 23:02:42 +0000148 }
Eric Christopher0c912c52011-07-07 22:55:26 +0000149
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000150 if (Opts.Static)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000151 Builder.defineMacro("__STATIC__");
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000152 else
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000153 Builder.defineMacro("__DYNAMIC__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000154
155 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000156 Builder.defineMacro("_REENTRANT");
Daniel Dunbar497ff132009-04-10 19:52:24 +0000157
Daniel Dunbarecf13562011-04-19 21:40:34 +0000158 // Get the platform type and version number from the triple.
Daniel Dunbar497ff132009-04-10 19:52:24 +0000159 unsigned Maj, Min, Rev;
Bob Wilson8e5acc52012-01-31 23:52:58 +0000160 if (Triple.isMacOSX()) {
161 Triple.getMacOSXVersion(Maj, Min, Rev);
Manman Renccf25bb2016-06-28 20:55:30 +0000162 PlatformName = "macos";
Daniel Dunbarecf13562011-04-19 21:40:34 +0000163 } else {
Bob Wilson8e5acc52012-01-31 23:52:58 +0000164 Triple.getOSVersion(Maj, Min, Rev);
165 PlatformName = llvm::Triple::getOSTypeName(Triple.getOS());
Daniel Dunbarecf13562011-04-19 21:40:34 +0000166 }
Daniel Dunbard86666f2010-01-26 01:44:04 +0000167
Sebastian Pop422377c2012-01-20 22:01:23 +0000168 // If -target arch-pc-win32-macho option specified, we're
Eric Christopherb081ba62011-07-29 21:20:35 +0000169 // generating code for Win32 ABI. No need to emit
Chad Rosierb90e4022011-07-19 20:00:06 +0000170 // __ENVIRONMENT_XX_OS_VERSION_MIN_REQUIRED__.
171 if (PlatformName == "win32") {
172 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
173 return;
174 }
175
Evan Cheng31dd9a62014-01-26 23:12:43 +0000176 // Set the appropriate OS version define.
177 if (Triple.isiOS()) {
Bob Wilson4cf27c42016-07-18 20:29:14 +0000178 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
179 char Str[7];
180 if (Maj < 10) {
181 Str[0] = '0' + Maj;
182 Str[1] = '0' + (Min / 10);
183 Str[2] = '0' + (Min % 10);
184 Str[3] = '0' + (Rev / 10);
185 Str[4] = '0' + (Rev % 10);
186 Str[5] = '\0';
187 } else {
188 // Handle versions >= 10.
189 Str[0] = '0' + (Maj / 10);
190 Str[1] = '0' + (Maj % 10);
191 Str[2] = '0' + (Min / 10);
192 Str[3] = '0' + (Min % 10);
193 Str[4] = '0' + (Rev / 10);
194 Str[5] = '0' + (Rev % 10);
195 Str[6] = '\0';
196 }
Tim Northover67465f82015-10-30 16:30:30 +0000197 if (Triple.isTvOS())
198 Builder.defineMacro("__ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__", Str);
199 else
200 Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__",
201 Str);
202
203 } else if (Triple.isWatchOS()) {
204 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
205 char Str[6];
206 Str[0] = '0' + Maj;
207 Str[1] = '0' + (Min / 10);
208 Str[2] = '0' + (Min % 10);
209 Str[3] = '0' + (Rev / 10);
210 Str[4] = '0' + (Rev % 10);
211 Str[5] = '\0';
212 Builder.defineMacro("__ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__", Str);
Evan Cheng31dd9a62014-01-26 23:12:43 +0000213 } else if (Triple.isMacOSX()) {
214 // Note that the Driver allows versions which aren't representable in the
215 // define (because we only get a single digit for the minor and micro
216 // revision numbers). So, we limit them to the maximum representable
217 // version.
218 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
Bob Wilson2a3710e2014-08-08 21:45:53 +0000219 char Str[7];
220 if (Maj < 10 || (Maj == 10 && Min < 10)) {
221 Str[0] = '0' + (Maj / 10);
222 Str[1] = '0' + (Maj % 10);
223 Str[2] = '0' + std::min(Min, 9U);
224 Str[3] = '0' + std::min(Rev, 9U);
225 Str[4] = '\0';
226 } else {
227 // Handle versions > 10.9.
228 Str[0] = '0' + (Maj / 10);
229 Str[1] = '0' + (Maj % 10);
230 Str[2] = '0' + (Min / 10);
231 Str[3] = '0' + (Min % 10);
232 Str[4] = '0' + (Rev / 10);
233 Str[5] = '0' + (Rev % 10);
234 Str[6] = '\0';
235 }
Evan Cheng31dd9a62014-01-26 23:12:43 +0000236 Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
Daniel Dunbar497ff132009-04-10 19:52:24 +0000237 }
Daniel Dunbarecf13562011-04-19 21:40:34 +0000238
Tim Northover157d9112014-01-16 08:48:16 +0000239 // Tell users about the kernel if there is one.
240 if (Triple.isOSDarwin())
241 Builder.defineMacro("__MACH__");
242
Chris Bieneman46977b62016-04-29 17:53:00 +0000243 // The Watch ABI uses Dwarf EH.
244 if(Triple.isWatchABI())
245 Builder.defineMacro("__ARM_DWARF_EH__");
246
Daniel Dunbarecf13562011-04-19 21:40:34 +0000247 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
Eli Friedman3fd920a2008-08-20 02:34:37 +0000248}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000249
Torok Edwinb2b37c62009-06-30 17:10:35 +0000250template<typename Target>
251class DarwinTargetInfo : public OSTargetInfo<Target> {
252protected:
Craig Topper3164f332014-03-11 03:39:26 +0000253 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
254 MacroBuilder &Builder) const override {
Eric Christopher0c912c52011-07-07 22:55:26 +0000255 getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000256 this->PlatformMinVersion);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000257 }
Mike Stump11289f42009-09-09 15:08:12 +0000258
Torok Edwinb2b37c62009-06-30 17:10:35 +0000259public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000260 DarwinTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
261 : OSTargetInfo<Target>(Triple, Opts) {
Tim Northovera12d0a92016-01-07 09:04:46 +0000262 // By default, no TLS, and we whitelist permitted architecture/OS
263 // combinations.
264 this->TLSSupported = false;
265
266 if (Triple.isMacOSX())
267 this->TLSSupported = !Triple.isMacOSXVersionLT(10, 7);
268 else if (Triple.isiOS()) {
269 // 64-bit iOS supported it from 8 onwards, 32-bit from 9 onwards.
270 if (Triple.getArch() == llvm::Triple::x86_64 ||
271 Triple.getArch() == llvm::Triple::aarch64)
272 this->TLSSupported = !Triple.isOSVersionLT(8);
273 else if (Triple.getArch() == llvm::Triple::x86 ||
274 Triple.getArch() == llvm::Triple::arm ||
275 Triple.getArch() == llvm::Triple::thumb)
276 this->TLSSupported = !Triple.isOSVersionLT(9);
277 } else if (Triple.isWatchOS())
278 this->TLSSupported = !Triple.isOSVersionLT(2);
279
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000280 this->MCountName = "\01mcount";
281 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000282
Craig Topper3164f332014-03-11 03:39:26 +0000283 std::string isValidSectionSpecifier(StringRef SR) const override {
Chris Lattner30ba6742009-08-10 19:03:04 +0000284 // Let MCSectionMachO validate this.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000285 StringRef Segment, Section;
Chris Lattner30ba6742009-08-10 19:03:04 +0000286 unsigned TAA, StubSize;
Daniel Dunbar75942372011-03-19 02:06:21 +0000287 bool HasTAA;
Chris Lattner30ba6742009-08-10 19:03:04 +0000288 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
Daniel Dunbar75942372011-03-19 02:06:21 +0000289 TAA, HasTAA, StubSize);
Chris Lattner30ba6742009-08-10 19:03:04 +0000290 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000291
Craig Topper3164f332014-03-11 03:39:26 +0000292 const char *getStaticInitSectionSpecifier() const override {
Anders Carlsson851318a2010-06-08 22:47:50 +0000293 // FIXME: We should return 0 when building kexts.
294 return "__TEXT,__StaticInit,regular,pure_instructions";
295 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000296
John McCalleed64c72012-01-29 01:20:30 +0000297 /// Darwin does not support protected visibility. Darwin's "default"
298 /// is very similar to ELF's "protected"; Darwin requires a "weak"
299 /// attribute on declarations that can be dynamically replaced.
Craig Topper3164f332014-03-11 03:39:26 +0000300 bool hasProtectedVisibility() const override {
John McCalleed64c72012-01-29 01:20:30 +0000301 return false;
302 }
Akira Hatanaka68ab7fe2016-03-31 06:36:07 +0000303
304 unsigned getExnObjectAlignment() const override {
305 // The alignment of an exception object is 8-bytes for darwin since
306 // libc++abi doesn't declare _Unwind_Exception with __attribute__((aligned))
307 // and therefore doesn't guarantee 16-byte alignment.
308 return 64;
309 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000310};
311
Chris Lattner30ba6742009-08-10 19:03:04 +0000312
Torok Edwinb2b37c62009-06-30 17:10:35 +0000313// DragonFlyBSD Target
314template<typename Target>
315class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
316protected:
Craig Topper3164f332014-03-11 03:39:26 +0000317 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
318 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000319 // DragonFly defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000320 Builder.defineMacro("__DragonFly__");
321 Builder.defineMacro("__DragonFly_cc_version", "100001");
322 Builder.defineMacro("__ELF__");
323 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
324 Builder.defineMacro("__tune_i386__");
Saleem Abdulrasool56027092017-02-07 19:00:06 +0000325 DefineStd(Builder, "unix", Opts);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000326 }
327public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000328 DragonFlyBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
329 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000330 switch (Triple.getArch()) {
331 default:
332 case llvm::Triple::x86:
333 case llvm::Triple::x86_64:
334 this->MCountName = ".mcount";
335 break;
336 }
Eli Friedman4286fba2012-02-10 23:02:29 +0000337 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000338};
339
Dimitry Andricc6d924c2016-05-20 17:27:22 +0000340#ifndef FREEBSD_CC_VERSION
341#define FREEBSD_CC_VERSION 0U
342#endif
343
Torok Edwinb2b37c62009-06-30 17:10:35 +0000344// FreeBSD Target
345template<typename Target>
346class FreeBSDTargetInfo : public OSTargetInfo<Target> {
347protected:
Craig Topper3164f332014-03-11 03:39:26 +0000348 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
349 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000350 // FreeBSD defines; list based off of gcc output
351
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000352 unsigned Release = Triple.getOSMajorVersion();
353 if (Release == 0U)
Dimitry Andricc6d924c2016-05-20 17:27:22 +0000354 Release = 8U;
355 unsigned CCVersion = FREEBSD_CC_VERSION;
356 if (CCVersion == 0U)
357 CCVersion = Release * 100000U + 1U;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000358
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000359 Builder.defineMacro("__FreeBSD__", Twine(Release));
Dimitry Andricc6d924c2016-05-20 17:27:22 +0000360 Builder.defineMacro("__FreeBSD_cc_version", Twine(CCVersion));
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000361 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
Saleem Abdulrasool56027092017-02-07 19:00:06 +0000362 DefineStd(Builder, "unix", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000363 Builder.defineMacro("__ELF__");
Ed Schoutend0621462013-09-29 07:54:52 +0000364
365 // On FreeBSD, wchar_t contains the number of the code point as
366 // used by the character set of the locale. These character sets are
367 // not necessarily a superset of ASCII.
Richard Smith00a4a852015-01-13 01:47:45 +0000368 //
369 // FIXME: This is wrong; the macro refers to the numerical values
370 // of wchar_t *literals*, which are not locale-dependent. However,
371 // FreeBSD systems apparently depend on us getting this wrong, and
372 // setting this to 1 is conforming even if all the basic source
373 // character literals have the same encoding as char and wchar_t.
Ed Schoutend0621462013-09-29 07:54:52 +0000374 Builder.defineMacro("__STDC_MB_MIGHT_NEQ_WC__", "1");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000375 }
376public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000377 FreeBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
378 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000379 switch (Triple.getArch()) {
380 default:
381 case llvm::Triple::x86:
382 case llvm::Triple::x86_64:
383 this->MCountName = ".mcount";
384 break;
385 case llvm::Triple::mips:
386 case llvm::Triple::mipsel:
387 case llvm::Triple::ppc:
388 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +0000389 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000390 this->MCountName = "_mcount";
391 break;
392 case llvm::Triple::arm:
393 this->MCountName = "__mcount";
394 break;
Duncan Sands9cb27e92009-07-08 13:55:08 +0000395 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000396 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000397};
398
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000399// GNU/kFreeBSD Target
400template<typename Target>
401class KFreeBSDTargetInfo : public OSTargetInfo<Target> {
402protected:
Craig Topper3164f332014-03-11 03:39:26 +0000403 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
404 MacroBuilder &Builder) const override {
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000405 // GNU/kFreeBSD defines; list based off of gcc output
406
Saleem Abdulrasool56027092017-02-07 19:00:06 +0000407 DefineStd(Builder, "unix", Opts);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000408 Builder.defineMacro("__FreeBSD_kernel__");
409 Builder.defineMacro("__GLIBC__");
410 Builder.defineMacro("__ELF__");
411 if (Opts.POSIXThreads)
412 Builder.defineMacro("_REENTRANT");
413 if (Opts.CPlusPlus)
414 Builder.defineMacro("_GNU_SOURCE");
415 }
416public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000417 KFreeBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
418 : OSTargetInfo<Target>(Triple, Opts) {}
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000419};
420
Reid Kleckner330fb172016-05-11 16:19:05 +0000421// Haiku Target
422template<typename Target>
423class HaikuTargetInfo : public OSTargetInfo<Target> {
424protected:
425 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
426 MacroBuilder &Builder) const override {
427 // Haiku defines; list based off of gcc output
428 Builder.defineMacro("__HAIKU__");
429 Builder.defineMacro("__ELF__");
Saleem Abdulrasool56027092017-02-07 19:00:06 +0000430 DefineStd(Builder, "unix", Opts);
Reid Kleckner330fb172016-05-11 16:19:05 +0000431 }
432public:
433 HaikuTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
434 : OSTargetInfo<Target>(Triple, Opts) {
435 this->SizeType = TargetInfo::UnsignedLong;
436 this->IntPtrType = TargetInfo::SignedLong;
437 this->PtrDiffType = TargetInfo::SignedLong;
438 this->ProcessIDType = TargetInfo::SignedLong;
439 this->TLSSupported = false;
440
441 }
442};
443
Chris Lattner3e2ee142010-07-07 16:01:42 +0000444// Minix Target
445template<typename Target>
446class MinixTargetInfo : public OSTargetInfo<Target> {
447protected:
Craig Topper3164f332014-03-11 03:39:26 +0000448 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
449 MacroBuilder &Builder) const override {
Chris Lattner3e2ee142010-07-07 16:01:42 +0000450 // Minix defines
451
452 Builder.defineMacro("__minix", "3");
453 Builder.defineMacro("_EM_WSIZE", "4");
454 Builder.defineMacro("_EM_PSIZE", "4");
455 Builder.defineMacro("_EM_SSIZE", "2");
456 Builder.defineMacro("_EM_LSIZE", "4");
457 Builder.defineMacro("_EM_FSIZE", "4");
458 Builder.defineMacro("_EM_DSIZE", "8");
Eli Friedman83de5132011-12-08 23:54:21 +0000459 Builder.defineMacro("__ELF__");
Saleem Abdulrasool56027092017-02-07 19:00:06 +0000460 DefineStd(Builder, "unix", Opts);
Chris Lattner3e2ee142010-07-07 16:01:42 +0000461 }
462public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000463 MinixTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
464 : OSTargetInfo<Target>(Triple, Opts) {}
Chris Lattner3e2ee142010-07-07 16:01:42 +0000465};
466
Torok Edwinb2b37c62009-06-30 17:10:35 +0000467// Linux target
468template<typename Target>
469class LinuxTargetInfo : public OSTargetInfo<Target> {
470protected:
Craig Topper3164f332014-03-11 03:39:26 +0000471 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
472 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000473 // Linux defines; list based off of gcc output
Saleem Abdulrasool56027092017-02-07 19:00:06 +0000474 DefineStd(Builder, "unix", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000475 DefineStd(Builder, "linux", Opts);
476 Builder.defineMacro("__gnu_linux__");
477 Builder.defineMacro("__ELF__");
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +0000478 if (Triple.isAndroid()) {
Evgeniy Stepanov94dc4c92012-04-26 12:08:09 +0000479 Builder.defineMacro("__ANDROID__", "1");
Dan Albert84aee012015-03-03 18:28:38 +0000480 unsigned Maj, Min, Rev;
David Majnemer5c2589a2015-06-01 23:38:25 +0000481 Triple.getEnvironmentVersion(Maj, Min, Rev);
Dan Albert84aee012015-03-03 18:28:38 +0000482 this->PlatformName = "android";
483 this->PlatformMinVersion = VersionTuple(Maj, Min, Rev);
Stephen Hinesa89d8ff2016-11-11 01:29:39 +0000484 if (Maj)
485 Builder.defineMacro("__ANDROID_API__", Twine(Maj));
Dan Albert84aee012015-03-03 18:28:38 +0000486 }
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000487 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000488 Builder.defineMacro("_REENTRANT");
Douglas Gregor3ecc6652010-04-21 05:52:38 +0000489 if (Opts.CPlusPlus)
490 Builder.defineMacro("_GNU_SOURCE");
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +0000491 if (this->HasFloat128)
492 Builder.defineMacro("__FLOAT128__");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000493 }
494public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000495 LinuxTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
496 : OSTargetInfo<Target>(Triple, Opts) {
Douglas Gregore6d6e512011-01-12 21:19:25 +0000497 this->WIntType = TargetInfo::UnsignedInt;
Hal Finkelecdb4542014-03-30 13:00:06 +0000498
499 switch (Triple.getArch()) {
500 default:
501 break;
502 case llvm::Triple::ppc:
503 case llvm::Triple::ppc64:
504 case llvm::Triple::ppc64le:
505 this->MCountName = "_mcount";
506 break;
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +0000507 case llvm::Triple::x86:
508 case llvm::Triple::x86_64:
509 case llvm::Triple::systemz:
510 this->HasFloat128 = true;
511 break;
Hal Finkelecdb4542014-03-30 13:00:06 +0000512 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000513 }
Benjamin Kramera518b222011-10-15 17:53:33 +0000514
Craig Topper3164f332014-03-11 03:39:26 +0000515 const char *getStaticInitSectionSpecifier() const override {
Benjamin Kramera518b222011-10-15 17:53:33 +0000516 return ".text.startup";
517 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000518};
519
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000520// NetBSD Target
521template<typename Target>
522class NetBSDTargetInfo : public OSTargetInfo<Target> {
523protected:
Craig Topper3164f332014-03-11 03:39:26 +0000524 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
525 MacroBuilder &Builder) const override {
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000526 // NetBSD defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000527 Builder.defineMacro("__NetBSD__");
528 Builder.defineMacro("__unix__");
529 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000530 if (Opts.POSIXThreads)
Joerg Sonnenberger84502662017-01-16 14:07:24 +0000531 Builder.defineMacro("_REENTRANT");
Joerg Sonnenbergercc1edb52014-05-13 18:58:36 +0000532
533 switch (Triple.getArch()) {
534 default:
535 break;
536 case llvm::Triple::arm:
537 case llvm::Triple::armeb:
538 case llvm::Triple::thumb:
539 case llvm::Triple::thumbeb:
540 Builder.defineMacro("__ARM_DWARF_EH__");
541 break;
542 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000543 }
544public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000545 NetBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
546 : OSTargetInfo<Target>(Triple, Opts) {
Joerg Sonnenberger740f3f42015-04-10 21:02:53 +0000547 this->MCountName = "_mcount";
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000548 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000549};
550
Torok Edwinb2b37c62009-06-30 17:10:35 +0000551// OpenBSD Target
552template<typename Target>
553class OpenBSDTargetInfo : public OSTargetInfo<Target> {
554protected:
Craig Topper3164f332014-03-11 03:39:26 +0000555 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
556 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000557 // OpenBSD defines; list based off of gcc output
558
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000559 Builder.defineMacro("__OpenBSD__");
Saleem Abdulrasool56027092017-02-07 19:00:06 +0000560 DefineStd(Builder, "unix", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000561 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000562 if (Opts.POSIXThreads)
Chris Lattner024e12d2012-04-25 06:12:24 +0000563 Builder.defineMacro("_REENTRANT");
Brad Smith0561a5a2017-02-20 03:18:15 +0000564 if (this->HasFloat128)
565 Builder.defineMacro("__FLOAT128__");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000566 }
567public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000568 OpenBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
569 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000570 this->TLSSupported = false;
Eli Friedman3715d1f2011-12-15 02:15:56 +0000571
Eli Friedman3715d1f2011-12-15 02:15:56 +0000572 switch (Triple.getArch()) {
Eli Friedman3715d1f2011-12-15 02:15:56 +0000573 case llvm::Triple::x86:
574 case llvm::Triple::x86_64:
Brad Smith0561a5a2017-02-20 03:18:15 +0000575 this->HasFloat128 = true;
576 // FALLTHROUGH
577 default:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000578 this->MCountName = "__mcount";
579 break;
580 case llvm::Triple::mips64:
581 case llvm::Triple::mips64el:
582 case llvm::Triple::ppc:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000583 case llvm::Triple::sparcv9:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000584 this->MCountName = "_mcount";
585 break;
586 }
587 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000588};
589
Eli Friedman9fa28852012-08-08 23:57:20 +0000590// Bitrig Target
591template<typename Target>
592class BitrigTargetInfo : public OSTargetInfo<Target> {
593protected:
Craig Topper3164f332014-03-11 03:39:26 +0000594 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
595 MacroBuilder &Builder) const override {
Eli Friedman9fa28852012-08-08 23:57:20 +0000596 // Bitrig defines; list based off of gcc output
597
598 Builder.defineMacro("__Bitrig__");
Saleem Abdulrasool56027092017-02-07 19:00:06 +0000599 DefineStd(Builder, "unix", Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +0000600 Builder.defineMacro("__ELF__");
601 if (Opts.POSIXThreads)
602 Builder.defineMacro("_REENTRANT");
Renato Golin9ba39232015-02-27 16:35:48 +0000603
604 switch (Triple.getArch()) {
605 default:
606 break;
607 case llvm::Triple::arm:
608 case llvm::Triple::armeb:
609 case llvm::Triple::thumb:
610 case llvm::Triple::thumbeb:
611 Builder.defineMacro("__ARM_DWARF_EH__");
612 break;
613 }
Eli Friedman9fa28852012-08-08 23:57:20 +0000614 }
615public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000616 BitrigTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
617 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000618 this->MCountName = "__mcount";
Eli Friedman9fa28852012-08-08 23:57:20 +0000619 }
620};
621
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000622// PSP Target
623template<typename Target>
624class PSPTargetInfo : public OSTargetInfo<Target> {
625protected:
Craig Topper3164f332014-03-11 03:39:26 +0000626 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
627 MacroBuilder &Builder) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000628 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000629 Builder.defineMacro("PSP");
630 Builder.defineMacro("_PSP");
631 Builder.defineMacro("__psp__");
632 Builder.defineMacro("__ELF__");
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000633 }
634public:
James Y Knightb214cbc2016-03-04 19:00:41 +0000635 PSPTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {}
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000636};
637
John Thompsone467e192009-11-19 17:18:50 +0000638// PS3 PPU Target
639template<typename Target>
640class PS3PPUTargetInfo : public OSTargetInfo<Target> {
641protected:
Craig Topper3164f332014-03-11 03:39:26 +0000642 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
643 MacroBuilder &Builder) const override {
John Thompsone467e192009-11-19 17:18:50 +0000644 // PS3 PPU defines.
John Thompson957816f2010-03-25 16:18:32 +0000645 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000646 Builder.defineMacro("__PPU__");
647 Builder.defineMacro("__CELLOS_LV2__");
648 Builder.defineMacro("__ELF__");
649 Builder.defineMacro("__LP32__");
John Thompson07a61a42010-06-24 22:44:13 +0000650 Builder.defineMacro("_ARCH_PPC64");
651 Builder.defineMacro("__powerpc64__");
John Thompsone467e192009-11-19 17:18:50 +0000652 }
653public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000654 PS3PPUTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
655 : OSTargetInfo<Target>(Triple, Opts) {
Nick Lewyckyc0a61732011-12-16 22:32:39 +0000656 this->LongWidth = this->LongAlign = 32;
657 this->PointerWidth = this->PointerAlign = 32;
John Thompson07a61a42010-06-24 22:44:13 +0000658 this->IntMaxType = TargetInfo::SignedLongLong;
John Thompson07a61a42010-06-24 22:44:13 +0000659 this->Int64Type = TargetInfo::SignedLongLong;
John Thompson6f8dba72009-12-18 14:21:08 +0000660 this->SizeType = TargetInfo::UnsignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +0000661 this->resetDataLayout("E-m:e-p:32:32-i64:64-n32:64");
John Thompsone467e192009-11-19 17:18:50 +0000662 }
663};
664
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000665template <typename Target>
666class PS4OSTargetInfo : public OSTargetInfo<Target> {
667protected:
668 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
669 MacroBuilder &Builder) const override {
670 Builder.defineMacro("__FreeBSD__", "9");
671 Builder.defineMacro("__FreeBSD_cc_version", "900001");
672 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
Saleem Abdulrasool56027092017-02-07 19:00:06 +0000673 DefineStd(Builder, "unix", Opts);
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000674 Builder.defineMacro("__ELF__");
Paul Robinson9d613612016-05-16 17:22:25 +0000675 Builder.defineMacro("__ORBIS__");
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000676 }
677public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000678 PS4OSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
679 : OSTargetInfo<Target>(Triple, Opts) {
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000680 this->WCharType = this->UnsignedShort;
681
Paul Robinsond30e2ee2015-07-14 20:52:32 +0000682 // On PS4, TLS variable cannot be aligned to more than 32 bytes (256 bits).
683 this->MaxTLSAlign = 256;
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000684
Sunil Srivastava0ce2f222016-02-05 20:50:02 +0000685 // On PS4, do not honor explicit bit field alignment,
686 // as in "__attribute__((aligned(2))) int b : 1;".
687 this->UseExplicitBitFieldAlignment = false;
688
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000689 switch (Triple.getArch()) {
690 default:
691 case llvm::Triple::x86_64:
692 this->MCountName = ".mcount";
693 break;
694 }
695 }
696};
697
Torok Edwinb2b37c62009-06-30 17:10:35 +0000698// Solaris target
699template<typename Target>
700class SolarisTargetInfo : public OSTargetInfo<Target> {
701protected:
Craig Topper3164f332014-03-11 03:39:26 +0000702 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
703 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000704 DefineStd(Builder, "sun", Opts);
Saleem Abdulrasool56027092017-02-07 19:00:06 +0000705 DefineStd(Builder, "unix", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000706 Builder.defineMacro("__ELF__");
707 Builder.defineMacro("__svr4__");
708 Builder.defineMacro("__SVR4");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000709 // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and
710 // newer, but to 500 for everything else. feature_test.h has a check to
711 // ensure that you are not using C99 with an old version of X/Open or C89
Richard Smithab506ad2014-10-20 23:26:58 +0000712 // with a new version.
713 if (Opts.C99)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000714 Builder.defineMacro("_XOPEN_SOURCE", "600");
715 else
716 Builder.defineMacro("_XOPEN_SOURCE", "500");
David Chisnalle04307e2012-03-02 10:49:52 +0000717 if (Opts.CPlusPlus)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000718 Builder.defineMacro("__C99FEATURES__");
David Chisnall0c1941cb2012-02-17 18:35:11 +0000719 Builder.defineMacro("_LARGEFILE_SOURCE");
720 Builder.defineMacro("_LARGEFILE64_SOURCE");
721 Builder.defineMacro("__EXTENSIONS__");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000722 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000723 }
724public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000725 SolarisTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
726 : OSTargetInfo<Target>(Triple, Opts) {
David Chisnallb526e932012-03-28 18:04:14 +0000727 this->WCharType = this->SignedInt;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000728 // FIXME: WIntType should be SignedLong
729 }
730};
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000731
732// Windows target
733template<typename Target>
734class WindowsTargetInfo : public OSTargetInfo<Target> {
735protected:
Craig Topper3164f332014-03-11 03:39:26 +0000736 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
737 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000738 Builder.defineMacro("_WIN32");
739 }
740 void getVisualStudioDefines(const LangOptions &Opts,
741 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000742 if (Opts.CPlusPlus) {
David Majnemerf6072342014-07-01 22:24:56 +0000743 if (Opts.RTTIData)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000744 Builder.defineMacro("_CPPRTTI");
745
Reid Kleckner16514352015-01-30 21:42:55 +0000746 if (Opts.CXXExceptions)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000747 Builder.defineMacro("_CPPUNWIND");
748 }
749
David Majnemer6a658902015-07-22 22:36:26 +0000750 if (Opts.Bool)
751 Builder.defineMacro("__BOOL_DEFINED");
752
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000753 if (!Opts.CharIsSigned)
754 Builder.defineMacro("_CHAR_UNSIGNED");
755
756 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
757 // but it works for now.
758 if (Opts.POSIXThreads)
759 Builder.defineMacro("_MT");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000760
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +0000761 if (Opts.MSCompatibilityVersion) {
762 Builder.defineMacro("_MSC_VER",
763 Twine(Opts.MSCompatibilityVersion / 100000));
764 Builder.defineMacro("_MSC_FULL_VER", Twine(Opts.MSCompatibilityVersion));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000765 // FIXME We cannot encode the revision information into 32-bits
766 Builder.defineMacro("_MSC_BUILD", Twine(1));
David Majnemeraaf2b842015-03-18 07:53:18 +0000767
David Majnemerb710a932015-05-11 03:57:49 +0000768 if (Opts.CPlusPlus11 && Opts.isCompatibleWithMSVC(LangOptions::MSVC2015))
David Majnemeraaf2b842015-03-18 07:53:18 +0000769 Builder.defineMacro("_HAS_CHAR16_T_LANGUAGE_SUPPORT", Twine(1));
David Majnemer017cf352016-06-28 03:13:16 +0000770
771 if (Opts.isCompatibleWithMSVC(LangOptions::MSVC2015)) {
772 if (Opts.CPlusPlus1z)
773 Builder.defineMacro("_MSVC_LANG", "201403L");
774 else if (Opts.CPlusPlus14)
775 Builder.defineMacro("_MSVC_LANG", "201402L");
776 }
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000777 }
Reid Kleckner6f6e76d2014-04-16 20:10:16 +0000778
779 if (Opts.MicrosoftExt) {
780 Builder.defineMacro("_MSC_EXTENSIONS");
781
782 if (Opts.CPlusPlus11) {
783 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
784 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
785 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
786 }
787 }
788
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000789 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000790 }
791
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000792public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000793 WindowsTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
794 : OSTargetInfo<Target>(Triple, Opts) {}
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000795};
796
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000797template <typename Target>
798class NaClTargetInfo : public OSTargetInfo<Target> {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000799protected:
Craig Topper3164f332014-03-11 03:39:26 +0000800 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
801 MacroBuilder &Builder) const override {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000802 if (Opts.POSIXThreads)
803 Builder.defineMacro("_REENTRANT");
804 if (Opts.CPlusPlus)
805 Builder.defineMacro("_GNU_SOURCE");
806
Saleem Abdulrasool56027092017-02-07 19:00:06 +0000807 DefineStd(Builder, "unix", Opts);
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000808 Builder.defineMacro("__ELF__");
809 Builder.defineMacro("__native_client__");
810 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000811
812public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000813 NaClTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
814 : OSTargetInfo<Target>(Triple, Opts) {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000815 this->LongAlign = 32;
816 this->LongWidth = 32;
817 this->PointerAlign = 32;
818 this->PointerWidth = 32;
819 this->IntMaxType = TargetInfo::SignedLongLong;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000820 this->Int64Type = TargetInfo::SignedLongLong;
821 this->DoubleAlign = 64;
822 this->LongDoubleWidth = 64;
823 this->LongDoubleAlign = 64;
Jan Wen Voung1f9c4ee2014-01-15 21:42:41 +0000824 this->LongLongWidth = 64;
825 this->LongLongAlign = 64;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000826 this->SizeType = TargetInfo::UnsignedInt;
827 this->PtrDiffType = TargetInfo::SignedInt;
828 this->IntPtrType = TargetInfo::SignedInt;
Guy Blank294cbbd2016-08-18 08:44:33 +0000829 // RegParmMax is inherited from the underlying architecture.
Stephan Bergmann17c7f702016-12-14 11:57:17 +0000830 this->LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Rafael Espindola1c09b262013-12-18 23:41:04 +0000831 if (Triple.getArch() == llvm::Triple::arm) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +0000832 // Handled in ARM's setABI().
Rafael Espindola1c09b262013-12-18 23:41:04 +0000833 } else if (Triple.getArch() == llvm::Triple::x86) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000834 this->resetDataLayout("e-m:e-p:32:32-i64:64-n8:16:32-S128");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000835 } else if (Triple.getArch() == llvm::Triple::x86_64) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000836 this->resetDataLayout("e-m:e-p:32:32-i64:64-n8:16:32:64-S128");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000837 } else if (Triple.getArch() == llvm::Triple::mipsel) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000838 // Handled on mips' setDataLayout.
Rafael Espindola1c09b262013-12-18 23:41:04 +0000839 } else {
840 assert(Triple.getArch() == llvm::Triple::le32);
James Y Knightb214cbc2016-03-04 19:00:41 +0000841 this->resetDataLayout("e-p:32:32-i64:64");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000842 }
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000843 }
844};
Torok Edwinb2b37c62009-06-30 17:10:35 +0000845
Petr Hosek62e1d232016-10-06 06:08:09 +0000846// Fuchsia Target
847template<typename Target>
848class FuchsiaTargetInfo : public OSTargetInfo<Target> {
849protected:
850 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
851 MacroBuilder &Builder) const override {
852 Builder.defineMacro("__Fuchsia__");
853 Builder.defineMacro("__ELF__");
854 if (Opts.POSIXThreads)
855 Builder.defineMacro("_REENTRANT");
856 // Required by the libc++ locale support.
857 if (Opts.CPlusPlus)
858 Builder.defineMacro("_GNU_SOURCE");
859 }
860public:
861 FuchsiaTargetInfo(const llvm::Triple &Triple,
862 const TargetOptions &Opts)
863 : OSTargetInfo<Target>(Triple, Opts) {
864 this->MCountName = "__mcount";
865 }
866};
867
Dan Gohmanc2853072015-09-03 22:51:53 +0000868// WebAssembly target
869template <typename Target>
870class WebAssemblyOSTargetInfo : public OSTargetInfo<Target> {
871 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Hans Wennborg7eb54642015-09-10 17:07:54 +0000872 MacroBuilder &Builder) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +0000873 // A common platform macro.
874 if (Opts.POSIXThreads)
875 Builder.defineMacro("_REENTRANT");
876 // Follow g++ convention and predefine _GNU_SOURCE for C++.
877 if (Opts.CPlusPlus)
878 Builder.defineMacro("_GNU_SOURCE");
879 }
880
881 // As an optimization, group static init code together in a section.
Hans Wennborg7eb54642015-09-10 17:07:54 +0000882 const char *getStaticInitSectionSpecifier() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +0000883 return ".text.__startup";
884 }
885
886public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000887 explicit WebAssemblyOSTargetInfo(const llvm::Triple &Triple,
888 const TargetOptions &Opts)
889 : OSTargetInfo<Target>(Triple, Opts) {
Dan Gohmanc2853072015-09-03 22:51:53 +0000890 this->MCountName = "__mcount";
Dan Gohmanc2853072015-09-03 22:51:53 +0000891 this->TheCXXABI.set(TargetCXXABI::WebAssembly);
892 }
893};
Dan Gohmanc2853072015-09-03 22:51:53 +0000894
Chris Lattner09d98f52008-10-05 21:50:58 +0000895//===----------------------------------------------------------------------===//
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000896// Specific target implementations.
897//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000898
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000899// PPC abstract base class
900class PPCTargetInfo : public TargetInfo {
901 static const Builtin::Info BuiltinInfo[];
902 static const char * const GCCRegNames[];
903 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Hal Finkel8eb59282012-06-11 22:35:19 +0000904 std::string CPU;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000905
906 // Target cpu features.
Eric Christopher758aad72017-03-21 22:06:18 +0000907 bool HasAltivec;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000908 bool HasVSX;
Bill Schmidt8c184e32014-10-10 17:21:23 +0000909 bool HasP8Vector;
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +0000910 bool HasP8Crypto;
Nemanja Ivanovic35458c22015-04-11 10:43:36 +0000911 bool HasDirectMove;
Hal Finkel0d0a1a52015-03-11 19:14:15 +0000912 bool HasQPX;
Kit Barton8246f282015-03-25 19:41:41 +0000913 bool HasHTM;
Nemanja Ivanovic239eec72015-04-09 23:58:16 +0000914 bool HasBPERMD;
915 bool HasExtDiv;
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +0000916 bool HasP9Vector;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000917
Ulrich Weigand8afad612014-07-28 13:17:52 +0000918protected:
919 std::string ABI;
920
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000921public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000922 PPCTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Eric Christopher758aad72017-03-21 22:06:18 +0000923 : TargetInfo(Triple), HasAltivec(false), HasVSX(false), HasP8Vector(false),
Saleem Abdulrasool10a49722016-04-08 16:52:00 +0000924 HasP8Crypto(false), HasDirectMove(false), HasQPX(false), HasHTM(false),
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +0000925 HasBPERMD(false), HasExtDiv(false), HasP9Vector(false) {
Eric Christopher153dad42017-03-25 02:55:21 +0000926 SuitableAlign = 128;
Alexey Bataev00396512015-07-02 03:40:19 +0000927 SimdDefaultAlign = 128;
Nico Weber3435ede2012-01-31 02:07:33 +0000928 LongDoubleWidth = LongDoubleAlign = 128;
Stephan Bergmann17c7f702016-12-14 11:57:17 +0000929 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble();
Nico Weber3435ede2012-01-31 02:07:33 +0000930 }
Eli Friedman9ffd4a92009-06-05 07:05:05 +0000931
Hal Finkel6b984f02012-07-03 16:51:04 +0000932 /// \brief Flags for architecture specific defines.
933 typedef enum {
934 ArchDefineNone = 0,
935 ArchDefineName = 1 << 0, // <name> is substituted for arch name.
936 ArchDefinePpcgr = 1 << 1,
937 ArchDefinePpcsq = 1 << 2,
938 ArchDefine440 = 1 << 3,
939 ArchDefine603 = 1 << 4,
940 ArchDefine604 = 1 << 5,
941 ArchDefinePwr4 = 1 << 6,
Bill Schmidt38378a02013-02-01 20:23:10 +0000942 ArchDefinePwr5 = 1 << 7,
943 ArchDefinePwr5x = 1 << 8,
944 ArchDefinePwr6 = 1 << 9,
945 ArchDefinePwr6x = 1 << 10,
946 ArchDefinePwr7 = 1 << 11,
Will Schmidtf0487512014-06-26 13:34:10 +0000947 ArchDefinePwr8 = 1 << 12,
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +0000948 ArchDefinePwr9 = 1 << 13,
949 ArchDefineA2 = 1 << 14,
950 ArchDefineA2q = 1 << 15
Hal Finkel6b984f02012-07-03 16:51:04 +0000951 } ArchDefineTypes;
952
Eric Christopher3646e622017-03-22 06:36:09 +0000953 // Set the language option for altivec based on our value.
954 void adjust(LangOptions &Opts) override {
955 if (HasAltivec)
956 Opts.AltiVec = 1;
957 TargetInfo::adjust(Opts);
958 }
959
Bill Schmidt38378a02013-02-01 20:23:10 +0000960 // Note: GCC recognizes the following additional cpus:
961 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
962 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
963 // titan, rs64.
Craig Topper3164f332014-03-11 03:39:26 +0000964 bool setCPU(const std::string &Name) override {
Hal Finkel8eb59282012-06-11 22:35:19 +0000965 bool CPUKnown = llvm::StringSwitch<bool>(Name)
966 .Case("generic", true)
967 .Case("440", true)
968 .Case("450", true)
969 .Case("601", true)
970 .Case("602", true)
971 .Case("603", true)
972 .Case("603e", true)
973 .Case("603ev", true)
974 .Case("604", true)
975 .Case("604e", true)
976 .Case("620", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000977 .Case("630", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000978 .Case("g3", true)
979 .Case("7400", true)
980 .Case("g4", true)
981 .Case("7450", true)
982 .Case("g4+", true)
983 .Case("750", true)
984 .Case("970", true)
985 .Case("g5", true)
986 .Case("a2", true)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +0000987 .Case("a2q", true)
Hal Finkelf6d6cb02012-09-18 22:25:03 +0000988 .Case("e500mc", true)
989 .Case("e5500", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000990 .Case("power3", true)
991 .Case("pwr3", true)
992 .Case("power4", true)
993 .Case("pwr4", true)
994 .Case("power5", true)
995 .Case("pwr5", true)
996 .Case("power5x", true)
997 .Case("pwr5x", true)
998 .Case("power6", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000999 .Case("pwr6", true)
Bill Schmidt38378a02013-02-01 20:23:10 +00001000 .Case("power6x", true)
1001 .Case("pwr6x", true)
1002 .Case("power7", true)
Hal Finkel8eb59282012-06-11 22:35:19 +00001003 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +00001004 .Case("power8", true)
1005 .Case("pwr8", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001006 .Case("power9", true)
1007 .Case("pwr9", true)
Bill Schmidt38378a02013-02-01 20:23:10 +00001008 .Case("powerpc", true)
Hal Finkel8eb59282012-06-11 22:35:19 +00001009 .Case("ppc", true)
Bill Schmidt38378a02013-02-01 20:23:10 +00001010 .Case("powerpc64", true)
Hal Finkel8eb59282012-06-11 22:35:19 +00001011 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +00001012 .Case("powerpc64le", true)
1013 .Case("ppc64le", true)
Hal Finkel8eb59282012-06-11 22:35:19 +00001014 .Default(false);
1015
1016 if (CPUKnown)
1017 CPU = Name;
1018
1019 return CPUKnown;
1020 }
1021
Ulrich Weigand8afad612014-07-28 13:17:52 +00001022
1023 StringRef getABI() const override { return ABI; }
1024
Craig Topper6c03a542015-10-19 04:51:35 +00001025 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
1026 return llvm::makeArrayRef(BuiltinInfo,
1027 clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner10a5b382007-01-29 05:24:35 +00001028 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001029
Craig Topper3164f332014-03-11 03:39:26 +00001030 bool isCLZForZeroUndef() const override { return false; }
Bob Wilson19a2f2b2012-01-28 18:02:29 +00001031
Craig Topper3164f332014-03-11 03:39:26 +00001032 void getTargetDefines(const LangOptions &Opts,
1033 MacroBuilder &Builder) const override;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001034
Eric Christopher8c47b422015-10-09 18:39:55 +00001035 bool
1036 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
1037 StringRef CPU,
1038 const std::vector<std::string> &FeaturesVec) const override;
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001039
Craig Topper3164f332014-03-11 03:39:26 +00001040 bool handleTargetFeatures(std::vector<std::string> &Features,
1041 DiagnosticsEngine &Diags) override;
1042 bool hasFeature(StringRef Feature) const override;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001043 void setFeatureEnabled(llvm::StringMap<bool> &Features, StringRef Name,
1044 bool Enabled) const override;
Craig Topper3164f332014-03-11 03:39:26 +00001045
Craig Topperf054e3a2015-10-19 03:52:27 +00001046 ArrayRef<const char *> getGCCRegNames() const override;
1047 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00001048 bool validateAsmConstraint(const char *&Name,
1049 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00001050 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +00001051 default: return false;
1052 case 'O': // Zero
John Thompson07a61a42010-06-24 22:44:13 +00001053 break;
Anders Carlssonf511f642007-11-27 04:11:28 +00001054 case 'b': // Base register
1055 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +00001056 Info.setAllowsRegister();
John Thompson07a61a42010-06-24 22:44:13 +00001057 break;
1058 // FIXME: The following are added to allow parsing.
1059 // I just took a guess at what the actions should be.
1060 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001061 case 'd': // Floating point register (containing 64-bit value)
John Thompson07a61a42010-06-24 22:44:13 +00001062 case 'v': // Altivec vector register
1063 Info.setAllowsRegister();
1064 break;
1065 case 'w':
1066 switch (Name[1]) {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001067 case 'd':// VSX vector register to hold vector double data
1068 case 'f':// VSX vector register to hold vector float data
1069 case 's':// VSX vector register to hold scalar float data
1070 case 'a':// Any VSX register
Hal Finkelf7a07a52014-03-02 18:24:18 +00001071 case 'c':// An individual CR bit
John Thompson07a61a42010-06-24 22:44:13 +00001072 break;
1073 default:
1074 return false;
1075 }
1076 Info.setAllowsRegister();
1077 Name++; // Skip over 'w'.
1078 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001079 case 'h': // `MQ', `CTR', or `LINK' register
1080 case 'q': // `MQ' register
1081 case 'c': // `CTR' register
1082 case 'l': // `LINK' register
1083 case 'x': // `CR' register (condition register) number 0
1084 case 'y': // `CR' register (condition register)
1085 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson07a61a42010-06-24 22:44:13 +00001086 Info.setAllowsRegister();
1087 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001088 case 'I': // Signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +00001089 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001090 // (use `L' instead for SImode constants)
1091 case 'K': // Unsigned 16-bit constant
1092 case 'L': // Signed 16-bit constant shifted left 16 bits
1093 case 'M': // Constant larger than 31
1094 case 'N': // Exact power of 2
1095 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +00001096 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001097 // register with one instruction per word
John Thompson07a61a42010-06-24 22:44:13 +00001098 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001099 // into a register using three instructions
John Thompson07a61a42010-06-24 22:44:13 +00001100 break;
1101 case 'm': // Memory operand. Note that on PowerPC targets, m can
1102 // include addresses that update the base register. It
1103 // is therefore only safe to use `m' in an asm statement
1104 // if that asm statement accesses the operand exactly once.
1105 // The asm statement must also use `%U<opno>' as a
Sebastian Redldd008712010-08-17 22:42:34 +00001106 // placeholder for the "update" flag in the corresponding
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001107 // load or store instruction. For example:
John Thompson07a61a42010-06-24 22:44:13 +00001108 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001109 // is correct but:
John Thompson07a61a42010-06-24 22:44:13 +00001110 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
1111 // is not. Use es rather than m if you don't want the base
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001112 // register to be updated.
1113 case 'e':
John Thompsonceebdf12010-06-25 00:02:05 +00001114 if (Name[1] != 's')
1115 return false;
Sebastian Redldd008712010-08-17 22:42:34 +00001116 // es: A "stable" memory operand; that is, one which does not
John Thompson07a61a42010-06-24 22:44:13 +00001117 // include any automodification of the base register. Unlike
1118 // `m', this constraint can be used in asm statements that
1119 // might access the operand several times, or that might not
John Thompsonceebdf12010-06-25 00:02:05 +00001120 // access it at all.
John Thompson07a61a42010-06-24 22:44:13 +00001121 Info.setAllowsMemory();
John Thompsonceebdf12010-06-25 00:02:05 +00001122 Name++; // Skip over 'e'.
John Thompson07a61a42010-06-24 22:44:13 +00001123 break;
1124 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001125 // usually better to use `m' or `es' in asm statements)
John Thompson07a61a42010-06-24 22:44:13 +00001126 case 'Z': // Memory operand that is an indexed or indirect from a
1127 // register (it is usually better to use `m' or `es' in
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001128 // asm statements)
John Thompson07a61a42010-06-24 22:44:13 +00001129 Info.setAllowsMemory();
1130 Info.setAllowsRegister();
1131 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001132 case 'R': // AIX TOC entry
John Thompson07a61a42010-06-24 22:44:13 +00001133 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001134 // register (`p' is preferable for asm statements)
1135 case 'S': // Constant suitable as a 64-bit mask operand
1136 case 'T': // Constant suitable as a 32-bit mask operand
1137 case 'U': // System V Release 4 small data area reference
John Thompson07a61a42010-06-24 22:44:13 +00001138 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001139 // instructions
1140 case 'W': // Vector constant that does not require memory
1141 case 'j': // Vector constant that is all zeros.
John Thompson07a61a42010-06-24 22:44:13 +00001142 break;
1143 // End FIXME.
Anders Carlssonf511f642007-11-27 04:11:28 +00001144 }
John Thompson07a61a42010-06-24 22:44:13 +00001145 return true;
Anders Carlssonf511f642007-11-27 04:11:28 +00001146 }
Craig Topper3164f332014-03-11 03:39:26 +00001147 std::string convertConstraint(const char *&Constraint) const override {
Hal Finkelf7a07a52014-03-02 18:24:18 +00001148 std::string R;
1149 switch (*Constraint) {
1150 case 'e':
1151 case 'w':
1152 // Two-character constraint; add "^" hint for later parsing.
1153 R = std::string("^") + std::string(Constraint, 2);
1154 Constraint++;
1155 break;
1156 default:
1157 return TargetInfo::convertConstraint(Constraint);
1158 }
1159 return R;
1160 }
Craig Topper3164f332014-03-11 03:39:26 +00001161 const char *getClobbers() const override {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001162 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +00001163 }
Craig Topper3164f332014-03-11 03:39:26 +00001164 int getEHDataRegisterNumber(unsigned RegNo) const override {
Adhemerval Zanella5d874ae2013-01-22 20:02:45 +00001165 if (RegNo == 0) return 3;
1166 if (RegNo == 1) return 4;
1167 return -1;
1168 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00001169
1170 bool hasSjLjLowering() const override {
1171 return true;
1172 }
David Majnemer2617ea62015-06-09 18:05:33 +00001173
1174 bool useFloat128ManglingForLongDouble() const override {
1175 return LongDoubleWidth == 128 &&
Stephan Bergmann17c7f702016-12-14 11:57:17 +00001176 LongDoubleFormat == &llvm::APFloat::PPCDoubleDouble() &&
David Majnemer2617ea62015-06-09 18:05:33 +00001177 getTriple().isOSBinFormatELF();
1178 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001179};
Anders Carlssonf511f642007-11-27 04:11:28 +00001180
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001181const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00001182#define BUILTIN(ID, TYPE, ATTRS) \
1183 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1184#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1185 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5abdec72009-06-14 01:05:48 +00001186#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001187};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001188
Eric Christopher917e9522014-11-18 22:36:15 +00001189/// handleTargetFeatures - Perform initialization based on the user
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001190/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00001191bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001192 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00001193 for (const auto &Feature : Features) {
Eric Christopher758aad72017-03-21 22:06:18 +00001194 if (Feature == "+altivec") {
1195 HasAltivec = true;
1196 } else if (Feature == "+vsx") {
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001197 HasVSX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001198 } else if (Feature == "+bpermd") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001199 HasBPERMD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001200 } else if (Feature == "+extdiv") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001201 HasExtDiv = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001202 } else if (Feature == "+power8-vector") {
Bill Schmidt8c184e32014-10-10 17:21:23 +00001203 HasP8Vector = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001204 } else if (Feature == "+crypto") {
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001205 HasP8Crypto = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001206 } else if (Feature == "+direct-move") {
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001207 HasDirectMove = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001208 } else if (Feature == "+qpx") {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001209 HasQPX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001210 } else if (Feature == "+htm") {
Kit Barton8246f282015-03-25 19:41:41 +00001211 HasHTM = true;
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001212 } else if (Feature == "+float128") {
1213 HasFloat128 = true;
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001214 } else if (Feature == "+power9-vector") {
1215 HasP9Vector = true;
Kit Barton8246f282015-03-25 19:41:41 +00001216 }
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001217 // TODO: Finish this list and add an assert that we've handled them
1218 // all.
1219 }
Eric Christopher02c33352015-08-25 00:59:11 +00001220
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001221 return true;
1222}
1223
Chris Lattnerecd49032009-03-02 22:27:17 +00001224/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
1225/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001226void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001227 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00001228 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001229 Builder.defineMacro("__ppc__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001230 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001231 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001232 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001233 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001234 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001235 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001236 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001237 Builder.defineMacro("__ppc64__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001238 Builder.defineMacro("__PPC64__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001239 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001240
Chris Lattnerecd49032009-03-02 22:27:17 +00001241 // Target properties.
Bill Schmidt778d3872013-07-26 01:36:11 +00001242 if (getTriple().getArch() == llvm::Triple::ppc64le) {
1243 Builder.defineMacro("_LITTLE_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001244 } else {
1245 if (getTriple().getOS() != llvm::Triple::NetBSD &&
1246 getTriple().getOS() != llvm::Triple::OpenBSD)
1247 Builder.defineMacro("_BIG_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001248 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001249
Ulrich Weigand8afad612014-07-28 13:17:52 +00001250 // ABI options.
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001251 if (ABI == "elfv1" || ABI == "elfv1-qpx")
Ulrich Weigand8afad612014-07-28 13:17:52 +00001252 Builder.defineMacro("_CALL_ELF", "1");
1253 if (ABI == "elfv2")
1254 Builder.defineMacro("_CALL_ELF", "2");
1255
Eric Christopher2fd2eda2017-03-25 03:33:59 +00001256 // This typically is only for a new enough linker (bfd >= 2.16.2 or gold), but
Eric Christopher1e6fedb2017-03-25 19:26:04 +00001257 // our suppport post-dates this and it should work on all 64-bit ppc linux
1258 // platforms. It is guaranteed to work on all elfv2 platforms.
1259 if (getTriple().getOS() == llvm::Triple::Linux && PointerWidth == 64)
Eric Christopher2fd2eda2017-03-25 03:33:59 +00001260 Builder.defineMacro("_CALL_LINUX", "1");
1261
Chris Lattnerecd49032009-03-02 22:27:17 +00001262 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001263 Builder.defineMacro("__NATURAL_ALIGNMENT__");
1264 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001265
Chris Lattnerecd49032009-03-02 22:27:17 +00001266 // FIXME: Should be controlled by command line option.
Eric Christopheree214102017-03-25 06:37:23 +00001267 if (LongDoubleWidth == 128) {
Roman Divacky13b586f2013-07-03 19:45:54 +00001268 Builder.defineMacro("__LONG_DOUBLE_128__");
Eric Christopheree214102017-03-25 06:37:23 +00001269 Builder.defineMacro("__LONGDOUBLE128");
1270 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001271
Eric Christopher32ac5e42017-02-15 07:50:11 +00001272 // Define this for elfv2 (64-bit only) or 64-bit darwin.
1273 if (ABI == "elfv2" ||
1274 (getTriple().getOS() == llvm::Triple::Darwin && PointerWidth == 64))
1275 Builder.defineMacro("__STRUCT_PARM_ALIGN__", "16");
1276
Hal Finkel8eb59282012-06-11 22:35:19 +00001277 // CPU identification.
Eric Christopherb70819e2017-03-25 02:29:18 +00001278 ArchDefineTypes defs =
1279 (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
1280 .Case("440", ArchDefineName)
1281 .Case("450", ArchDefineName | ArchDefine440)
1282 .Case("601", ArchDefineName)
1283 .Case("602", ArchDefineName | ArchDefinePpcgr)
1284 .Case("603", ArchDefineName | ArchDefinePpcgr)
1285 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1286 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1287 .Case("604", ArchDefineName | ArchDefinePpcgr)
1288 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
1289 .Case("620", ArchDefineName | ArchDefinePpcgr)
1290 .Case("630", ArchDefineName | ArchDefinePpcgr)
1291 .Case("7400", ArchDefineName | ArchDefinePpcgr)
1292 .Case("7450", ArchDefineName | ArchDefinePpcgr)
1293 .Case("750", ArchDefineName | ArchDefinePpcgr)
1294 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr |
1295 ArchDefinePpcsq)
1296 .Case("a2", ArchDefineA2)
1297 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
1298 .Case("pwr3", ArchDefinePpcgr)
1299 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
1300 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr |
1301 ArchDefinePpcsq)
1302 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4 |
1303 ArchDefinePpcgr | ArchDefinePpcsq)
1304 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5 |
1305 ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1306 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x |
1307 ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr |
1308 ArchDefinePpcsq)
1309 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6 |
1310 ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4 |
1311 ArchDefinePpcgr | ArchDefinePpcsq)
1312 .Case("pwr8", ArchDefineName | ArchDefinePwr7 | ArchDefinePwr6x |
1313 ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5 |
1314 ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1315 .Case("pwr9", ArchDefineName | ArchDefinePwr8 | ArchDefinePwr7 |
1316 ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x |
1317 ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr |
1318 ArchDefinePpcsq)
1319 .Case("power3", ArchDefinePpcgr)
1320 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1321 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr |
1322 ArchDefinePpcsq)
1323 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4 |
1324 ArchDefinePpcgr | ArchDefinePpcsq)
1325 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5 |
1326 ArchDefinePwr4 | ArchDefinePpcgr |
1327 ArchDefinePpcsq)
1328 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x |
1329 ArchDefinePwr5 | ArchDefinePwr4 |
1330 ArchDefinePpcgr | ArchDefinePpcsq)
1331 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6 |
1332 ArchDefinePwr5x | ArchDefinePwr5 |
1333 ArchDefinePwr4 | ArchDefinePpcgr |
1334 ArchDefinePpcsq)
1335 .Case("power8", ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr6x |
1336 ArchDefinePwr6 | ArchDefinePwr5x |
1337 ArchDefinePwr5 | ArchDefinePwr4 |
1338 ArchDefinePpcgr | ArchDefinePpcsq)
1339 .Case("power9", ArchDefinePwr9 | ArchDefinePwr8 | ArchDefinePwr7 |
1340 ArchDefinePwr6x | ArchDefinePwr6 |
1341 ArchDefinePwr5x | ArchDefinePwr5 |
1342 ArchDefinePwr4 | ArchDefinePpcgr |
1343 ArchDefinePpcsq)
1344 // powerpc64le automatically defaults to at least power8.
1345 .Case("ppc64le", ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr6x |
1346 ArchDefinePwr6 | ArchDefinePwr5x |
1347 ArchDefinePwr5 | ArchDefinePwr4 |
1348 ArchDefinePpcgr | ArchDefinePpcsq)
1349 .Default(ArchDefineNone);
Hal Finkel6b984f02012-07-03 16:51:04 +00001350
1351 if (defs & ArchDefineName)
1352 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
1353 if (defs & ArchDefinePpcgr)
1354 Builder.defineMacro("_ARCH_PPCGR");
1355 if (defs & ArchDefinePpcsq)
1356 Builder.defineMacro("_ARCH_PPCSQ");
1357 if (defs & ArchDefine440)
Hal Finkel8eb59282012-06-11 22:35:19 +00001358 Builder.defineMacro("_ARCH_440");
Hal Finkel6b984f02012-07-03 16:51:04 +00001359 if (defs & ArchDefine603)
1360 Builder.defineMacro("_ARCH_603");
1361 if (defs & ArchDefine604)
1362 Builder.defineMacro("_ARCH_604");
Bill Schmidt38378a02013-02-01 20:23:10 +00001363 if (defs & ArchDefinePwr4)
Hal Finkel6b984f02012-07-03 16:51:04 +00001364 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt38378a02013-02-01 20:23:10 +00001365 if (defs & ArchDefinePwr5)
Hal Finkel6b984f02012-07-03 16:51:04 +00001366 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt38378a02013-02-01 20:23:10 +00001367 if (defs & ArchDefinePwr5x)
1368 Builder.defineMacro("_ARCH_PWR5X");
1369 if (defs & ArchDefinePwr6)
Hal Finkel8eb59282012-06-11 22:35:19 +00001370 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt38378a02013-02-01 20:23:10 +00001371 if (defs & ArchDefinePwr6x)
1372 Builder.defineMacro("_ARCH_PWR6X");
1373 if (defs & ArchDefinePwr7)
1374 Builder.defineMacro("_ARCH_PWR7");
Will Schmidtf0487512014-06-26 13:34:10 +00001375 if (defs & ArchDefinePwr8)
1376 Builder.defineMacro("_ARCH_PWR8");
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001377 if (defs & ArchDefinePwr9)
1378 Builder.defineMacro("_ARCH_PWR9");
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001379 if (defs & ArchDefineA2)
1380 Builder.defineMacro("_ARCH_A2");
1381 if (defs & ArchDefineA2q) {
1382 Builder.defineMacro("_ARCH_A2Q");
1383 Builder.defineMacro("_ARCH_QP");
1384 }
1385
1386 if (getTriple().getVendor() == llvm::Triple::BGQ) {
1387 Builder.defineMacro("__bg__");
1388 Builder.defineMacro("__THW_BLUEGENE__");
1389 Builder.defineMacro("__bgq__");
1390 Builder.defineMacro("__TOS_BGQ__");
1391 }
Bill Schmidt38378a02013-02-01 20:23:10 +00001392
Eric Christopher758aad72017-03-21 22:06:18 +00001393 if (HasAltivec) {
1394 Builder.defineMacro("__VEC__", "10206");
1395 Builder.defineMacro("__ALTIVEC__");
1396 }
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001397 if (HasVSX)
1398 Builder.defineMacro("__VSX__");
Bill Schmidt8c184e32014-10-10 17:21:23 +00001399 if (HasP8Vector)
Bill Schmidt59eb7672014-10-10 15:09:43 +00001400 Builder.defineMacro("__POWER8_VECTOR__");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001401 if (HasP8Crypto)
1402 Builder.defineMacro("__CRYPTO__");
Kit Barton8246f282015-03-25 19:41:41 +00001403 if (HasHTM)
1404 Builder.defineMacro("__HTM__");
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001405 if (HasFloat128)
1406 Builder.defineMacro("__FLOAT128__");
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001407 if (HasP9Vector)
1408 Builder.defineMacro("__POWER9_VECTOR__");
Hal Finkela57b8902015-10-01 13:39:49 +00001409
1410 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
1411 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
1412 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
1413 if (PointerWidth == 64)
1414 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001415
Eric Christopher0d361162017-03-25 05:40:13 +00001416 // We have support for the bswap intrinsics so we can define this.
1417 Builder.defineMacro("__HAVE_BSWAP__", "1");
1418
Bill Schmidt38378a02013-02-01 20:23:10 +00001419 // FIXME: The following are not yet generated here by Clang, but are
1420 // generated by GCC:
1421 //
1422 // _SOFT_FLOAT_
1423 // __RECIP_PRECISION__
1424 // __APPLE_ALTIVEC__
Bill Schmidt38378a02013-02-01 20:23:10 +00001425 // __RECIP__
1426 // __RECIPF__
1427 // __RSQRTE__
1428 // __RSQRTEF__
1429 // _SOFT_DOUBLE_
1430 // __NO_LWSYNC__
Bill Schmidt38378a02013-02-01 20:23:10 +00001431 // __CMODEL_MEDIUM__
1432 // __CMODEL_LARGE__
1433 // _CALL_SYSV
1434 // _CALL_DARWIN
1435 // __NO_FPRS__
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001436}
1437
Eric Christophera8a14c32015-08-31 18:39:16 +00001438// Handle explicit options being passed to the compiler here: if we've
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001439// explicitly turned off vsx and turned on any of:
1440// - power8-vector
1441// - direct-move
1442// - float128
1443// - power9-vector
1444// then go ahead and error since the customer has expressed an incompatible
Eric Christophera8a14c32015-08-31 18:39:16 +00001445// set of options.
1446static bool ppcUserFeaturesCheck(DiagnosticsEngine &Diags,
Eric Christopher8c47b422015-10-09 18:39:55 +00001447 const std::vector<std::string> &FeaturesVec) {
Eric Christophera8a14c32015-08-31 18:39:16 +00001448
1449 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "-vsx") !=
1450 FeaturesVec.end()) {
1451 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+power8-vector") !=
1452 FeaturesVec.end()) {
1453 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mpower8-vector"
1454 << "-mno-vsx";
1455 return false;
1456 }
1457
1458 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+direct-move") !=
1459 FeaturesVec.end()) {
1460 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mdirect-move"
1461 << "-mno-vsx";
1462 return false;
1463 }
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001464
1465 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+float128") !=
1466 FeaturesVec.end()) {
1467 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mfloat128"
1468 << "-mno-vsx";
1469 return false;
1470 }
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001471
1472 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+power9-vector") !=
1473 FeaturesVec.end()) {
1474 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mpower9-vector"
1475 << "-mno-vsx";
1476 return false;
1477 }
Eric Christophera8a14c32015-08-31 18:39:16 +00001478 }
1479
1480 return true;
1481}
1482
Eric Christopher8c47b422015-10-09 18:39:55 +00001483bool PPCTargetInfo::initFeatureMap(
1484 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
1485 const std::vector<std::string> &FeaturesVec) const {
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001486 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1487 .Case("7400", true)
1488 .Case("g4", true)
1489 .Case("7450", true)
1490 .Case("g4+", true)
1491 .Case("970", true)
1492 .Case("g5", true)
1493 .Case("pwr6", true)
1494 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +00001495 .Case("pwr8", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001496 .Case("pwr9", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001497 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +00001498 .Case("ppc64le", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001499 .Default(false);
Hal Finkelb58ce852013-02-01 18:44:19 +00001500
1501 Features["qpx"] = (CPU == "a2q");
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001502 Features["power9-vector"] = (CPU == "pwr9");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001503 Features["crypto"] = llvm::StringSwitch<bool>(CPU)
1504 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001505 .Case("pwr9", true)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001506 .Case("pwr8", true)
1507 .Default(false);
1508 Features["power8-vector"] = llvm::StringSwitch<bool>(CPU)
1509 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001510 .Case("pwr9", true)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001511 .Case("pwr8", true)
1512 .Default(false);
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001513 Features["bpermd"] = llvm::StringSwitch<bool>(CPU)
1514 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001515 .Case("pwr9", true)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001516 .Case("pwr8", true)
1517 .Case("pwr7", true)
1518 .Default(false);
1519 Features["extdiv"] = llvm::StringSwitch<bool>(CPU)
1520 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001521 .Case("pwr9", true)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001522 .Case("pwr8", true)
1523 .Case("pwr7", true)
1524 .Default(false);
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001525 Features["direct-move"] = llvm::StringSwitch<bool>(CPU)
1526 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001527 .Case("pwr9", true)
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001528 .Case("pwr8", true)
1529 .Default(false);
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001530 Features["vsx"] = llvm::StringSwitch<bool>(CPU)
1531 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001532 .Case("pwr9", true)
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001533 .Case("pwr8", true)
1534 .Case("pwr7", true)
1535 .Default(false);
Eric Christopher74fa24f2017-03-20 21:12:53 +00001536 Features["htm"] = llvm::StringSwitch<bool>(CPU)
1537 .Case("ppc64le", true)
1538 .Case("pwr9", true)
1539 .Case("pwr8", true)
1540 .Default(false);
Eric Christopheref1e2952015-08-28 02:13:58 +00001541
Eric Christophera8a14c32015-08-31 18:39:16 +00001542 if (!ppcUserFeaturesCheck(Diags, FeaturesVec))
1543 return false;
Eric Christopher007b0a02015-08-28 22:32:01 +00001544
Eric Christopher007b0a02015-08-28 22:32:01 +00001545 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001546}
1547
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001548bool PPCTargetInfo::hasFeature(StringRef Feature) const {
Bill Schmidte6e9d152014-11-02 14:56:41 +00001549 return llvm::StringSwitch<bool>(Feature)
Eric Christopher758aad72017-03-21 22:06:18 +00001550 .Case("powerpc", true)
1551 .Case("altivec", HasAltivec)
1552 .Case("vsx", HasVSX)
1553 .Case("power8-vector", HasP8Vector)
1554 .Case("crypto", HasP8Crypto)
1555 .Case("direct-move", HasDirectMove)
1556 .Case("qpx", HasQPX)
1557 .Case("htm", HasHTM)
1558 .Case("bpermd", HasBPERMD)
1559 .Case("extdiv", HasExtDiv)
1560 .Case("float128", HasFloat128)
1561 .Case("power9-vector", HasP9Vector)
1562 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001563}
Chris Lattner17df24e2008-04-21 18:56:49 +00001564
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001565void PPCTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
1566 StringRef Name, bool Enabled) const {
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001567 if (Enabled) {
Eric Christopherd26d8832017-04-15 06:15:00 +00001568 // If we're enabling any of the vsx based features then enable vsx and
1569 // altivec. We'll diagnose any problems later.
1570 bool FeatureHasVSX = llvm::StringSwitch<bool>(Name)
1571 .Case("vsx", true)
1572 .Case("direct-move", true)
1573 .Case("power8-vector", true)
1574 .Case("power9-vector", true)
1575 .Case("float128", true)
1576 .Default(false);
1577 if (FeatureHasVSX)
1578 Features["vsx"] = Features["altivec"] = true;
1579 if (Name == "power9-vector")
1580 Features["power8-vector"] = true;
1581 Features[Name] = true;
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001582 } else {
Eric Christopherd26d8832017-04-15 06:15:00 +00001583 // If we're disabling altivec or vsx go ahead and disable all of the vsx
1584 // features.
1585 if ((Name == "altivec") || (Name == "vsx"))
1586 Features["vsx"] = Features["direct-move"] = Features["power8-vector"] =
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001587 Features["float128"] = Features["power9-vector"] = false;
Eric Christopherd26d8832017-04-15 06:15:00 +00001588 if (Name == "power8-vector")
1589 Features["power9-vector"] = false;
1590 Features[Name] = false;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001591 }
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001592}
1593
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001594const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001595 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1596 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1597 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1598 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1599 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1600 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1601 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1602 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001603 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001604 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001605 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001606 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1607 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1608 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1609 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001610 "vrsave", "vscr",
1611 "spe_acc", "spefscr",
1612 "sfp"
1613};
Chris Lattner10a5b382007-01-29 05:24:35 +00001614
Craig Topperf054e3a2015-10-19 03:52:27 +00001615ArrayRef<const char*> PPCTargetInfo::getGCCRegNames() const {
1616 return llvm::makeArrayRef(GCCRegNames);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001617}
Chris Lattner5ba61f02006-10-14 07:39:34 +00001618
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001619const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1620 // While some of these aliases do map to different registers
1621 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001622 { { "0" }, "r0" },
1623 { { "1"}, "r1" },
1624 { { "2" }, "r2" },
1625 { { "3" }, "r3" },
1626 { { "4" }, "r4" },
1627 { { "5" }, "r5" },
1628 { { "6" }, "r6" },
1629 { { "7" }, "r7" },
1630 { { "8" }, "r8" },
1631 { { "9" }, "r9" },
1632 { { "10" }, "r10" },
1633 { { "11" }, "r11" },
1634 { { "12" }, "r12" },
1635 { { "13" }, "r13" },
1636 { { "14" }, "r14" },
1637 { { "15" }, "r15" },
1638 { { "16" }, "r16" },
1639 { { "17" }, "r17" },
1640 { { "18" }, "r18" },
1641 { { "19" }, "r19" },
1642 { { "20" }, "r20" },
1643 { { "21" }, "r21" },
1644 { { "22" }, "r22" },
1645 { { "23" }, "r23" },
1646 { { "24" }, "r24" },
1647 { { "25" }, "r25" },
1648 { { "26" }, "r26" },
1649 { { "27" }, "r27" },
1650 { { "28" }, "r28" },
1651 { { "29" }, "r29" },
1652 { { "30" }, "r30" },
1653 { { "31" }, "r31" },
1654 { { "fr0" }, "f0" },
1655 { { "fr1" }, "f1" },
1656 { { "fr2" }, "f2" },
1657 { { "fr3" }, "f3" },
1658 { { "fr4" }, "f4" },
1659 { { "fr5" }, "f5" },
1660 { { "fr6" }, "f6" },
1661 { { "fr7" }, "f7" },
1662 { { "fr8" }, "f8" },
1663 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +00001664 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001665 { { "fr11" }, "f11" },
1666 { { "fr12" }, "f12" },
1667 { { "fr13" }, "f13" },
1668 { { "fr14" }, "f14" },
1669 { { "fr15" }, "f15" },
1670 { { "fr16" }, "f16" },
1671 { { "fr17" }, "f17" },
1672 { { "fr18" }, "f18" },
1673 { { "fr19" }, "f19" },
1674 { { "fr20" }, "f20" },
1675 { { "fr21" }, "f21" },
1676 { { "fr22" }, "f22" },
1677 { { "fr23" }, "f23" },
1678 { { "fr24" }, "f24" },
1679 { { "fr25" }, "f25" },
1680 { { "fr26" }, "f26" },
1681 { { "fr27" }, "f27" },
1682 { { "fr28" }, "f28" },
1683 { { "fr29" }, "f29" },
1684 { { "fr30" }, "f30" },
1685 { { "fr31" }, "f31" },
1686 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001687};
1688
Craig Topperf054e3a2015-10-19 03:52:27 +00001689ArrayRef<TargetInfo::GCCRegAlias> PPCTargetInfo::getGCCRegAliases() const {
1690 return llvm::makeArrayRef(GCCRegAliases);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001691}
Chris Lattner02dffbd2006-10-14 07:50:21 +00001692
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001693class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001694public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001695 PPC32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1696 : PPCTargetInfo(Triple, Opts) {
James Y Knightb214cbc2016-03-04 19:00:41 +00001697 resetDataLayout("E-m:e-p:32:32-i64:64-n32");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001698
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001699 switch (getTriple().getOS()) {
Nico Weber3435ede2012-01-31 02:07:33 +00001700 case llvm::Triple::Linux:
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001701 case llvm::Triple::FreeBSD:
1702 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001703 SizeType = UnsignedInt;
Hal Finkel26908382012-03-02 20:54:36 +00001704 PtrDiffType = SignedInt;
1705 IntPtrType = SignedInt;
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001706 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +00001707 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001708 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001709 }
Roman Divacky816dcd12012-03-13 16:53:54 +00001710
Roman Divacky3ffe7462012-03-13 19:20:17 +00001711 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1712 LongDoubleWidth = LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00001713 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Roman Divacky3ffe7462012-03-13 19:20:17 +00001714 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001715
1716 // PPC32 supports atomics up to 4 bytes.
1717 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divacky965b0b72011-01-06 08:27:10 +00001718 }
1719
Craig Topper3164f332014-03-11 03:39:26 +00001720 BuiltinVaListKind getBuiltinVaListKind() const override {
Roman Divacky965b0b72011-01-06 08:27:10 +00001721 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Inge5d3fb222012-06-16 03:34:49 +00001722 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman873f65a2008-08-21 00:13:15 +00001723 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001724};
Chris Lattner5ba61f02006-10-14 07:39:34 +00001725
Bill Schmidt778d3872013-07-26 01:36:11 +00001726// Note: ABI differences may eventually require us to have a separate
1727// TargetInfo for little endian.
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001728class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001729public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001730 PPC64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1731 : PPCTargetInfo(Triple, Opts) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001732 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001733 IntMaxType = SignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001734 Int64Type = SignedLong;
Roman Divacky816dcd12012-03-13 16:53:54 +00001735
Eric Christopherf6ee1f32017-02-10 04:35:21 +00001736 if ((Triple.getArch() == llvm::Triple::ppc64le)) {
1737 resetDataLayout("e-m:e-i64:64-n32:64");
Eric Christopher4855ba82017-02-10 03:32:34 +00001738 ABI = "elfv2";
Eric Christopherf6ee1f32017-02-10 04:35:21 +00001739 } else {
1740 resetDataLayout("E-m:e-i64:64-n32:64");
Eric Christopher4855ba82017-02-10 03:32:34 +00001741 ABI = "elfv1";
Eric Christopherf6ee1f32017-02-10 04:35:21 +00001742 }
Eric Christopher4855ba82017-02-10 03:32:34 +00001743
Eric Christopherf6ee1f32017-02-10 04:35:21 +00001744 switch (getTriple().getOS()) {
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001745 case llvm::Triple::FreeBSD:
Roman Divacky3ffe7462012-03-13 19:20:17 +00001746 LongDoubleWidth = LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00001747 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001748 break;
Joerg Sonnenbergeraac82c42014-10-15 19:52:03 +00001749 case llvm::Triple::NetBSD:
1750 IntMaxType = SignedLongLong;
1751 Int64Type = SignedLongLong;
1752 break;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001753 default:
1754 break;
Ulrich Weigand8afad612014-07-28 13:17:52 +00001755 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001756
1757 // PPC64 supports atomics up to 8 bytes.
1758 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001759 }
Craig Topper3164f332014-03-11 03:39:26 +00001760 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001761 return TargetInfo::CharPtrBuiltinVaList;
Roman Divacky965b0b72011-01-06 08:27:10 +00001762 }
Eric Christophere6b7cf42015-07-10 18:25:52 +00001763 // PPC64 Linux-specific ABI options.
Ulrich Weigand8afad612014-07-28 13:17:52 +00001764 bool setABI(const std::string &Name) override {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001765 if (Name == "elfv1" || Name == "elfv1-qpx" || Name == "elfv2") {
Ulrich Weigand8afad612014-07-28 13:17:52 +00001766 ABI = Name;
1767 return true;
1768 }
1769 return false;
1770 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001771};
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001772
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001773class DarwinPPC32TargetInfo : public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001774public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001775 DarwinPPC32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1776 : DarwinTargetInfo<PPC32TargetInfo>(Triple, Opts) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001777 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +00001778 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Eric Christopher917e9522014-11-18 22:36:15 +00001779 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev68d773c2012-01-17 22:40:00 +00001780 LongLongAlign = 32;
James Y Knightb214cbc2016-03-04 19:00:41 +00001781 resetDataLayout("E-m:o-p:32:32-f64:32:64-n32");
Roman Divacky965b0b72011-01-06 08:27:10 +00001782 }
Craig Topper3164f332014-03-11 03:39:26 +00001783 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001784 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001785 }
1786};
1787
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001788class DarwinPPC64TargetInfo : public DarwinTargetInfo<PPC64TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001789public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001790 DarwinPPC64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1791 : DarwinTargetInfo<PPC64TargetInfo>(Triple, Opts) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001792 HasAlignMac68kSupport = true;
James Y Knightb214cbc2016-03-04 19:00:41 +00001793 resetDataLayout("E-m:o-i64:64-n32:64");
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001794 }
1795};
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001796
Eric Christopherc48497a2015-09-18 21:26:24 +00001797static const unsigned NVPTXAddrSpaceMap[] = {
Yaxun Liub34ec822017-04-11 17:24:23 +00001798 0, // Default
Eric Christopherc48497a2015-09-18 21:26:24 +00001799 1, // opencl_global
1800 3, // opencl_local
1801 4, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00001802 // FIXME: generic has to be added to the target
Eric Christopherc48497a2015-09-18 21:26:24 +00001803 0, // opencl_generic
1804 1, // cuda_device
1805 4, // cuda_constant
1806 3, // cuda_shared
1807};
1808
1809class NVPTXTargetInfo : public TargetInfo {
1810 static const char *const GCCRegNames[];
1811 static const Builtin::Info BuiltinInfo[];
Justin Lebar62907612016-07-06 21:21:39 +00001812 CudaArch GPU;
Justin Lebarb6626592017-01-05 16:53:21 +00001813 std::unique_ptr<TargetInfo> HostTarget;
Reid Klecknerbbc01782014-12-03 21:53:36 +00001814
Eric Christopherc48497a2015-09-18 21:26:24 +00001815public:
Justin Lebarb6626592017-01-05 16:53:21 +00001816 NVPTXTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts,
1817 unsigned TargetPointerWidth)
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001818 : TargetInfo(Triple) {
Justin Lebarb6626592017-01-05 16:53:21 +00001819 assert((TargetPointerWidth == 32 || TargetPointerWidth == 64) &&
1820 "NVPTX only supports 32- and 64-bit modes.");
1821
Eric Christopherc48497a2015-09-18 21:26:24 +00001822 TLSSupported = false;
Eric Christopherc48497a2015-09-18 21:26:24 +00001823 AddrSpaceMap = &NVPTXAddrSpaceMap;
1824 UseAddrSpaceMapMangling = true;
Justin Lebarb6626592017-01-05 16:53:21 +00001825
Eric Christopherc48497a2015-09-18 21:26:24 +00001826 // Define available target features
1827 // These must be defined in sorted order!
1828 NoAsmVariants = true;
Justin Lebar62907612016-07-06 21:21:39 +00001829 GPU = CudaArch::SM_20;
Justin Lebar76945b22016-04-29 23:05:19 +00001830
Justin Lebarb6626592017-01-05 16:53:21 +00001831 if (TargetPointerWidth == 32)
1832 resetDataLayout("e-p:32:32-i64:64-v16:16-v32:32-n16:32:64");
1833 else
1834 resetDataLayout("e-i64:64-v16:16-v32:32-n16:32:64");
1835
Justin Lebar76945b22016-04-29 23:05:19 +00001836 // If possible, get a TargetInfo for our host triple, so we can match its
1837 // types.
1838 llvm::Triple HostTriple(Opts.HostTriple);
Justin Lebarb6626592017-01-05 16:53:21 +00001839 if (!HostTriple.isNVPTX())
1840 HostTarget.reset(AllocateTarget(llvm::Triple(Opts.HostTriple), Opts));
1841
1842 // If no host target, make some guesses about the data layout and return.
Justin Lebar76945b22016-04-29 23:05:19 +00001843 if (!HostTarget) {
Justin Lebarb6626592017-01-05 16:53:21 +00001844 LongWidth = LongAlign = TargetPointerWidth;
1845 PointerWidth = PointerAlign = TargetPointerWidth;
1846 switch (TargetPointerWidth) {
1847 case 32:
1848 SizeType = TargetInfo::UnsignedInt;
1849 PtrDiffType = TargetInfo::SignedInt;
1850 IntPtrType = TargetInfo::SignedInt;
1851 break;
1852 case 64:
1853 SizeType = TargetInfo::UnsignedLong;
1854 PtrDiffType = TargetInfo::SignedLong;
1855 IntPtrType = TargetInfo::SignedLong;
1856 break;
1857 default:
1858 llvm_unreachable("TargetPointerWidth must be 32 or 64");
1859 }
Justin Lebar76945b22016-04-29 23:05:19 +00001860 return;
1861 }
1862
Justin Lebarb6626592017-01-05 16:53:21 +00001863 // Copy properties from host target.
Justin Lebar76945b22016-04-29 23:05:19 +00001864 PointerWidth = HostTarget->getPointerWidth(/* AddrSpace = */ 0);
1865 PointerAlign = HostTarget->getPointerAlign(/* AddrSpace = */ 0);
1866 BoolWidth = HostTarget->getBoolWidth();
1867 BoolAlign = HostTarget->getBoolAlign();
1868 IntWidth = HostTarget->getIntWidth();
1869 IntAlign = HostTarget->getIntAlign();
1870 HalfWidth = HostTarget->getHalfWidth();
1871 HalfAlign = HostTarget->getHalfAlign();
1872 FloatWidth = HostTarget->getFloatWidth();
1873 FloatAlign = HostTarget->getFloatAlign();
1874 DoubleWidth = HostTarget->getDoubleWidth();
1875 DoubleAlign = HostTarget->getDoubleAlign();
1876 LongWidth = HostTarget->getLongWidth();
1877 LongAlign = HostTarget->getLongAlign();
1878 LongLongWidth = HostTarget->getLongLongWidth();
1879 LongLongAlign = HostTarget->getLongLongAlign();
1880 MinGlobalAlign = HostTarget->getMinGlobalAlign();
Richard Smith59139022016-09-30 22:41:36 +00001881 NewAlign = HostTarget->getNewAlign();
Justin Lebar76945b22016-04-29 23:05:19 +00001882 DefaultAlignForAttributeAligned =
1883 HostTarget->getDefaultAlignForAttributeAligned();
1884 SizeType = HostTarget->getSizeType();
1885 IntMaxType = HostTarget->getIntMaxType();
1886 PtrDiffType = HostTarget->getPtrDiffType(/* AddrSpace = */ 0);
1887 IntPtrType = HostTarget->getIntPtrType();
1888 WCharType = HostTarget->getWCharType();
1889 WIntType = HostTarget->getWIntType();
1890 Char16Type = HostTarget->getChar16Type();
1891 Char32Type = HostTarget->getChar32Type();
1892 Int64Type = HostTarget->getInt64Type();
1893 SigAtomicType = HostTarget->getSigAtomicType();
1894 ProcessIDType = HostTarget->getProcessIDType();
1895
1896 UseBitFieldTypeAlignment = HostTarget->useBitFieldTypeAlignment();
1897 UseZeroLengthBitfieldAlignment =
1898 HostTarget->useZeroLengthBitfieldAlignment();
1899 UseExplicitBitFieldAlignment = HostTarget->useExplicitBitFieldAlignment();
1900 ZeroLengthBitfieldBoundary = HostTarget->getZeroLengthBitfieldBoundary();
1901
Justin Lebar5057f172016-09-09 20:35:43 +00001902 // This is a bit of a lie, but it controls __GCC_ATOMIC_XXX_LOCK_FREE, and
1903 // we need those macros to be identical on host and device, because (among
1904 // other things) they affect which standard library classes are defined, and
1905 // we need all classes to be defined on both the host and device.
1906 MaxAtomicInlineWidth = HostTarget->getMaxAtomicInlineWidth();
1907
Justin Lebar76945b22016-04-29 23:05:19 +00001908 // Properties intentionally not copied from host:
1909 // - LargeArrayMinWidth, LargeArrayAlign: Not visible across the
1910 // host/device boundary.
1911 // - SuitableAlign: Not visible across the host/device boundary, and may
1912 // correctly be different on host/device, e.g. if host has wider vector
1913 // types than device.
1914 // - LongDoubleWidth, LongDoubleAlign: nvptx's long double type is the same
1915 // as its double type, but that's not necessarily true on the host.
1916 // TODO: nvcc emits a warning when using long double on device; we should
1917 // do the same.
Eric Christopherc48497a2015-09-18 21:26:24 +00001918 }
1919 void getTargetDefines(const LangOptions &Opts,
1920 MacroBuilder &Builder) const override {
1921 Builder.defineMacro("__PTX__");
1922 Builder.defineMacro("__NVPTX__");
1923 if (Opts.CUDAIsDevice) {
1924 // Set __CUDA_ARCH__ for the GPU specified.
Justin Lebaref1aaac2016-07-06 21:21:14 +00001925 std::string CUDAArchCode = [this] {
1926 switch (GPU) {
Simon Pilgrim13dff572016-07-07 22:32:26 +00001927 case CudaArch::UNKNOWN:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001928 assert(false && "No GPU arch when compiling CUDA device code.");
1929 return "";
Justin Lebar62907612016-07-06 21:21:39 +00001930 case CudaArch::SM_20:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001931 return "200";
Justin Lebar62907612016-07-06 21:21:39 +00001932 case CudaArch::SM_21:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001933 return "210";
Justin Lebar62907612016-07-06 21:21:39 +00001934 case CudaArch::SM_30:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001935 return "300";
Justin Lebar62907612016-07-06 21:21:39 +00001936 case CudaArch::SM_32:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001937 return "320";
Justin Lebar62907612016-07-06 21:21:39 +00001938 case CudaArch::SM_35:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001939 return "350";
Justin Lebar62907612016-07-06 21:21:39 +00001940 case CudaArch::SM_37:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001941 return "370";
Justin Lebar62907612016-07-06 21:21:39 +00001942 case CudaArch::SM_50:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001943 return "500";
Justin Lebar62907612016-07-06 21:21:39 +00001944 case CudaArch::SM_52:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001945 return "520";
Justin Lebar62907612016-07-06 21:21:39 +00001946 case CudaArch::SM_53:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001947 return "530";
Justin Lebar62907612016-07-06 21:21:39 +00001948 case CudaArch::SM_60:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001949 return "600";
Justin Lebar62907612016-07-06 21:21:39 +00001950 case CudaArch::SM_61:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001951 return "610";
Justin Lebar62907612016-07-06 21:21:39 +00001952 case CudaArch::SM_62:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001953 return "620";
1954 }
Simon Pilgrim13dff572016-07-07 22:32:26 +00001955 llvm_unreachable("unhandled CudaArch");
Justin Lebaref1aaac2016-07-06 21:21:14 +00001956 }();
Eric Christopherc48497a2015-09-18 21:26:24 +00001957 Builder.defineMacro("__CUDA_ARCH__", CUDAArchCode);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001958 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001959 }
Craig Topper6c03a542015-10-19 04:51:35 +00001960 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
1961 return llvm::makeArrayRef(BuiltinInfo,
1962 clang::NVPTX::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eric Christopherc48497a2015-09-18 21:26:24 +00001963 }
Artem Belevichfda99052016-09-28 17:47:35 +00001964 bool
1965 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
1966 StringRef CPU,
1967 const std::vector<std::string> &FeaturesVec) const override {
1968 Features["satom"] = GPU >= CudaArch::SM_60;
1969 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
1970 }
1971
Eric Christopherc48497a2015-09-18 21:26:24 +00001972 bool hasFeature(StringRef Feature) const override {
Artem Belevichfda99052016-09-28 17:47:35 +00001973 return llvm::StringSwitch<bool>(Feature)
1974 .Cases("ptx", "nvptx", true)
1975 .Case("satom", GPU >= CudaArch::SM_60) // Atomics w/ scope.
1976 .Default(false);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001977 }
1978
Craig Topperf054e3a2015-10-19 03:52:27 +00001979 ArrayRef<const char *> getGCCRegNames() const override;
1980 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00001981 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00001982 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00001983 }
1984 bool validateAsmConstraint(const char *&Name,
1985 TargetInfo::ConstraintInfo &Info) const override {
1986 switch (*Name) {
1987 default:
1988 return false;
1989 case 'c':
1990 case 'h':
1991 case 'r':
1992 case 'l':
1993 case 'f':
1994 case 'd':
1995 Info.setAllowsRegister();
1996 return true;
Eli Bendersky13467172015-04-01 20:29:18 +00001997 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001998 }
1999 const char *getClobbers() const override {
2000 // FIXME: Is this really right?
2001 return "";
2002 }
2003 BuiltinVaListKind getBuiltinVaListKind() const override {
2004 // FIXME: implement
2005 return TargetInfo::CharPtrBuiltinVaList;
2006 }
2007 bool setCPU(const std::string &Name) override {
Justin Lebar62907612016-07-06 21:21:39 +00002008 GPU = StringToCudaArch(Name);
2009 return GPU != CudaArch::UNKNOWN;
Eric Christopherc48497a2015-09-18 21:26:24 +00002010 }
Jan Vesely9674bd42016-06-17 19:02:14 +00002011 void setSupportedOpenCLOpts() override {
2012 auto &Opts = getSupportedOpenCLOpts();
Yaxun Liu5b746652016-12-18 05:18:55 +00002013 Opts.support("cl_clang_storage_class_specifiers");
2014 Opts.support("cl_khr_gl_sharing");
2015 Opts.support("cl_khr_icd");
Jan Vesely9674bd42016-06-17 19:02:14 +00002016
Yaxun Liu5b746652016-12-18 05:18:55 +00002017 Opts.support("cl_khr_fp64");
2018 Opts.support("cl_khr_byte_addressable_store");
2019 Opts.support("cl_khr_global_int32_base_atomics");
2020 Opts.support("cl_khr_global_int32_extended_atomics");
2021 Opts.support("cl_khr_local_int32_base_atomics");
2022 Opts.support("cl_khr_local_int32_extended_atomics");
Jan Vesely9674bd42016-06-17 19:02:14 +00002023 }
Justin Lebar86c4e632017-01-05 16:53:38 +00002024
2025 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
2026 // CUDA compilations support all of the host's calling conventions.
2027 //
2028 // TODO: We should warn if you apply a non-default CC to anything other than
2029 // a host function.
2030 if (HostTarget)
2031 return HostTarget->checkCallingConvention(CC);
2032 return CCCR_Warning;
2033 }
Eric Christopherc48497a2015-09-18 21:26:24 +00002034};
2035
2036const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
2037#define BUILTIN(ID, TYPE, ATTRS) \
2038 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
2039#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
2040 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Artem Belevichfda99052016-09-28 17:47:35 +00002041#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
2042 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Eric Christopherc48497a2015-09-18 21:26:24 +00002043#include "clang/Basic/BuiltinsNVPTX.def"
2044};
2045
2046const char *const NVPTXTargetInfo::GCCRegNames[] = {"r0"};
2047
Craig Topperf054e3a2015-10-19 03:52:27 +00002048ArrayRef<const char *> NVPTXTargetInfo::getGCCRegNames() const {
2049 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00002050}
2051
Yaxun Liu6d96f1632017-05-18 18:51:09 +00002052static const LangAS::Map AMDGPUNonOpenCLPrivateIsZeroMap = {
2053 4, // Default
2054 1, // opencl_global
2055 3, // opencl_local
2056 2, // opencl_constant
2057 4, // opencl_generic
2058 1, // cuda_device
2059 2, // cuda_constant
2060 3 // cuda_shared
Yaxun Liu3464f922017-03-25 03:46:25 +00002061};
Yaxun Liu6d96f1632017-05-18 18:51:09 +00002062static const LangAS::Map AMDGPUNonOpenCLGenericIsZeroMap = {
2063 0, // Default
2064 1, // opencl_global
2065 3, // opencl_local
2066 2, // opencl_constant
2067 0, // opencl_generic
2068 1, // cuda_device
2069 2, // cuda_constant
2070 3 // cuda_shared
2071};
2072static const LangAS::Map AMDGPUOpenCLPrivateIsZeroMap = {
2073 0, // Default
2074 1, // opencl_global
2075 3, // opencl_local
2076 2, // opencl_constant
2077 4, // opencl_generic
2078 1, // cuda_device
2079 2, // cuda_constant
2080 3 // cuda_shared
2081};
2082static const LangAS::Map AMDGPUOpenCLGenericIsZeroMap = {
2083 5, // Default
2084 1, // opencl_global
2085 3, // opencl_local
2086 2, // opencl_constant
2087 0, // opencl_generic
2088 1, // cuda_device
2089 2, // cuda_constant
2090 3 // cuda_shared
Eli Friedmand13b41e2012-10-12 23:32:00 +00002091};
2092
Tom Stellarda96344b2014-08-21 13:58:40 +00002093// If you edit the description strings, make sure you update
2094// getPointerWidthV().
2095
Craig Topper273dbc62015-10-18 05:29:26 +00002096static const char *const DataLayoutStringR600 =
Rafael Espindola29db13a2014-01-03 18:13:17 +00002097 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
2098 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00002099
Yaxun Liu3464f922017-03-25 03:46:25 +00002100static const char *const DataLayoutStringSIPrivateIsZero =
Matt Arsenault6dc455f2016-05-31 16:58:18 +00002101 "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 +00002102 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
2103 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00002104
Yaxun Liu3464f922017-03-25 03:46:25 +00002105static const char *const DataLayoutStringSIGenericIsZero =
Yaxun Liub122ed92017-04-06 19:18:36 +00002106 "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 +00002107 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
Yaxun Liub34ec822017-04-11 17:24:23 +00002108 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64-A5";
Yaxun Liu3464f922017-03-25 03:46:25 +00002109
Matt Arsenault250024f2016-06-08 01:56:42 +00002110class AMDGPUTargetInfo final : public TargetInfo {
Matt Arsenault56f008d2014-06-24 20:45:01 +00002111 static const Builtin::Info BuiltinInfo[];
Tom Stellard7b1059b2015-04-14 14:36:56 +00002112 static const char * const GCCRegNames[];
Matt Arsenault56f008d2014-06-24 20:45:01 +00002113
Yaxun Liu3464f922017-03-25 03:46:25 +00002114 struct AddrSpace {
2115 unsigned Generic, Global, Local, Constant, Private;
2116 AddrSpace(bool IsGenericZero_ = false){
2117 if (IsGenericZero_) {
2118 Generic = 0;
2119 Global = 1;
2120 Local = 3;
Yaxun Liub122ed92017-04-06 19:18:36 +00002121 Constant = 2;
Yaxun Liu3464f922017-03-25 03:46:25 +00002122 Private = 5;
2123 } else {
2124 Generic = 4;
2125 Global = 1;
2126 Local = 3;
2127 Constant = 2;
2128 Private = 0;
2129 }
2130 }
2131 };
2132
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002133 /// \brief The GPU profiles supported by the AMDGPU target.
Tom Stellardc74b1e02013-03-04 17:40:53 +00002134 enum GPUKind {
2135 GK_NONE,
2136 GK_R600,
2137 GK_R600_DOUBLE_OPS,
2138 GK_R700,
2139 GK_R700_DOUBLE_OPS,
2140 GK_EVERGREEN,
2141 GK_EVERGREEN_DOUBLE_OPS,
2142 GK_NORTHERN_ISLANDS,
2143 GK_CAYMAN,
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002144 GK_GFX6,
2145 GK_GFX7,
Matt Arsenaulteb952fd2017-02-18 19:02:41 +00002146 GK_GFX8,
2147 GK_GFX9
Tom Stellardc74b1e02013-03-04 17:40:53 +00002148 } GPU;
2149
Jan Veselyeebeaea2015-05-04 19:53:36 +00002150 bool hasFP64:1;
2151 bool hasFMAF:1;
2152 bool hasLDEXPF:1;
Yaxun Liu354097b2017-03-25 11:34:41 +00002153 const AddrSpace AS;
Jan Veselya3abd6d2015-05-01 17:38:13 +00002154
Konstantin Zhuravlyove668b1c2017-04-14 05:33:57 +00002155 static bool hasFullSpeedFMAF32(StringRef GPUName) {
2156 return parseAMDGCNName(GPUName) >= GK_GFX9;
2157 }
2158
Matt Arsenault250024f2016-06-08 01:56:42 +00002159 static bool isAMDGCN(const llvm::Triple &TT) {
2160 return TT.getArch() == llvm::Triple::amdgcn;
2161 }
2162
Yaxun Liu3464f922017-03-25 03:46:25 +00002163 static bool isGenericZero(const llvm::Triple &TT) {
2164 return TT.getEnvironmentName() == "amdgiz" ||
2165 TT.getEnvironmentName() == "amdgizcl";
2166 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00002167public:
Yaxun Liu2c17e822016-08-09 19:43:38 +00002168 AMDGPUTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Matt Arsenault250024f2016-06-08 01:56:42 +00002169 : TargetInfo(Triple) ,
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002170 GPU(isAMDGCN(Triple) ? GK_GFX6 : GK_R600),
Matt Arsenault250024f2016-06-08 01:56:42 +00002171 hasFP64(false),
2172 hasFMAF(false),
Yaxun Liu2c17e822016-08-09 19:43:38 +00002173 hasLDEXPF(false),
Yaxun Liu3464f922017-03-25 03:46:25 +00002174 AS(isGenericZero(Triple)){
Matt Arsenault250024f2016-06-08 01:56:42 +00002175 if (getTriple().getArch() == llvm::Triple::amdgcn) {
Jan Veselya3abd6d2015-05-01 17:38:13 +00002176 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00002177 hasFMAF = true;
2178 hasLDEXPF = true;
Tom Stellardd99fb952015-01-28 15:38:44 +00002179 }
Yaxun Liu3464f922017-03-25 03:46:25 +00002180 auto IsGenericZero = isGenericZero(Triple);
Matt Arsenault250024f2016-06-08 01:56:42 +00002181 resetDataLayout(getTriple().getArch() == llvm::Triple::amdgcn ?
Yaxun Liu3464f922017-03-25 03:46:25 +00002182 (IsGenericZero ? DataLayoutStringSIGenericIsZero :
2183 DataLayoutStringSIPrivateIsZero)
2184 : DataLayoutStringR600);
Yaxun Liub34ec822017-04-11 17:24:23 +00002185 assert(DataLayout->getAllocaAddrSpace() == AS.Private);
Matt Arsenault250024f2016-06-08 01:56:42 +00002186
David Tweed31d09b02013-09-13 12:04:22 +00002187 UseAddrSpaceMapMangling = true;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002188 }
2189
Yaxun Liuaf3d4db2017-05-23 16:15:53 +00002190 void adjust(LangOptions &Opts) override {
2191 TargetInfo::adjust(Opts);
2192 if (isGenericZero(getTriple())) {
2193 AddrSpaceMap = Opts.OpenCL ? &AMDGPUOpenCLGenericIsZeroMap
2194 : &AMDGPUNonOpenCLGenericIsZeroMap;
2195 } else {
2196 AddrSpaceMap = Opts.OpenCL ? &AMDGPUOpenCLPrivateIsZeroMap
2197 : &AMDGPUNonOpenCLPrivateIsZeroMap;
2198 }
2199 }
2200
Tom Stellarda96344b2014-08-21 13:58:40 +00002201 uint64_t getPointerWidthV(unsigned AddrSpace) const override {
2202 if (GPU <= GK_CAYMAN)
2203 return 32;
2204
Yaxun Liu3464f922017-03-25 03:46:25 +00002205 if (AddrSpace == AS.Private || AddrSpace == AS.Local) {
2206 return 32;
Tom Stellarda96344b2014-08-21 13:58:40 +00002207 }
Yaxun Liu3464f922017-03-25 03:46:25 +00002208 return 64;
Tom Stellarda96344b2014-08-21 13:58:40 +00002209 }
2210
Yaxun Liu26f75662016-08-19 05:17:25 +00002211 uint64_t getMaxPointerWidth() const override {
2212 return getTriple().getArch() == llvm::Triple::amdgcn ? 64 : 32;
2213 }
2214
Craig Topper3164f332014-03-11 03:39:26 +00002215 const char * getClobbers() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00002216 return "";
2217 }
2218
Craig Topperf054e3a2015-10-19 03:52:27 +00002219 ArrayRef<const char *> getGCCRegNames() const override;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002220
Craig Topperf054e3a2015-10-19 03:52:27 +00002221 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
2222 return None;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002223 }
2224
Craig Topper3164f332014-03-11 03:39:26 +00002225 bool validateAsmConstraint(const char *&Name,
Tom Stellardd097e942015-11-19 22:11:58 +00002226 TargetInfo::ConstraintInfo &Info) const override {
2227 switch (*Name) {
2228 default: break;
2229 case 'v': // vgpr
2230 case 's': // sgpr
2231 Info.setAllowsRegister();
2232 return true;
2233 }
2234 return false;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002235 }
2236
Matt Arsenault250024f2016-06-08 01:56:42 +00002237 bool initFeatureMap(llvm::StringMap<bool> &Features,
2238 DiagnosticsEngine &Diags, StringRef CPU,
2239 const std::vector<std::string> &FeatureVec) const override;
2240
Yaxun Liu2c17e822016-08-09 19:43:38 +00002241 void adjustTargetOptions(const CodeGenOptions &CGOpts,
2242 TargetOptions &TargetOpts) const override {
Yaxun Liu2c17e822016-08-09 19:43:38 +00002243 bool hasFP32Denormals = false;
2244 bool hasFP64Denormals = false;
2245 for (auto &I : TargetOpts.FeaturesAsWritten) {
2246 if (I == "+fp32-denormals" || I == "-fp32-denormals")
2247 hasFP32Denormals = true;
Matt Arsenault09cca092017-01-23 22:31:14 +00002248 if (I == "+fp64-fp16-denormals" || I == "-fp64-fp16-denormals")
Yaxun Liu2c17e822016-08-09 19:43:38 +00002249 hasFP64Denormals = true;
2250 }
2251 if (!hasFP32Denormals)
Konstantin Zhuravlyove668b1c2017-04-14 05:33:57 +00002252 TargetOpts.Features.push_back(
2253 (Twine(hasFullSpeedFMAF32(TargetOpts.CPU) &&
Yaxun Liud3e85b92016-09-13 17:37:09 +00002254 !CGOpts.FlushDenorm ? '+' : '-') + Twine("fp32-denormals")).str());
Matt Arsenault09cca092017-01-23 22:31:14 +00002255 // Always do not flush fp64 or fp16 denorms.
Yaxun Liu2c17e822016-08-09 19:43:38 +00002256 if (!hasFP64Denormals && hasFP64)
Matt Arsenault09cca092017-01-23 22:31:14 +00002257 TargetOpts.Features.push_back("+fp64-fp16-denormals");
Yaxun Liu2c17e822016-08-09 19:43:38 +00002258 }
2259
Craig Topper6c03a542015-10-19 04:51:35 +00002260 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
2261 return llvm::makeArrayRef(BuiltinInfo,
2262 clang::AMDGPU::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eli Friedmand13b41e2012-10-12 23:32:00 +00002263 }
2264
Craig Topper3164f332014-03-11 03:39:26 +00002265 void getTargetDefines(const LangOptions &Opts,
2266 MacroBuilder &Builder) const override {
Matt Arsenault5e020b22016-02-27 09:06:26 +00002267 if (getTriple().getArch() == llvm::Triple::amdgcn)
2268 Builder.defineMacro("__AMDGCN__");
2269 else
2270 Builder.defineMacro("__R600__");
2271
Jan Veselyeebeaea2015-05-04 19:53:36 +00002272 if (hasFMAF)
2273 Builder.defineMacro("__HAS_FMAF__");
2274 if (hasLDEXPF)
2275 Builder.defineMacro("__HAS_LDEXPF__");
Jan Vesely211ba782016-06-17 02:25:03 +00002276 if (hasFP64)
2277 Builder.defineMacro("__HAS_FP64__");
Eli Friedmand13b41e2012-10-12 23:32:00 +00002278 }
2279
Craig Topper3164f332014-03-11 03:39:26 +00002280 BuiltinVaListKind getBuiltinVaListKind() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00002281 return TargetInfo::CharPtrBuiltinVaList;
2282 }
2283
Matt Arsenault250024f2016-06-08 01:56:42 +00002284 static GPUKind parseR600Name(StringRef Name) {
2285 return llvm::StringSwitch<GPUKind>(Name)
Tom Stellardc74b1e02013-03-04 17:40:53 +00002286 .Case("r600" , GK_R600)
2287 .Case("rv610", GK_R600)
2288 .Case("rv620", GK_R600)
2289 .Case("rv630", GK_R600)
2290 .Case("rv635", GK_R600)
2291 .Case("rs780", GK_R600)
2292 .Case("rs880", GK_R600)
2293 .Case("rv670", GK_R600_DOUBLE_OPS)
2294 .Case("rv710", GK_R700)
2295 .Case("rv730", GK_R700)
2296 .Case("rv740", GK_R700_DOUBLE_OPS)
2297 .Case("rv770", GK_R700_DOUBLE_OPS)
2298 .Case("palm", GK_EVERGREEN)
2299 .Case("cedar", GK_EVERGREEN)
2300 .Case("sumo", GK_EVERGREEN)
2301 .Case("sumo2", GK_EVERGREEN)
2302 .Case("redwood", GK_EVERGREEN)
2303 .Case("juniper", GK_EVERGREEN)
2304 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
2305 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
2306 .Case("barts", GK_NORTHERN_ISLANDS)
2307 .Case("turks", GK_NORTHERN_ISLANDS)
2308 .Case("caicos", GK_NORTHERN_ISLANDS)
2309 .Case("cayman", GK_CAYMAN)
2310 .Case("aruba", GK_CAYMAN)
Matt Arsenault250024f2016-06-08 01:56:42 +00002311 .Default(GK_NONE);
2312 }
2313
2314 static GPUKind parseAMDGCNName(StringRef Name) {
2315 return llvm::StringSwitch<GPUKind>(Name)
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002316 .Case("tahiti", GK_GFX6)
2317 .Case("pitcairn", GK_GFX6)
2318 .Case("verde", GK_GFX6)
2319 .Case("oland", GK_GFX6)
2320 .Case("hainan", GK_GFX6)
2321 .Case("bonaire", GK_GFX7)
2322 .Case("kabini", GK_GFX7)
2323 .Case("kaveri", GK_GFX7)
2324 .Case("hawaii", GK_GFX7)
2325 .Case("mullins", GK_GFX7)
Yaxun Liue59a0bc2016-10-26 16:40:21 +00002326 .Case("gfx700", GK_GFX7)
2327 .Case("gfx701", GK_GFX7)
2328 .Case("gfx702", GK_GFX7)
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002329 .Case("tonga", GK_GFX8)
2330 .Case("iceland", GK_GFX8)
2331 .Case("carrizo", GK_GFX8)
2332 .Case("fiji", GK_GFX8)
2333 .Case("stoney", GK_GFX8)
2334 .Case("polaris10", GK_GFX8)
2335 .Case("polaris11", GK_GFX8)
Yaxun Liue59a0bc2016-10-26 16:40:21 +00002336 .Case("gfx800", GK_GFX8)
2337 .Case("gfx801", GK_GFX8)
2338 .Case("gfx802", GK_GFX8)
2339 .Case("gfx803", GK_GFX8)
2340 .Case("gfx804", GK_GFX8)
2341 .Case("gfx810", GK_GFX8)
Matt Arsenaulteb952fd2017-02-18 19:02:41 +00002342 .Case("gfx900", GK_GFX9)
2343 .Case("gfx901", GK_GFX9)
Tom Stellardc74b1e02013-03-04 17:40:53 +00002344 .Default(GK_NONE);
Matt Arsenault250024f2016-06-08 01:56:42 +00002345 }
Tom Stellardc74b1e02013-03-04 17:40:53 +00002346
Matt Arsenault250024f2016-06-08 01:56:42 +00002347 bool setCPU(const std::string &Name) override {
2348 if (getTriple().getArch() == llvm::Triple::amdgcn)
2349 GPU = parseAMDGCNName(Name);
2350 else
2351 GPU = parseR600Name(Name);
Tom Stellardc74b1e02013-03-04 17:40:53 +00002352
Matt Arsenault250024f2016-06-08 01:56:42 +00002353 return GPU != GK_NONE;
Tom Stellardc74b1e02013-03-04 17:40:53 +00002354 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002355
Jan Vesely211ba782016-06-17 02:25:03 +00002356 void setSupportedOpenCLOpts() override {
2357 auto &Opts = getSupportedOpenCLOpts();
Yaxun Liu5b746652016-12-18 05:18:55 +00002358 Opts.support("cl_clang_storage_class_specifiers");
2359 Opts.support("cl_khr_icd");
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002360
Jan Vesely211ba782016-06-17 02:25:03 +00002361 if (hasFP64)
Yaxun Liu5b746652016-12-18 05:18:55 +00002362 Opts.support("cl_khr_fp64");
Jan Vesely211ba782016-06-17 02:25:03 +00002363 if (GPU >= GK_EVERGREEN) {
Yaxun Liu5b746652016-12-18 05:18:55 +00002364 Opts.support("cl_khr_byte_addressable_store");
2365 Opts.support("cl_khr_global_int32_base_atomics");
2366 Opts.support("cl_khr_global_int32_extended_atomics");
2367 Opts.support("cl_khr_local_int32_base_atomics");
2368 Opts.support("cl_khr_local_int32_extended_atomics");
Jan Vesely211ba782016-06-17 02:25:03 +00002369 }
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002370 if (GPU >= GK_GFX6) {
Yaxun Liu5b746652016-12-18 05:18:55 +00002371 Opts.support("cl_khr_fp16");
2372 Opts.support("cl_khr_int64_base_atomics");
2373 Opts.support("cl_khr_int64_extended_atomics");
2374 Opts.support("cl_khr_mipmap_image");
2375 Opts.support("cl_khr_subgroups");
2376 Opts.support("cl_khr_3d_image_writes");
2377 Opts.support("cl_amd_media_ops");
2378 Opts.support("cl_amd_media_ops2");
Jan Vesely211ba782016-06-17 02:25:03 +00002379 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002380 }
Nikolay Haustov8c6538b2016-06-30 09:06:33 +00002381
Yaxun Liu99444cb2016-08-03 20:38:06 +00002382 LangAS::ID getOpenCLImageAddrSpace() const override {
2383 return LangAS::opencl_constant;
2384 }
2385
Konstantin Zhuravlyovd1ba16e2017-03-08 23:56:48 +00002386 /// \returns Target specific vtbl ptr address space.
2387 unsigned getVtblPtrAddressSpace() const override {
2388 // \todo: We currently have address spaces defined in AMDGPU Backend. It
2389 // would be nice if we could use it here instead of using bare numbers (same
2390 // applies to getDWARFAddressSpace).
2391 return 2; // constant.
2392 }
2393
2394 /// \returns If a target requires an address within a target specific address
2395 /// space \p AddressSpace to be converted in order to be used, then return the
2396 /// corresponding target specific DWARF address space.
2397 ///
2398 /// \returns Otherwise return None and no conversion will be emitted in the
2399 /// DWARF.
2400 Optional<unsigned> getDWARFAddressSpace(
2401 unsigned AddressSpace) const override {
Yaxun Liu3464f922017-03-25 03:46:25 +00002402 const unsigned DWARF_Private = 1;
2403 const unsigned DWARF_Local = 2;
2404 if (AddressSpace == AS.Private) {
2405 return DWARF_Private;
2406 } else if (AddressSpace == AS.Local) {
2407 return DWARF_Local;
2408 } else {
Konstantin Zhuravlyovd1ba16e2017-03-08 23:56:48 +00002409 return None;
2410 }
2411 }
2412
Nikolay Haustov8c6538b2016-06-30 09:06:33 +00002413 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
2414 switch (CC) {
2415 default:
2416 return CCCR_Warning;
2417 case CC_C:
2418 case CC_OpenCLKernel:
2419 return CCCR_OK;
2420 }
2421 }
Yaxun Liu402804b2016-12-15 08:09:08 +00002422
2423 // In amdgcn target the null pointer in global, constant, and generic
2424 // address space has value 0 but in private and local address space has
2425 // value ~0.
2426 uint64_t getNullPointerValue(unsigned AS) const override {
Matt Arsenaultbf5e3e42017-03-13 19:47:53 +00002427 return AS == LangAS::opencl_local ? ~0 : 0;
Yaxun Liu402804b2016-12-15 08:09:08 +00002428 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00002429};
2430
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002431const Builtin::Info AMDGPUTargetInfo::BuiltinInfo[] = {
Matt Arsenault56f008d2014-06-24 20:45:01 +00002432#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00002433 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Matt Arsenault250024f2016-06-08 01:56:42 +00002434#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
2435 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002436#include "clang/Basic/BuiltinsAMDGPU.def"
Matt Arsenault56f008d2014-06-24 20:45:01 +00002437};
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002438const char * const AMDGPUTargetInfo::GCCRegNames[] = {
Tom Stellard7b1059b2015-04-14 14:36:56 +00002439 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
2440 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
2441 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
2442 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
2443 "v32", "v33", "v34", "v35", "v36", "v37", "v38", "v39",
2444 "v40", "v41", "v42", "v43", "v44", "v45", "v46", "v47",
2445 "v48", "v49", "v50", "v51", "v52", "v53", "v54", "v55",
2446 "v56", "v57", "v58", "v59", "v60", "v61", "v62", "v63",
2447 "v64", "v65", "v66", "v67", "v68", "v69", "v70", "v71",
2448 "v72", "v73", "v74", "v75", "v76", "v77", "v78", "v79",
2449 "v80", "v81", "v82", "v83", "v84", "v85", "v86", "v87",
2450 "v88", "v89", "v90", "v91", "v92", "v93", "v94", "v95",
2451 "v96", "v97", "v98", "v99", "v100", "v101", "v102", "v103",
2452 "v104", "v105", "v106", "v107", "v108", "v109", "v110", "v111",
2453 "v112", "v113", "v114", "v115", "v116", "v117", "v118", "v119",
2454 "v120", "v121", "v122", "v123", "v124", "v125", "v126", "v127",
2455 "v128", "v129", "v130", "v131", "v132", "v133", "v134", "v135",
2456 "v136", "v137", "v138", "v139", "v140", "v141", "v142", "v143",
2457 "v144", "v145", "v146", "v147", "v148", "v149", "v150", "v151",
2458 "v152", "v153", "v154", "v155", "v156", "v157", "v158", "v159",
2459 "v160", "v161", "v162", "v163", "v164", "v165", "v166", "v167",
2460 "v168", "v169", "v170", "v171", "v172", "v173", "v174", "v175",
2461 "v176", "v177", "v178", "v179", "v180", "v181", "v182", "v183",
2462 "v184", "v185", "v186", "v187", "v188", "v189", "v190", "v191",
2463 "v192", "v193", "v194", "v195", "v196", "v197", "v198", "v199",
2464 "v200", "v201", "v202", "v203", "v204", "v205", "v206", "v207",
2465 "v208", "v209", "v210", "v211", "v212", "v213", "v214", "v215",
2466 "v216", "v217", "v218", "v219", "v220", "v221", "v222", "v223",
2467 "v224", "v225", "v226", "v227", "v228", "v229", "v230", "v231",
2468 "v232", "v233", "v234", "v235", "v236", "v237", "v238", "v239",
2469 "v240", "v241", "v242", "v243", "v244", "v245", "v246", "v247",
2470 "v248", "v249", "v250", "v251", "v252", "v253", "v254", "v255",
2471 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
2472 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
2473 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
2474 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
2475 "s32", "s33", "s34", "s35", "s36", "s37", "s38", "s39",
2476 "s40", "s41", "s42", "s43", "s44", "s45", "s46", "s47",
2477 "s48", "s49", "s50", "s51", "s52", "s53", "s54", "s55",
2478 "s56", "s57", "s58", "s59", "s60", "s61", "s62", "s63",
2479 "s64", "s65", "s66", "s67", "s68", "s69", "s70", "s71",
2480 "s72", "s73", "s74", "s75", "s76", "s77", "s78", "s79",
2481 "s80", "s81", "s82", "s83", "s84", "s85", "s86", "s87",
2482 "s88", "s89", "s90", "s91", "s92", "s93", "s94", "s95",
2483 "s96", "s97", "s98", "s99", "s100", "s101", "s102", "s103",
2484 "s104", "s105", "s106", "s107", "s108", "s109", "s110", "s111",
2485 "s112", "s113", "s114", "s115", "s116", "s117", "s118", "s119",
Etienne Bergerone8ae26f2016-03-24 18:29:24 +00002486 "s120", "s121", "s122", "s123", "s124", "s125", "s126", "s127",
Matt Arsenaultb015d622016-02-27 09:06:22 +00002487 "exec", "vcc", "scc", "m0", "flat_scratch", "exec_lo", "exec_hi",
2488 "vcc_lo", "vcc_hi", "flat_scratch_lo", "flat_scratch_hi"
Tom Stellard7b1059b2015-04-14 14:36:56 +00002489};
2490
Craig Topperf054e3a2015-10-19 03:52:27 +00002491ArrayRef<const char *> AMDGPUTargetInfo::getGCCRegNames() const {
2492 return llvm::makeArrayRef(GCCRegNames);
Tom Stellard7b1059b2015-04-14 14:36:56 +00002493}
Matt Arsenault56f008d2014-06-24 20:45:01 +00002494
Matt Arsenault250024f2016-06-08 01:56:42 +00002495bool AMDGPUTargetInfo::initFeatureMap(
2496 llvm::StringMap<bool> &Features,
2497 DiagnosticsEngine &Diags, StringRef CPU,
2498 const std::vector<std::string> &FeatureVec) const {
2499
2500 // XXX - What does the member GPU mean if device name string passed here?
2501 if (getTriple().getArch() == llvm::Triple::amdgcn) {
2502 if (CPU.empty())
2503 CPU = "tahiti";
2504
2505 switch (parseAMDGCNName(CPU)) {
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002506 case GK_GFX6:
2507 case GK_GFX7:
Matt Arsenault250024f2016-06-08 01:56:42 +00002508 break;
2509
Matt Arsenaulta0c6dca2017-02-22 20:55:59 +00002510 case GK_GFX9:
2511 Features["gfx9-insts"] = true;
2512 LLVM_FALLTHROUGH;
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002513 case GK_GFX8:
Matt Arsenault250024f2016-06-08 01:56:42 +00002514 Features["s-memrealtime"] = true;
2515 Features["16-bit-insts"] = true;
Yaxun Liu4d867992017-03-10 01:30:46 +00002516 Features["dpp"] = true;
Matt Arsenault250024f2016-06-08 01:56:42 +00002517 break;
2518
2519 case GK_NONE:
2520 return false;
2521 default:
2522 llvm_unreachable("unhandled subtarget");
2523 }
2524 } else {
2525 if (CPU.empty())
2526 CPU = "r600";
2527
2528 switch (parseR600Name(CPU)) {
2529 case GK_R600:
2530 case GK_R700:
2531 case GK_EVERGREEN:
2532 case GK_NORTHERN_ISLANDS:
2533 break;
2534 case GK_R600_DOUBLE_OPS:
2535 case GK_R700_DOUBLE_OPS:
2536 case GK_EVERGREEN_DOUBLE_OPS:
2537 case GK_CAYMAN:
2538 Features["fp64"] = true;
2539 break;
2540 case GK_NONE:
2541 return false;
2542 default:
2543 llvm_unreachable("unhandled subtarget");
2544 }
2545 }
2546
2547 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeatureVec);
2548}
2549
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00002550const Builtin::Info BuiltinInfoX86[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00002551#define BUILTIN(ID, TYPE, ATTRS) \
2552 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002553#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
Craig Topper07d3b622015-08-07 05:14:44 +00002554 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Albert Gutowski727ab8a2016-09-14 21:19:43 +00002555#define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANGS, FEATURE) \
2556 { #ID, TYPE, ATTRS, HEADER, LANGS, FEATURE },
Chris Lattner5abdec72009-06-14 01:05:48 +00002557#include "clang/Basic/BuiltinsX86.def"
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00002558
2559#define BUILTIN(ID, TYPE, ATTRS) \
2560 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Albert Gutowski0fd6e962016-10-12 17:28:44 +00002561#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
2562 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00002563#define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANGS, FEATURE) \
2564 { #ID, TYPE, ATTRS, HEADER, LANGS, FEATURE },
2565#include "clang/Basic/BuiltinsX86_64.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00002566};
Eli Friedmanb5366062008-05-20 14:21:01 +00002567
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00002568
Nuno Lopescfca1f02009-12-23 17:49:57 +00002569static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002570 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
2571 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00002572 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002573 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
2574 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
2575 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00002576 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00002577 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
2578 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Marina Yatsina41c45fa2016-02-03 11:32:08 +00002579 "xmm16", "xmm17", "xmm18", "xmm19", "xmm20", "xmm21", "xmm22", "xmm23",
2580 "xmm24", "xmm25", "xmm26", "xmm27", "xmm28", "xmm29", "xmm30", "xmm31",
2581 "ymm16", "ymm17", "ymm18", "ymm19", "ymm20", "ymm21", "ymm22", "ymm23",
2582 "ymm24", "ymm25", "ymm26", "ymm27", "ymm28", "ymm29", "ymm30", "ymm31",
2583 "zmm0", "zmm1", "zmm2", "zmm3", "zmm4", "zmm5", "zmm6", "zmm7",
2584 "zmm8", "zmm9", "zmm10", "zmm11", "zmm12", "zmm13", "zmm14", "zmm15",
2585 "zmm16", "zmm17", "zmm18", "zmm19", "zmm20", "zmm21", "zmm22", "zmm23",
2586 "zmm24", "zmm25", "zmm26", "zmm27", "zmm28", "zmm29", "zmm30", "zmm31",
Michael Zuckerman15604b92016-10-31 14:16:57 +00002587 "k0", "k1", "k2", "k3", "k4", "k5", "k6", "k7",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002588};
2589
Eric Christophercdd36352011-06-21 00:05:20 +00002590const TargetInfo::AddlRegName AddlRegNames[] = {
2591 { { "al", "ah", "eax", "rax" }, 0 },
2592 { { "bl", "bh", "ebx", "rbx" }, 3 },
2593 { { "cl", "ch", "ecx", "rcx" }, 2 },
2594 { { "dl", "dh", "edx", "rdx" }, 1 },
2595 { { "esi", "rsi" }, 4 },
2596 { { "edi", "rdi" }, 5 },
2597 { { "esp", "rsp" }, 7 },
2598 { { "ebp", "rbp" }, 6 },
Alexey Bataeva7ab1b42015-09-04 03:42:23 +00002599 { { "r8d", "r8w", "r8b" }, 38 },
2600 { { "r9d", "r9w", "r9b" }, 39 },
2601 { { "r10d", "r10w", "r10b" }, 40 },
2602 { { "r11d", "r11w", "r11b" }, 41 },
2603 { { "r12d", "r12w", "r12b" }, 42 },
2604 { { "r13d", "r13w", "r13b" }, 43 },
2605 { { "r14d", "r14w", "r14b" }, 44 },
2606 { { "r15d", "r15w", "r15b" }, 45 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00002607};
2608
2609// X86 target abstract base class; x86-32 and x86-64 are very close, so
2610// most of the implementation can be shared.
2611class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00002612 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002613 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Craig Topper543f3bd2015-10-14 23:47:57 +00002614 } SSELevel = NoSSE;
Eli Friedman33465822011-07-08 23:31:17 +00002615 enum MMX3DNowEnum {
2616 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
Craig Topper543f3bd2015-10-14 23:47:57 +00002617 } MMX3DNowLevel = NoMMX3DNow;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002618 enum XOPEnum {
2619 NoXOP,
2620 SSE4A,
2621 FMA4,
2622 XOP
Craig Topper543f3bd2015-10-14 23:47:57 +00002623 } XOPLevel = NoXOP;
Anders Carlssone437c682010-01-27 03:47:49 +00002624
Craig Topper543f3bd2015-10-14 23:47:57 +00002625 bool HasAES = false;
2626 bool HasPCLMUL = false;
2627 bool HasLZCNT = false;
2628 bool HasRDRND = false;
2629 bool HasFSGSBASE = false;
2630 bool HasBMI = false;
2631 bool HasBMI2 = false;
2632 bool HasPOPCNT = false;
2633 bool HasRTM = false;
2634 bool HasPRFCHW = false;
2635 bool HasRDSEED = false;
2636 bool HasADX = false;
2637 bool HasTBM = false;
Simon Pilgrim35113482017-05-08 12:09:45 +00002638 bool HasLWP = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002639 bool HasFMA = false;
2640 bool HasF16C = false;
2641 bool HasAVX512CD = false;
Oren Ben Simhon140c1fb2017-05-25 13:44:11 +00002642 bool HasAVX512VPOPCNTDQ = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002643 bool HasAVX512ER = false;
2644 bool HasAVX512PF = false;
2645 bool HasAVX512DQ = false;
2646 bool HasAVX512BW = false;
2647 bool HasAVX512VL = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002648 bool HasAVX512VBMI = false;
2649 bool HasAVX512IFMA = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002650 bool HasSHA = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002651 bool HasMPX = false;
2652 bool HasSGX = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002653 bool HasCX16 = false;
Craig Toppere33f51f2015-10-16 06:22:36 +00002654 bool HasFXSR = false;
Craig Topperda9fe562015-10-15 05:23:38 +00002655 bool HasXSAVE = false;
2656 bool HasXSAVEOPT = false;
2657 bool HasXSAVEC = false;
2658 bool HasXSAVES = false;
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00002659 bool HasMWAITX = false;
Craig Topper45742262017-02-09 06:10:14 +00002660 bool HasCLZERO = false;
Asaf Badouha9d1e182015-12-31 14:14:07 +00002661 bool HasPKU = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002662 bool HasCLFLUSHOPT = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002663 bool HasCLWB = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002664 bool HasMOVBE = false;
2665 bool HasPREFETCHWT1 = false;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00002666
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002667 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
2668 ///
2669 /// Each enumeration represents a particular CPU supported by Clang. These
2670 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
2671 enum CPUKind {
2672 CK_Generic,
2673
2674 /// \name i386
2675 /// i386-generation processors.
2676 //@{
2677 CK_i386,
2678 //@}
2679
2680 /// \name i486
2681 /// i486-generation processors.
2682 //@{
2683 CK_i486,
2684 CK_WinChipC6,
2685 CK_WinChip2,
2686 CK_C3,
2687 //@}
2688
2689 /// \name i586
2690 /// i586-generation processors, P5 microarchitecture based.
2691 //@{
2692 CK_i586,
2693 CK_Pentium,
2694 CK_PentiumMMX,
2695 //@}
2696
2697 /// \name i686
2698 /// i686-generation processors, P6 / Pentium M microarchitecture based.
2699 //@{
2700 CK_i686,
2701 CK_PentiumPro,
2702 CK_Pentium2,
2703 CK_Pentium3,
2704 CK_Pentium3M,
2705 CK_PentiumM,
2706 CK_C3_2,
2707
2708 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
2709 /// Clang however has some logic to suport this.
2710 // FIXME: Warn, deprecate, and potentially remove this.
2711 CK_Yonah,
2712 //@}
2713
2714 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00002715 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002716 //@{
2717 CK_Pentium4,
2718 CK_Pentium4M,
2719 CK_Prescott,
2720 CK_Nocona,
2721 //@}
2722
2723 /// \name Core
2724 /// Core microarchitecture based processors.
2725 //@{
2726 CK_Core2,
2727
2728 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
2729 /// codename which GCC no longer accepts as an option to -march, but Clang
2730 /// has some logic for recognizing it.
2731 // FIXME: Warn, deprecate, and potentially remove this.
2732 CK_Penryn,
2733 //@}
2734
2735 /// \name Atom
2736 /// Atom processors
2737 //@{
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002738 CK_Bonnell,
Preston Gurda3c58c02013-09-13 19:27:17 +00002739 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002740 //@}
2741
2742 /// \name Nehalem
2743 /// Nehalem microarchitecture based processors.
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002744 CK_Nehalem,
2745
2746 /// \name Westmere
2747 /// Westmere microarchitecture based processors.
2748 CK_Westmere,
2749
2750 /// \name Sandy Bridge
2751 /// Sandy Bridge microarchitecture based processors.
2752 CK_SandyBridge,
2753
2754 /// \name Ivy Bridge
2755 /// Ivy Bridge microarchitecture based processors.
2756 CK_IvyBridge,
2757
2758 /// \name Haswell
2759 /// Haswell microarchitecture based processors.
2760 CK_Haswell,
2761
2762 /// \name Broadwell
2763 /// Broadwell microarchitecture based processors.
Robert Khasanov50e6f582014-09-19 09:53:48 +00002764 CK_Broadwell,
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002765
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002766 /// \name Skylake Client
2767 /// Skylake client microarchitecture based processors.
2768 CK_SkylakeClient,
2769
2770 /// \name Skylake Server
2771 /// Skylake server microarchitecture based processors.
2772 CK_SkylakeServer,
2773
2774 /// \name Cannonlake Client
2775 /// Cannonlake client microarchitecture based processors.
2776 CK_Cannonlake,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002777
Craig Topper449314e2013-08-20 07:09:39 +00002778 /// \name Knights Landing
2779 /// Knights Landing processor.
2780 CK_KNL,
2781
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002782 /// \name Lakemont
2783 /// Lakemont microarchitecture based processors.
2784 CK_Lakemont,
2785
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002786 /// \name K6
2787 /// K6 architecture processors.
2788 //@{
2789 CK_K6,
2790 CK_K6_2,
2791 CK_K6_3,
2792 //@}
2793
2794 /// \name K7
2795 /// K7 architecture processors.
2796 //@{
2797 CK_Athlon,
2798 CK_AthlonThunderbird,
2799 CK_Athlon4,
2800 CK_AthlonXP,
2801 CK_AthlonMP,
2802 //@}
2803
2804 /// \name K8
2805 /// K8 architecture processors.
2806 //@{
2807 CK_Athlon64,
2808 CK_Athlon64SSE3,
2809 CK_AthlonFX,
2810 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00002811 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002812 CK_Opteron,
2813 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00002814 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002815 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002816
Benjamin Kramer569f2152012-01-10 11:50:18 +00002817 /// \name Bobcat
2818 /// Bobcat architecture processors.
2819 //@{
2820 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002821 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002822 //@}
2823
2824 /// \name Bulldozer
2825 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002826 //@{
2827 CK_BDVER1,
2828 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002829 CK_BDVER3,
Benjamin Kramer56c58222014-05-02 15:47:51 +00002830 CK_BDVER4,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002831 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002832
Craig Topperc45744a2017-01-10 06:02:12 +00002833 /// \name zen
2834 /// Zen architecture processors.
2835 //@{
2836 CK_ZNVER1,
2837 //@}
2838
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002839 /// This specification is deprecated and will be removed in the future.
2840 /// Users should prefer \see CK_K8.
2841 // FIXME: Warn on this when the CPU is set to it.
Saleem Abdulrasoolcb29c1a2014-11-17 18:40:15 +00002842 //@{
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002843 CK_x86_64,
2844 //@}
2845
2846 /// \name Geode
2847 /// Geode processors.
2848 //@{
2849 CK_Geode
2850 //@}
Craig Topper543f3bd2015-10-14 23:47:57 +00002851 } CPU = CK_Generic;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002852
Eric Christopherc50738f2015-08-27 00:05:50 +00002853 CPUKind getCPUKind(StringRef CPU) const {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002854 return llvm::StringSwitch<CPUKind>(CPU)
2855 .Case("i386", CK_i386)
2856 .Case("i486", CK_i486)
2857 .Case("winchip-c6", CK_WinChipC6)
2858 .Case("winchip2", CK_WinChip2)
2859 .Case("c3", CK_C3)
2860 .Case("i586", CK_i586)
2861 .Case("pentium", CK_Pentium)
2862 .Case("pentium-mmx", CK_PentiumMMX)
2863 .Case("i686", CK_i686)
2864 .Case("pentiumpro", CK_PentiumPro)
2865 .Case("pentium2", CK_Pentium2)
2866 .Case("pentium3", CK_Pentium3)
2867 .Case("pentium3m", CK_Pentium3M)
2868 .Case("pentium-m", CK_PentiumM)
2869 .Case("c3-2", CK_C3_2)
2870 .Case("yonah", CK_Yonah)
2871 .Case("pentium4", CK_Pentium4)
2872 .Case("pentium4m", CK_Pentium4M)
2873 .Case("prescott", CK_Prescott)
2874 .Case("nocona", CK_Nocona)
2875 .Case("core2", CK_Core2)
2876 .Case("penryn", CK_Penryn)
2877 .Case("bonnell", CK_Bonnell)
2878 .Case("atom", CK_Bonnell) // Legacy name.
2879 .Case("silvermont", CK_Silvermont)
2880 .Case("slm", CK_Silvermont) // Legacy name.
2881 .Case("nehalem", CK_Nehalem)
2882 .Case("corei7", CK_Nehalem) // Legacy name.
2883 .Case("westmere", CK_Westmere)
2884 .Case("sandybridge", CK_SandyBridge)
2885 .Case("corei7-avx", CK_SandyBridge) // Legacy name.
2886 .Case("ivybridge", CK_IvyBridge)
2887 .Case("core-avx-i", CK_IvyBridge) // Legacy name.
2888 .Case("haswell", CK_Haswell)
2889 .Case("core-avx2", CK_Haswell) // Legacy name.
2890 .Case("broadwell", CK_Broadwell)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002891 .Case("skylake", CK_SkylakeClient)
2892 .Case("skylake-avx512", CK_SkylakeServer)
2893 .Case("skx", CK_SkylakeServer) // Legacy name.
2894 .Case("cannonlake", CK_Cannonlake)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002895 .Case("knl", CK_KNL)
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002896 .Case("lakemont", CK_Lakemont)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002897 .Case("k6", CK_K6)
2898 .Case("k6-2", CK_K6_2)
2899 .Case("k6-3", CK_K6_3)
2900 .Case("athlon", CK_Athlon)
2901 .Case("athlon-tbird", CK_AthlonThunderbird)
2902 .Case("athlon-4", CK_Athlon4)
2903 .Case("athlon-xp", CK_AthlonXP)
2904 .Case("athlon-mp", CK_AthlonMP)
2905 .Case("athlon64", CK_Athlon64)
2906 .Case("athlon64-sse3", CK_Athlon64SSE3)
2907 .Case("athlon-fx", CK_AthlonFX)
2908 .Case("k8", CK_K8)
2909 .Case("k8-sse3", CK_K8SSE3)
2910 .Case("opteron", CK_Opteron)
2911 .Case("opteron-sse3", CK_OpteronSSE3)
2912 .Case("barcelona", CK_AMDFAM10)
2913 .Case("amdfam10", CK_AMDFAM10)
2914 .Case("btver1", CK_BTVER1)
2915 .Case("btver2", CK_BTVER2)
2916 .Case("bdver1", CK_BDVER1)
2917 .Case("bdver2", CK_BDVER2)
2918 .Case("bdver3", CK_BDVER3)
2919 .Case("bdver4", CK_BDVER4)
Craig Topperc45744a2017-01-10 06:02:12 +00002920 .Case("znver1", CK_ZNVER1)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002921 .Case("x86-64", CK_x86_64)
2922 .Case("geode", CK_Geode)
2923 .Default(CK_Generic);
2924 }
2925
Rafael Espindolaeb265472013-08-21 21:59:03 +00002926 enum FPMathKind {
2927 FP_Default,
2928 FP_SSE,
2929 FP_387
Craig Topper543f3bd2015-10-14 23:47:57 +00002930 } FPMath = FP_Default;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002931
Eli Friedman3fd920a2008-08-20 02:34:37 +00002932public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00002933 X86TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
2934 : TargetInfo(Triple) {
Stephan Bergmann17c7f702016-12-14 11:57:17 +00002935 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended();
Chris Lattner1f5ad112006-10-14 18:32:12 +00002936 }
Craig Topper3164f332014-03-11 03:39:26 +00002937 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00002938 // X87 evaluates with 80 bits "long double" precision.
2939 return SSELevel == NoSSE ? 2 : 0;
2940 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002941 ArrayRef<const char *> getGCCRegNames() const override {
2942 return llvm::makeArrayRef(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00002943 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002944 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
2945 return None;
Eric Christophercdd36352011-06-21 00:05:20 +00002946 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002947 ArrayRef<TargetInfo::AddlRegName> getGCCAddlRegNames() const override {
2948 return llvm::makeArrayRef(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00002949 }
Eric Christopherd9832702015-06-29 21:00:05 +00002950 bool validateCpuSupports(StringRef Name) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002951 bool validateAsmConstraint(const char *&Name,
Eric Christopher917e9522014-11-18 22:36:15 +00002952 TargetInfo::ConstraintInfo &info) const override;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002953
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00002954 bool validateGlobalRegisterVariable(StringRef RegName,
2955 unsigned RegSize,
2956 bool &HasSizeMismatch) const override {
2957 // esp and ebp are the only 32-bit registers the x86 backend can currently
2958 // handle.
2959 if (RegName.equals("esp") || RegName.equals("ebp")) {
2960 // Check that the register size is 32-bit.
2961 HasSizeMismatch = RegSize != 32;
2962 return true;
2963 }
2964
2965 return false;
2966 }
2967
Akira Hatanaka974131e2014-09-18 18:17:18 +00002968 bool validateOutputSize(StringRef Constraint, unsigned Size) const override;
2969
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002970 bool validateInputSize(StringRef Constraint, unsigned Size) const override;
2971
Akira Hatanaka974131e2014-09-18 18:17:18 +00002972 virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const;
2973
Craig Topper3164f332014-03-11 03:39:26 +00002974 std::string convertConstraint(const char *&Constraint) const override;
2975 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002976 return "~{dirflag},~{fpsr},~{flags}";
2977 }
Marina Yatsinac42fd032016-12-26 12:23:42 +00002978
2979 StringRef getConstraintRegister(const StringRef &Constraint,
2980 const StringRef &Expression) const override {
2981 StringRef::iterator I, E;
2982 for (I = Constraint.begin(), E = Constraint.end(); I != E; ++I) {
2983 if (isalpha(*I))
2984 break;
2985 }
2986 if (I == E)
2987 return "";
2988 switch (*I) {
2989 // For the register constraints, return the matching register name
2990 case 'a':
2991 return "ax";
2992 case 'b':
2993 return "bx";
2994 case 'c':
2995 return "cx";
2996 case 'd':
2997 return "dx";
2998 case 'S':
2999 return "si";
3000 case 'D':
3001 return "di";
3002 // In case the constraint is 'r' we need to return Expression
3003 case 'r':
3004 return Expression;
3005 default:
3006 // Default value if there is no constraint for the register
3007 return "";
3008 }
3009 return "";
3010 }
3011
Craig Topper3164f332014-03-11 03:39:26 +00003012 void getTargetDefines(const LangOptions &Opts,
3013 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00003014 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
3015 bool Enabled);
3016 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
3017 bool Enabled);
3018 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
3019 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00003020 void setFeatureEnabled(llvm::StringMap<bool> &Features,
3021 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00003022 setFeatureEnabledImpl(Features, Name, Enabled);
3023 }
3024 // This exists purely to cut down on the number of virtual calls in
Eric Christopheref1e2952015-08-28 02:13:58 +00003025 // initFeatureMap which calls this repeatedly.
Craig Topper86d79ef2013-09-17 04:51:29 +00003026 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
3027 StringRef Name, bool Enabled);
Eric Christopher8c47b422015-10-09 18:39:55 +00003028 bool
3029 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
3030 StringRef CPU,
3031 const std::vector<std::string> &FeaturesVec) const override;
Craig Topper3164f332014-03-11 03:39:26 +00003032 bool hasFeature(StringRef Feature) const override;
3033 bool handleTargetFeatures(std::vector<std::string> &Features,
3034 DiagnosticsEngine &Diags) override;
Alp Toker4925ba72014-06-07 23:30:42 +00003035 StringRef getABI() const override {
Ahmed Bougacha0b938282015-06-22 21:31:43 +00003036 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX512F)
3037 return "avx512";
Craig Topperd945d502015-10-20 00:00:17 +00003038 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00003039 return "avx";
Craig Topperd945d502015-10-20 00:00:17 +00003040 if (getTriple().getArch() == llvm::Triple::x86 &&
Derek Schuffc7dd7222012-10-11 15:52:22 +00003041 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00003042 return "no-mmx";
3043 return "";
Eli Friedman33465822011-07-08 23:31:17 +00003044 }
Craig Topper3164f332014-03-11 03:39:26 +00003045 bool setCPU(const std::string &Name) override {
Eric Christopherb39e44b2015-08-26 23:42:18 +00003046 CPU = getCPUKind(Name);
Chandler Carruth212334f2011-09-28 08:55:37 +00003047
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00003048 // Perform any per-CPU checks necessary to determine if this CPU is
3049 // acceptable.
3050 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
3051 // invalid without explaining *why*.
3052 switch (CPU) {
3053 case CK_Generic:
3054 // No processor selected!
3055 return false;
3056
3057 case CK_i386:
3058 case CK_i486:
3059 case CK_WinChipC6:
3060 case CK_WinChip2:
3061 case CK_C3:
3062 case CK_i586:
3063 case CK_Pentium:
3064 case CK_PentiumMMX:
3065 case CK_i686:
3066 case CK_PentiumPro:
3067 case CK_Pentium2:
3068 case CK_Pentium3:
3069 case CK_Pentium3M:
3070 case CK_PentiumM:
3071 case CK_Yonah:
3072 case CK_C3_2:
3073 case CK_Pentium4:
3074 case CK_Pentium4M:
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003075 case CK_Lakemont:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00003076 case CK_Prescott:
3077 case CK_K6:
3078 case CK_K6_2:
3079 case CK_K6_3:
3080 case CK_Athlon:
3081 case CK_AthlonThunderbird:
3082 case CK_Athlon4:
3083 case CK_AthlonXP:
3084 case CK_AthlonMP:
3085 case CK_Geode:
3086 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00003087 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00003088 return false;
3089
3090 // Fallthrough
3091 case CK_Nocona:
3092 case CK_Core2:
3093 case CK_Penryn:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003094 case CK_Bonnell:
Preston Gurda3c58c02013-09-13 19:27:17 +00003095 case CK_Silvermont:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003096 case CK_Nehalem:
3097 case CK_Westmere:
3098 case CK_SandyBridge:
3099 case CK_IvyBridge:
3100 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00003101 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003102 case CK_SkylakeClient:
3103 case CK_SkylakeServer:
3104 case CK_Cannonlake:
Craig Topper449314e2013-08-20 07:09:39 +00003105 case CK_KNL:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00003106 case CK_Athlon64:
3107 case CK_Athlon64SSE3:
3108 case CK_AthlonFX:
3109 case CK_K8:
3110 case CK_K8SSE3:
3111 case CK_Opteron:
3112 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00003113 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00003114 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003115 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003116 case CK_BDVER1:
3117 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003118 case CK_BDVER3:
Benjamin Kramer56c58222014-05-02 15:47:51 +00003119 case CK_BDVER4:
Craig Topperc45744a2017-01-10 06:02:12 +00003120 case CK_ZNVER1:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00003121 case CK_x86_64:
3122 return true;
3123 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00003124 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003125 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003126
Craig Topper3164f332014-03-11 03:39:26 +00003127 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00003128
Craig Topper3164f332014-03-11 03:39:26 +00003129 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00003130 // Most of the non-ARM calling conventions are i386 conventions.
3131 switch (CC) {
3132 case CC_X86ThisCall:
3133 case CC_X86FastCall:
3134 case CC_X86StdCall:
3135 case CC_X86VectorCall:
Erich Keane757d3172016-11-02 18:29:35 +00003136 case CC_X86RegCall:
John McCall477f2bb2016-03-03 06:39:32 +00003137 case CC_C:
3138 case CC_Swift:
3139 case CC_X86Pascal:
3140 case CC_IntelOclBicc:
Pekka Jaaskelainenfc2629a2017-06-01 07:18:49 +00003141 case CC_OpenCLKernel:
John McCall477f2bb2016-03-03 06:39:32 +00003142 return CCCR_OK;
3143 default:
3144 return CCCR_Warning;
3145 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003146 }
3147
Craig Topper3164f332014-03-11 03:39:26 +00003148 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00003149 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003150 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00003151
3152 bool hasSjLjLowering() const override {
3153 return true;
3154 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00003155
3156 void setSupportedOpenCLOpts() override {
Yaxun Liu5b746652016-12-18 05:18:55 +00003157 getSupportedOpenCLOpts().supportAll();
Yaxun Liu39cf40f2016-05-16 17:06:34 +00003158 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00003159};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00003160
Rafael Espindolaeb265472013-08-21 21:59:03 +00003161bool X86TargetInfo::setFPMath(StringRef Name) {
3162 if (Name == "387") {
3163 FPMath = FP_387;
3164 return true;
3165 }
3166 if (Name == "sse") {
3167 FPMath = FP_SSE;
3168 return true;
3169 }
3170 return false;
3171}
3172
Eric Christopher007b0a02015-08-28 22:32:01 +00003173bool X86TargetInfo::initFeatureMap(
3174 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
Eric Christopher8c47b422015-10-09 18:39:55 +00003175 const std::vector<std::string> &FeaturesVec) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003176 // FIXME: This *really* should not be here.
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003177 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00003178 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00003179 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003180
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003181 const CPUKind Kind = getCPUKind(CPU);
Andrey Turetskiy5f1cf5f2016-03-23 11:15:10 +00003182
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003183 // Enable X87 for all X86 processors but Lakemont.
3184 if (Kind != CK_Lakemont)
3185 setFeatureEnabledImpl(Features, "x87", true);
3186
3187 switch (Kind) {
Chandler Carruth212334f2011-09-28 08:55:37 +00003188 case CK_Generic:
3189 case CK_i386:
3190 case CK_i486:
3191 case CK_i586:
3192 case CK_Pentium:
3193 case CK_i686:
3194 case CK_PentiumPro:
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003195 case CK_Lakemont:
Chandler Carruth212334f2011-09-28 08:55:37 +00003196 break;
3197 case CK_PentiumMMX:
3198 case CK_Pentium2:
Craig Topperdb4dc082014-11-06 05:52:19 +00003199 case CK_K6:
3200 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00003201 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003202 break;
3203 case CK_Pentium3:
3204 case CK_Pentium3M:
Craig Topperdb4dc082014-11-06 05:52:19 +00003205 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00003206 setFeatureEnabledImpl(Features, "sse", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003207 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003208 break;
3209 case CK_PentiumM:
3210 case CK_Pentium4:
3211 case CK_Pentium4M:
3212 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00003213 setFeatureEnabledImpl(Features, "sse2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003214 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003215 break;
3216 case CK_Yonah:
3217 case CK_Prescott:
3218 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00003219 setFeatureEnabledImpl(Features, "sse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003220 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003221 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003222 break;
3223 case CK_Core2:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003224 case CK_Bonnell:
Craig Topper86d79ef2013-09-17 04:51:29 +00003225 setFeatureEnabledImpl(Features, "ssse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003226 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003227 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003228 break;
3229 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00003230 setFeatureEnabledImpl(Features, "sse4.1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003231 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003232 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003233 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003234 case CK_Cannonlake:
3235 setFeatureEnabledImpl(Features, "avx512ifma", true);
3236 setFeatureEnabledImpl(Features, "avx512vbmi", true);
3237 setFeatureEnabledImpl(Features, "sha", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003238 LLVM_FALLTHROUGH;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003239 case CK_SkylakeServer:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003240 setFeatureEnabledImpl(Features, "avx512f", true);
3241 setFeatureEnabledImpl(Features, "avx512cd", true);
3242 setFeatureEnabledImpl(Features, "avx512dq", true);
3243 setFeatureEnabledImpl(Features, "avx512bw", true);
3244 setFeatureEnabledImpl(Features, "avx512vl", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003245 setFeatureEnabledImpl(Features, "pku", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003246 setFeatureEnabledImpl(Features, "clwb", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003247 LLVM_FALLTHROUGH;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003248 case CK_SkylakeClient:
Craig Topperda9fe562015-10-15 05:23:38 +00003249 setFeatureEnabledImpl(Features, "xsavec", true);
3250 setFeatureEnabledImpl(Features, "xsaves", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003251 setFeatureEnabledImpl(Features, "mpx", true);
3252 setFeatureEnabledImpl(Features, "sgx", true);
3253 setFeatureEnabledImpl(Features, "clflushopt", true);
Eric Christopherfc6ffed2017-03-28 23:03:19 +00003254 setFeatureEnabledImpl(Features, "rtm", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003255 LLVM_FALLTHROUGH;
Craig Topperdb4dc082014-11-06 05:52:19 +00003256 case CK_Broadwell:
3257 setFeatureEnabledImpl(Features, "rdseed", true);
3258 setFeatureEnabledImpl(Features, "adx", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003259 LLVM_FALLTHROUGH;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003260 case CK_Haswell:
Craig Topperdb4dc082014-11-06 05:52:19 +00003261 setFeatureEnabledImpl(Features, "avx2", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003262 setFeatureEnabledImpl(Features, "lzcnt", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003263 setFeatureEnabledImpl(Features, "bmi", true);
3264 setFeatureEnabledImpl(Features, "bmi2", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003265 setFeatureEnabledImpl(Features, "fma", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003266 setFeatureEnabledImpl(Features, "movbe", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003267 LLVM_FALLTHROUGH;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003268 case CK_IvyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00003269 setFeatureEnabledImpl(Features, "rdrnd", true);
3270 setFeatureEnabledImpl(Features, "f16c", true);
3271 setFeatureEnabledImpl(Features, "fsgsbase", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003272 LLVM_FALLTHROUGH;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003273 case CK_SandyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00003274 setFeatureEnabledImpl(Features, "avx", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003275 setFeatureEnabledImpl(Features, "xsave", true);
3276 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003277 LLVM_FALLTHROUGH;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003278 case CK_Westmere:
Craig Topperdb4dc082014-11-06 05:52:19 +00003279 case CK_Silvermont:
3280 setFeatureEnabledImpl(Features, "aes", true);
3281 setFeatureEnabledImpl(Features, "pclmul", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003282 LLVM_FALLTHROUGH;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003283 case CK_Nehalem:
Craig Topperdb4dc082014-11-06 05:52:19 +00003284 setFeatureEnabledImpl(Features, "sse4.2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003285 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00003286 setFeatureEnabledImpl(Features, "cx16", true);
3287 break;
3288 case CK_KNL:
3289 setFeatureEnabledImpl(Features, "avx512f", true);
3290 setFeatureEnabledImpl(Features, "avx512cd", true);
3291 setFeatureEnabledImpl(Features, "avx512er", true);
3292 setFeatureEnabledImpl(Features, "avx512pf", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003293 setFeatureEnabledImpl(Features, "prefetchwt1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003294 setFeatureEnabledImpl(Features, "fxsr", true);
Robert Khasanov50e6f582014-09-19 09:53:48 +00003295 setFeatureEnabledImpl(Features, "rdseed", true);
3296 setFeatureEnabledImpl(Features, "adx", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00003297 setFeatureEnabledImpl(Features, "lzcnt", true);
3298 setFeatureEnabledImpl(Features, "bmi", true);
3299 setFeatureEnabledImpl(Features, "bmi2", true);
3300 setFeatureEnabledImpl(Features, "rtm", true);
3301 setFeatureEnabledImpl(Features, "fma", true);
3302 setFeatureEnabledImpl(Features, "rdrnd", true);
3303 setFeatureEnabledImpl(Features, "f16c", true);
3304 setFeatureEnabledImpl(Features, "fsgsbase", true);
3305 setFeatureEnabledImpl(Features, "aes", true);
3306 setFeatureEnabledImpl(Features, "pclmul", true);
3307 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003308 setFeatureEnabledImpl(Features, "xsaveopt", true);
3309 setFeatureEnabledImpl(Features, "xsave", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003310 setFeatureEnabledImpl(Features, "movbe", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003311 break;
3312 case CK_K6_2:
3313 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00003314 case CK_WinChip2:
3315 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00003316 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003317 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00003318 case CK_Athlon:
3319 case CK_AthlonThunderbird:
3320 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00003321 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00003322 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003323 case CK_Athlon4:
3324 case CK_AthlonXP:
3325 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00003326 setFeatureEnabledImpl(Features, "sse", true);
3327 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003328 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003329 break;
3330 case CK_K8:
3331 case CK_Opteron:
3332 case CK_Athlon64:
3333 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00003334 setFeatureEnabledImpl(Features, "sse2", true);
3335 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003336 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003337 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00003338 case CK_AMDFAM10:
3339 setFeatureEnabledImpl(Features, "sse4a", true);
3340 setFeatureEnabledImpl(Features, "lzcnt", true);
3341 setFeatureEnabledImpl(Features, "popcnt", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003342 LLVM_FALLTHROUGH;
Chandler Carruth212334f2011-09-28 08:55:37 +00003343 case CK_K8SSE3:
3344 case CK_OpteronSSE3:
3345 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00003346 setFeatureEnabledImpl(Features, "sse3", true);
3347 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003348 setFeatureEnabledImpl(Features, "fxsr", true);
Roman Divackyce253d82011-10-30 13:47:56 +00003349 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00003350 case CK_BTVER2:
3351 setFeatureEnabledImpl(Features, "avx", true);
3352 setFeatureEnabledImpl(Features, "aes", true);
3353 setFeatureEnabledImpl(Features, "pclmul", true);
3354 setFeatureEnabledImpl(Features, "bmi", true);
3355 setFeatureEnabledImpl(Features, "f16c", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003356 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003357 LLVM_FALLTHROUGH;
Benjamin Kramer569f2152012-01-10 11:50:18 +00003358 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00003359 setFeatureEnabledImpl(Features, "ssse3", true);
3360 setFeatureEnabledImpl(Features, "sse4a", true);
3361 setFeatureEnabledImpl(Features, "lzcnt", true);
3362 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00003363 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003364 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003365 setFeatureEnabledImpl(Features, "fxsr", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003366 break;
Craig Topperc45744a2017-01-10 06:02:12 +00003367 case CK_ZNVER1:
3368 setFeatureEnabledImpl(Features, "adx", true);
3369 setFeatureEnabledImpl(Features, "aes", true);
3370 setFeatureEnabledImpl(Features, "avx2", true);
3371 setFeatureEnabledImpl(Features, "bmi", true);
3372 setFeatureEnabledImpl(Features, "bmi2", true);
3373 setFeatureEnabledImpl(Features, "clflushopt", true);
Craig Topper45742262017-02-09 06:10:14 +00003374 setFeatureEnabledImpl(Features, "clzero", true);
Craig Topperc45744a2017-01-10 06:02:12 +00003375 setFeatureEnabledImpl(Features, "cx16", true);
3376 setFeatureEnabledImpl(Features, "f16c", true);
3377 setFeatureEnabledImpl(Features, "fma", true);
3378 setFeatureEnabledImpl(Features, "fsgsbase", true);
3379 setFeatureEnabledImpl(Features, "fxsr", true);
3380 setFeatureEnabledImpl(Features, "lzcnt", true);
3381 setFeatureEnabledImpl(Features, "mwaitx", true);
3382 setFeatureEnabledImpl(Features, "movbe", true);
3383 setFeatureEnabledImpl(Features, "pclmul", true);
3384 setFeatureEnabledImpl(Features, "popcnt", true);
3385 setFeatureEnabledImpl(Features, "prfchw", true);
3386 setFeatureEnabledImpl(Features, "rdrnd", true);
3387 setFeatureEnabledImpl(Features, "rdseed", true);
3388 setFeatureEnabledImpl(Features, "sha", true);
3389 setFeatureEnabledImpl(Features, "sse4a", true);
3390 setFeatureEnabledImpl(Features, "xsave", true);
3391 setFeatureEnabledImpl(Features, "xsavec", true);
3392 setFeatureEnabledImpl(Features, "xsaveopt", true);
3393 setFeatureEnabledImpl(Features, "xsaves", true);
3394 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003395 case CK_BDVER4:
3396 setFeatureEnabledImpl(Features, "avx2", true);
3397 setFeatureEnabledImpl(Features, "bmi2", true);
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003398 setFeatureEnabledImpl(Features, "mwaitx", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003399 LLVM_FALLTHROUGH;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003400 case CK_BDVER3:
Craig Topper8c7f2512014-11-03 06:51:41 +00003401 setFeatureEnabledImpl(Features, "fsgsbase", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003402 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003403 LLVM_FALLTHROUGH;
Craig Topper8c7f2512014-11-03 06:51:41 +00003404 case CK_BDVER2:
Andrea Di Biagio9760a442014-11-06 12:08:57 +00003405 setFeatureEnabledImpl(Features, "bmi", true);
3406 setFeatureEnabledImpl(Features, "fma", true);
3407 setFeatureEnabledImpl(Features, "f16c", true);
3408 setFeatureEnabledImpl(Features, "tbm", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003409 LLVM_FALLTHROUGH;
Andrea Di Biagio9760a442014-11-06 12:08:57 +00003410 case CK_BDVER1:
3411 // xop implies avx, sse4a and fma4.
Craig Topper86d79ef2013-09-17 04:51:29 +00003412 setFeatureEnabledImpl(Features, "xop", true);
Simon Pilgrim35113482017-05-08 12:09:45 +00003413 setFeatureEnabledImpl(Features, "lwp", true);
Craig Topper86d79ef2013-09-17 04:51:29 +00003414 setFeatureEnabledImpl(Features, "lzcnt", true);
3415 setFeatureEnabledImpl(Features, "aes", true);
3416 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00003417 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003418 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003419 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003420 setFeatureEnabledImpl(Features, "xsave", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003421 break;
Eli Friedman33465822011-07-08 23:31:17 +00003422 }
Eric Christopherbbd746d2015-10-08 20:10:14 +00003423 if (!TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec))
3424 return false;
3425
3426 // Can't do this earlier because we need to be able to explicitly enable
3427 // or disable these features and the things that they depend upon.
3428
3429 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
3430 auto I = Features.find("sse4.2");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003431 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00003432 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-popcnt") ==
3433 FeaturesVec.end())
3434 Features["popcnt"] = true;
3435
3436 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
3437 I = Features.find("3dnow");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003438 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00003439 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-prfchw") ==
3440 FeaturesVec.end())
3441 Features["prfchw"] = true;
3442
Eric Christophera7260af2015-10-08 20:10:18 +00003443 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
3444 // then enable MMX.
3445 I = Features.find("sse");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003446 if (I != Features.end() && I->getValue() &&
Eric Christophera7260af2015-10-08 20:10:18 +00003447 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-mmx") ==
3448 FeaturesVec.end())
3449 Features["mmx"] = true;
3450
Eric Christopherbbd746d2015-10-08 20:10:14 +00003451 return true;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003452}
3453
Rafael Espindolae62e2792013-08-20 13:44:29 +00003454void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00003455 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003456 if (Enabled) {
3457 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003458 case AVX512F:
3459 Features["avx512f"] = true;
Galina Kistanova078b3012017-05-23 16:33:07 +00003460 LLVM_FALLTHROUGH;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003461 case AVX2:
3462 Features["avx2"] = true;
Galina Kistanova078b3012017-05-23 16:33:07 +00003463 LLVM_FALLTHROUGH;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003464 case AVX:
3465 Features["avx"] = true;
Craig Topperda9fe562015-10-15 05:23:38 +00003466 Features["xsave"] = true;
Galina Kistanova078b3012017-05-23 16:33:07 +00003467 LLVM_FALLTHROUGH;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003468 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00003469 Features["sse4.2"] = true;
Galina Kistanova078b3012017-05-23 16:33:07 +00003470 LLVM_FALLTHROUGH;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003471 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00003472 Features["sse4.1"] = true;
Galina Kistanova078b3012017-05-23 16:33:07 +00003473 LLVM_FALLTHROUGH;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003474 case SSSE3:
3475 Features["ssse3"] = true;
Galina Kistanova078b3012017-05-23 16:33:07 +00003476 LLVM_FALLTHROUGH;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003477 case SSE3:
3478 Features["sse3"] = true;
Galina Kistanova078b3012017-05-23 16:33:07 +00003479 LLVM_FALLTHROUGH;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003480 case SSE2:
3481 Features["sse2"] = true;
Galina Kistanova078b3012017-05-23 16:33:07 +00003482 LLVM_FALLTHROUGH;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003483 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00003484 Features["sse"] = true;
Galina Kistanova078b3012017-05-23 16:33:07 +00003485 LLVM_FALLTHROUGH;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003486 case NoSSE:
3487 break;
3488 }
3489 return;
3490 }
3491
3492 switch (Level) {
3493 case NoSSE:
3494 case SSE1:
3495 Features["sse"] = false;
Galina Kistanova078b3012017-05-23 16:33:07 +00003496 LLVM_FALLTHROUGH;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003497 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00003498 Features["sse2"] = Features["pclmul"] = Features["aes"] =
3499 Features["sha"] = false;
Galina Kistanova078b3012017-05-23 16:33:07 +00003500 LLVM_FALLTHROUGH;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003501 case SSE3:
3502 Features["sse3"] = false;
3503 setXOPLevel(Features, NoXOP, false);
Galina Kistanova078b3012017-05-23 16:33:07 +00003504 LLVM_FALLTHROUGH;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003505 case SSSE3:
3506 Features["ssse3"] = false;
Galina Kistanova078b3012017-05-23 16:33:07 +00003507 LLVM_FALLTHROUGH;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003508 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00003509 Features["sse4.1"] = false;
Galina Kistanova078b3012017-05-23 16:33:07 +00003510 LLVM_FALLTHROUGH;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003511 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00003512 Features["sse4.2"] = false;
Galina Kistanova078b3012017-05-23 16:33:07 +00003513 LLVM_FALLTHROUGH;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003514 case AVX:
Craig Topperda9fe562015-10-15 05:23:38 +00003515 Features["fma"] = Features["avx"] = Features["f16c"] = Features["xsave"] =
3516 Features["xsaveopt"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00003517 setXOPLevel(Features, FMA4, false);
Galina Kistanova078b3012017-05-23 16:33:07 +00003518 LLVM_FALLTHROUGH;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003519 case AVX2:
3520 Features["avx2"] = false;
Galina Kistanova078b3012017-05-23 16:33:07 +00003521 LLVM_FALLTHROUGH;
Craig Topper9c4d17f2013-08-21 03:59:22 +00003522 case AVX512F:
Eric Christopher917e9522014-11-18 22:36:15 +00003523 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
Oren Ben Simhon140c1fb2017-05-25 13:44:11 +00003524 Features["avx512pf"] = Features["avx512dq"] = Features["avx512bw"] =
3525 Features["avx512vl"] = Features["avx512vbmi"] =
3526 Features["avx512ifma"] = Features["avx512vpopcntdq"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003527 }
3528}
3529
3530void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00003531 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003532 if (Enabled) {
3533 switch (Level) {
3534 case AMD3DNowAthlon:
3535 Features["3dnowa"] = true;
Galina Kistanova078b3012017-05-23 16:33:07 +00003536 LLVM_FALLTHROUGH;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003537 case AMD3DNow:
3538 Features["3dnow"] = true;
Galina Kistanova078b3012017-05-23 16:33:07 +00003539 LLVM_FALLTHROUGH;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003540 case MMX:
3541 Features["mmx"] = true;
Galina Kistanova078b3012017-05-23 16:33:07 +00003542 LLVM_FALLTHROUGH;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003543 case NoMMX3DNow:
3544 break;
3545 }
3546 return;
3547 }
3548
3549 switch (Level) {
3550 case NoMMX3DNow:
3551 case MMX:
3552 Features["mmx"] = false;
Galina Kistanova078b3012017-05-23 16:33:07 +00003553 LLVM_FALLTHROUGH;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003554 case AMD3DNow:
3555 Features["3dnow"] = false;
Galina Kistanova078b3012017-05-23 16:33:07 +00003556 LLVM_FALLTHROUGH;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003557 case AMD3DNowAthlon:
3558 Features["3dnowa"] = false;
3559 }
3560}
3561
3562void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00003563 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003564 if (Enabled) {
3565 switch (Level) {
3566 case XOP:
3567 Features["xop"] = true;
Galina Kistanova078b3012017-05-23 16:33:07 +00003568 LLVM_FALLTHROUGH;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003569 case FMA4:
3570 Features["fma4"] = true;
3571 setSSELevel(Features, AVX, true);
Galina Kistanova078b3012017-05-23 16:33:07 +00003572 LLVM_FALLTHROUGH;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003573 case SSE4A:
3574 Features["sse4a"] = true;
3575 setSSELevel(Features, SSE3, true);
Galina Kistanova078b3012017-05-23 16:33:07 +00003576 LLVM_FALLTHROUGH;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003577 case NoXOP:
3578 break;
3579 }
3580 return;
3581 }
3582
3583 switch (Level) {
3584 case NoXOP:
3585 case SSE4A:
3586 Features["sse4a"] = false;
Galina Kistanova078b3012017-05-23 16:33:07 +00003587 LLVM_FALLTHROUGH;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003588 case FMA4:
3589 Features["fma4"] = false;
Galina Kistanova078b3012017-05-23 16:33:07 +00003590 LLVM_FALLTHROUGH;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003591 case XOP:
3592 Features["xop"] = false;
3593 }
3594}
3595
Craig Topper86d79ef2013-09-17 04:51:29 +00003596void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
3597 StringRef Name, bool Enabled) {
Eric Christopher298ac302015-07-01 00:08:32 +00003598 // This is a bit of a hack to deal with the sse4 target feature when used
3599 // as part of the target attribute. We handle sse4 correctly everywhere
3600 // else. See below for more information on how we handle the sse4 options.
3601 if (Name != "sse4")
3602 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00003603
Craig Topper29561122013-09-19 01:13:07 +00003604 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003605 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003606 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003607 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003608 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003609 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003610 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003611 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003612 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003613 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003614 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003615 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003616 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003617 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003618 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003619 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003620 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003621 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003622 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003623 if (Enabled)
3624 setSSELevel(Features, SSE2, Enabled);
3625 } else if (Name == "pclmul") {
3626 if (Enabled)
3627 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003628 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003629 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003630 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003631 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003632 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003633 setSSELevel(Features, AVX512F, Enabled);
Craig Topperb4f83a02016-02-29 06:51:38 +00003634 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf" ||
3635 Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl" ||
Oren Ben Simhon140c1fb2017-05-25 13:44:11 +00003636 Name == "avx512vbmi" || Name == "avx512ifma" ||
3637 Name == "avx512vpopcntdq") {
Craig Topper679b53a2013-08-21 05:29:10 +00003638 if (Enabled)
3639 setSSELevel(Features, AVX512F, Enabled);
Craig Topper6c7ecc52016-11-09 04:51:03 +00003640 // Enable BWI instruction if VBMI is being enabled.
3641 if (Name == "avx512vbmi" && Enabled)
3642 Features["avx512bw"] = true;
3643 // Also disable VBMI if BWI is being disabled.
3644 if (Name == "avx512bw" && !Enabled)
3645 Features["avx512vbmi"] = false;
Craig Topper679b53a2013-08-21 05:29:10 +00003646 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003647 if (Enabled)
3648 setSSELevel(Features, AVX, Enabled);
3649 } else if (Name == "fma4") {
3650 setXOPLevel(Features, FMA4, Enabled);
3651 } else if (Name == "xop") {
3652 setXOPLevel(Features, XOP, Enabled);
3653 } else if (Name == "sse4a") {
3654 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00003655 } else if (Name == "f16c") {
3656 if (Enabled)
3657 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00003658 } else if (Name == "sha") {
3659 if (Enabled)
3660 setSSELevel(Features, SSE2, Enabled);
Eric Christopher298ac302015-07-01 00:08:32 +00003661 } else if (Name == "sse4") {
3662 // We can get here via the __target__ attribute since that's not controlled
3663 // via the -msse4/-mno-sse4 command line alias. Handle this the same way
3664 // here - turn on the sse4.2 if enabled, turn off the sse4.1 level if
3665 // disabled.
3666 if (Enabled)
3667 setSSELevel(Features, SSE42, Enabled);
3668 else
3669 setSSELevel(Features, SSE41, Enabled);
Craig Topperda9fe562015-10-15 05:23:38 +00003670 } else if (Name == "xsave") {
Craig Topper840927e2016-02-29 06:51:34 +00003671 if (!Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003672 Features["xsaveopt"] = false;
3673 } else if (Name == "xsaveopt" || Name == "xsavec" || Name == "xsaves") {
Craig Topper840927e2016-02-29 06:51:34 +00003674 if (Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003675 Features["xsave"] = true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003676 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003677}
3678
Eric Christopher3ff21b32013-10-16 21:26:26 +00003679/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003680/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00003681bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00003682 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00003683 for (const auto &Feature : Features) {
3684 if (Feature[0] != '+')
Daniel Dunbar979586e2009-11-11 09:38:56 +00003685 continue;
3686
Eric Christopher610fe112015-08-26 08:21:55 +00003687 if (Feature == "+aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00003688 HasAES = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003689 } else if (Feature == "+pclmul") {
Craig Topper3f122a72012-05-31 05:18:48 +00003690 HasPCLMUL = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003691 } else if (Feature == "+lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00003692 HasLZCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003693 } else if (Feature == "+rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00003694 HasRDRND = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003695 } else if (Feature == "+fsgsbase") {
Craig Topper8c7f2512014-11-03 06:51:41 +00003696 HasFSGSBASE = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003697 } else if (Feature == "+bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00003698 HasBMI = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003699 } else if (Feature == "+bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00003700 HasBMI2 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003701 } else if (Feature == "+popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00003702 HasPOPCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003703 } else if (Feature == "+rtm") {
Michael Liao625a8752012-11-10 05:17:46 +00003704 HasRTM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003705 } else if (Feature == "+prfchw") {
Michael Liao74f4eaf2013-03-26 17:52:08 +00003706 HasPRFCHW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003707 } else if (Feature == "+rdseed") {
Michael Liaoffaae352013-03-29 05:17:55 +00003708 HasRDSEED = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003709 } else if (Feature == "+adx") {
Robert Khasanov50e6f582014-09-19 09:53:48 +00003710 HasADX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003711 } else if (Feature == "+tbm") {
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003712 HasTBM = true;
Simon Pilgrim35113482017-05-08 12:09:45 +00003713 } else if (Feature == "+lwp") {
3714 HasLWP = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003715 } else if (Feature == "+fma") {
Craig Topperbba778b2012-06-03 21:46:30 +00003716 HasFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003717 } else if (Feature == "+f16c") {
Manman Rena45358c2012-10-11 00:59:55 +00003718 HasF16C = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003719 } else if (Feature == "+avx512cd") {
Craig Topper679b53a2013-08-21 05:29:10 +00003720 HasAVX512CD = true;
Oren Ben Simhon140c1fb2017-05-25 13:44:11 +00003721 } else if (Feature == "+avx512vpopcntdq") {
3722 HasAVX512VPOPCNTDQ = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003723 } else if (Feature == "+avx512er") {
Craig Topper679b53a2013-08-21 05:29:10 +00003724 HasAVX512ER = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003725 } else if (Feature == "+avx512pf") {
Craig Topper679b53a2013-08-21 05:29:10 +00003726 HasAVX512PF = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003727 } else if (Feature == "+avx512dq") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003728 HasAVX512DQ = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003729 } else if (Feature == "+avx512bw") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003730 HasAVX512BW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003731 } else if (Feature == "+avx512vl") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003732 HasAVX512VL = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003733 } else if (Feature == "+avx512vbmi") {
3734 HasAVX512VBMI = true;
3735 } else if (Feature == "+avx512ifma") {
3736 HasAVX512IFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003737 } else if (Feature == "+sha") {
Ben Langmuir58078d02013-09-19 13:22:04 +00003738 HasSHA = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003739 } else if (Feature == "+mpx") {
3740 HasMPX = true;
3741 } else if (Feature == "+movbe") {
3742 HasMOVBE = true;
3743 } else if (Feature == "+sgx") {
3744 HasSGX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003745 } else if (Feature == "+cx16") {
Nick Lewycky50e8f482013-10-05 20:14:27 +00003746 HasCX16 = true;
Craig Toppere33f51f2015-10-16 06:22:36 +00003747 } else if (Feature == "+fxsr") {
3748 HasFXSR = true;
Craig Topperda9fe562015-10-15 05:23:38 +00003749 } else if (Feature == "+xsave") {
3750 HasXSAVE = true;
3751 } else if (Feature == "+xsaveopt") {
3752 HasXSAVEOPT = true;
3753 } else if (Feature == "+xsavec") {
3754 HasXSAVEC = true;
3755 } else if (Feature == "+xsaves") {
3756 HasXSAVES = true;
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003757 } else if (Feature == "+mwaitx") {
3758 HasMWAITX = true;
Asaf Badouha9d1e182015-12-31 14:14:07 +00003759 } else if (Feature == "+pku") {
3760 HasPKU = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003761 } else if (Feature == "+clflushopt") {
3762 HasCLFLUSHOPT = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003763 } else if (Feature == "+clwb") {
3764 HasCLWB = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003765 } else if (Feature == "+prefetchwt1") {
3766 HasPREFETCHWT1 = true;
Craig Topper45742262017-02-09 06:10:14 +00003767 } else if (Feature == "+clzero") {
3768 HasCLZERO = true;
Nick Lewycky50e8f482013-10-05 20:14:27 +00003769 }
3770
Benjamin Kramer27402c62012-03-05 15:10:44 +00003771 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003772 .Case("+avx512f", AVX512F)
3773 .Case("+avx2", AVX2)
3774 .Case("+avx", AVX)
3775 .Case("+sse4.2", SSE42)
3776 .Case("+sse4.1", SSE41)
3777 .Case("+ssse3", SSSE3)
3778 .Case("+sse3", SSE3)
3779 .Case("+sse2", SSE2)
3780 .Case("+sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00003781 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003782 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003783
Eli Friedman33465822011-07-08 23:31:17 +00003784 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00003785 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003786 .Case("+3dnowa", AMD3DNowAthlon)
3787 .Case("+3dnow", AMD3DNow)
3788 .Case("+mmx", MMX)
Eli Friedman33465822011-07-08 23:31:17 +00003789 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00003790 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003791
3792 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003793 .Case("+xop", XOP)
3794 .Case("+fma4", FMA4)
3795 .Case("+sse4a", SSE4A)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003796 .Default(NoXOP);
3797 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003798 }
Eli Friedman33465822011-07-08 23:31:17 +00003799
Rafael Espindolaeb265472013-08-21 21:59:03 +00003800 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
3801 // matches the selected sse level.
Craig Topperd945d502015-10-20 00:00:17 +00003802 if ((FPMath == FP_SSE && SSELevel < SSE1) ||
3803 (FPMath == FP_387 && SSELevel >= SSE1)) {
3804 Diags.Report(diag::err_target_unsupported_fpmath) <<
3805 (FPMath == FP_SSE ? "sse" : "387");
Rafael Espindolaeb265472013-08-21 21:59:03 +00003806 return false;
3807 }
3808
Alexey Bataev00396512015-07-02 03:40:19 +00003809 SimdDefaultAlign =
Ahmed Bougacha68bf64e2015-08-27 22:24:56 +00003810 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Rafael Espindolaeb265472013-08-21 21:59:03 +00003811 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00003812}
Chris Lattnerecd49032009-03-02 22:27:17 +00003813
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003814/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
3815/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00003816void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003817 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00003818 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00003819 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003820 Builder.defineMacro("__amd64__");
3821 Builder.defineMacro("__amd64");
3822 Builder.defineMacro("__x86_64");
3823 Builder.defineMacro("__x86_64__");
Bob Wilsona2acb1e2014-08-08 23:46:28 +00003824 if (getTriple().getArchName() == "x86_64h") {
3825 Builder.defineMacro("__x86_64h");
3826 Builder.defineMacro("__x86_64h__");
3827 }
Chris Lattnerecd49032009-03-02 22:27:17 +00003828 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003829 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00003830 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003831
Chris Lattnerecd49032009-03-02 22:27:17 +00003832 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003833 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
3834 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00003835 switch (CPU) {
3836 case CK_Generic:
3837 break;
3838 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003839 // The rest are coming from the i386 define above.
3840 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003841 break;
3842 case CK_i486:
3843 case CK_WinChipC6:
3844 case CK_WinChip2:
3845 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003846 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00003847 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003848 case CK_PentiumMMX:
3849 Builder.defineMacro("__pentium_mmx__");
3850 Builder.defineMacro("__tune_pentium_mmx__");
3851 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003852 case CK_i586:
3853 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003854 defineCPUMacros(Builder, "i586");
3855 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00003856 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003857 case CK_Pentium3:
3858 case CK_Pentium3M:
3859 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003860 Builder.defineMacro("__tune_pentium3__");
3861 // Fallthrough
3862 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00003863 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003864 Builder.defineMacro("__tune_pentium2__");
3865 // Fallthrough
3866 case CK_PentiumPro:
3867 Builder.defineMacro("__tune_i686__");
3868 Builder.defineMacro("__tune_pentiumpro__");
3869 // Fallthrough
3870 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003871 Builder.defineMacro("__i686");
3872 Builder.defineMacro("__i686__");
3873 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
3874 Builder.defineMacro("__pentiumpro");
3875 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003876 break;
3877 case CK_Pentium4:
3878 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003879 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00003880 break;
3881 case CK_Yonah:
3882 case CK_Prescott:
3883 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003884 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00003885 break;
3886 case CK_Core2:
3887 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003888 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00003889 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003890 case CK_Bonnell:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003891 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00003892 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00003893 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00003894 defineCPUMacros(Builder, "slm");
3895 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003896 case CK_Nehalem:
3897 case CK_Westmere:
3898 case CK_SandyBridge:
3899 case CK_IvyBridge:
3900 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00003901 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003902 case CK_SkylakeClient:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003903 // FIXME: Historically, we defined this legacy name, it would be nice to
3904 // remove it at some point. We've never exposed fine-grained names for
3905 // recent primary x86 CPUs, and we should keep it that way.
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003906 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00003907 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003908 case CK_SkylakeServer:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003909 defineCPUMacros(Builder, "skx");
3910 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003911 case CK_Cannonlake:
3912 break;
Craig Topper449314e2013-08-20 07:09:39 +00003913 case CK_KNL:
3914 defineCPUMacros(Builder, "knl");
3915 break;
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003916 case CK_Lakemont:
3917 Builder.defineMacro("__tune_lakemont__");
3918 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003919 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003920 Builder.defineMacro("__k6_2__");
3921 Builder.defineMacro("__tune_k6_2__");
3922 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003923 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003924 if (CPU != CK_K6_2) { // In case of fallthrough
3925 // FIXME: GCC may be enabling these in cases where some other k6
3926 // architecture is specified but -m3dnow is explicitly provided. The
3927 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003928 Builder.defineMacro("__k6_3__");
3929 Builder.defineMacro("__tune_k6_3__");
3930 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003931 // Fallthrough
3932 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003933 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00003934 break;
3935 case CK_Athlon:
3936 case CK_AthlonThunderbird:
3937 case CK_Athlon4:
3938 case CK_AthlonXP:
3939 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003940 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003941 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003942 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003943 Builder.defineMacro("__tune_athlon_sse__");
3944 }
Chandler Carruth212334f2011-09-28 08:55:37 +00003945 break;
3946 case CK_K8:
3947 case CK_K8SSE3:
3948 case CK_x86_64:
3949 case CK_Opteron:
3950 case CK_OpteronSSE3:
3951 case CK_Athlon64:
3952 case CK_Athlon64SSE3:
3953 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003954 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00003955 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00003956 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003957 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00003958 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00003959 case CK_BTVER1:
3960 defineCPUMacros(Builder, "btver1");
3961 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003962 case CK_BTVER2:
3963 defineCPUMacros(Builder, "btver2");
3964 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003965 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003966 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003967 break;
3968 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003969 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003970 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003971 case CK_BDVER3:
3972 defineCPUMacros(Builder, "bdver3");
3973 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003974 case CK_BDVER4:
3975 defineCPUMacros(Builder, "bdver4");
3976 break;
Craig Topperc45744a2017-01-10 06:02:12 +00003977 case CK_ZNVER1:
3978 defineCPUMacros(Builder, "znver1");
3979 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003980 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003981 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00003982 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003983 }
Chris Lattner96e43572009-03-02 22:40:39 +00003984
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003985 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003986 Builder.defineMacro("__REGISTER_PREFIX__", "");
3987
Chris Lattner6df41af2009-04-19 17:32:33 +00003988 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
3989 // functions in glibc header files that use FP Stack inline asm which the
3990 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003991 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003992
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003993 if (HasAES)
3994 Builder.defineMacro("__AES__");
3995
Craig Topper3f122a72012-05-31 05:18:48 +00003996 if (HasPCLMUL)
3997 Builder.defineMacro("__PCLMUL__");
3998
Craig Topper22967d42011-12-25 05:06:45 +00003999 if (HasLZCNT)
4000 Builder.defineMacro("__LZCNT__");
4001
Benjamin Kramer1e250392012-07-07 09:39:18 +00004002 if (HasRDRND)
4003 Builder.defineMacro("__RDRND__");
4004
Craig Topper8c7f2512014-11-03 06:51:41 +00004005 if (HasFSGSBASE)
4006 Builder.defineMacro("__FSGSBASE__");
4007
Craig Topper22967d42011-12-25 05:06:45 +00004008 if (HasBMI)
4009 Builder.defineMacro("__BMI__");
4010
4011 if (HasBMI2)
4012 Builder.defineMacro("__BMI2__");
4013
Craig Topper1de83482011-12-29 16:10:46 +00004014 if (HasPOPCNT)
4015 Builder.defineMacro("__POPCNT__");
4016
Michael Liao625a8752012-11-10 05:17:46 +00004017 if (HasRTM)
4018 Builder.defineMacro("__RTM__");
4019
Michael Liao74f4eaf2013-03-26 17:52:08 +00004020 if (HasPRFCHW)
4021 Builder.defineMacro("__PRFCHW__");
4022
Michael Liaoffaae352013-03-29 05:17:55 +00004023 if (HasRDSEED)
4024 Builder.defineMacro("__RDSEED__");
4025
Robert Khasanov50e6f582014-09-19 09:53:48 +00004026 if (HasADX)
4027 Builder.defineMacro("__ADX__");
4028
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00004029 if (HasTBM)
4030 Builder.defineMacro("__TBM__");
4031
Simon Pilgrim35113482017-05-08 12:09:45 +00004032 if (HasLWP)
4033 Builder.defineMacro("__LWP__");
4034
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00004035 if (HasMWAITX)
4036 Builder.defineMacro("__MWAITX__");
4037
Rafael Espindolae62e2792013-08-20 13:44:29 +00004038 switch (XOPLevel) {
4039 case XOP:
4040 Builder.defineMacro("__XOP__");
Galina Kistanova078b3012017-05-23 16:33:07 +00004041 LLVM_FALLTHROUGH;
Rafael Espindolae62e2792013-08-20 13:44:29 +00004042 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00004043 Builder.defineMacro("__FMA4__");
Galina Kistanova078b3012017-05-23 16:33:07 +00004044 LLVM_FALLTHROUGH;
Rafael Espindolae62e2792013-08-20 13:44:29 +00004045 case SSE4A:
4046 Builder.defineMacro("__SSE4A__");
Galina Kistanova078b3012017-05-23 16:33:07 +00004047 LLVM_FALLTHROUGH;
Rafael Espindolae62e2792013-08-20 13:44:29 +00004048 case NoXOP:
4049 break;
4050 }
Craig Topperffdb46c2011-12-30 07:33:42 +00004051
Craig Topperbba778b2012-06-03 21:46:30 +00004052 if (HasFMA)
4053 Builder.defineMacro("__FMA__");
4054
Manman Rena45358c2012-10-11 00:59:55 +00004055 if (HasF16C)
4056 Builder.defineMacro("__F16C__");
4057
Craig Topper679b53a2013-08-21 05:29:10 +00004058 if (HasAVX512CD)
4059 Builder.defineMacro("__AVX512CD__");
Oren Ben Simhon140c1fb2017-05-25 13:44:11 +00004060 if (HasAVX512VPOPCNTDQ)
4061 Builder.defineMacro("__AVX512VPOPCNTDQ__");
Craig Topper679b53a2013-08-21 05:29:10 +00004062 if (HasAVX512ER)
4063 Builder.defineMacro("__AVX512ER__");
4064 if (HasAVX512PF)
4065 Builder.defineMacro("__AVX512PF__");
Robert Khasanov3b6616c2014-07-30 13:53:40 +00004066 if (HasAVX512DQ)
4067 Builder.defineMacro("__AVX512DQ__");
4068 if (HasAVX512BW)
4069 Builder.defineMacro("__AVX512BW__");
4070 if (HasAVX512VL)
4071 Builder.defineMacro("__AVX512VL__");
Craig Topperb4f83a02016-02-29 06:51:38 +00004072 if (HasAVX512VBMI)
4073 Builder.defineMacro("__AVX512VBMI__");
4074 if (HasAVX512IFMA)
4075 Builder.defineMacro("__AVX512IFMA__");
Craig Topper679b53a2013-08-21 05:29:10 +00004076
Ben Langmuir58078d02013-09-19 13:22:04 +00004077 if (HasSHA)
4078 Builder.defineMacro("__SHA__");
4079
Craig Toppere33f51f2015-10-16 06:22:36 +00004080 if (HasFXSR)
4081 Builder.defineMacro("__FXSR__");
Craig Topperda9fe562015-10-15 05:23:38 +00004082 if (HasXSAVE)
4083 Builder.defineMacro("__XSAVE__");
4084 if (HasXSAVEOPT)
4085 Builder.defineMacro("__XSAVEOPT__");
4086 if (HasXSAVEC)
4087 Builder.defineMacro("__XSAVEC__");
4088 if (HasXSAVES)
4089 Builder.defineMacro("__XSAVES__");
Asaf Badouha9d1e182015-12-31 14:14:07 +00004090 if (HasPKU)
4091 Builder.defineMacro("__PKU__");
Nick Lewycky50e8f482013-10-05 20:14:27 +00004092 if (HasCX16)
4093 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
Craig Topper78b47872017-02-08 06:48:58 +00004094 if (HasCLFLUSHOPT)
4095 Builder.defineMacro("__CLFLUSHOPT__");
Craig Topper8c708cf2017-02-08 07:36:58 +00004096 if (HasCLWB)
4097 Builder.defineMacro("__CLWB__");
Craig Topperb16cb822017-02-08 07:56:42 +00004098 if (HasMPX)
4099 Builder.defineMacro("__MPX__");
Craig Topper204ecff2017-02-08 08:23:17 +00004100 if (HasSGX)
4101 Builder.defineMacro("__SGX__");
Craig Topperd2bf7b02017-02-08 08:23:40 +00004102 if (HasPREFETCHWT1)
4103 Builder.defineMacro("__PREFETCHWT1__");
Craig Topper45742262017-02-09 06:10:14 +00004104 if (HasCLZERO)
4105 Builder.defineMacro("__CLZERO__");
Nick Lewycky50e8f482013-10-05 20:14:27 +00004106
Chris Lattner96e43572009-03-02 22:40:39 +00004107 // Each case falls through to the previous one here.
4108 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00004109 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00004110 Builder.defineMacro("__AVX512F__");
Galina Kistanova078b3012017-05-23 16:33:07 +00004111 LLVM_FALLTHROUGH;
Craig Topper23b92192012-01-09 09:19:09 +00004112 case AVX2:
4113 Builder.defineMacro("__AVX2__");
Galina Kistanova078b3012017-05-23 16:33:07 +00004114 LLVM_FALLTHROUGH;
Craig Topper23b92192012-01-09 09:19:09 +00004115 case AVX:
4116 Builder.defineMacro("__AVX__");
Galina Kistanova078b3012017-05-23 16:33:07 +00004117 LLVM_FALLTHROUGH;
Chris Lattner96e43572009-03-02 22:40:39 +00004118 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004119 Builder.defineMacro("__SSE4_2__");
Galina Kistanova078b3012017-05-23 16:33:07 +00004120 LLVM_FALLTHROUGH;
Chris Lattner96e43572009-03-02 22:40:39 +00004121 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004122 Builder.defineMacro("__SSE4_1__");
Galina Kistanova078b3012017-05-23 16:33:07 +00004123 LLVM_FALLTHROUGH;
Chris Lattner96e43572009-03-02 22:40:39 +00004124 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004125 Builder.defineMacro("__SSSE3__");
Galina Kistanova078b3012017-05-23 16:33:07 +00004126 LLVM_FALLTHROUGH;
Chris Lattner96e43572009-03-02 22:40:39 +00004127 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004128 Builder.defineMacro("__SSE3__");
Galina Kistanova078b3012017-05-23 16:33:07 +00004129 LLVM_FALLTHROUGH;
Chris Lattner96e43572009-03-02 22:40:39 +00004130 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004131 Builder.defineMacro("__SSE2__");
4132 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Galina Kistanova078b3012017-05-23 16:33:07 +00004133 LLVM_FALLTHROUGH;
Chris Lattner96e43572009-03-02 22:40:39 +00004134 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004135 Builder.defineMacro("__SSE__");
4136 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Galina Kistanova078b3012017-05-23 16:33:07 +00004137 LLVM_FALLTHROUGH;
Eli Friedman33465822011-07-08 23:31:17 +00004138 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00004139 break;
4140 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004141
Derek Schuffc7dd7222012-10-11 15:52:22 +00004142 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004143 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00004144 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00004145 case AVX2:
4146 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004147 case SSE42:
4148 case SSE41:
4149 case SSSE3:
4150 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004151 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004152 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004153 break;
4154 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004155 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004156 break;
4157 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004158 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004159 }
4160 }
4161
Anders Carlssone437c682010-01-27 03:47:49 +00004162 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00004163 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00004164 case AMD3DNowAthlon:
4165 Builder.defineMacro("__3dNOW_A__");
Galina Kistanova078b3012017-05-23 16:33:07 +00004166 LLVM_FALLTHROUGH;
Anders Carlssone437c682010-01-27 03:47:49 +00004167 case AMD3DNow:
4168 Builder.defineMacro("__3dNOW__");
Galina Kistanova078b3012017-05-23 16:33:07 +00004169 LLVM_FALLTHROUGH;
Eli Friedman33465822011-07-08 23:31:17 +00004170 case MMX:
4171 Builder.defineMacro("__MMX__");
Galina Kistanova078b3012017-05-23 16:33:07 +00004172 LLVM_FALLTHROUGH;
Eli Friedman33465822011-07-08 23:31:17 +00004173 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00004174 break;
4175 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00004176
4177 if (CPU >= CK_i486) {
4178 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
4179 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
4180 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
4181 }
4182 if (CPU >= CK_i586)
4183 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Reid Klecknera40b38a2017-05-26 17:48:01 +00004184
4185 if (HasFloat128)
4186 Builder.defineMacro("__SIZEOF_FLOAT128__", "16");
Chris Lattnerecd49032009-03-02 22:27:17 +00004187}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004188
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004189bool X86TargetInfo::hasFeature(StringRef Feature) const {
4190 return llvm::StringSwitch<bool>(Feature)
4191 .Case("aes", HasAES)
4192 .Case("avx", SSELevel >= AVX)
4193 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00004194 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00004195 .Case("avx512cd", HasAVX512CD)
Oren Ben Simhon140c1fb2017-05-25 13:44:11 +00004196 .Case("avx512vpopcntdq", HasAVX512VPOPCNTDQ)
Craig Topper679b53a2013-08-21 05:29:10 +00004197 .Case("avx512er", HasAVX512ER)
4198 .Case("avx512pf", HasAVX512PF)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00004199 .Case("avx512dq", HasAVX512DQ)
4200 .Case("avx512bw", HasAVX512BW)
4201 .Case("avx512vl", HasAVX512VL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00004202 .Case("avx512vbmi", HasAVX512VBMI)
4203 .Case("avx512ifma", HasAVX512IFMA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004204 .Case("bmi", HasBMI)
4205 .Case("bmi2", HasBMI2)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00004206 .Case("clflushopt", HasCLFLUSHOPT)
4207 .Case("clwb", HasCLWB)
Craig Topper45742262017-02-09 06:10:14 +00004208 .Case("clzero", HasCLZERO)
Nick Lewycky50e8f482013-10-05 20:14:27 +00004209 .Case("cx16", HasCX16)
4210 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00004211 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00004212 .Case("fma4", XOPLevel >= FMA4)
Craig Topper8c7f2512014-11-03 06:51:41 +00004213 .Case("fsgsbase", HasFSGSBASE)
Craig Toppere33f51f2015-10-16 06:22:36 +00004214 .Case("fxsr", HasFXSR)
Craig Topper8dbc5842014-11-03 07:05:26 +00004215 .Case("lzcnt", HasLZCNT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004216 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
4217 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
4218 .Case("mmx", MMX3DNowLevel >= MMX)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00004219 .Case("movbe", HasMOVBE)
4220 .Case("mpx", HasMPX)
Craig Topper3f122a72012-05-31 05:18:48 +00004221 .Case("pclmul", HasPCLMUL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00004222 .Case("pku", HasPKU)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004223 .Case("popcnt", HasPOPCNT)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00004224 .Case("prefetchwt1", HasPREFETCHWT1)
Michael Liao74f4eaf2013-03-26 17:52:08 +00004225 .Case("prfchw", HasPRFCHW)
Craig Topper8dbc5842014-11-03 07:05:26 +00004226 .Case("rdrnd", HasRDRND)
Michael Liaoffaae352013-03-29 05:17:55 +00004227 .Case("rdseed", HasRDSEED)
Craig Topper8dbc5842014-11-03 07:05:26 +00004228 .Case("rtm", HasRTM)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00004229 .Case("sgx", HasSGX)
Ben Langmuir58078d02013-09-19 13:22:04 +00004230 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004231 .Case("sse", SSELevel >= SSE1)
4232 .Case("sse2", SSELevel >= SSE2)
4233 .Case("sse3", SSELevel >= SSE3)
4234 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00004235 .Case("sse4.1", SSELevel >= SSE41)
4236 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00004237 .Case("sse4a", XOPLevel >= SSE4A)
Craig Topper8dbc5842014-11-03 07:05:26 +00004238 .Case("tbm", HasTBM)
Simon Pilgrim35113482017-05-08 12:09:45 +00004239 .Case("lwp", HasLWP)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004240 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00004241 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
4242 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00004243 .Case("xop", XOPLevel >= XOP)
Craig Topperda9fe562015-10-15 05:23:38 +00004244 .Case("xsave", HasXSAVE)
4245 .Case("xsavec", HasXSAVEC)
4246 .Case("xsaves", HasXSAVES)
4247 .Case("xsaveopt", HasXSAVEOPT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004248 .Default(false);
4249}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004250
Eric Christopherd9832702015-06-29 21:00:05 +00004251// We can't use a generic validation scheme for the features accepted here
4252// versus subtarget features accepted in the target attribute because the
4253// bitfield structure that's initialized in the runtime only supports the
4254// below currently rather than the full range of subtarget features. (See
4255// X86TargetInfo::hasFeature for a somewhat comprehensive list).
4256bool X86TargetInfo::validateCpuSupports(StringRef FeatureStr) const {
4257 return llvm::StringSwitch<bool>(FeatureStr)
4258 .Case("cmov", true)
4259 .Case("mmx", true)
4260 .Case("popcnt", true)
4261 .Case("sse", true)
4262 .Case("sse2", true)
4263 .Case("sse3", true)
Benjamin Kramerf4c520d2016-05-20 15:21:08 +00004264 .Case("ssse3", true)
Eric Christopherd9832702015-06-29 21:00:05 +00004265 .Case("sse4.1", true)
4266 .Case("sse4.2", true)
4267 .Case("avx", true)
4268 .Case("avx2", true)
4269 .Case("sse4a", true)
4270 .Case("fma4", true)
4271 .Case("xop", true)
4272 .Case("fma", true)
4273 .Case("avx512f", true)
4274 .Case("bmi", true)
4275 .Case("bmi2", true)
Benjamin Kramerf4c520d2016-05-20 15:21:08 +00004276 .Case("aes", true)
4277 .Case("pclmul", true)
4278 .Case("avx512vl", true)
4279 .Case("avx512bw", true)
4280 .Case("avx512dq", true)
4281 .Case("avx512cd", true)
Oren Ben Simhon140c1fb2017-05-25 13:44:11 +00004282 .Case("avx512vpopcntdq", true)
Benjamin Kramerf4c520d2016-05-20 15:21:08 +00004283 .Case("avx512er", true)
4284 .Case("avx512pf", true)
4285 .Case("avx512vbmi", true)
4286 .Case("avx512ifma", true)
Eric Christopherd9832702015-06-29 21:00:05 +00004287 .Default(false);
4288}
4289
Eli Friedman3fd920a2008-08-20 02:34:37 +00004290bool
Anders Carlsson58436352009-02-28 17:11:49 +00004291X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00004292 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00004293 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004294 default: return false;
Alexey Bataev91e58602015-07-20 12:08:00 +00004295 // Constant constraints.
4296 case 'e': // 32-bit signed integer constant for use with sign-extending x86_64
4297 // instructions.
4298 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
4299 // x86_64 instructions.
4300 case 's':
4301 Info.setRequiresImmediate();
4302 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00004303 case 'I':
4304 Info.setRequiresImmediate(0, 31);
4305 return true;
4306 case 'J':
4307 Info.setRequiresImmediate(0, 63);
4308 return true;
4309 case 'K':
4310 Info.setRequiresImmediate(-128, 127);
4311 return true;
4312 case 'L':
Alexey Bataev91e58602015-07-20 12:08:00 +00004313 Info.setRequiresImmediate({ int(0xff), int(0xffff), int(0xffffffff) });
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00004314 return true;
4315 case 'M':
4316 Info.setRequiresImmediate(0, 3);
4317 return true;
4318 case 'N':
4319 Info.setRequiresImmediate(0, 255);
4320 return true;
4321 case 'O':
4322 Info.setRequiresImmediate(0, 127);
4323 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00004324 // Register constraints.
4325 case 'Y': // 'Y' is the first character for several 2-character constraints.
4326 // Shift the pointer to the second character of the constraint.
4327 Name++;
4328 switch (*Name) {
4329 default:
4330 return false;
4331 case '0': // First SSE register.
4332 case 't': // Any SSE register, when SSE2 is enabled.
4333 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
4334 case 'm': // Any MMX register, when inter-unit moves enabled.
Michael Zuckerman849a6a52016-10-31 17:23:52 +00004335 case 'k': // AVX512 arch mask registers: k1-k7.
Alexey Bataev91e58602015-07-20 12:08:00 +00004336 Info.setAllowsRegister();
4337 return true;
4338 }
4339 case 'f': // Any x87 floating point stack register.
Akira Hatanaka88ef7282014-07-18 23:30:30 +00004340 // Constraint 'f' cannot be used for output operands.
4341 if (Info.ConstraintStr[0] == '=')
4342 return false;
Akira Hatanaka88ef7282014-07-18 23:30:30 +00004343 Info.setAllowsRegister();
4344 return true;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004345 case 'a': // eax.
4346 case 'b': // ebx.
4347 case 'c': // ecx.
4348 case 'd': // edx.
4349 case 'S': // esi.
4350 case 'D': // edi.
4351 case 'A': // edx:eax.
Alexey Bataev91e58602015-07-20 12:08:00 +00004352 case 't': // Top of floating point stack.
4353 case 'u': // Second from top of floating point stack.
Eli Friedman3fd920a2008-08-20 02:34:37 +00004354 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00004355 case 'y': // Any MMX register.
Michael Zuckerman62f516f2016-11-01 13:16:44 +00004356 case 'v': // Any {X,Y,Z}MM register (Arch & context dependent)
Anders Carlsson5f7ee682008-10-06 19:17:39 +00004357 case 'x': // Any SSE register.
Michael Zuckerman849a6a52016-10-31 17:23:52 +00004358 case 'k': // Any AVX512 mask register (same as Yk, additionaly allows k0
4359 // for intermideate k reg operations).
Eli Friedman3fd920a2008-08-20 02:34:37 +00004360 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00004361 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
4362 case 'l': // "Index" registers: any general register that can be used as an
4363 // index in a base+index memory access.
4364 Info.setAllowsRegister();
4365 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00004366 // Floating point constant constraints.
Dale Johannesen46742a42010-08-24 22:33:12 +00004367 case 'C': // SSE floating point constant.
4368 case 'G': // x87 floating point constant.
Eli Friedman3fd920a2008-08-20 02:34:37 +00004369 return true;
4370 }
4371}
4372
Akira Hatanaka974131e2014-09-18 18:17:18 +00004373bool X86TargetInfo::validateOutputSize(StringRef Constraint,
4374 unsigned Size) const {
4375 // Strip off constraint modifiers.
4376 while (Constraint[0] == '=' ||
4377 Constraint[0] == '+' ||
4378 Constraint[0] == '&')
4379 Constraint = Constraint.substr(1);
4380
4381 return validateOperandSize(Constraint, Size);
4382}
4383
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004384bool X86TargetInfo::validateInputSize(StringRef Constraint,
4385 unsigned Size) const {
Akira Hatanaka974131e2014-09-18 18:17:18 +00004386 return validateOperandSize(Constraint, Size);
4387}
4388
4389bool X86TargetInfo::validateOperandSize(StringRef Constraint,
4390 unsigned Size) const {
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004391 switch (Constraint[0]) {
4392 default: break;
Michael Zuckerman849a6a52016-10-31 17:23:52 +00004393 case 'k':
4394 // Registers k0-k7 (AVX512) size limit is 64 bit.
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004395 case 'y':
4396 return Size <= 64;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004397 case 'f':
4398 case 't':
4399 case 'u':
4400 return Size <= 128;
Michael Zuckerman62f516f2016-11-01 13:16:44 +00004401 case 'v':
Hans Wennborg3c619a42014-09-18 20:24:04 +00004402 case 'x':
Alexey Bataev91e58602015-07-20 12:08:00 +00004403 if (SSELevel >= AVX512F)
4404 // 512-bit zmm registers can be used if target supports AVX512F.
4405 return Size <= 512U;
4406 else if (SSELevel >= AVX)
4407 // 256-bit ymm registers can be used if target supports AVX.
4408 return Size <= 256U;
4409 return Size <= 128U;
4410 case 'Y':
4411 // 'Y' is the first character for several 2-character constraints.
4412 switch (Constraint[1]) {
4413 default: break;
4414 case 'm':
4415 // 'Ym' is synonymous with 'y'.
Michael Zuckerman849a6a52016-10-31 17:23:52 +00004416 case 'k':
Alexey Bataev91e58602015-07-20 12:08:00 +00004417 return Size <= 64;
4418 case 'i':
4419 case 't':
4420 // 'Yi' and 'Yt' are synonymous with 'x' when SSE2 is enabled.
4421 if (SSELevel >= AVX512F)
4422 return Size <= 512U;
4423 else if (SSELevel >= AVX)
4424 return Size <= 256U;
4425 return SSELevel >= SSE2 && Size <= 128U;
4426 }
4427
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004428 }
4429
4430 return true;
4431}
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00004432
Eli Friedman3fd920a2008-08-20 02:34:37 +00004433std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004434X86TargetInfo::convertConstraint(const char *&Constraint) const {
4435 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004436 case 'a': return std::string("{ax}");
4437 case 'b': return std::string("{bx}");
4438 case 'c': return std::string("{cx}");
4439 case 'd': return std::string("{dx}");
4440 case 'S': return std::string("{si}");
4441 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00004442 case 'p': // address
4443 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00004444 case 't': // top of floating point stack.
4445 return std::string("{st}");
4446 case 'u': // second from top of floating point stack.
4447 return std::string("{st(1)}"); // second from top of floating point stack.
Michael Zuckerman849a6a52016-10-31 17:23:52 +00004448 case 'Y':
4449 switch (Constraint[1]) {
4450 default:
4451 // Break from inner switch and fall through (copy single char),
4452 // continue parsing after copying the current constraint into
4453 // the return string.
4454 break;
4455 case 'k':
4456 // "^" hints llvm that this is a 2 letter constraint.
4457 // "Constraint++" is used to promote the string iterator
4458 // to the next constraint.
4459 return std::string("^") + std::string(Constraint++, 2);
4460 }
4461 LLVM_FALLTHROUGH;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004462 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004463 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00004464 }
4465}
Chris Lattner5ba61f02006-10-14 07:39:34 +00004466
Eli Friedman3fd920a2008-08-20 02:34:37 +00004467// X86-32 generic target
4468class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00004469public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004470 X86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4471 : X86TargetInfo(Triple, Opts) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004472 DoubleAlign = LongLongAlign = 32;
4473 LongDoubleWidth = 96;
4474 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00004475 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00004476 resetDataLayout("e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128");
Eli Friedman32ca82a2009-03-29 20:31:09 +00004477 SizeType = UnsignedInt;
4478 PtrDiffType = SignedInt;
4479 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00004480 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00004481
4482 // Use fpret for all types.
4483 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
4484 (1 << TargetInfo::Double) |
4485 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004486
4487 // x86-32 has atomics up to 8 bytes
4488 // FIXME: Check that we actually have cmpxchg8b before setting
4489 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
4490 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004491 }
Craig Topper3164f332014-03-11 03:39:26 +00004492 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004493 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004494 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004495
Craig Topper3164f332014-03-11 03:39:26 +00004496 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00004497 if (RegNo == 0) return 0;
4498 if (RegNo == 1) return 2;
4499 return -1;
4500 }
Akira Hatanaka974131e2014-09-18 18:17:18 +00004501 bool validateOperandSize(StringRef Constraint,
4502 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00004503 switch (Constraint[0]) {
4504 default: break;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004505 case 'R':
4506 case 'q':
4507 case 'Q':
Bill Wendling887b4852012-11-12 06:42:51 +00004508 case 'a':
4509 case 'b':
4510 case 'c':
4511 case 'd':
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004512 case 'S':
4513 case 'D':
Bill Wendling3c7fed82012-11-12 18:52:32 +00004514 return Size <= 32;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004515 case 'A':
4516 return Size <= 64;
Bill Wendling887b4852012-11-12 06:42:51 +00004517 }
4518
Akira Hatanaka974131e2014-09-18 18:17:18 +00004519 return X86TargetInfo::validateOperandSize(Constraint, Size);
Bill Wendling887b4852012-11-12 06:42:51 +00004520 }
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00004521 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
4522 return llvm::makeArrayRef(BuiltinInfoX86, clang::X86::LastX86CommonBuiltin -
4523 Builtin::FirstTSBuiltin + 1);
4524 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004525};
Eli Friedman3fd920a2008-08-20 02:34:37 +00004526
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004527class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
4528public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004529 NetBSDI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4530 : NetBSDTargetInfo<X86_32TargetInfo>(Triple, Opts) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004531
Craig Topper3164f332014-03-11 03:39:26 +00004532 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00004533 unsigned Major, Minor, Micro;
4534 getTriple().getOSVersion(Major, Minor, Micro);
4535 // New NetBSD uses the default rounding mode.
4536 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
4537 return X86_32TargetInfo::getFloatEvalMethod();
4538 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004539 return 1;
4540 }
4541};
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004542
Eli Friedmane3aa4542009-07-05 18:47:56 +00004543class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
4544public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004545 OpenBSDI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4546 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00004547 SizeType = UnsignedLong;
4548 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004549 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00004550 }
4551};
Eli Friedmane3aa4542009-07-05 18:47:56 +00004552
Eli Friedman9fa28852012-08-08 23:57:20 +00004553class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
4554public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004555 BitrigI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4556 : BitrigTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman9fa28852012-08-08 23:57:20 +00004557 SizeType = UnsignedLong;
4558 IntPtrType = SignedLong;
4559 PtrDiffType = SignedLong;
4560 }
4561};
Eli Friedman9fa28852012-08-08 23:57:20 +00004562
Torok Edwinb2b37c62009-06-30 17:10:35 +00004563class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004564public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004565 DarwinI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4566 : DarwinTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004567 LongDoubleWidth = 128;
4568 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004569 SuitableAlign = 128;
Tim Northover5627d392015-10-30 16:30:45 +00004570 MaxVectorAlign = 256;
4571 // The watchOS simulator uses the builtin bool type for Objective-C.
4572 llvm::Triple T = llvm::Triple(Triple);
4573 if (T.isWatchOS())
4574 UseSignedCharForObjCBool = false;
Eli Friedman32ca82a2009-03-29 20:31:09 +00004575 SizeType = UnsignedLong;
4576 IntPtrType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00004577 resetDataLayout("e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128");
Daniel Dunbarbd606522010-05-27 00:35:16 +00004578 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00004579 }
4580
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004581 bool handleTargetFeatures(std::vector<std::string> &Features,
4582 DiagnosticsEngine &Diags) override {
4583 if (!DarwinTargetInfo<X86_32TargetInfo>::handleTargetFeatures(Features,
4584 Diags))
4585 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004586 // We now know the features we have: we can decide how to align vectors.
4587 MaxVectorAlign =
4588 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004589 return true;
4590 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004591};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004592
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004593// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004594class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004595public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004596 WindowsX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4597 : WindowsTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Chris Lattner46be2e12009-06-24 17:12:15 +00004598 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00004599 DoubleAlign = LongLongAlign = 64;
Reid Kleckner7510c092015-04-01 16:45:06 +00004600 bool IsWinCOFF =
4601 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
James Y Knightb214cbc2016-03-04 19:00:41 +00004602 resetDataLayout(IsWinCOFF
4603 ? "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
4604 : "e-m:e-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32");
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004605 }
Craig Topper3164f332014-03-11 03:39:26 +00004606 void getTargetDefines(const LangOptions &Opts,
4607 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004608 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
4609 }
4610};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004611
4612// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004613class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004614public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004615 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple,
4616 const TargetOptions &Opts)
4617 : WindowsX86_32TargetInfo(Triple, Opts) {
Eli Friedman015d6282011-03-22 21:25:11 +00004618 LongDoubleWidth = LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00004619 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004620 }
Craig Topper3164f332014-03-11 03:39:26 +00004621 void getTargetDefines(const LangOptions &Opts,
4622 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004623 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
4624 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
4625 // The value of the following reflects processor type.
4626 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
4627 // We lost the original triple, so we use the default.
4628 Builder.defineMacro("_M_IX86", "600");
4629 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004630};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004631
David Majnemerae1ed0e2015-05-28 04:36:18 +00004632static void addCygMingDefines(const LangOptions &Opts, MacroBuilder &Builder) {
Eric Christopherb093d692015-10-09 18:39:59 +00004633 // Mingw and cygwin define __declspec(a) to __attribute__((a)). Clang
4634 // supports __declspec natively under -fms-extensions, but we define a no-op
4635 // __declspec macro anyway for pre-processor compatibility.
Reid Kleckner47606832014-04-21 20:58:00 +00004636 if (Opts.MicrosoftExt)
4637 Builder.defineMacro("__declspec", "__declspec");
4638 else
4639 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
4640
4641 if (!Opts.MicrosoftExt) {
4642 // Provide macros for all the calling convention keywords. Provide both
4643 // single and double underscore prefixed variants. These are available on
4644 // x64 as well as x86, even though they have no effect.
4645 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
4646 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00004647 std::string GCCSpelling = "__attribute__((__";
4648 GCCSpelling += CC;
4649 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00004650 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
4651 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
4652 }
4653 }
4654}
4655
David Majnemerae1ed0e2015-05-28 04:36:18 +00004656static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
4657 Builder.defineMacro("__MSVCRT__");
4658 Builder.defineMacro("__MINGW32__");
4659 addCygMingDefines(Opts, Builder);
4660}
4661
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004662// x86-32 MinGW target
4663class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
4664public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004665 MinGWX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Reid Kleckner9eabbb62017-05-26 17:38:15 +00004666 : WindowsX86_32TargetInfo(Triple, Opts) {
4667 HasFloat128 = true;
4668 }
Craig Topper3164f332014-03-11 03:39:26 +00004669 void getTargetDefines(const LangOptions &Opts,
4670 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004671 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004672 DefineStd(Builder, "WIN32", Opts);
4673 DefineStd(Builder, "WINNT", Opts);
4674 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00004675 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004676 }
4677};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004678
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004679// x86-32 Cygwin target
4680class CygwinX86_32TargetInfo : public X86_32TargetInfo {
4681public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004682 CygwinX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4683 : X86_32TargetInfo(Triple, Opts) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004684 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004685 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00004686 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 +00004687 }
Craig Topper3164f332014-03-11 03:39:26 +00004688 void getTargetDefines(const LangOptions &Opts,
4689 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004690 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00004691 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004692 Builder.defineMacro("__CYGWIN__");
4693 Builder.defineMacro("__CYGWIN32__");
David Majnemerae1ed0e2015-05-28 04:36:18 +00004694 addCygMingDefines(Opts, Builder);
Saleem Abdulrasool56027092017-02-07 19:00:06 +00004695 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00004696 if (Opts.CPlusPlus)
4697 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00004698 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004699};
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004700
Chris Lattnerb986aba2010-04-11 19:29:39 +00004701// x86-32 Haiku target
Reid Kleckner330fb172016-05-11 16:19:05 +00004702class HaikuX86_32TargetInfo : public HaikuTargetInfo<X86_32TargetInfo> {
Chris Lattnerb986aba2010-04-11 19:29:39 +00004703public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004704 HaikuX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Reid Kleckner330fb172016-05-11 16:19:05 +00004705 : HaikuTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman04831922010-08-22 01:00:03 +00004706 }
Craig Topper3164f332014-03-11 03:39:26 +00004707 void getTargetDefines(const LangOptions &Opts,
4708 MacroBuilder &Builder) const override {
Reid Kleckner330fb172016-05-11 16:19:05 +00004709 HaikuTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
Chris Lattnerb986aba2010-04-11 19:29:39 +00004710 Builder.defineMacro("__INTEL__");
Chris Lattnerb986aba2010-04-11 19:29:39 +00004711 }
4712};
Chris Lattnerb986aba2010-04-11 19:29:39 +00004713
Alexey Bataevc99b0492015-11-25 09:24:26 +00004714// X86-32 MCU target
4715class MCUX86_32TargetInfo : public X86_32TargetInfo {
4716public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004717 MCUX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4718 : X86_32TargetInfo(Triple, Opts) {
Alexey Bataevc99b0492015-11-25 09:24:26 +00004719 LongDoubleWidth = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00004720 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
James Y Knightb214cbc2016-03-04 19:00:41 +00004721 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 +00004722 WIntType = UnsignedInt;
Alexey Bataevc99b0492015-11-25 09:24:26 +00004723 }
4724
4725 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
4726 // On MCU we support only C calling convention.
4727 return CC == CC_C ? CCCR_OK : CCCR_Warning;
4728 }
4729
4730 void getTargetDefines(const LangOptions &Opts,
4731 MacroBuilder &Builder) const override {
4732 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4733 Builder.defineMacro("__iamcu");
4734 Builder.defineMacro("__iamcu__");
4735 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00004736
4737 bool allowsLargerPreferedTypeAlignment() const override {
4738 return false;
4739 }
Alexey Bataevc99b0492015-11-25 09:24:26 +00004740};
4741
Douglas Gregor9fabd852011-07-01 22:41:14 +00004742// RTEMS Target
4743template<typename Target>
4744class RTEMSTargetInfo : public OSTargetInfo<Target> {
4745protected:
Craig Topper3164f332014-03-11 03:39:26 +00004746 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4747 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004748 // RTEMS defines; list based off of gcc output
4749
Douglas Gregor9fabd852011-07-01 22:41:14 +00004750 Builder.defineMacro("__rtems__");
4751 Builder.defineMacro("__ELF__");
4752 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004753
Douglas Gregor9fabd852011-07-01 22:41:14 +00004754public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004755 RTEMSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4756 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004757 switch (Triple.getArch()) {
4758 default:
4759 case llvm::Triple::x86:
4760 // this->MCountName = ".mcount";
4761 break;
4762 case llvm::Triple::mips:
4763 case llvm::Triple::mipsel:
4764 case llvm::Triple::ppc:
4765 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00004766 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004767 // this->MCountName = "_mcount";
4768 break;
4769 case llvm::Triple::arm:
4770 // this->MCountName = "__mcount";
4771 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004772 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004773 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00004774};
4775
Douglas Gregor9fabd852011-07-01 22:41:14 +00004776// x86-32 RTEMS target
4777class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
4778public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004779 RTEMSX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4780 : X86_32TargetInfo(Triple, Opts) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004781 SizeType = UnsignedLong;
4782 IntPtrType = SignedLong;
4783 PtrDiffType = SignedLong;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004784 }
Craig Topper3164f332014-03-11 03:39:26 +00004785 void getTargetDefines(const LangOptions &Opts,
4786 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004787 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4788 Builder.defineMacro("__INTEL__");
4789 Builder.defineMacro("__rtems__");
4790 }
4791};
Douglas Gregor9fabd852011-07-01 22:41:14 +00004792
Eli Friedman3fd920a2008-08-20 02:34:37 +00004793// x86-64 generic target
4794class X86_64TargetInfo : public X86TargetInfo {
4795public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004796 X86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4797 : X86TargetInfo(Triple, Opts) {
David Blaikie40f842d2014-07-10 18:46:15 +00004798 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
David Majnemer8fa8c382015-03-17 23:55:00 +00004799 bool IsWinCOFF =
4800 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Zinovy Nis1db95732014-07-10 15:27:19 +00004801 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00004802 LongDoubleWidth = 128;
4803 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00004804 LargeArrayMinWidth = 128;
4805 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004806 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00004807 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
4808 PtrDiffType = IsX32 ? SignedInt : SignedLong;
4809 IntPtrType = IsX32 ? SignedInt : SignedLong;
4810 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00004811 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00004812 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00004813
Eric Christopher917e9522014-11-18 22:36:15 +00004814 // Pointers are 32-bit in x32.
Eric Christopherf6ee1f32017-02-10 04:35:21 +00004815 resetDataLayout(IsX32
4816 ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128"
4817 : IsWinCOFF ? "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
4818 : "e-m:e-i64:64-f80:128-n8:16:32:64-S128");
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00004819
4820 // Use fpret only for long double.
4821 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004822
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00004823 // Use fp2ret for _Complex long double.
4824 ComplexLongDoubleUsesFP2Ret = true;
4825
Charles Davisc7d5c942015-09-17 20:55:33 +00004826 // Make __builtin_ms_va_list available.
4827 HasBuiltinMSVaList = true;
4828
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004829 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004830 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00004831 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00004832 }
Craig Topper3164f332014-03-11 03:39:26 +00004833 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004834 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00004835 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004836
Craig Topper3164f332014-03-11 03:39:26 +00004837 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00004838 if (RegNo == 0) return 0;
4839 if (RegNo == 1) return 1;
4840 return -1;
4841 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004842
Craig Topper3164f332014-03-11 03:39:26 +00004843 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00004844 switch (CC) {
4845 case CC_C:
4846 case CC_Swift:
4847 case CC_X86VectorCall:
4848 case CC_IntelOclBicc:
4849 case CC_X86_64Win64:
Roman Levenstein35aa5ce2016-03-16 18:00:46 +00004850 case CC_PreserveMost:
4851 case CC_PreserveAll:
Erich Keane757d3172016-11-02 18:29:35 +00004852 case CC_X86RegCall:
Pekka Jaaskelainenfc2629a2017-06-01 07:18:49 +00004853 case CC_OpenCLKernel:
John McCall477f2bb2016-03-03 06:39:32 +00004854 return CCCR_OK;
4855 default:
4856 return CCCR_Warning;
4857 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004858 }
4859
Craig Topper3164f332014-03-11 03:39:26 +00004860 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00004861 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004862 }
4863
Pavel Chupinfd223e12014-08-04 12:39:43 +00004864 // for x32 we need it here explicitly
4865 bool hasInt128Type() const override { return true; }
Reid Klecknerf27e7522016-02-01 18:58:24 +00004866 unsigned getUnwindWordWidth() const override { return 64; }
4867 unsigned getRegisterWidth() const override { return 64; }
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00004868
4869 bool validateGlobalRegisterVariable(StringRef RegName,
4870 unsigned RegSize,
4871 bool &HasSizeMismatch) const override {
4872 // rsp and rbp are the only 64-bit registers the x86 backend can currently
4873 // handle.
4874 if (RegName.equals("rsp") || RegName.equals("rbp")) {
4875 // Check that the register size is 64-bit.
4876 HasSizeMismatch = RegSize != 64;
4877 return true;
4878 }
4879
4880 // Check if the register is a 32-bit register the backend can handle.
4881 return X86TargetInfo::validateGlobalRegisterVariable(RegName, RegSize,
4882 HasSizeMismatch);
4883 }
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00004884 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
4885 return llvm::makeArrayRef(BuiltinInfoX86,
4886 X86::LastTSBuiltin - Builtin::FirstTSBuiltin);
4887 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004888};
Eli Friedman3fd920a2008-08-20 02:34:37 +00004889
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004890// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004891class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004892public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004893 WindowsX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4894 : WindowsTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004895 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00004896 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004897 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004898 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004899 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00004900 SizeType = UnsignedLongLong;
4901 PtrDiffType = SignedLongLong;
4902 IntPtrType = SignedLongLong;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004903 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004904
Craig Topper3164f332014-03-11 03:39:26 +00004905 void getTargetDefines(const LangOptions &Opts,
4906 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004907 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004908 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004909 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004910
Craig Topper3164f332014-03-11 03:39:26 +00004911 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004912 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00004913 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004914
Craig Topper3164f332014-03-11 03:39:26 +00004915 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004916 switch (CC) {
4917 case CC_X86StdCall:
4918 case CC_X86ThisCall:
4919 case CC_X86FastCall:
4920 return CCCR_Ignore;
4921 case CC_C:
4922 case CC_X86VectorCall:
4923 case CC_IntelOclBicc:
4924 case CC_X86_64SysV:
Arnold Schwaighofer4fc955e2016-10-12 18:59:24 +00004925 case CC_Swift:
Erich Keane757d3172016-11-02 18:29:35 +00004926 case CC_X86RegCall:
Pekka Jaaskelainenfc2629a2017-06-01 07:18:49 +00004927 case CC_OpenCLKernel:
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004928 return CCCR_OK;
4929 default:
4930 return CCCR_Warning;
4931 }
Charles Davisb5a214e2013-08-30 04:39:01 +00004932 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004933};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004934
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004935// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004936class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004937public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004938 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple,
4939 const TargetOptions &Opts)
4940 : WindowsX86_64TargetInfo(Triple, Opts) {
Eli Friedman015d6282011-03-22 21:25:11 +00004941 LongDoubleWidth = LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00004942 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004943 }
Craig Topper3164f332014-03-11 03:39:26 +00004944 void getTargetDefines(const LangOptions &Opts,
4945 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004946 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
4947 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
David Majnemerb856e8f2015-07-26 23:17:29 +00004948 Builder.defineMacro("_M_X64", "100");
4949 Builder.defineMacro("_M_AMD64", "100");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004950 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004951};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004952
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004953// x86-64 MinGW target
4954class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
4955public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004956 MinGWX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4957 : WindowsX86_64TargetInfo(Triple, Opts) {
Reid Kleckner11a17192015-10-28 22:29:52 +00004958 // Mingw64 rounds long double size and alignment up to 16 bytes, but sticks
4959 // with x86 FP ops. Weird.
4960 LongDoubleWidth = LongDoubleAlign = 128;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00004961 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended();
Reid Kleckner9eabbb62017-05-26 17:38:15 +00004962 HasFloat128 = true;
Reid Kleckner11a17192015-10-28 22:29:52 +00004963 }
4964
Craig Topper3164f332014-03-11 03:39:26 +00004965 void getTargetDefines(const LangOptions &Opts,
4966 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004967 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004968 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004969 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00004970 addMinGWDefines(Opts, Builder);
Reid Klecknere070b992014-11-14 02:01:10 +00004971
4972 // GCC defines this macro when it is using __gxx_personality_seh0.
4973 if (!Opts.SjLjExceptions)
4974 Builder.defineMacro("__SEH__");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004975 }
4976};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004977
Yaron Kerend030d112015-07-22 17:38:19 +00004978// x86-64 Cygwin target
4979class CygwinX86_64TargetInfo : public X86_64TargetInfo {
4980public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004981 CygwinX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4982 : X86_64TargetInfo(Triple, Opts) {
Yaron Kerend030d112015-07-22 17:38:19 +00004983 TLSSupported = false;
4984 WCharType = UnsignedShort;
4985 }
4986 void getTargetDefines(const LangOptions &Opts,
4987 MacroBuilder &Builder) const override {
4988 X86_64TargetInfo::getTargetDefines(Opts, Builder);
4989 Builder.defineMacro("__x86_64__");
4990 Builder.defineMacro("__CYGWIN__");
4991 Builder.defineMacro("__CYGWIN64__");
4992 addCygMingDefines(Opts, Builder);
Saleem Abdulrasool56027092017-02-07 19:00:06 +00004993 DefineStd(Builder, "unix", Opts);
Yaron Kerend030d112015-07-22 17:38:19 +00004994 if (Opts.CPlusPlus)
4995 Builder.defineMacro("_GNU_SOURCE");
4996
4997 // GCC defines this macro when it is using __gxx_personality_seh0.
4998 if (!Opts.SjLjExceptions)
4999 Builder.defineMacro("__SEH__");
5000 }
5001};
5002
Eli Friedman2857ccb2009-07-01 03:36:11 +00005003class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
5004public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005005 DarwinX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5006 : DarwinTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00005007 Int64Type = SignedLongLong;
Tim Northovera2ee4332014-03-29 15:09:45 +00005008 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
5009 llvm::Triple T = llvm::Triple(Triple);
Bob Wilson946c04c2014-10-19 02:19:27 +00005010 if (T.isiOS())
Tim Northovera2ee4332014-03-29 15:09:45 +00005011 UseSignedCharForObjCBool = false;
James Y Knightb214cbc2016-03-04 19:00:41 +00005012 resetDataLayout("e-m:o-i64:64-f80:128-n8:16:32:64-S128");
Eli Friedman2857ccb2009-07-01 03:36:11 +00005013 }
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00005014
5015 bool handleTargetFeatures(std::vector<std::string> &Features,
5016 DiagnosticsEngine &Diags) override {
5017 if (!DarwinTargetInfo<X86_64TargetInfo>::handleTargetFeatures(Features,
5018 Diags))
5019 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00005020 // We now know the features we have: we can decide how to align vectors.
5021 MaxVectorAlign =
5022 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00005023 return true;
5024 }
Eli Friedman2857ccb2009-07-01 03:36:11 +00005025};
Eli Friedman2857ccb2009-07-01 03:36:11 +00005026
Eli Friedman245f2292009-07-05 22:31:18 +00005027class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
5028public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005029 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5030 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Eli Friedman245f2292009-07-05 22:31:18 +00005031 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00005032 Int64Type = SignedLongLong;
5033 }
5034};
Eli Friedman245f2292009-07-05 22:31:18 +00005035
Eli Friedman9fa28852012-08-08 23:57:20 +00005036class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
5037public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005038 BitrigX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5039 : BitrigTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005040 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005041 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00005042 }
5043};
Tim Northover9bb857a2013-01-31 12:13:10 +00005044
Eli Friedmanf05b7722008-08-20 07:44:10 +00005045class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005046 // Possible FPU choices.
5047 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005048 VFP2FPU = (1 << 0),
5049 VFP3FPU = (1 << 1),
5050 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00005051 NeonFPU = (1 << 3),
5052 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005053 };
5054
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005055 // Possible HWDiv features.
5056 enum HWDivMode {
5057 HWDivThumb = (1 << 0),
5058 HWDivARM = (1 << 1)
5059 };
5060
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005061 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00005062 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005063 }
5064
5065 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5066 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005067
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005068 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005069
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005070 StringRef CPUProfile;
5071 StringRef CPUAttr;
5072
Rafael Espindolaeb265472013-08-21 21:59:03 +00005073 enum {
5074 FP_Default,
5075 FP_VFP,
5076 FP_Neon
5077 } FPMath;
5078
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005079 unsigned ArchISA;
Renato Goline84b0002015-10-08 16:43:26 +00005080 unsigned ArchKind = llvm::ARM::AK_ARMV4T;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005081 unsigned ArchProfile;
5082 unsigned ArchVersion;
5083
Bernard Ogdenda13af32013-10-24 18:32:51 +00005084 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005085
Logan Chien57086ce2012-10-10 06:56:20 +00005086 unsigned IsAAPCS : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005087 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005088
5089 // Initialized via features.
5090 unsigned SoftFloat : 1;
5091 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00005092
Bernard Ogden18b57012013-10-29 09:47:51 +00005093 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00005094 unsigned Crypto : 1;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005095 unsigned DSP : 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005096 unsigned Unaligned : 1;
5097
5098 enum {
5099 LDREX_B = (1 << 0), /// byte (8-bit)
5100 LDREX_H = (1 << 1), /// half (16-bit)
5101 LDREX_W = (1 << 2), /// word (32-bit)
5102 LDREX_D = (1 << 3), /// double (64-bit)
5103 };
5104
5105 uint32_t LDREX;
Bernard Ogden18b57012013-10-29 09:47:51 +00005106
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005107 // ACLE 6.5.1 Hardware floating point
5108 enum {
5109 HW_FP_HP = (1 << 1), /// half (16-bit)
5110 HW_FP_SP = (1 << 2), /// single (32-bit)
5111 HW_FP_DP = (1 << 3), /// double (64-bit)
5112 };
5113 uint32_t HW_FP;
5114
Chris Lattner5cc15e02010-03-03 19:03:45 +00005115 static const Builtin::Info BuiltinInfo[];
5116
Rafael Espindolad6c2b722013-12-18 19:47:32 +00005117 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00005118 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00005119
5120 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00005121 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00005122
Renato Golin0201a9e2016-09-22 19:28:20 +00005123 // size_t is unsigned long on MachO-derived environments, NetBSD,
5124 // OpenBSD and Bitrig.
Renato Golin9ba39232015-02-27 16:35:48 +00005125 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD ||
Renato Golin0201a9e2016-09-22 19:28:20 +00005126 T.getOS() == llvm::Triple::OpenBSD ||
Renato Golin9ba39232015-02-27 16:35:48 +00005127 T.getOS() == llvm::Triple::Bitrig)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00005128 SizeType = UnsignedLong;
5129 else
5130 SizeType = UnsignedInt;
5131
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00005132 switch (T.getOS()) {
5133 case llvm::Triple::NetBSD:
Renato Golin0201a9e2016-09-22 19:28:20 +00005134 case llvm::Triple::OpenBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00005135 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00005136 break;
5137 case llvm::Triple::Win32:
5138 WCharType = UnsignedShort;
5139 break;
5140 case llvm::Triple::Linux:
5141 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00005142 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
5143 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00005144 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00005145 }
5146
5147 UseBitFieldTypeAlignment = true;
5148
5149 ZeroLengthBitfieldBoundary = 0;
5150
Tim Northover147cd2f2014-10-14 22:12:21 +00005151 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
5152 // so set preferred for small types to 32.
5153 if (T.isOSBinFormatMachO()) {
James Y Knightb214cbc2016-03-04 19:00:41 +00005154 resetDataLayout(BigEndian
5155 ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
5156 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Tim Northover147cd2f2014-10-14 22:12:21 +00005157 } else if (T.isOSWindows()) {
Tim Northover147cd2f2014-10-14 22:12:21 +00005158 assert(!BigEndian && "Windows on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00005159 resetDataLayout("e"
5160 "-m:w"
5161 "-p:32:32"
5162 "-i64:64"
5163 "-v128:64:128"
5164 "-a:0:32"
5165 "-n32"
5166 "-S64");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00005167 } else if (T.isOSNaCl()) {
5168 assert(!BigEndian && "NaCl on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00005169 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00005170 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00005171 resetDataLayout(BigEndian
5172 ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
5173 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00005174 }
5175
5176 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00005177 }
5178
Tim Northover5627d392015-10-30 16:30:45 +00005179 void setABIAPCS(bool IsAAPCS16) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00005180 const llvm::Triple &T = getTriple();
5181
Rafael Espindolaafa854c2013-12-18 20:24:51 +00005182 IsAAPCS = false;
5183
Tim Northover5627d392015-10-30 16:30:45 +00005184 if (IsAAPCS16)
5185 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
5186 else
5187 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00005188
Rafael Espindolad6c2b722013-12-18 19:47:32 +00005189 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00005190 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00005191 SizeType = UnsignedInt;
5192 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00005193 SizeType = UnsignedLong;
5194
5195 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
5196 WCharType = SignedInt;
5197
5198 // Do not respect the alignment of bit-field types when laying out
5199 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
5200 UseBitFieldTypeAlignment = false;
5201
5202 /// gcc forces the alignment to 4 bytes, regardless of the type of the
5203 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
5204 /// gcc.
5205 ZeroLengthBitfieldBoundary = 32;
5206
Tim Northover5627d392015-10-30 16:30:45 +00005207 if (T.isOSBinFormatMachO() && IsAAPCS16) {
5208 assert(!BigEndian && "AAPCS16 does not support big-endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00005209 resetDataLayout("e-m:o-p:32:32-i64:64-a:0:32-n32-S128");
Tim Northover5627d392015-10-30 16:30:45 +00005210 } else if (T.isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00005211 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00005212 BigEndian
5213 ? "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 +00005214 : "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 +00005215 else
James Y Knightb214cbc2016-03-04 19:00:41 +00005216 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00005217 BigEndian
5218 ? "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 +00005219 : "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 +00005220
5221 // FIXME: Override "preferred align" for double and long long.
5222 }
5223
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005224 void setArchInfo() {
5225 StringRef ArchName = getTriple().getArchName();
5226
Renato Goline84b0002015-10-08 16:43:26 +00005227 ArchISA = llvm::ARM::parseArchISA(ArchName);
5228 CPU = llvm::ARM::getDefaultCPU(ArchName);
5229 unsigned AK = llvm::ARM::parseArch(ArchName);
5230 if (AK != llvm::ARM::AK_INVALID)
5231 ArchKind = AK;
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005232 setArchInfo(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005233 }
5234
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005235 void setArchInfo(unsigned Kind) {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005236 StringRef SubArch;
5237
5238 // cache TargetParser info
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005239 ArchKind = Kind;
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00005240 SubArch = llvm::ARM::getSubArch(ArchKind);
5241 ArchProfile = llvm::ARM::parseArchProfile(SubArch);
5242 ArchVersion = llvm::ARM::parseArchVersion(SubArch);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005243
5244 // cache CPU related strings
5245 CPUAttr = getCPUAttr();
5246 CPUProfile = getCPUProfile();
5247 }
5248
5249 void setAtomic() {
Eric Christopherb093d692015-10-09 18:39:59 +00005250 // when triple does not specify a sub arch,
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005251 // then we are not using inline atomics
Renato Goline84b0002015-10-08 16:43:26 +00005252 bool ShouldUseInlineAtomic =
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005253 (ArchISA == llvm::ARM::IK_ARM && ArchVersion >= 6) ||
5254 (ArchISA == llvm::ARM::IK_THUMB && ArchVersion >= 7);
Eric Christopherb093d692015-10-09 18:39:59 +00005255 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005256 if (ArchProfile == llvm::ARM::PK_M) {
5257 MaxAtomicPromoteWidth = 32;
5258 if (ShouldUseInlineAtomic)
5259 MaxAtomicInlineWidth = 32;
5260 }
5261 else {
5262 MaxAtomicPromoteWidth = 64;
5263 if (ShouldUseInlineAtomic)
5264 MaxAtomicInlineWidth = 64;
Eric Christopherb093d692015-10-09 18:39:59 +00005265 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005266 }
5267
5268 bool isThumb() const {
5269 return (ArchISA == llvm::ARM::IK_THUMB);
5270 }
5271
5272 bool supportsThumb() const {
5273 return CPUAttr.count('T') || ArchVersion >= 6;
5274 }
5275
5276 bool supportsThumb2() const {
Bradley Smithf4affc12016-03-03 13:52:22 +00005277 return CPUAttr.equals("6T2") ||
5278 (ArchVersion >= 7 && !CPUAttr.equals("8M_BASE"));
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005279 }
5280
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005281 StringRef getCPUAttr() const {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005282 // For most sub-arches, the build attribute CPU name is enough.
5283 // For Cortex variants, it's slightly different.
5284 switch(ArchKind) {
5285 default:
Chandler Carruthd96f37a2015-08-30 07:51:18 +00005286 return llvm::ARM::getCPUAttr(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005287 case llvm::ARM::AK_ARMV6M:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005288 return "6M";
Tim Northover525c73c2015-07-21 21:47:33 +00005289 case llvm::ARM::AK_ARMV7S:
5290 return "7S";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005291 case llvm::ARM::AK_ARMV7A:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005292 return "7A";
5293 case llvm::ARM::AK_ARMV7R:
5294 return "7R";
5295 case llvm::ARM::AK_ARMV7M:
5296 return "7M";
5297 case llvm::ARM::AK_ARMV7EM:
5298 return "7EM";
George Burgess IVfc970562017-02-09 23:30:10 +00005299 case llvm::ARM::AK_ARMV7VE:
5300 return "7VE";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005301 case llvm::ARM::AK_ARMV8A:
5302 return "8A";
5303 case llvm::ARM::AK_ARMV8_1A:
5304 return "8_1A";
Oliver Stannard3086c042016-02-11 16:05:52 +00005305 case llvm::ARM::AK_ARMV8_2A:
5306 return "8_2A";
Bradley Smithf4affc12016-03-03 13:52:22 +00005307 case llvm::ARM::AK_ARMV8MBaseline:
5308 return "8M_BASE";
5309 case llvm::ARM::AK_ARMV8MMainline:
5310 return "8M_MAIN";
Javed Absar00b74442016-10-07 12:08:41 +00005311 case llvm::ARM::AK_ARMV8R:
5312 return "8R";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005313 }
5314 }
5315
5316 StringRef getCPUProfile() const {
5317 switch(ArchProfile) {
5318 case llvm::ARM::PK_A:
5319 return "A";
5320 case llvm::ARM::PK_R:
5321 return "R";
5322 case llvm::ARM::PK_M:
5323 return "M";
5324 default:
5325 return "";
5326 }
5327 }
5328
Chris Lattner17df24e2008-04-21 18:56:49 +00005329public:
Matt Arsenaultf333de32016-09-07 07:08:02 +00005330 ARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005331 : TargetInfo(Triple), FPMath(FP_Default), IsAAPCS(true), LDREX(0),
5332 HW_FP(0) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005333
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00005334 switch (getTriple().getOS()) {
5335 case llvm::Triple::NetBSD:
Renato Golin0201a9e2016-09-22 19:28:20 +00005336 case llvm::Triple::OpenBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00005337 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00005338 break;
5339 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00005340 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00005341 break;
5342 }
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00005343
Renato Goline84b0002015-10-08 16:43:26 +00005344 // Cache arch related info.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005345 setArchInfo();
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00005346
Chris Lattner1a8f3942010-04-23 16:29:58 +00005347 // {} in inline assembly are neon specifiers, not assembly variant
5348 // specifiers.
5349 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005350
Eric Christopher0e261882014-12-05 01:06:59 +00005351 // FIXME: This duplicates code from the driver that sets the -target-abi
5352 // option - this code is used if -target-abi isn't passed and should
5353 // be unified in some way.
5354 if (Triple.isOSBinFormatMachO()) {
5355 // The backend is hardwired to assume AAPCS for M-class processors, ensure
5356 // the frontend matches that.
5357 if (Triple.getEnvironment() == llvm::Triple::EABI ||
5358 Triple.getOS() == llvm::Triple::UnknownOS ||
Zijiao Ma56a83722016-08-17 02:13:33 +00005359 ArchProfile == llvm::ARM::PK_M) {
Eric Christopher0e261882014-12-05 01:06:59 +00005360 setABI("aapcs");
Tim Northoverd88ecb32016-01-27 19:32:40 +00005361 } else if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00005362 setABI("aapcs16");
Eric Christopher0e261882014-12-05 01:06:59 +00005363 } else {
5364 setABI("apcs-gnu");
5365 }
5366 } else if (Triple.isOSWindows()) {
5367 // FIXME: this is invalid for WindowsCE
5368 setABI("aapcs");
5369 } else {
5370 // Select the default based on the platform.
5371 switch (Triple.getEnvironment()) {
5372 case llvm::Triple::Android:
5373 case llvm::Triple::GNUEABI:
5374 case llvm::Triple::GNUEABIHF:
Rafael Espindola0fa66802016-06-24 21:35:06 +00005375 case llvm::Triple::MuslEABI:
5376 case llvm::Triple::MuslEABIHF:
Eric Christopher0e261882014-12-05 01:06:59 +00005377 setABI("aapcs-linux");
5378 break;
5379 case llvm::Triple::EABIHF:
5380 case llvm::Triple::EABI:
5381 setABI("aapcs");
5382 break;
Eric Christopher560cc4f2014-12-18 02:08:55 +00005383 case llvm::Triple::GNU:
Renato Goline84b0002015-10-08 16:43:26 +00005384 setABI("apcs-gnu");
5385 break;
Eric Christopher0e261882014-12-05 01:06:59 +00005386 default:
5387 if (Triple.getOS() == llvm::Triple::NetBSD)
5388 setABI("apcs-gnu");
Brad Smith3d648b32017-02-28 03:20:26 +00005389 else if (Triple.getOS() == llvm::Triple::OpenBSD)
5390 setABI("aapcs-linux");
Eric Christopher0e261882014-12-05 01:06:59 +00005391 else
5392 setABI("aapcs");
5393 break;
5394 }
5395 }
John McCall86353412010-08-21 22:46:04 +00005396
5397 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00005398 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005399
Renato Golin15b86152015-07-03 16:41:13 +00005400 // ARM has atomics up to 8 bytes
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005401 setAtomic();
Rafael Espindola5ab8e2e2015-07-02 15:14:10 +00005402
Javed Absar15b80a52017-06-07 10:02:02 +00005403 // Maximum alignment for ARM NEON data types should be 64-bits (AAPCS)
5404 if (IsAAPCS && (Triple.getEnvironment() != llvm::Triple::Android))
5405 MaxVectorAlign = 64;
5406
James Molloya7139222012-03-12 09:14:10 +00005407 // Do force alignment of members that follow zero length bitfields. If
Eric Christopher917e9522014-11-18 22:36:15 +00005408 // the alignment of the zero-length bitfield is greater than the member
5409 // that follows it, `bar', `bar' will be aligned as the type of the
James Molloya7139222012-03-12 09:14:10 +00005410 // zero length bitfield.
5411 UseZeroLengthBitfieldAlignment = true;
Saleem Abdulrasool9b5ba542016-04-10 03:19:47 +00005412
5413 if (Triple.getOS() == llvm::Triple::Linux ||
5414 Triple.getOS() == llvm::Triple::UnknownOS)
5415 this->MCountName =
5416 Opts.EABIVersion == "gnu" ? "\01__gnu_mcount_nc" : "\01mcount";
Eli Friedmanb5366062008-05-20 14:21:01 +00005417 }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00005418
Alp Toker4925ba72014-06-07 23:30:42 +00005419 StringRef getABI() const override { return ABI; }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00005420
Craig Topper3164f332014-03-11 03:39:26 +00005421 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00005422 ABI = Name;
5423
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00005424 // The defaults (above) are for AAPCS, check if we need to change them.
5425 //
5426 // FIXME: We need support for -meabi... we could just mangle it into the
5427 // name.
Tim Northover756447a2015-10-30 16:30:36 +00005428 if (Name == "apcs-gnu" || Name == "aapcs16") {
Tim Northover5627d392015-10-30 16:30:45 +00005429 setABIAPCS(Name == "aapcs16");
Rafael Espindolad6c2b722013-12-18 19:47:32 +00005430 return true;
5431 }
5432 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
5433 setABIAAPCS();
5434 return true;
5435 }
5436 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00005437 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00005438
Renato Golinf5c4dec2015-05-27 13:33:00 +00005439 // FIXME: This should be based on Arch attributes, not CPU names.
Eric Christopher8c47b422015-10-09 18:39:55 +00005440 bool
5441 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
5442 StringRef CPU,
5443 const std::vector<std::string> &FeaturesVec) const override {
5444
Mehdi Aminia0016ec2016-10-07 08:37:29 +00005445 std::vector<StringRef> TargetFeatures;
Bradley Smithb3501962015-11-16 11:16:36 +00005446 unsigned Arch = llvm::ARM::parseArch(getTriple().getArchName());
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005447
5448 // get default FPU features
Bradley Smithb3501962015-11-16 11:16:36 +00005449 unsigned FPUKind = llvm::ARM::getDefaultFPU(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005450 llvm::ARM::getFPUFeatures(FPUKind, TargetFeatures);
5451
5452 // get default Extension features
Bradley Smithb3501962015-11-16 11:16:36 +00005453 unsigned Extensions = llvm::ARM::getDefaultExtensions(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005454 llvm::ARM::getExtensionFeatures(Extensions, TargetFeatures);
5455
Mehdi Aminia0016ec2016-10-07 08:37:29 +00005456 for (auto Feature : TargetFeatures)
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005457 if (Feature[0] == '+')
Mehdi Aminia0016ec2016-10-07 08:37:29 +00005458 Features[Feature.drop_front(1)] = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005459
Florian Hahncc524bf2017-06-07 11:50:45 +00005460 // Enable or disable thumb-mode explicitly per function to enable mixed
5461 // ARM and Thumb code generation.
5462 if (isThumb())
5463 Features["thumb-mode"] = true;
5464 else
5465 Features["thumb-mode"] = false;
5466
Florian Hahn28f03bb2017-06-06 09:26:15 +00005467 // Convert user-provided arm and thumb GNU target attributes to
5468 // [-|+]thumb-mode target features respectively.
5469 std::vector<std::string> UpdatedFeaturesVec(FeaturesVec);
5470 for (auto &Feature : UpdatedFeaturesVec) {
5471 if (Feature.compare("+arm") == 0)
5472 Feature = "-thumb-mode";
5473 else if (Feature.compare("+thumb") == 0)
5474 Feature = "+thumb-mode";
5475 }
5476
5477 return TargetInfo::initFeatureMap(Features, Diags, CPU, UpdatedFeaturesVec);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005478 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005479
Craig Topper3164f332014-03-11 03:39:26 +00005480 bool handleTargetFeatures(std::vector<std::string> &Features,
5481 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005482 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00005483 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00005484 Crypto = 0;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005485 DSP = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005486 Unaligned = 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005487 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005488 HWDiv = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005489
Ranjeet Singhac08e532015-06-24 23:39:25 +00005490 // This does not diagnose illegal cases like having both
5491 // "+vfpv2" and "+vfpv3" or having "+neon" and "+fp-only-sp".
5492 uint32_t HW_FP_remove = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005493 for (const auto &Feature : Features) {
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005494 if (Feature == "+soft-float") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00005495 SoftFloat = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005496 } else if (Feature == "+soft-float-abi") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00005497 SoftFloatABI = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005498 } else if (Feature == "+vfp2") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005499 FPU |= VFP2FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005500 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005501 } else if (Feature == "+vfp3") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005502 FPU |= VFP3FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005503 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005504 } else if (Feature == "+vfp4") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005505 FPU |= VFP4FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005506 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005507 } else if (Feature == "+fp-armv8") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00005508 FPU |= FPARMV8;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005509 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005510 } else if (Feature == "+neon") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005511 FPU |= NeonFPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005512 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005513 } else if (Feature == "+hwdiv") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005514 HWDiv |= HWDivThumb;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005515 } else if (Feature == "+hwdiv-arm") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005516 HWDiv |= HWDivARM;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005517 } else if (Feature == "+crc") {
Bernard Ogden18b57012013-10-29 09:47:51 +00005518 CRC = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005519 } else if (Feature == "+crypto") {
Tim Northover02e38602014-02-03 17:28:04 +00005520 Crypto = 1;
Artyom Skrobov05d85ae2015-10-23 17:19:02 +00005521 } else if (Feature == "+dsp") {
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005522 DSP = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005523 } else if (Feature == "+fp-only-sp") {
Matt Arsenault250024f2016-06-08 01:56:42 +00005524 HW_FP_remove |= HW_FP_DP;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005525 } else if (Feature == "+strict-align") {
5526 Unaligned = 0;
5527 } else if (Feature == "+fp16") {
5528 HW_FP |= HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005529 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00005530 }
Ranjeet Singhac08e532015-06-24 23:39:25 +00005531 HW_FP &= ~HW_FP_remove;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005532
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005533 switch (ArchVersion) {
5534 case 6:
5535 if (ArchProfile == llvm::ARM::PK_M)
5536 LDREX = 0;
5537 else if (ArchKind == llvm::ARM::AK_ARMV6K)
5538 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5539 else
5540 LDREX = LDREX_W;
5541 break;
5542 case 7:
5543 if (ArchProfile == llvm::ARM::PK_M)
5544 LDREX = LDREX_W | LDREX_H | LDREX_B ;
5545 else
5546 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5547 break;
5548 case 8:
5549 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5550 }
5551
Rafael Espindolaeb265472013-08-21 21:59:03 +00005552 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
5553 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
5554 return false;
5555 }
5556
5557 if (FPMath == FP_Neon)
5558 Features.push_back("+neonfp");
5559 else if (FPMath == FP_VFP)
5560 Features.push_back("-neonfp");
5561
Daniel Dunbar893d4752009-12-19 04:15:38 +00005562 // Remove front-end specific options which the backend handles differently.
Eric Christopher9e172d22015-05-12 01:26:21 +00005563 auto Feature =
5564 std::find(Features.begin(), Features.end(), "+soft-float-abi");
5565 if (Feature != Features.end())
5566 Features.erase(Feature);
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005567
Rafael Espindolaeb265472013-08-21 21:59:03 +00005568 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005569 }
5570
Craig Topper3164f332014-03-11 03:39:26 +00005571 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005572 return llvm::StringSwitch<bool>(Feature)
5573 .Case("arm", true)
Ben Langmuir587aeaf2015-08-07 01:59:56 +00005574 .Case("aarch32", true)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005575 .Case("softfloat", SoftFloat)
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005576 .Case("thumb", isThumb())
Amara Emerson8c3de542013-09-16 18:07:35 +00005577 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Weiming Zhaobe380c72017-05-05 19:25:29 +00005578 .Case("vfp", FPU && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005579 .Case("hwdiv", HWDiv & HWDivThumb)
5580 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005581 .Default(false);
5582 }
Renato Golin15b86152015-07-03 16:41:13 +00005583
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005584 bool setCPU(const std::string &Name) override {
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005585 if (Name != "generic")
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00005586 setArchInfo(llvm::ARM::parseCPUArch(Name));
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005587
Renato Golin15b86152015-07-03 16:41:13 +00005588 if (ArchKind == llvm::ARM::AK_INVALID)
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005589 return false;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005590 setAtomic();
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005591 CPU = Name;
5592 return true;
5593 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005594
Craig Topper3164f332014-03-11 03:39:26 +00005595 bool setFPMath(StringRef Name) override;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005596
Craig Topper3164f332014-03-11 03:39:26 +00005597 void getTargetDefines(const LangOptions &Opts,
5598 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00005599 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005600 Builder.defineMacro("__arm");
5601 Builder.defineMacro("__arm__");
Weiming Zhaob0613132016-04-18 16:25:46 +00005602 // For bare-metal none-eabi.
5603 if (getTriple().getOS() == llvm::Triple::UnknownOS &&
Oliver Stannard233310f2017-04-18 13:12:36 +00005604 (getTriple().getEnvironment() == llvm::Triple::EABI ||
5605 getTriple().getEnvironment() == llvm::Triple::EABIHF))
Weiming Zhaob0613132016-04-18 16:25:46 +00005606 Builder.defineMacro("__ELF__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00005607
Oliver Stannard233310f2017-04-18 13:12:36 +00005608
Chris Lattnerecd49032009-03-02 22:27:17 +00005609 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005610 Builder.defineMacro("__REGISTER_PREFIX__", "");
Tim Northover5627d392015-10-30 16:30:45 +00005611
5612 // Unfortunately, __ARM_ARCH_7K__ is now more of an ABI descriptor. The CPU
5613 // happens to be Cortex-A7 though, so it should still get __ARM_ARCH_7A__.
Tim Northoverd88ecb32016-01-27 19:32:40 +00005614 if (getTriple().isWatchABI())
Tim Northover5627d392015-10-30 16:30:45 +00005615 Builder.defineMacro("__ARM_ARCH_7K__", "2");
5616
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005617 if (!CPUAttr.empty())
5618 Builder.defineMacro("__ARM_ARCH_" + CPUAttr + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005619
5620 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005621 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
Benjamin Kramerb42d9a52015-12-24 10:07:37 +00005622 Builder.defineMacro("__ARM_ARCH", Twine(ArchVersion));
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005623
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005624 if (ArchVersion >= 8) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005625 // ACLE 6.5.7 Crypto Extension
5626 if (Crypto)
5627 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
5628 // ACLE 6.5.8 CRC32 Extension
5629 if (CRC)
5630 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
5631 // ACLE 6.5.10 Numeric Maximum and Minimum
5632 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
5633 // ACLE 6.5.9 Directed Rounding
5634 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
James Molloy0ffb0932014-09-15 11:25:38 +00005635 }
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005636
5637 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
5638 // is not defined for the M-profile.
Bradley Smithf4affc12016-03-03 13:52:22 +00005639 // NOTE that the default profile is assumed to be 'A'
5640 if (CPUProfile.empty() || ArchProfile != llvm::ARM::PK_M)
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005641 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
5642
Bradley Smithf4affc12016-03-03 13:52:22 +00005643 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supports the original
5644 // Thumb ISA (including v6-M and v8-M Baseline). It is set to 2 if the
5645 // core supports the Thumb-2 ISA as found in the v6T2 architecture and all
5646 // v7 and v8 architectures excluding v8-M Baseline.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005647 if (supportsThumb2())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005648 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005649 else if (supportsThumb())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005650 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
5651
5652 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
5653 // instruction set such as ARM or Thumb.
5654 Builder.defineMacro("__ARM_32BIT_STATE", "1");
5655
5656 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
5657
5658 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005659 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005660 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00005661
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005662 // ACLE 6.4.3 Unaligned access supported in hardware
Eric Christopherb093d692015-10-09 18:39:59 +00005663 if (Unaligned)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005664 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Eric Christopherb093d692015-10-09 18:39:59 +00005665
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005666 // ACLE 6.4.4 LDREX/STREX
5667 if (LDREX)
5668 Builder.defineMacro("__ARM_FEATURE_LDREX", "0x" + llvm::utohexstr(LDREX));
5669
5670 // ACLE 6.4.5 CLZ
Eric Christopherb093d692015-10-09 18:39:59 +00005671 if (ArchVersion == 5 ||
5672 (ArchVersion == 6 && CPUProfile != "M") ||
5673 ArchVersion > 6)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005674 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
5675
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005676 // ACLE 6.5.1 Hardware Floating Point
5677 if (HW_FP)
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +00005678 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005679
Yi Konga44c4d72014-06-27 21:25:42 +00005680 // ACLE predefines.
5681 Builder.defineMacro("__ARM_ACLE", "200");
5682
Oliver Stannarddc2854c2015-09-03 12:40:58 +00005683 // FP16 support (we currently only support IEEE format).
5684 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
5685 Builder.defineMacro("__ARM_FP16_ARGS", "1");
5686
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005687 // ACLE 6.5.3 Fused multiply-accumulate (FMA)
Silviu Baranga632fdc52016-04-28 11:29:08 +00005688 if (ArchVersion >= 7 && (FPU & VFP4FPU))
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005689 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
5690
Mike Stump9d54bd72009-04-08 02:07:04 +00005691 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005692
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005693 // FIXME: It's more complicated than this and we don't really support
5694 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005695 // Windows on ARM does not "support" interworking
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005696 if (5 <= ArchVersion && ArchVersion <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005697 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005698
David Tweed8f676532012-10-25 13:33:01 +00005699 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00005700 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005701 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
Tim Northover862eaf82016-05-13 21:26:45 +00005702 if (!getTriple().isOSBinFormatMachO() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00005703 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005704 Builder.defineMacro("__ARM_PCS", "1");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005705 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005706
Tim Northover28fc0e12016-04-28 13:59:55 +00005707 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp" ||
5708 ABI == "aapcs16")
5709 Builder.defineMacro("__ARM_PCS_VFP", "1");
5710
Daniel Dunbar893d4752009-12-19 04:15:38 +00005711 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005712 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005713
Zijiao Ma56a83722016-08-17 02:13:33 +00005714 if (ArchKind == llvm::ARM::AK_XSCALE)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005715 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005716
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005717 if (isThumb()) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005718 Builder.defineMacro("__THUMBEL__");
5719 Builder.defineMacro("__thumb__");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005720 if (supportsThumb2())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005721 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005722 }
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005723
5724 // ACLE 6.4.9 32-bit SIMD instructions
5725 if (ArchVersion >= 6 && (CPUProfile != "M" || CPUAttr == "7EM"))
5726 Builder.defineMacro("__ARM_FEATURE_SIMD32", "1");
5727
5728 // ACLE 6.4.10 Hardware Integer Divide
Eric Christopherb093d692015-10-09 18:39:59 +00005729 if (((HWDiv & HWDivThumb) && isThumb()) ||
5730 ((HWDiv & HWDivARM) && !isThumb())) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005731 Builder.defineMacro("__ARM_FEATURE_IDIV", "1");
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005732 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005733 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005734
5735 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005736 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005737
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005738 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005739 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005740 if (FPU & VFP2FPU)
5741 Builder.defineMacro("__ARM_VFPV2__");
5742 if (FPU & VFP3FPU)
5743 Builder.defineMacro("__ARM_VFPV3__");
5744 if (FPU & VFP4FPU)
5745 Builder.defineMacro("__ARM_VFPV4__");
Tim Northoverc67803f2016-12-21 20:49:43 +00005746 if (FPU & FPARMV8)
5747 Builder.defineMacro("__ARM_FPV5__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005748 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00005749
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005750 // This only gets set when Neon instructions are actually available, unlike
5751 // the VFP define, hence the soft float and arch check. This is subtly
5752 // different from gcc, we follow the intent which was that it should be set
5753 // when Neon instructions are actually available.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005754 if ((FPU & NeonFPU) && !SoftFloat && ArchVersion >= 7) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005755 Builder.defineMacro("__ARM_NEON", "1");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005756 Builder.defineMacro("__ARM_NEON__");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005757 // current AArch32 NEON implementations do not support double-precision
5758 // floating-point even when it is present in VFP.
Eric Christopherb093d692015-10-09 18:39:59 +00005759 Builder.defineMacro("__ARM_NEON_FP",
5760 "0x" + llvm::utohexstr(HW_FP & ~HW_FP_DP));
Tim Northover5bb34ca2013-11-21 12:36:34 +00005761 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00005762
Bradley Smith0f28f0c2014-01-20 10:52:00 +00005763 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
5764 Opts.ShortWChar ? "2" : "4");
5765
5766 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5767 Opts.ShortEnums ? "1" : "4");
5768
Bradley Smithf4affc12016-03-03 13:52:22 +00005769 if (ArchVersion >= 6 && CPUAttr != "6M" && CPUAttr != "8M_BASE") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00005770 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5771 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5772 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5773 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
5774 }
Sergey Dmitrouk745f5302014-11-25 08:57:36 +00005775
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005776 // ACLE 6.4.7 DSP instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005777 if (DSP) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005778 Builder.defineMacro("__ARM_FEATURE_DSP", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005779 }
5780
5781 // ACLE 6.4.8 Saturation instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005782 bool SAT = false;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005783 if ((ArchVersion == 6 && CPUProfile != "M") || ArchVersion > 6 ) {
5784 Builder.defineMacro("__ARM_FEATURE_SAT", "1");
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005785 SAT = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005786 }
5787
5788 // ACLE 6.4.6 Q (saturation) flag
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005789 if (DSP || SAT)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005790 Builder.defineMacro("__ARM_FEATURE_QBIT", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005791
5792 if (Opts.UnsafeFPMath)
5793 Builder.defineMacro("__ARM_FP_FAST", "1");
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005794
5795 if (ArchKind == llvm::ARM::AK_ARMV8_1A)
5796 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
Chris Lattner17df24e2008-04-21 18:56:49 +00005797 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005798
Craig Topper6c03a542015-10-19 04:51:35 +00005799 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5800 return llvm::makeArrayRef(BuiltinInfo,
5801 clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner17df24e2008-04-21 18:56:49 +00005802 }
Craig Topper3164f332014-03-11 03:39:26 +00005803 bool isCLZForZeroUndef() const override { return false; }
5804 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northover5627d392015-10-30 16:30:45 +00005805 return IsAAPCS
5806 ? AAPCSABIBuiltinVaList
Tim Northoverd88ecb32016-01-27 19:32:40 +00005807 : (getTriple().isWatchABI() ? TargetInfo::CharPtrBuiltinVaList
5808 : TargetInfo::VoidPtrBuiltinVaList);
Chris Lattner17df24e2008-04-21 18:56:49 +00005809 }
Craig Topperf054e3a2015-10-19 03:52:27 +00005810 ArrayRef<const char *> getGCCRegNames() const override;
5811 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00005812 bool validateAsmConstraint(const char *&Name,
5813 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00005814 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00005815 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00005816 case 'l': // r0-r7
5817 case 'h': // r8-r15
JF Bastien750caef2016-02-19 06:54:45 +00005818 case 't': // VFP Floating point register single precision
5819 case 'w': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00005820 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00005821 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005822 case 'I':
5823 case 'J':
5824 case 'K':
5825 case 'L':
5826 case 'M':
5827 // FIXME
5828 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00005829 case 'Q': // A memory address that is a single base register.
5830 Info.setAllowsMemory();
5831 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005832 case 'U': // a memory reference...
5833 switch (Name[1]) {
5834 case 'q': // ...ARMV4 ldrsb
5835 case 'v': // ...VFP load/store (reg+constant offset)
5836 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00005837 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00005838 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00005839 case 'n': // valid address for Neon doubleword vector load/store
5840 case 'm': // valid address for Neon element and structure load/store
5841 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00005842 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005843 Info.setAllowsMemory();
5844 Name++;
5845 return true;
5846 }
Nate Begeman2908fa02008-04-22 05:03:19 +00005847 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005848 return false;
5849 }
Craig Topper3164f332014-03-11 03:39:26 +00005850 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005851 std::string R;
5852 switch (*Constraint) {
5853 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00005854 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005855 Constraint++;
5856 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00005857 case 'p': // 'p' should be translated to 'r' by default.
5858 R = std::string("r");
5859 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005860 default:
5861 return std::string(1, *Constraint);
5862 }
5863 return R;
5864 }
Akira Hatanaka987f1862014-08-22 06:05:21 +00005865 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005866 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005867 std::string &SuggestedModifier) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00005868 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00005869 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00005870
Bill Wendling9d1ee112012-10-25 23:28:48 +00005871 // Strip off constraint modifiers.
5872 while (Constraint[0] == '=' ||
5873 Constraint[0] == '+' ||
5874 Constraint[0] == '&')
5875 Constraint = Constraint.substr(1);
5876
5877 switch (Constraint[0]) {
5878 default: break;
5879 case 'r': {
5880 switch (Modifier) {
5881 default:
Tim Northover8f24b172013-12-08 15:24:55 +00005882 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00005883 case 'q':
5884 // A register of size 32 cannot fit a vector type.
5885 return false;
5886 }
5887 }
5888 }
5889
5890 return true;
5891 }
Craig Topper3164f332014-03-11 03:39:26 +00005892 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00005893 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00005894 return "";
5895 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005896
Craig Topper3164f332014-03-11 03:39:26 +00005897 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00005898 switch (CC) {
5899 case CC_AAPCS:
5900 case CC_AAPCS_VFP:
5901 case CC_Swift:
Pekka Jaaskelainenfc2629a2017-06-01 07:18:49 +00005902 case CC_OpenCLKernel:
John McCall477f2bb2016-03-03 06:39:32 +00005903 return CCCR_OK;
5904 default:
5905 return CCCR_Warning;
5906 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005907 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00005908
Craig Topper3164f332014-03-11 03:39:26 +00005909 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00005910 if (RegNo == 0) return 0;
5911 if (RegNo == 1) return 1;
5912 return -1;
5913 }
Matthias Braund1e2fad2015-07-17 00:15:22 +00005914
5915 bool hasSjLjLowering() const override {
5916 return true;
5917 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005918};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005919
Rafael Espindolaeb265472013-08-21 21:59:03 +00005920bool ARMTargetInfo::setFPMath(StringRef Name) {
5921 if (Name == "neon") {
5922 FPMath = FP_Neon;
5923 return true;
5924 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
5925 Name == "vfp4") {
5926 FPMath = FP_VFP;
5927 return true;
5928 }
5929 return false;
5930}
5931
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005932const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005933 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005934 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005935 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
5936
5937 // Float registers
5938 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
5939 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
5940 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005941 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005942
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005943 // Double registers
5944 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
5945 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005946 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
5947 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005948
5949 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005950 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
5951 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005952};
5953
Craig Topperf054e3a2015-10-19 03:52:27 +00005954ArrayRef<const char *> ARMTargetInfo::getGCCRegNames() const {
5955 return llvm::makeArrayRef(GCCRegNames);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005956}
5957
5958const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005959 { { "a1" }, "r0" },
5960 { { "a2" }, "r1" },
5961 { { "a3" }, "r2" },
5962 { { "a4" }, "r3" },
5963 { { "v1" }, "r4" },
5964 { { "v2" }, "r5" },
5965 { { "v3" }, "r6" },
5966 { { "v4" }, "r7" },
5967 { { "v5" }, "r8" },
5968 { { "v6", "rfp" }, "r9" },
5969 { { "sl" }, "r10" },
5970 { { "fp" }, "r11" },
5971 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00005972 { { "r13" }, "sp" },
5973 { { "r14" }, "lr" },
5974 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005975 // The S, D and Q registers overlap, but aren't really aliases; we
5976 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005977};
5978
Craig Topperf054e3a2015-10-19 03:52:27 +00005979ArrayRef<TargetInfo::GCCRegAlias> ARMTargetInfo::getGCCRegAliases() const {
5980 return llvm::makeArrayRef(GCCRegAliases);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005981}
Chris Lattner5cc15e02010-03-03 19:03:45 +00005982
5983const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00005984#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005985 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005986#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5987 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00005988#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00005989
Craig Topper07d3b622015-08-07 05:14:44 +00005990#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005991 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005992#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005993 { #ID, TYPE, ATTRS, nullptr, LANG, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005994#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5995 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Albert Gutowski2a0621e2016-10-12 22:01:05 +00005996#define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANGS, FEATURE) \
5997 { #ID, TYPE, ATTRS, HEADER, LANGS, FEATURE },
Chris Lattner5cc15e02010-03-03 19:03:45 +00005998#include "clang/Basic/BuiltinsARM.def"
5999};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006000
6001class ARMleTargetInfo : public ARMTargetInfo {
6002public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006003 ARMleTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Matt Arsenaultf333de32016-09-07 07:08:02 +00006004 : ARMTargetInfo(Triple, Opts) {}
Alexander Kornienko34eb2072015-04-11 02:00:23 +00006005 void getTargetDefines(const LangOptions &Opts,
6006 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006007 Builder.defineMacro("__ARMEL__");
6008 ARMTargetInfo::getTargetDefines(Opts, Builder);
6009 }
6010};
6011
6012class ARMbeTargetInfo : public ARMTargetInfo {
6013public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006014 ARMbeTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Matt Arsenaultf333de32016-09-07 07:08:02 +00006015 : ARMTargetInfo(Triple, Opts) {}
Alexander Kornienko34eb2072015-04-11 02:00:23 +00006016 void getTargetDefines(const LangOptions &Opts,
6017 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006018 Builder.defineMacro("__ARMEB__");
6019 Builder.defineMacro("__ARM_BIG_ENDIAN");
6020 ARMTargetInfo::getTargetDefines(Opts, Builder);
6021 }
6022};
Chris Lattner17df24e2008-04-21 18:56:49 +00006023
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00006024class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
6025 const llvm::Triple Triple;
6026public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006027 WindowsARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6028 : WindowsTargetInfo<ARMleTargetInfo>(Triple, Opts), Triple(Triple) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00006029 WCharType = UnsignedShort;
6030 SizeType = UnsignedInt;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00006031 }
6032 void getVisualStudioDefines(const LangOptions &Opts,
6033 MacroBuilder &Builder) const {
6034 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
6035
6036 // FIXME: this is invalid for WindowsCE
6037 Builder.defineMacro("_M_ARM_NT", "1");
6038 Builder.defineMacro("_M_ARMT", "_M_ARM");
6039 Builder.defineMacro("_M_THUMB", "_M_ARM");
6040
6041 assert((Triple.getArch() == llvm::Triple::arm ||
6042 Triple.getArch() == llvm::Triple::thumb) &&
6043 "invalid architecture for Windows ARM target info");
6044 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
6045 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
6046
6047 // TODO map the complete set of values
6048 // 31: VFPv3 40: VFPv4
6049 Builder.defineMacro("_M_ARM_FP", "31");
6050 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00006051 BuiltinVaListKind getBuiltinVaListKind() const override {
6052 return TargetInfo::CharPtrBuiltinVaList;
6053 }
Martell Malone7ccda3c2015-08-14 18:00:09 +00006054 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
6055 switch (CC) {
6056 case CC_X86StdCall:
6057 case CC_X86ThisCall:
6058 case CC_X86FastCall:
6059 case CC_X86VectorCall:
6060 return CCCR_Ignore;
6061 case CC_C:
Pekka Jaaskelainenfc2629a2017-06-01 07:18:49 +00006062 case CC_OpenCLKernel:
Martell Malone7ccda3c2015-08-14 18:00:09 +00006063 return CCCR_OK;
6064 default:
6065 return CCCR_Warning;
6066 }
6067 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00006068};
6069
6070// Windows ARM + Itanium C++ ABI Target
6071class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
6072public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006073 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple,
6074 const TargetOptions &Opts)
6075 : WindowsARMTargetInfo(Triple, Opts) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00006076 TheCXXABI.set(TargetCXXABI::GenericARM);
6077 }
6078
6079 void getTargetDefines(const LangOptions &Opts,
6080 MacroBuilder &Builder) const override {
6081 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
6082
6083 if (Opts.MSVCCompat)
6084 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
6085 }
6086};
6087
6088// Windows ARM, MS (C++) ABI
6089class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
6090public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006091 MicrosoftARMleTargetInfo(const llvm::Triple &Triple,
6092 const TargetOptions &Opts)
6093 : WindowsARMTargetInfo(Triple, Opts) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00006094 TheCXXABI.set(TargetCXXABI::Microsoft);
6095 }
6096
6097 void getTargetDefines(const LangOptions &Opts,
6098 MacroBuilder &Builder) const override {
6099 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
6100 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
6101 }
6102};
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00006103
Yaron Keren321249c2015-07-15 13:32:23 +00006104// ARM MinGW target
6105class MinGWARMTargetInfo : public WindowsARMTargetInfo {
6106public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006107 MinGWARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6108 : WindowsARMTargetInfo(Triple, Opts) {
Yaron Keren321249c2015-07-15 13:32:23 +00006109 TheCXXABI.set(TargetCXXABI::GenericARM);
6110 }
6111
6112 void getTargetDefines(const LangOptions &Opts,
6113 MacroBuilder &Builder) const override {
6114 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
6115 DefineStd(Builder, "WIN32", Opts);
6116 DefineStd(Builder, "WINNT", Opts);
6117 Builder.defineMacro("_ARM_");
6118 addMinGWDefines(Opts, Builder);
6119 }
6120};
6121
6122// ARM Cygwin target
6123class CygwinARMTargetInfo : public ARMleTargetInfo {
6124public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006125 CygwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6126 : ARMleTargetInfo(Triple, Opts) {
Yaron Keren321249c2015-07-15 13:32:23 +00006127 TLSSupported = false;
6128 WCharType = UnsignedShort;
6129 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00006130 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Yaron Keren321249c2015-07-15 13:32:23 +00006131 }
6132 void getTargetDefines(const LangOptions &Opts,
6133 MacroBuilder &Builder) const override {
6134 ARMleTargetInfo::getTargetDefines(Opts, Builder);
6135 Builder.defineMacro("_ARM_");
6136 Builder.defineMacro("__CYGWIN__");
6137 Builder.defineMacro("__CYGWIN32__");
Saleem Abdulrasool56027092017-02-07 19:00:06 +00006138 DefineStd(Builder, "unix", Opts);
Yaron Keren321249c2015-07-15 13:32:23 +00006139 if (Opts.CPlusPlus)
6140 Builder.defineMacro("_GNU_SOURCE");
6141 }
6142};
6143
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006144class DarwinARMTargetInfo : public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00006145protected:
Craig Topper3164f332014-03-11 03:39:26 +00006146 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
6147 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00006148 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00006149 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00006150
Torok Edwinb2b37c62009-06-30 17:10:35 +00006151public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006152 DarwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6153 : DarwinTargetInfo<ARMleTargetInfo>(Triple, Opts) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00006154 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00006155 // iOS always has 64-bit atomic instructions.
Eric Christopher917e9522014-11-18 22:36:15 +00006156 // FIXME: This should be based off of the target features in
6157 // ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00006158 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00006159
Tim Northoverd88ecb32016-01-27 19:32:40 +00006160 if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00006161 // Darwin on iOS uses a variant of the ARM C++ ABI.
6162 TheCXXABI.set(TargetCXXABI::WatchOS);
6163
6164 // The 32-bit ABI is silent on what ptrdiff_t should be, but given that
6165 // size_t is long, it's a bit weird for it to be int.
6166 PtrDiffType = SignedLong;
6167
6168 // BOOL should be a real boolean on the new ABI
6169 UseSignedCharForObjCBool = false;
6170 } else
6171 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00006172 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00006173};
Eli Friedmanf05b7722008-08-20 07:44:10 +00006174
Tim Northover573cbee2014-05-24 12:52:07 +00006175class AArch64TargetInfo : public TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00006176 virtual void setDataLayout() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00006177 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6178 static const char *const GCCRegNames[];
6179
James Molloy75f5f9e2014-04-16 15:33:48 +00006180 enum FPUModeEnum {
6181 FPUMode,
6182 NeonMode
6183 };
6184
6185 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00006186 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00006187 unsigned Crypto;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006188 unsigned Unaligned;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00006189 unsigned V8_1A;
Abderrazek Zaafranif10ca932017-06-20 18:54:57 +00006190 unsigned V8_2A;
6191 unsigned HasFullFP16;
James Molloy75f5f9e2014-04-16 15:33:48 +00006192
Tim Northovera2ee4332014-03-29 15:09:45 +00006193 static const Builtin::Info BuiltinInfo[];
6194
6195 std::string ABI;
6196
6197public:
Saleem Abdulrasool9b5ba542016-04-10 03:19:47 +00006198 AArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Tim Northovera2ee4332014-03-29 15:09:45 +00006199 : TargetInfo(Triple), ABI("aapcs") {
Brad Smith9aa2bf22017-02-21 23:13:09 +00006200 if (getTriple().getOS() == llvm::Triple::NetBSD ||
6201 getTriple().getOS() == llvm::Triple::OpenBSD) {
Tim Northover25e8a672014-05-24 12:51:25 +00006202 WCharType = SignedInt;
6203
6204 // NetBSD apparently prefers consistency across ARM targets to consistency
6205 // across 64-bit targets.
6206 Int64Type = SignedLongLong;
6207 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00006208 } else {
6209 WCharType = UnsignedInt;
6210 Int64Type = SignedLong;
6211 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00006212 }
6213
Tim Northovera2ee4332014-03-29 15:09:45 +00006214 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00006215 MaxVectorAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00006216 MaxAtomicInlineWidth = 128;
6217 MaxAtomicPromoteWidth = 128;
6218
Tim Northovera6a19f12015-02-06 01:25:07 +00006219 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 128;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00006220 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Tim Northovera2ee4332014-03-29 15:09:45 +00006221
Tim Northovera2ee4332014-03-29 15:09:45 +00006222 // {} in inline assembly are neon specifiers, not assembly variant
6223 // specifiers.
6224 NoAsmVariants = true;
6225
Tim Northover7ad87af2015-01-16 18:44:04 +00006226 // AAPCS gives rules for bitfields. 7.1.7 says: "The container type
6227 // contributes to the alignment of the containing aggregate in the same way
6228 // a plain (non bit-field) member of that type would, without exception for
6229 // zero-sized or anonymous bit-fields."
Tim Northover5627d392015-10-30 16:30:45 +00006230 assert(UseBitFieldTypeAlignment && "bitfields affect type alignment");
Tim Northover7ad87af2015-01-16 18:44:04 +00006231 UseZeroLengthBitfieldAlignment = true;
6232
Tim Northover573cbee2014-05-24 12:52:07 +00006233 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00006234 TheCXXABI.set(TargetCXXABI::GenericAArch64);
Saleem Abdulrasoolc066d9c2016-04-12 03:05:03 +00006235
Eric Christopherfb834a82017-02-28 17:22:05 +00006236 if (Triple.getOS() == llvm::Triple::Linux)
6237 this->MCountName = "\01_mcount";
6238 else if (Triple.getOS() == llvm::Triple::UnknownOS)
Saleem Abdulrasoolc066d9c2016-04-12 03:05:03 +00006239 this->MCountName = Opts.EABIVersion == "gnu" ? "\01_mcount" : "mcount";
Tim Northovera2ee4332014-03-29 15:09:45 +00006240 }
6241
Alp Toker4925ba72014-06-07 23:30:42 +00006242 StringRef getABI() const override { return ABI; }
David Blaikie1cbb9712014-11-14 19:09:44 +00006243 bool setABI(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006244 if (Name != "aapcs" && Name != "darwinpcs")
6245 return false;
6246
6247 ABI = Name;
6248 return true;
6249 }
6250
David Blaikie1cbb9712014-11-14 19:09:44 +00006251 bool setCPU(const std::string &Name) override {
Zijiao Ma33e95212016-07-28 06:24:48 +00006252 return Name == "generic" ||
6253 llvm::AArch64::parseCPUArch(Name) !=
6254 static_cast<unsigned>(llvm::AArch64::ArchKind::AK_INVALID);
Tim Northovera2ee4332014-03-29 15:09:45 +00006255 }
6256
Alexander Kornienko34eb2072015-04-11 02:00:23 +00006257 void getTargetDefines(const LangOptions &Opts,
6258 MacroBuilder &Builder) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006259 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00006260 Builder.defineMacro("__aarch64__");
Oliver Stannard233310f2017-04-18 13:12:36 +00006261 // For bare-metal none-eabi.
6262 if (getTriple().getOS() == llvm::Triple::UnknownOS &&
6263 (getTriple().getEnvironment() == llvm::Triple::EABI ||
6264 getTriple().getEnvironment() == llvm::Triple::EABIHF))
6265 Builder.defineMacro("__ELF__");
Tim Northovera2ee4332014-03-29 15:09:45 +00006266
6267 // Target properties.
6268 Builder.defineMacro("_LP64");
6269 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00006270
6271 // ACLE predefines. Many can only have one possible value on v8 AArch64.
6272 Builder.defineMacro("__ARM_ACLE", "200");
6273 Builder.defineMacro("__ARM_ARCH", "8");
6274 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
6275
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006276 Builder.defineMacro("__ARM_64BIT_STATE", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00006277 Builder.defineMacro("__ARM_PCS_AAPCS64", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006278 Builder.defineMacro("__ARM_ARCH_ISA_A64", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00006279
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006280 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
6281 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
6282 Builder.defineMacro("__ARM_FEATURE_LDREX", "0xF");
6283 Builder.defineMacro("__ARM_FEATURE_IDIV", "1"); // As specified in ACLE
James Molloy0ffb0932014-09-15 11:25:38 +00006284 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006285 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
6286 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00006287
6288 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
6289
6290 // 0xe implies support for half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006291 Builder.defineMacro("__ARM_FP", "0xE");
Tim Northovera2ee4332014-03-29 15:09:45 +00006292
6293 // PCS specifies this for SysV variants, which is all we support. Other ABIs
6294 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006295 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
6296 Builder.defineMacro("__ARM_FP16_ARGS", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00006297
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00006298 if (Opts.UnsafeFPMath)
6299 Builder.defineMacro("__ARM_FP_FAST", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00006300
6301 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
6302
6303 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
6304 Opts.ShortEnums ? "1" : "4");
6305
James Molloy75f5f9e2014-04-16 15:33:48 +00006306 if (FPU == NeonMode) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006307 Builder.defineMacro("__ARM_NEON", "1");
James Molloy75f5f9e2014-04-16 15:33:48 +00006308 // 64-bit NEON supports half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006309 Builder.defineMacro("__ARM_NEON_FP", "0xE");
James Molloy75f5f9e2014-04-16 15:33:48 +00006310 }
Tim Northovera2ee4332014-03-29 15:09:45 +00006311
Bradley Smith418c5932014-05-02 15:17:51 +00006312 if (CRC)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006313 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
Bradley Smith418c5932014-05-02 15:17:51 +00006314
James Molloy75f5f9e2014-04-16 15:33:48 +00006315 if (Crypto)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006316 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
6317
6318 if (Unaligned)
6319 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Reid Klecknerd167d422015-05-06 15:31:46 +00006320
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00006321 if (V8_1A)
6322 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
Abderrazek Zaafranif10ca932017-06-20 18:54:57 +00006323 if (V8_2A && FPU == NeonMode && HasFullFP16)
6324 Builder.defineMacro("__ARM_FEATURE_FP16_VECTOR_ARITHMETIC", "1");
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00006325
Reid Klecknerd167d422015-05-06 15:31:46 +00006326 // All of the __sync_(bool|val)_compare_and_swap_(1|2|4|8) builtins work.
6327 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
6328 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
6329 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
6330 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Tim Northovera2ee4332014-03-29 15:09:45 +00006331 }
6332
Craig Topper6c03a542015-10-19 04:51:35 +00006333 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6334 return llvm::makeArrayRef(BuiltinInfo,
6335 clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin);
Tim Northovera2ee4332014-03-29 15:09:45 +00006336 }
6337
David Blaikie1cbb9712014-11-14 19:09:44 +00006338 bool hasFeature(StringRef Feature) const override {
James Molloy75f5f9e2014-04-16 15:33:48 +00006339 return Feature == "aarch64" ||
6340 Feature == "arm64" ||
Ben Langmuir587aeaf2015-08-07 01:59:56 +00006341 Feature == "arm" ||
James Molloy75f5f9e2014-04-16 15:33:48 +00006342 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00006343 }
6344
James Molloy5e73df52014-04-16 15:06:20 +00006345 bool handleTargetFeatures(std::vector<std::string> &Features,
6346 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00006347 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00006348 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00006349 Crypto = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006350 Unaligned = 1;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00006351 V8_1A = 0;
Abderrazek Zaafranif10ca932017-06-20 18:54:57 +00006352 V8_2A = 0;
6353 HasFullFP16 = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006354
Eric Christopher610fe112015-08-26 08:21:55 +00006355 for (const auto &Feature : Features) {
6356 if (Feature == "+neon")
James Molloy75f5f9e2014-04-16 15:33:48 +00006357 FPU = NeonMode;
Eric Christopher610fe112015-08-26 08:21:55 +00006358 if (Feature == "+crc")
Bradley Smith418c5932014-05-02 15:17:51 +00006359 CRC = 1;
Eric Christopher610fe112015-08-26 08:21:55 +00006360 if (Feature == "+crypto")
James Molloy75f5f9e2014-04-16 15:33:48 +00006361 Crypto = 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006362 if (Feature == "+strict-align")
6363 Unaligned = 0;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00006364 if (Feature == "+v8.1a")
6365 V8_1A = 1;
Abderrazek Zaafranif10ca932017-06-20 18:54:57 +00006366 if (Feature == "+v8.2a")
6367 V8_2A = 1;
6368 if (Feature == "+fullfp16")
6369 HasFullFP16 = 1;
James Molloy75f5f9e2014-04-16 15:33:48 +00006370 }
6371
James Y Knightb214cbc2016-03-04 19:00:41 +00006372 setDataLayout();
James Molloy5e73df52014-04-16 15:06:20 +00006373
6374 return true;
6375 }
6376
John McCall477f2bb2016-03-03 06:39:32 +00006377 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
6378 switch (CC) {
6379 case CC_C:
6380 case CC_Swift:
Roman Levenstein35aa5ce2016-03-16 18:00:46 +00006381 case CC_PreserveMost:
6382 case CC_PreserveAll:
Pekka Jaaskelainenfc2629a2017-06-01 07:18:49 +00006383 case CC_OpenCLKernel:
John McCall477f2bb2016-03-03 06:39:32 +00006384 return CCCR_OK;
6385 default:
6386 return CCCR_Warning;
6387 }
6388 }
6389
David Blaikie1cbb9712014-11-14 19:09:44 +00006390 bool isCLZForZeroUndef() const override { return false; }
Tim Northovera2ee4332014-03-29 15:09:45 +00006391
David Blaikie1cbb9712014-11-14 19:09:44 +00006392 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006393 return TargetInfo::AArch64ABIBuiltinVaList;
6394 }
6395
Craig Topperf054e3a2015-10-19 03:52:27 +00006396 ArrayRef<const char *> getGCCRegNames() const override;
6397 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00006398
Alexander Kornienko34eb2072015-04-11 02:00:23 +00006399 bool validateAsmConstraint(const char *&Name,
6400 TargetInfo::ConstraintInfo &Info) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006401 switch (*Name) {
6402 default:
6403 return false;
6404 case 'w': // Floating point and SIMD registers (V0-V31)
6405 Info.setAllowsRegister();
6406 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00006407 case 'I': // Constant that can be used with an ADD instruction
6408 case 'J': // Constant that can be used with a SUB instruction
6409 case 'K': // Constant that can be used with a 32-bit logical instruction
6410 case 'L': // Constant that can be used with a 64-bit logical instruction
6411 case 'M': // Constant that can be used as a 32-bit MOV immediate
6412 case 'N': // Constant that can be used as a 64-bit MOV immediate
6413 case 'Y': // Floating point constant zero
6414 case 'Z': // Integer constant zero
6415 return true;
6416 case 'Q': // A memory reference with base register and no offset
6417 Info.setAllowsMemory();
6418 return true;
6419 case 'S': // A symbolic address
6420 Info.setAllowsRegister();
6421 return true;
6422 case 'U':
Eric Christopher917e9522014-11-18 22:36:15 +00006423 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
6424 // Utf: A memory address suitable for ldp/stp in TF mode.
6425 // Usa: An absolute symbolic address.
6426 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
6427 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
Tim Northovera2ee4332014-03-29 15:09:45 +00006428 case 'z': // Zero register, wzr or xzr
6429 Info.setAllowsRegister();
6430 return true;
6431 case 'x': // Floating point and SIMD registers (V0-V15)
6432 Info.setAllowsRegister();
6433 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00006434 }
6435 return false;
6436 }
6437
Akira Hatanaka987f1862014-08-22 06:05:21 +00006438 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00006439 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00006440 std::string &SuggestedModifier) const override {
James Molloy8a157bf2014-07-25 10:19:47 +00006441 // Strip off constraint modifiers.
6442 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
6443 Constraint = Constraint.substr(1);
6444
6445 switch (Constraint[0]) {
6446 default:
6447 return true;
6448 case 'z':
6449 case 'r': {
6450 switch (Modifier) {
6451 case 'x':
6452 case 'w':
6453 // For now assume that the person knows what they're
6454 // doing with the modifier.
6455 return true;
6456 default:
6457 // By default an 'r' constraint will be in the 'x'
6458 // registers.
Akira Hatanaka987f1862014-08-22 06:05:21 +00006459 if (Size == 64)
6460 return true;
6461
6462 SuggestedModifier = "w";
6463 return false;
James Molloy8a157bf2014-07-25 10:19:47 +00006464 }
6465 }
6466 }
6467 }
6468
David Blaikie1cbb9712014-11-14 19:09:44 +00006469 const char *getClobbers() const override { return ""; }
Tim Northovera2ee4332014-03-29 15:09:45 +00006470
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00006471 int getEHDataRegisterNumber(unsigned RegNo) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006472 if (RegNo == 0)
6473 return 0;
6474 if (RegNo == 1)
6475 return 1;
6476 return -1;
6477 }
6478};
6479
Tim Northover573cbee2014-05-24 12:52:07 +00006480const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00006481 // 32-bit Integer registers
6482 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
6483 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
6484 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
6485
6486 // 64-bit Integer registers
6487 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
6488 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
6489 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
6490
6491 // 32-bit floating point regsisters
6492 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
6493 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
6494 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
6495
6496 // 64-bit floating point regsisters
6497 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
6498 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
6499 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
6500
6501 // Vector registers
6502 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
6503 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
6504 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
6505};
6506
Craig Topperf054e3a2015-10-19 03:52:27 +00006507ArrayRef<const char *> AArch64TargetInfo::getGCCRegNames() const {
6508 return llvm::makeArrayRef(GCCRegNames);
Tim Northovera2ee4332014-03-29 15:09:45 +00006509}
6510
Tim Northover573cbee2014-05-24 12:52:07 +00006511const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00006512 { { "w31" }, "wsp" },
6513 { { "x29" }, "fp" },
6514 { { "x30" }, "lr" },
6515 { { "x31" }, "sp" },
6516 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
6517 // don't want to substitute one of these for a different-sized one.
6518};
6519
Craig Topperf054e3a2015-10-19 03:52:27 +00006520ArrayRef<TargetInfo::GCCRegAlias> AArch64TargetInfo::getGCCRegAliases() const {
6521 return llvm::makeArrayRef(GCCRegAliases);
Tim Northovera2ee4332014-03-29 15:09:45 +00006522}
6523
Tim Northover573cbee2014-05-24 12:52:07 +00006524const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00006525#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006526 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00006527#include "clang/Basic/BuiltinsNEON.def"
6528
6529#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006530 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northover573cbee2014-05-24 12:52:07 +00006531#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00006532};
James Molloy5e73df52014-04-16 15:06:20 +00006533
Tim Northover573cbee2014-05-24 12:52:07 +00006534class AArch64leTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00006535 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00006536 if (getTriple().isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00006537 resetDataLayout("e-m:o-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006538 else
Chad Rosier4c077aa2016-07-07 20:02:25 +00006539 resetDataLayout("e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006540 }
6541
6542public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006543 AArch64leTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6544 : AArch64TargetInfo(Triple, Opts) {
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006545 }
James Molloy5e73df52014-04-16 15:06:20 +00006546 void getTargetDefines(const LangOptions &Opts,
6547 MacroBuilder &Builder) const override {
6548 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00006549 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00006550 }
6551};
6552
Tim Northover573cbee2014-05-24 12:52:07 +00006553class AArch64beTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00006554 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00006555 assert(!getTriple().isOSBinFormatMachO());
Chad Rosier4c077aa2016-07-07 20:02:25 +00006556 resetDataLayout("E-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006557 }
6558
6559public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006560 AArch64beTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6561 : AArch64TargetInfo(Triple, Opts) {}
James Molloy5e73df52014-04-16 15:06:20 +00006562 void getTargetDefines(const LangOptions &Opts,
6563 MacroBuilder &Builder) const override {
6564 Builder.defineMacro("__AARCH64EB__");
6565 Builder.defineMacro("__AARCH_BIG_ENDIAN");
6566 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00006567 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00006568 }
6569};
Tim Northovera2ee4332014-03-29 15:09:45 +00006570
Tim Northover573cbee2014-05-24 12:52:07 +00006571class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00006572protected:
6573 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
6574 MacroBuilder &Builder) const override {
6575 Builder.defineMacro("__AARCH64_SIMD__");
6576 Builder.defineMacro("__ARM64_ARCH_8__");
6577 Builder.defineMacro("__ARM_NEON__");
6578 Builder.defineMacro("__LITTLE_ENDIAN__");
6579 Builder.defineMacro("__REGISTER_PREFIX__", "");
6580 Builder.defineMacro("__arm64", "1");
6581 Builder.defineMacro("__arm64__", "1");
6582
6583 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
6584 }
6585
Tim Northovera2ee4332014-03-29 15:09:45 +00006586public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006587 DarwinAArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6588 : DarwinTargetInfo<AArch64leTargetInfo>(Triple, Opts) {
Tim Northovera2ee4332014-03-29 15:09:45 +00006589 Int64Type = SignedLongLong;
6590 WCharType = SignedInt;
6591 UseSignedCharForObjCBool = false;
6592
Tim Northovera6a19f12015-02-06 01:25:07 +00006593 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00006594 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Tim Northovera2ee4332014-03-29 15:09:45 +00006595
6596 TheCXXABI.set(TargetCXXABI::iOS64);
6597 }
6598
David Blaikie1cbb9712014-11-14 19:09:44 +00006599 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006600 return TargetInfo::CharPtrBuiltinVaList;
6601 }
6602};
Tim Northovera2ee4332014-03-29 15:09:45 +00006603
Tony Linthicum76329bf2011-12-12 21:14:55 +00006604// Hexagon abstract base class
6605class HexagonTargetInfo : public TargetInfo {
6606 static const Builtin::Info BuiltinInfo[];
6607 static const char * const GCCRegNames[];
6608 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6609 std::string CPU;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006610 bool HasHVX, HasHVXDouble;
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006611 bool UseLongCalls;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006612
Tony Linthicum76329bf2011-12-12 21:14:55 +00006613public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006614 HexagonTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6615 : TargetInfo(Triple) {
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00006616 // Specify the vector alignment explicitly. For v512x1, the calculated
6617 // alignment would be 512*alignment(i1), which is 512 bytes, instead of
6618 // the required minimum of 64 bytes.
James Y Knightb214cbc2016-03-04 19:00:41 +00006619 resetDataLayout("e-m:e-p:32:32:32-a:0-n16:32-"
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00006620 "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 +00006621 "v32:32:32-v64:64:64-v512:512:512-v1024:1024:1024-v2048:2048:2048");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006622 SizeType = UnsignedInt;
6623 PtrDiffType = SignedInt;
6624 IntPtrType = SignedInt;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006625
6626 // {} in inline assembly are packet specifiers, not assembly variant
6627 // specifiers.
6628 NoAsmVariants = true;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006629
6630 LargeArrayMinWidth = 64;
6631 LargeArrayAlign = 64;
6632 UseBitFieldTypeAlignment = true;
6633 ZeroLengthBitfieldBoundary = 32;
6634 HasHVX = HasHVXDouble = false;
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006635 UseLongCalls = false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006636 }
6637
Craig Topper6c03a542015-10-19 04:51:35 +00006638 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6639 return llvm::makeArrayRef(BuiltinInfo,
6640 clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006641 }
6642
Craig Topper3164f332014-03-11 03:39:26 +00006643 bool validateAsmConstraint(const char *&Name,
6644 TargetInfo::ConstraintInfo &Info) const override {
Krzysztof Parzyszeke0026e42016-05-18 14:56:14 +00006645 switch (*Name) {
6646 case 'v':
6647 case 'q':
6648 if (HasHVX) {
6649 Info.setAllowsRegister();
6650 return true;
6651 }
6652 break;
Krzysztof Parzyszek89fb4412016-05-20 13:50:32 +00006653 case 's':
6654 // Relocatable constant.
6655 return true;
Krzysztof Parzyszeke0026e42016-05-18 14:56:14 +00006656 }
6657 return false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006658 }
6659
Craig Topper3164f332014-03-11 03:39:26 +00006660 void getTargetDefines(const LangOptions &Opts,
6661 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006662
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006663 bool isCLZForZeroUndef() const override { return false; }
6664
Craig Topper3164f332014-03-11 03:39:26 +00006665 bool hasFeature(StringRef Feature) const override {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006666 return llvm::StringSwitch<bool>(Feature)
6667 .Case("hexagon", true)
6668 .Case("hvx", HasHVX)
6669 .Case("hvx-double", HasHVXDouble)
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006670 .Case("long-calls", UseLongCalls)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006671 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006672 }
Craig Topper3164f332014-03-11 03:39:26 +00006673
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006674 bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6675 StringRef CPU, const std::vector<std::string> &FeaturesVec)
6676 const override;
6677
6678 bool handleTargetFeatures(std::vector<std::string> &Features,
6679 DiagnosticsEngine &Diags) override;
6680
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006681 void setFeatureEnabled(llvm::StringMap<bool> &Features, StringRef Name,
6682 bool Enabled) const override;
6683
Craig Topper3164f332014-03-11 03:39:26 +00006684 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006685 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006686 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006687 ArrayRef<const char *> getGCCRegNames() const override;
6688 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00006689 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006690 return "";
6691 }
Sebastian Pop86500282012-01-13 20:37:10 +00006692
6693 static const char *getHexagonCPUSuffix(StringRef Name) {
6694 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00006695 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006696 .Case("hexagonv5", "5")
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006697 .Case("hexagonv55", "55")
6698 .Case("hexagonv60", "60")
Krzysztof Parzyszekff7f6672017-03-14 20:29:23 +00006699 .Case("hexagonv62", "62")
Craig Topperf1186c52014-05-08 06:41:40 +00006700 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00006701 }
6702
Craig Topper3164f332014-03-11 03:39:26 +00006703 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00006704 if (!getHexagonCPUSuffix(Name))
6705 return false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006706 CPU = Name;
6707 return true;
6708 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006709
6710 int getEHDataRegisterNumber(unsigned RegNo) const override {
6711 return RegNo < 2 ? RegNo : -1;
6712 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006713};
6714
6715void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006716 MacroBuilder &Builder) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006717 Builder.defineMacro("__qdsp6__", "1");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006718 Builder.defineMacro("__hexagon__", "1");
6719
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006720 if (CPU == "hexagonv4") {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006721 Builder.defineMacro("__HEXAGON_V4__");
6722 Builder.defineMacro("__HEXAGON_ARCH__", "4");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006723 if (Opts.HexagonQdsp6Compat) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006724 Builder.defineMacro("__QDSP6_V4__");
6725 Builder.defineMacro("__QDSP6_ARCH__", "4");
6726 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006727 } else if (CPU == "hexagonv5") {
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006728 Builder.defineMacro("__HEXAGON_V5__");
6729 Builder.defineMacro("__HEXAGON_ARCH__", "5");
6730 if(Opts.HexagonQdsp6Compat) {
6731 Builder.defineMacro("__QDSP6_V5__");
6732 Builder.defineMacro("__QDSP6_ARCH__", "5");
6733 }
Krzysztof Parzyszeka58ff512016-04-21 14:30:04 +00006734 } else if (CPU == "hexagonv55") {
6735 Builder.defineMacro("__HEXAGON_V55__");
6736 Builder.defineMacro("__HEXAGON_ARCH__", "55");
6737 Builder.defineMacro("__QDSP6_V55__");
6738 Builder.defineMacro("__QDSP6_ARCH__", "55");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006739 } else if (CPU == "hexagonv60") {
6740 Builder.defineMacro("__HEXAGON_V60__");
6741 Builder.defineMacro("__HEXAGON_ARCH__", "60");
6742 Builder.defineMacro("__QDSP6_V60__");
6743 Builder.defineMacro("__QDSP6_ARCH__", "60");
Krzysztof Parzyszekff7f6672017-03-14 20:29:23 +00006744 } else if (CPU == "hexagonv62") {
6745 Builder.defineMacro("__HEXAGON_V62__");
6746 Builder.defineMacro("__HEXAGON_ARCH__", "62");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006747 }
Krzysztof Parzyszek7f0756c2016-04-18 18:38:11 +00006748
6749 if (hasFeature("hvx")) {
6750 Builder.defineMacro("__HVX__");
6751 if (hasFeature("hvx-double"))
6752 Builder.defineMacro("__HVXDBL__");
6753 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006754}
6755
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006756bool HexagonTargetInfo::initFeatureMap(llvm::StringMap<bool> &Features,
6757 DiagnosticsEngine &Diags, StringRef CPU,
6758 const std::vector<std::string> &FeaturesVec) const {
6759 // Default for v60: -hvx, -hvx-double.
6760 Features["hvx"] = false;
6761 Features["hvx-double"] = false;
6762 Features["long-calls"] = false;
6763
6764 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
6765}
6766
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006767bool HexagonTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
6768 DiagnosticsEngine &Diags) {
6769 for (auto &F : Features) {
6770 if (F == "+hvx")
6771 HasHVX = true;
6772 else if (F == "-hvx")
6773 HasHVX = HasHVXDouble = false;
6774 else if (F == "+hvx-double")
6775 HasHVX = HasHVXDouble = true;
6776 else if (F == "-hvx-double")
6777 HasHVXDouble = false;
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006778
6779 if (F == "+long-calls")
6780 UseLongCalls = true;
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006781 else if (F == "-long-calls")
6782 UseLongCalls = false;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006783 }
6784 return true;
6785}
6786
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006787void HexagonTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
6788 StringRef Name, bool Enabled) const {
6789 if (Enabled) {
6790 if (Name == "hvx-double")
6791 Features["hvx"] = true;
6792 } else {
6793 if (Name == "hvx")
6794 Features["hvx-double"] = false;
6795 }
6796 Features[Name] = Enabled;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006797}
6798
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006799const char *const HexagonTargetInfo::GCCRegNames[] = {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006800 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6801 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6802 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6803 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
6804 "p0", "p1", "p2", "p3",
6805 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
6806};
6807
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006808ArrayRef<const char*> HexagonTargetInfo::getGCCRegNames() const {
Craig Topperf054e3a2015-10-19 03:52:27 +00006809 return llvm::makeArrayRef(GCCRegNames);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006810}
6811
Tony Linthicum76329bf2011-12-12 21:14:55 +00006812const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
6813 { { "sp" }, "r29" },
6814 { { "fp" }, "r30" },
6815 { { "lr" }, "r31" },
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006816};
Tony Linthicum76329bf2011-12-12 21:14:55 +00006817
Craig Topperf054e3a2015-10-19 03:52:27 +00006818ArrayRef<TargetInfo::GCCRegAlias> HexagonTargetInfo::getGCCRegAliases() const {
6819 return llvm::makeArrayRef(GCCRegAliases);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006820}
6821
6822
6823const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00006824#define BUILTIN(ID, TYPE, ATTRS) \
6825 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
6826#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
6827 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tony Linthicum76329bf2011-12-12 21:14:55 +00006828#include "clang/Basic/BuiltinsHexagon.def"
6829};
Tony Linthicum76329bf2011-12-12 21:14:55 +00006830
Jacques Pienaard964cc22016-03-28 21:02:54 +00006831class LanaiTargetInfo : public TargetInfo {
6832 // Class for Lanai (32-bit).
6833 // The CPU profiles supported by the Lanai backend
6834 enum CPUKind {
6835 CK_NONE,
6836 CK_V11,
6837 } CPU;
6838
6839 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6840 static const char *const GCCRegNames[];
6841
6842public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006843 LanaiTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6844 : TargetInfo(Triple) {
Jacques Pienaard964cc22016-03-28 21:02:54 +00006845 // Description string has to be kept in sync with backend.
6846 resetDataLayout("E" // Big endian
6847 "-m:e" // ELF name manging
6848 "-p:32:32" // 32 bit pointers, 32 bit aligned
6849 "-i64:64" // 64 bit integers, 64 bit aligned
6850 "-a:0:32" // 32 bit alignment of objects of aggregate type
6851 "-n32" // 32 bit native integer width
6852 "-S64" // 64 bit natural stack alignment
6853 );
6854
6855 // Setting RegParmMax equal to what mregparm was set to in the old
6856 // toolchain
6857 RegParmMax = 4;
6858
6859 // Set the default CPU to V11
6860 CPU = CK_V11;
6861
6862 // Temporary approach to make everything at least word-aligned and allow for
6863 // safely casting between pointers with different alignment requirements.
6864 // TODO: Remove this when there are no more cast align warnings on the
6865 // firmware.
6866 MinGlobalAlign = 32;
6867 }
6868
6869 void getTargetDefines(const LangOptions &Opts,
6870 MacroBuilder &Builder) const override {
6871 // Define __lanai__ when building for target lanai.
6872 Builder.defineMacro("__lanai__");
6873
6874 // Set define for the CPU specified.
6875 switch (CPU) {
6876 case CK_V11:
6877 Builder.defineMacro("__LANAI_V11__");
6878 break;
6879 case CK_NONE:
6880 llvm_unreachable("Unhandled target CPU");
6881 }
6882 }
6883
6884 bool setCPU(const std::string &Name) override {
6885 CPU = llvm::StringSwitch<CPUKind>(Name)
6886 .Case("v11", CK_V11)
6887 .Default(CK_NONE);
6888
6889 return CPU != CK_NONE;
6890 }
6891
6892 bool hasFeature(StringRef Feature) const override {
6893 return llvm::StringSwitch<bool>(Feature).Case("lanai", true).Default(false);
6894 }
6895
6896 ArrayRef<const char *> getGCCRegNames() const override;
6897
6898 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
6899
6900 BuiltinVaListKind getBuiltinVaListKind() const override {
6901 return TargetInfo::VoidPtrBuiltinVaList;
6902 }
6903
6904 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
6905
6906 bool validateAsmConstraint(const char *&Name,
6907 TargetInfo::ConstraintInfo &info) const override {
6908 return false;
6909 }
6910
6911 const char *getClobbers() const override { return ""; }
6912};
6913
6914const char *const LanaiTargetInfo::GCCRegNames[] = {
6915 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10",
6916 "r11", "r12", "r13", "r14", "r15", "r16", "r17", "r18", "r19", "r20", "r21",
6917 "r22", "r23", "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"};
6918
6919ArrayRef<const char *> LanaiTargetInfo::getGCCRegNames() const {
6920 return llvm::makeArrayRef(GCCRegNames);
6921}
6922
6923const TargetInfo::GCCRegAlias LanaiTargetInfo::GCCRegAliases[] = {
6924 {{"pc"}, "r2"},
6925 {{"sp"}, "r4"},
6926 {{"fp"}, "r5"},
6927 {{"rv"}, "r8"},
6928 {{"rr1"}, "r10"},
6929 {{"rr2"}, "r11"},
6930 {{"rca"}, "r15"},
6931};
6932
6933ArrayRef<TargetInfo::GCCRegAlias> LanaiTargetInfo::getGCCRegAliases() const {
6934 return llvm::makeArrayRef(GCCRegAliases);
6935}
6936
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006937// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
6938class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00006939 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6940 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006941 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00006942public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006943 SparcTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
James Y Knighta3518ad2016-01-27 01:04:51 +00006944 : TargetInfo(Triple), SoftFloat(false) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006945
Joerg Sonnenbergerd0be8dc2016-03-07 17:19:15 +00006946 int getEHDataRegisterNumber(unsigned RegNo) const override {
6947 if (RegNo == 0) return 24;
6948 if (RegNo == 1) return 25;
6949 return -1;
6950 }
6951
Craig Topper3164f332014-03-11 03:39:26 +00006952 bool handleTargetFeatures(std::vector<std::string> &Features,
6953 DiagnosticsEngine &Diags) override {
Jacob Baungard Hansen13a49372016-05-24 08:30:08 +00006954 // Check if software floating point is enabled
Eric Christopherfb481a42015-04-29 23:32:17 +00006955 auto Feature = std::find(Features.begin(), Features.end(), "+soft-float");
6956 if (Feature != Features.end()) {
6957 SoftFloat = true;
Eric Christopherfb481a42015-04-29 23:32:17 +00006958 }
Rafael Espindolaeb265472013-08-21 21:59:03 +00006959 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006960 }
Craig Topper3164f332014-03-11 03:39:26 +00006961 void getTargetDefines(const LangOptions &Opts,
6962 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006963 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006964 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006965
6966 if (SoftFloat)
6967 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00006968 }
Craig Topper3164f332014-03-11 03:39:26 +00006969
6970 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006971 return llvm::StringSwitch<bool>(Feature)
6972 .Case("softfloat", SoftFloat)
6973 .Case("sparc", true)
6974 .Default(false);
6975 }
Craig Topper3164f332014-03-11 03:39:26 +00006976
Chris Dewhurst0381cd72016-06-15 12:44:47 +00006977 bool hasSjLjLowering() const override {
6978 return true;
6979 }
6980
Craig Topper6c03a542015-10-19 04:51:35 +00006981 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006982 // FIXME: Implement!
Craig Topper6c03a542015-10-19 04:51:35 +00006983 return None;
Gabor Greif49991682008-02-21 16:29:08 +00006984 }
Craig Topper3164f332014-03-11 03:39:26 +00006985 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006986 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00006987 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006988 ArrayRef<const char *> getGCCRegNames() const override;
6989 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00006990 bool validateAsmConstraint(const char *&Name,
6991 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006992 // FIXME: Implement!
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00006993 switch (*Name) {
6994 case 'I': // Signed 13-bit constant
6995 case 'J': // Zero
6996 case 'K': // 32-bit constant with the low 12 bits clear
6997 case 'L': // A constant in the range supported by movcc (11-bit signed imm)
6998 case 'M': // A constant in the range supported by movrcc (19-bit signed imm)
6999 case 'N': // Same as 'K' but zext (required for SIMode)
7000 case 'O': // The constant 4096
7001 return true;
James Y Knighteb96e442017-05-12 16:01:23 +00007002
7003 case 'f':
7004 case 'e':
7005 info.setAllowsRegister();
7006 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00007007 }
Eli Friedmanda8f5a92008-08-20 07:28:14 +00007008 return false;
Gabor Greif49991682008-02-21 16:29:08 +00007009 }
Craig Topper3164f332014-03-11 03:39:26 +00007010 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00007011 // FIXME: Implement!
7012 return "";
Gabor Greif49991682008-02-21 16:29:08 +00007013 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00007014
7015 // No Sparc V7 for now, the backend doesn't support it anyway.
7016 enum CPUKind {
7017 CK_GENERIC,
7018 CK_V8,
7019 CK_SUPERSPARC,
7020 CK_SPARCLITE,
7021 CK_F934,
7022 CK_HYPERSPARC,
7023 CK_SPARCLITE86X,
7024 CK_SPARCLET,
7025 CK_TSC701,
7026 CK_V9,
7027 CK_ULTRASPARC,
7028 CK_ULTRASPARC3,
7029 CK_NIAGARA,
7030 CK_NIAGARA2,
7031 CK_NIAGARA3,
Douglas Katzman6871afc2016-03-15 22:34:02 +00007032 CK_NIAGARA4,
Douglas Katzman87da5f42016-07-25 16:36:02 +00007033 CK_MYRIAD2100,
7034 CK_MYRIAD2150,
7035 CK_MYRIAD2450,
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00007036 CK_LEON2,
7037 CK_LEON2_AT697E,
7038 CK_LEON2_AT697F,
7039 CK_LEON3,
7040 CK_LEON3_UT699,
7041 CK_LEON3_GR712RC,
7042 CK_LEON4,
7043 CK_LEON4_GR740
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00007044 } CPU = CK_GENERIC;
7045
7046 enum CPUGeneration {
7047 CG_V8,
7048 CG_V9,
7049 };
7050
7051 CPUGeneration getCPUGeneration(CPUKind Kind) const {
7052 switch (Kind) {
7053 case CK_GENERIC:
7054 case CK_V8:
7055 case CK_SUPERSPARC:
7056 case CK_SPARCLITE:
7057 case CK_F934:
7058 case CK_HYPERSPARC:
7059 case CK_SPARCLITE86X:
7060 case CK_SPARCLET:
7061 case CK_TSC701:
Douglas Katzman87da5f42016-07-25 16:36:02 +00007062 case CK_MYRIAD2100:
7063 case CK_MYRIAD2150:
7064 case CK_MYRIAD2450:
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00007065 case CK_LEON2:
7066 case CK_LEON2_AT697E:
7067 case CK_LEON2_AT697F:
7068 case CK_LEON3:
7069 case CK_LEON3_UT699:
7070 case CK_LEON3_GR712RC:
7071 case CK_LEON4:
7072 case CK_LEON4_GR740:
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00007073 return CG_V8;
7074 case CK_V9:
7075 case CK_ULTRASPARC:
7076 case CK_ULTRASPARC3:
7077 case CK_NIAGARA:
7078 case CK_NIAGARA2:
7079 case CK_NIAGARA3:
7080 case CK_NIAGARA4:
7081 return CG_V9;
7082 }
Aaron Ballmana9a72852015-11-11 13:42:02 +00007083 llvm_unreachable("Unexpected CPU kind");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00007084 }
7085
7086 CPUKind getCPUKind(StringRef Name) const {
7087 return llvm::StringSwitch<CPUKind>(Name)
7088 .Case("v8", CK_V8)
7089 .Case("supersparc", CK_SUPERSPARC)
7090 .Case("sparclite", CK_SPARCLITE)
7091 .Case("f934", CK_F934)
7092 .Case("hypersparc", CK_HYPERSPARC)
7093 .Case("sparclite86x", CK_SPARCLITE86X)
7094 .Case("sparclet", CK_SPARCLET)
7095 .Case("tsc701", CK_TSC701)
7096 .Case("v9", CK_V9)
7097 .Case("ultrasparc", CK_ULTRASPARC)
7098 .Case("ultrasparc3", CK_ULTRASPARC3)
7099 .Case("niagara", CK_NIAGARA)
7100 .Case("niagara2", CK_NIAGARA2)
7101 .Case("niagara3", CK_NIAGARA3)
7102 .Case("niagara4", CK_NIAGARA4)
Douglas Katzman87da5f42016-07-25 16:36:02 +00007103 .Case("ma2100", CK_MYRIAD2100)
7104 .Case("ma2150", CK_MYRIAD2150)
7105 .Case("ma2450", CK_MYRIAD2450)
7106 // FIXME: the myriad2[.n] spellings are obsolete,
7107 // but a grace period is needed to allow updating dependent builds.
7108 .Case("myriad2", CK_MYRIAD2100)
7109 .Case("myriad2.1", CK_MYRIAD2100)
7110 .Case("myriad2.2", CK_MYRIAD2150)
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00007111 .Case("leon2", CK_LEON2)
7112 .Case("at697e", CK_LEON2_AT697E)
7113 .Case("at697f", CK_LEON2_AT697F)
7114 .Case("leon3", CK_LEON3)
7115 .Case("ut699", CK_LEON3_UT699)
7116 .Case("gr712rc", CK_LEON3_GR712RC)
7117 .Case("leon4", CK_LEON4)
7118 .Case("gr740", CK_LEON4_GR740)
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00007119 .Default(CK_GENERIC);
7120 }
7121
7122 bool setCPU(const std::string &Name) override {
7123 CPU = getCPUKind(Name);
7124 return CPU != CK_GENERIC;
7125 }
Gabor Greif49991682008-02-21 16:29:08 +00007126};
7127
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007128const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00007129 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
7130 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
7131 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
7132 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
7133};
7134
Craig Topperf054e3a2015-10-19 03:52:27 +00007135ArrayRef<const char *> SparcTargetInfo::getGCCRegNames() const {
7136 return llvm::makeArrayRef(GCCRegNames);
Chris Lattner9b415d62009-01-27 01:58:38 +00007137}
7138
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007139const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00007140 { { "g0" }, "r0" },
7141 { { "g1" }, "r1" },
7142 { { "g2" }, "r2" },
7143 { { "g3" }, "r3" },
7144 { { "g4" }, "r4" },
7145 { { "g5" }, "r5" },
7146 { { "g6" }, "r6" },
7147 { { "g7" }, "r7" },
7148 { { "o0" }, "r8" },
7149 { { "o1" }, "r9" },
7150 { { "o2" }, "r10" },
7151 { { "o3" }, "r11" },
7152 { { "o4" }, "r12" },
7153 { { "o5" }, "r13" },
7154 { { "o6", "sp" }, "r14" },
7155 { { "o7" }, "r15" },
7156 { { "l0" }, "r16" },
7157 { { "l1" }, "r17" },
7158 { { "l2" }, "r18" },
7159 { { "l3" }, "r19" },
7160 { { "l4" }, "r20" },
7161 { { "l5" }, "r21" },
7162 { { "l6" }, "r22" },
7163 { { "l7" }, "r23" },
7164 { { "i0" }, "r24" },
7165 { { "i1" }, "r25" },
7166 { { "i2" }, "r26" },
7167 { { "i3" }, "r27" },
7168 { { "i4" }, "r28" },
7169 { { "i5" }, "r29" },
7170 { { "i6", "fp" }, "r30" },
7171 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00007172};
7173
Craig Topperf054e3a2015-10-19 03:52:27 +00007174ArrayRef<TargetInfo::GCCRegAlias> SparcTargetInfo::getGCCRegAliases() const {
7175 return llvm::makeArrayRef(GCCRegAliases);
Chris Lattner9b415d62009-01-27 01:58:38 +00007176}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007177
7178// SPARC v8 is the 32-bit mode selected by Triple::sparc.
7179class SparcV8TargetInfo : public SparcTargetInfo {
7180public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007181 SparcV8TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7182 : SparcTargetInfo(Triple, Opts) {
James Y Knightb214cbc2016-03-04 19:00:41 +00007183 resetDataLayout("E-m:e-p:32:32-i64:64-f128:64-n32-S64");
Brad Smith73859112015-08-13 21:45:57 +00007184 // NetBSD / OpenBSD use long (same as llvm default); everyone else uses int.
7185 switch (getTriple().getOS()) {
7186 default:
James Y Knight4b4d19e2015-06-04 15:36:29 +00007187 SizeType = UnsignedInt;
7188 IntPtrType = SignedInt;
7189 PtrDiffType = SignedInt;
Brad Smith73859112015-08-13 21:45:57 +00007190 break;
7191 case llvm::Triple::NetBSD:
7192 case llvm::Triple::OpenBSD:
7193 SizeType = UnsignedLong;
7194 IntPtrType = SignedLong;
7195 PtrDiffType = SignedLong;
7196 break;
Brad Smith56495d52015-08-13 22:00:53 +00007197 }
Douglas Katzman13f4a912016-11-09 15:43:51 +00007198 // Up to 32 bits are lock-free atomic, but we're willing to do atomic ops
7199 // on up to 64 bits.
7200 MaxAtomicPromoteWidth = 64;
7201 MaxAtomicInlineWidth = 32;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007202 }
7203
Craig Topper3164f332014-03-11 03:39:26 +00007204 void getTargetDefines(const LangOptions &Opts,
7205 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007206 SparcTargetInfo::getTargetDefines(Opts, Builder);
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00007207 switch (getCPUGeneration(CPU)) {
7208 case CG_V8:
7209 Builder.defineMacro("__sparcv8");
7210 if (getTriple().getOS() != llvm::Triple::Solaris)
7211 Builder.defineMacro("__sparcv8__");
7212 break;
7213 case CG_V9:
7214 Builder.defineMacro("__sparcv9");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00007215 if (getTriple().getOS() != llvm::Triple::Solaris) {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00007216 Builder.defineMacro("__sparcv9__");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00007217 Builder.defineMacro("__sparc_v9__");
7218 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00007219 break;
7220 }
Douglas Katzman6871afc2016-03-15 22:34:02 +00007221 if (getTriple().getVendor() == llvm::Triple::Myriad) {
Douglas Katzman87da5f42016-07-25 16:36:02 +00007222 std::string MyriadArchValue, Myriad2Value;
7223 Builder.defineMacro("__sparc_v8__");
7224 Builder.defineMacro("__leon__");
Douglas Katzman6871afc2016-03-15 22:34:02 +00007225 switch (CPU) {
Douglas Katzman87da5f42016-07-25 16:36:02 +00007226 case CK_MYRIAD2150:
7227 MyriadArchValue = "__ma2150";
7228 Myriad2Value = "2";
Douglas Katzman6871afc2016-03-15 22:34:02 +00007229 break;
Douglas Katzman87da5f42016-07-25 16:36:02 +00007230 case CK_MYRIAD2450:
7231 MyriadArchValue = "__ma2450";
7232 Myriad2Value = "2";
Douglas Katzman6871afc2016-03-15 22:34:02 +00007233 break;
7234 default:
Douglas Katzman87da5f42016-07-25 16:36:02 +00007235 MyriadArchValue = "__ma2100";
7236 Myriad2Value = "1";
Douglas Katzman6871afc2016-03-15 22:34:02 +00007237 break;
7238 }
Douglas Katzman87da5f42016-07-25 16:36:02 +00007239 Builder.defineMacro(MyriadArchValue, "1");
7240 Builder.defineMacro(MyriadArchValue+"__", "1");
7241 Builder.defineMacro("__myriad2__", Myriad2Value);
7242 Builder.defineMacro("__myriad2", Myriad2Value);
Douglas Katzman6871afc2016-03-15 22:34:02 +00007243 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007244 }
Chris Dewhurst69fa1922016-05-04 09:33:30 +00007245
7246 bool hasSjLjLowering() const override {
7247 return true;
7248 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007249};
7250
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007251// SPARCV8el is the 32-bit little-endian mode selected by Triple::sparcel.
7252class SparcV8elTargetInfo : public SparcV8TargetInfo {
7253 public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007254 SparcV8elTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7255 : SparcV8TargetInfo(Triple, Opts) {
7256 resetDataLayout("e-m:e-p:32:32-i64:64-f128:64-n32-S64");
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007257 }
7258};
7259
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007260// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
7261class SparcV9TargetInfo : public SparcTargetInfo {
7262public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007263 SparcV9TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7264 : SparcTargetInfo(Triple, Opts) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007265 // FIXME: Support Sparc quad-precision long double?
James Y Knightb214cbc2016-03-04 19:00:41 +00007266 resetDataLayout("E-m:e-i64:64-n32:64-S128");
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00007267 // This is an LP64 platform.
7268 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00007269
7270 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00007271 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00007272 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00007273 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00007274 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00007275 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00007276
7277 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
7278 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
7279 LongDoubleWidth = 128;
7280 LongDoubleAlign = 128;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007281 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00007282 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007283 }
7284
Craig Topper3164f332014-03-11 03:39:26 +00007285 void getTargetDefines(const LangOptions &Opts,
7286 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007287 SparcTargetInfo::getTargetDefines(Opts, Builder);
7288 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00007289 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00007290 // Solaris doesn't need these variants, but the BSDs do.
7291 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00007292 Builder.defineMacro("__sparc64__");
7293 Builder.defineMacro("__sparc_v9__");
7294 Builder.defineMacro("__sparcv9__");
7295 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007296 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00007297
Craig Topper3164f332014-03-11 03:39:26 +00007298 bool setCPU(const std::string &Name) override {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00007299 if (!SparcTargetInfo::setCPU(Name))
7300 return false;
7301 return getCPUGeneration(CPU) == CG_V9;
Roman Divackyb1ae3d42014-02-25 18:35:30 +00007302 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007303};
7304
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007305class SystemZTargetInfo : public TargetInfo {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007306 static const Builtin::Info BuiltinInfo[];
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007307 static const char *const GCCRegNames[];
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007308 std::string CPU;
7309 bool HasTransactionalExecution;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007310 bool HasVector;
Ulrich Weigand47445072013-05-06 16:26:41 +00007311
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007312public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007313 SystemZTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Eric Christopherb093d692015-10-09 18:39:59 +00007314 : TargetInfo(Triple), CPU("z10"), HasTransactionalExecution(false),
7315 HasVector(false) {
Ulrich Weigand881497a2015-03-30 13:50:21 +00007316 IntMaxType = SignedLong;
7317 Int64Type = SignedLong;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007318 TLSSupported = true;
7319 IntWidth = IntAlign = 32;
7320 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
7321 PointerWidth = PointerAlign = 64;
7322 LongDoubleWidth = 128;
7323 LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007324 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Ulrich Weigandca3cb7f2015-04-21 17:29:35 +00007325 DefaultAlignForAttributeAligned = 64;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007326 MinGlobalAlign = 16;
James Y Knightb214cbc2016-03-04 19:00:41 +00007327 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 +00007328 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
7329 }
7330 void getTargetDefines(const LangOptions &Opts,
7331 MacroBuilder &Builder) const override {
7332 Builder.defineMacro("__s390__");
7333 Builder.defineMacro("__s390x__");
7334 Builder.defineMacro("__zarch__");
7335 Builder.defineMacro("__LONG_DOUBLE_128__");
Ulrich Weigandb038a522016-02-05 21:34:28 +00007336
Ulrich Weigand82a86cb2017-02-06 17:04:22 +00007337 const std::string ISARev = llvm::StringSwitch<std::string>(CPU)
7338 .Cases("arch8", "z10", "8")
7339 .Cases("arch9", "z196", "9")
7340 .Cases("arch10", "zEC12", "10")
7341 .Cases("arch11", "z13", "11")
7342 .Default("");
7343 if (!ISARev.empty())
7344 Builder.defineMacro("__ARCH__", ISARev);
7345
Ulrich Weigandb038a522016-02-05 21:34:28 +00007346 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
7347 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
7348 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
7349 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
7350
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007351 if (HasTransactionalExecution)
7352 Builder.defineMacro("__HTM__");
Ulrich Weigand82a86cb2017-02-06 17:04:22 +00007353 if (HasVector)
7354 Builder.defineMacro("__VX__");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00007355 if (Opts.ZVector)
7356 Builder.defineMacro("__VEC__", "10301");
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007357 }
Craig Topper6c03a542015-10-19 04:51:35 +00007358 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7359 return llvm::makeArrayRef(BuiltinInfo,
7360 clang::SystemZ::LastTSBuiltin-Builtin::FirstTSBuiltin);
Ulrich Weigand47445072013-05-06 16:26:41 +00007361 }
7362
Craig Topperf054e3a2015-10-19 03:52:27 +00007363 ArrayRef<const char *> getGCCRegNames() const override;
7364 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007365 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00007366 return None;
Ulrich Weigand47445072013-05-06 16:26:41 +00007367 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007368 bool validateAsmConstraint(const char *&Name,
7369 TargetInfo::ConstraintInfo &info) const override;
7370 const char *getClobbers() const override {
7371 // FIXME: Is this really right?
7372 return "";
7373 }
7374 BuiltinVaListKind getBuiltinVaListKind() const override {
7375 return TargetInfo::SystemZBuiltinVaList;
7376 }
7377 bool setCPU(const std::string &Name) override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007378 CPU = Name;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007379 bool CPUKnown = llvm::StringSwitch<bool>(Name)
7380 .Case("z10", true)
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007381 .Case("arch8", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007382 .Case("z196", true)
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007383 .Case("arch9", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007384 .Case("zEC12", true)
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007385 .Case("arch10", true)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007386 .Case("z13", true)
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007387 .Case("arch11", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007388 .Default(false);
7389
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007390 return CPUKnown;
7391 }
Eric Christopher8c47b422015-10-09 18:39:55 +00007392 bool
7393 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7394 StringRef CPU,
7395 const std::vector<std::string> &FeaturesVec) const override {
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007396 if (CPU == "zEC12" || CPU == "arch10")
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007397 Features["transactional-execution"] = true;
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007398 if (CPU == "z13" || CPU == "arch11") {
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007399 Features["transactional-execution"] = true;
7400 Features["vector"] = true;
7401 }
Eric Christopher007b0a02015-08-28 22:32:01 +00007402 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007403 }
7404
7405 bool handleTargetFeatures(std::vector<std::string> &Features,
7406 DiagnosticsEngine &Diags) override {
7407 HasTransactionalExecution = false;
Eric Christopher610fe112015-08-26 08:21:55 +00007408 for (const auto &Feature : Features) {
7409 if (Feature == "+transactional-execution")
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007410 HasTransactionalExecution = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007411 else if (Feature == "+vector")
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007412 HasVector = true;
7413 }
7414 // If we use the vector ABI, vector types are 64-bit aligned.
7415 if (HasVector) {
7416 MaxVectorAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00007417 resetDataLayout("E-m:e-i1:8:16-i8:8:16-i64:64-f128:64"
7418 "-v128:64-a:8:16-n32:64");
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007419 }
7420 return true;
7421 }
7422
7423 bool hasFeature(StringRef Feature) const override {
7424 return llvm::StringSwitch<bool>(Feature)
Ulrich Weigandcc673442015-04-01 14:15:35 +00007425 .Case("systemz", true)
7426 .Case("htm", HasTransactionalExecution)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007427 .Case("vx", HasVector)
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007428 .Default(false);
7429 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007430
Bryan Chane3f1ed52016-04-28 13:56:43 +00007431 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
7432 switch (CC) {
7433 case CC_C:
7434 case CC_Swift:
Pekka Jaaskelainenfc2629a2017-06-01 07:18:49 +00007435 case CC_OpenCLKernel:
Bryan Chane3f1ed52016-04-28 13:56:43 +00007436 return CCCR_OK;
7437 default:
7438 return CCCR_Warning;
7439 }
7440 }
7441
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007442 StringRef getABI() const override {
7443 if (HasVector)
7444 return "vector";
7445 return "";
7446 }
Ulrich Weigand47fd2532015-06-16 15:21:47 +00007447
7448 bool useFloat128ManglingForLongDouble() const override {
7449 return true;
7450 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007451};
7452
7453const Builtin::Info SystemZTargetInfo::BuiltinInfo[] = {
7454#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00007455 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Jonas Paulsson3ace74a2016-03-30 15:51:24 +00007456#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
7457 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007458#include "clang/Basic/BuiltinsSystemZ.def"
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007459};
7460
7461const char *const SystemZTargetInfo::GCCRegNames[] = {
7462 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
7463 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
7464 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
7465 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
7466};
7467
Craig Topperf054e3a2015-10-19 03:52:27 +00007468ArrayRef<const char *> SystemZTargetInfo::getGCCRegNames() const {
7469 return llvm::makeArrayRef(GCCRegNames);
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007470}
7471
7472bool SystemZTargetInfo::
7473validateAsmConstraint(const char *&Name,
7474 TargetInfo::ConstraintInfo &Info) const {
7475 switch (*Name) {
7476 default:
7477 return false;
7478
7479 case 'a': // Address register
7480 case 'd': // Data register (equivalent to 'r')
7481 case 'f': // Floating-point register
7482 Info.setAllowsRegister();
7483 return true;
7484
7485 case 'I': // Unsigned 8-bit constant
7486 case 'J': // Unsigned 12-bit constant
7487 case 'K': // Signed 16-bit constant
7488 case 'L': // Signed 20-bit displacement (on all targets we support)
7489 case 'M': // 0x7fffffff
7490 return true;
7491
7492 case 'Q': // Memory with base and unsigned 12-bit displacement
7493 case 'R': // Likewise, plus an index
7494 case 'S': // Memory with base and signed 20-bit displacement
7495 case 'T': // Likewise, plus an index
7496 Info.setAllowsMemory();
7497 return true;
7498 }
7499}
Ulrich Weigand47445072013-05-06 16:26:41 +00007500
Eric Christopherc48497a2015-09-18 21:26:24 +00007501class MSP430TargetInfo : public TargetInfo {
7502 static const char *const GCCRegNames[];
Anton Korobeynikova0f54372009-05-03 13:43:08 +00007503
Eric Christopherc48497a2015-09-18 21:26:24 +00007504public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007505 MSP430TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7506 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007507 TLSSupported = false;
7508 IntWidth = 16;
7509 IntAlign = 16;
7510 LongWidth = 32;
7511 LongLongWidth = 64;
7512 LongAlign = LongLongAlign = 16;
7513 PointerWidth = 16;
7514 PointerAlign = 16;
7515 SuitableAlign = 16;
7516 SizeType = UnsignedInt;
7517 IntMaxType = SignedLongLong;
7518 IntPtrType = SignedInt;
7519 PtrDiffType = SignedInt;
7520 SigAtomicType = SignedLong;
Vadzim Dambrouski00b396c2017-06-23 21:12:56 +00007521 resetDataLayout("e-m:e-p:16:16-i32:16-i64:16-f32:16-f64:16-a:8-n8:16-S16");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00007522 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007523 void getTargetDefines(const LangOptions &Opts,
7524 MacroBuilder &Builder) const override {
7525 Builder.defineMacro("MSP430");
7526 Builder.defineMacro("__MSP430__");
7527 // FIXME: defines for different 'flavours' of MCU
7528 }
Craig Topper6c03a542015-10-19 04:51:35 +00007529 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00007530 // FIXME: Implement.
Craig Topper6c03a542015-10-19 04:51:35 +00007531 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00007532 }
7533 bool hasFeature(StringRef Feature) const override {
7534 return Feature == "msp430";
7535 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007536 ArrayRef<const char *> getGCCRegNames() const override;
7537 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00007538 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00007539 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00007540 }
7541 bool validateAsmConstraint(const char *&Name,
7542 TargetInfo::ConstraintInfo &info) const override {
7543 // FIXME: implement
7544 switch (*Name) {
7545 case 'K': // the constant 1
7546 case 'L': // constant -1^20 .. 1^19
7547 case 'M': // constant 1-4:
Eli Friedmana9c3d712009-08-19 20:47:07 +00007548 return true;
7549 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007550 // No target constraints for now.
7551 return false;
7552 }
7553 const char *getClobbers() const override {
7554 // FIXME: Is this really right?
7555 return "";
7556 }
7557 BuiltinVaListKind getBuiltinVaListKind() const override {
7558 // FIXME: implement
7559 return TargetInfo::CharPtrBuiltinVaList;
7560 }
7561};
7562
7563const char *const MSP430TargetInfo::GCCRegNames[] = {
7564 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
7565 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"};
7566
Craig Topperf054e3a2015-10-19 03:52:27 +00007567ArrayRef<const char *> MSP430TargetInfo::getGCCRegNames() const {
7568 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00007569}
7570
7571// LLVM and Clang cannot be used directly to output native binaries for
7572// target, but is used to compile C code to llvm bitcode with correct
7573// type and alignment information.
7574//
7575// TCE uses the llvm bitcode as input and uses it for generating customized
7576// target processor and program binary. TCE co-design environment is
7577// publicly available in http://tce.cs.tut.fi
7578
7579static const unsigned TCEOpenCLAddrSpaceMap[] = {
Yaxun Liub34ec822017-04-11 17:24:23 +00007580 0, // Default
Eric Christopherc48497a2015-09-18 21:26:24 +00007581 3, // opencl_global
7582 4, // opencl_local
7583 5, // opencl_constant
7584 // FIXME: generic has to be added to the target
7585 0, // opencl_generic
7586 0, // cuda_device
7587 0, // cuda_constant
7588 0 // cuda_shared
7589};
7590
7591class TCETargetInfo : public TargetInfo {
7592public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007593 TCETargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7594 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007595 TLSSupported = false;
7596 IntWidth = 32;
7597 LongWidth = LongLongWidth = 32;
7598 PointerWidth = 32;
7599 IntAlign = 32;
7600 LongAlign = LongLongAlign = 32;
7601 PointerAlign = 32;
7602 SuitableAlign = 32;
7603 SizeType = UnsignedInt;
7604 IntMaxType = SignedLong;
7605 IntPtrType = SignedInt;
7606 PtrDiffType = SignedInt;
7607 FloatWidth = 32;
7608 FloatAlign = 32;
7609 DoubleWidth = 32;
7610 DoubleAlign = 32;
7611 LongDoubleWidth = 32;
7612 LongDoubleAlign = 32;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007613 FloatFormat = &llvm::APFloat::IEEEsingle();
7614 DoubleFormat = &llvm::APFloat::IEEEsingle();
7615 LongDoubleFormat = &llvm::APFloat::IEEEsingle();
Pekka Jaaskelainen67354482016-11-16 15:22:31 +00007616 resetDataLayout("E-p:32:32:32-i1:8:8-i8:8:32-"
7617 "i16:16:32-i32:32:32-i64:32:32-"
7618 "f32:32:32-f64:32:32-v64:32:32-"
7619 "v128:32:32-v256:32:32-v512:32:32-"
7620 "v1024:32:32-a0:0:32-n32");
Eric Christopherc48497a2015-09-18 21:26:24 +00007621 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
7622 UseAddrSpaceMapMangling = true;
7623 }
7624
7625 void getTargetDefines(const LangOptions &Opts,
7626 MacroBuilder &Builder) const override {
7627 DefineStd(Builder, "tce", Opts);
7628 Builder.defineMacro("__TCE__");
7629 Builder.defineMacro("__TCE_V1__");
7630 }
7631 bool hasFeature(StringRef Feature) const override { return Feature == "tce"; }
7632
Craig Topper6c03a542015-10-19 04:51:35 +00007633 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007634 const char *getClobbers() const override { return ""; }
7635 BuiltinVaListKind getBuiltinVaListKind() const override {
7636 return TargetInfo::VoidPtrBuiltinVaList;
7637 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007638 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007639 bool validateAsmConstraint(const char *&Name,
7640 TargetInfo::ConstraintInfo &info) const override {
7641 return true;
7642 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007643 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7644 return None;
7645 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007646};
Eli Friedmana9c3d712009-08-19 20:47:07 +00007647
Pekka Jaaskelainen67354482016-11-16 15:22:31 +00007648class TCELETargetInfo : public TCETargetInfo {
7649public:
7650 TCELETargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7651 : TCETargetInfo(Triple, Opts) {
7652 BigEndian = false;
7653
7654 resetDataLayout("e-p:32:32:32-i1:8:8-i8:8:32-"
7655 "i16:16:32-i32:32:32-i64:32:32-"
7656 "f32:32:32-f64:32:32-v64:32:32-"
7657 "v128:32:32-v256:32:32-v512:32:32-"
7658 "v1024:32:32-a0:0:32-n32");
7659
7660 }
7661
7662 virtual void getTargetDefines(const LangOptions &Opts,
7663 MacroBuilder &Builder) const {
7664 DefineStd(Builder, "tcele", Opts);
7665 Builder.defineMacro("__TCE__");
7666 Builder.defineMacro("__TCE_V1__");
7667 Builder.defineMacro("__TCELE__");
7668 Builder.defineMacro("__TCELE_V1__");
7669 }
7670
7671};
7672
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007673class BPFTargetInfo : public TargetInfo {
7674public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007675 BPFTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7676 : TargetInfo(Triple) {
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007677 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
7678 SizeType = UnsignedLong;
7679 PtrDiffType = SignedLong;
7680 IntPtrType = SignedLong;
7681 IntMaxType = SignedLong;
7682 Int64Type = SignedLong;
7683 RegParmMax = 5;
7684 if (Triple.getArch() == llvm::Triple::bpfeb) {
James Y Knightb214cbc2016-03-04 19:00:41 +00007685 resetDataLayout("E-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007686 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00007687 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007688 }
7689 MaxAtomicPromoteWidth = 64;
7690 MaxAtomicInlineWidth = 64;
7691 TLSSupported = false;
7692 }
7693 void getTargetDefines(const LangOptions &Opts,
7694 MacroBuilder &Builder) const override {
7695 DefineStd(Builder, "bpf", Opts);
7696 Builder.defineMacro("__BPF__");
7697 }
7698 bool hasFeature(StringRef Feature) const override {
7699 return Feature == "bpf";
7700 }
7701
Craig Topper6c03a542015-10-19 04:51:35 +00007702 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007703 const char *getClobbers() const override {
7704 return "";
7705 }
7706 BuiltinVaListKind getBuiltinVaListKind() const override {
7707 return TargetInfo::VoidPtrBuiltinVaList;
7708 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007709 ArrayRef<const char *> getGCCRegNames() const override {
7710 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007711 }
7712 bool validateAsmConstraint(const char *&Name,
7713 TargetInfo::ConstraintInfo &info) const override {
7714 return true;
7715 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007716 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7717 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007718 }
Pekka Jaaskelainenfc2629a2017-06-01 07:18:49 +00007719 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
7720 switch (CC) {
7721 default:
7722 return CCCR_Warning;
7723 case CC_C:
7724 case CC_OpenCLKernel:
7725 return CCCR_OK;
7726 }
7727 }
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007728};
7729
Nikolai Bozhenov35d3c352017-06-27 09:48:24 +00007730class Nios2TargetInfo : public TargetInfo {
7731 void setDataLayout() {
7732 if (BigEndian)
7733 resetDataLayout("E-p:32:32:32-i8:8:32-i16:16:32-n32");
7734 else
7735 resetDataLayout("e-p:32:32:32-i8:8:32-i16:16:32-n32");
7736 }
7737
7738 static const Builtin::Info BuiltinInfo[];
7739 std::string CPU;
7740 std::string ABI;
7741
7742public:
7743 Nios2TargetInfo(const llvm::Triple &triple, const TargetOptions &opts)
7744 : TargetInfo(triple), CPU(opts.CPU), ABI(opts.ABI) {
7745 SizeType = UnsignedInt;
7746 PtrDiffType = SignedInt;
7747 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
7748 setDataLayout();
7749 }
7750
7751 StringRef getABI() const override { return ABI; }
7752 bool setABI(const std::string &Name) override {
7753 if (Name == "o32" || Name == "eabi") {
7754 ABI = Name;
7755 return true;
7756 }
7757 return false;
7758 }
7759
7760 bool setCPU(const std::string &Name) override {
7761 if (Name == "nios2r1" || Name == "nios2r2") {
7762 CPU = Name;
7763 return true;
7764 }
7765 return false;
7766 }
7767
7768 void getTargetDefines(const LangOptions &Opts,
7769 MacroBuilder &Builder) const override {
7770 DefineStd(Builder, "nios2", Opts);
7771 DefineStd(Builder, "NIOS2", Opts);
7772
7773 Builder.defineMacro("__nios2");
7774 Builder.defineMacro("__NIOS2");
7775 Builder.defineMacro("__nios2__");
7776 Builder.defineMacro("__NIOS2__");
7777 }
7778
7779 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7780 return llvm::makeArrayRef(BuiltinInfo, clang::Nios2::LastTSBuiltin -
7781 Builtin::FirstTSBuiltin);
7782 }
7783
7784 bool isFeatureSupportedByCPU(StringRef Feature, StringRef CPU) const {
7785 const bool isR2 = CPU == "nios2r2";
7786 return llvm::StringSwitch<bool>(Feature)
7787 .Case("nios2r2mandatory", isR2)
7788 .Case("nios2r2bmx", isR2)
7789 .Case("nios2r2mpx", isR2)
7790 .Case("nios2r2cdx", isR2)
7791 .Default(false);
7792 }
7793
7794 bool initFeatureMap(llvm::StringMap<bool> &Features,
7795 DiagnosticsEngine &Diags, StringRef CPU,
7796 const std::vector<std::string> &FeatureVec) const override {
7797 static const char *allFeatures[] = {
7798 "nios2r2mandatory", "nios2r2bmx", "nios2r2mpx", "nios2r2cdx"
7799 };
7800 for (const char *feature : allFeatures) {
7801 Features[feature] = isFeatureSupportedByCPU(feature, CPU);
7802 }
7803 return true;
7804 }
7805
7806 bool hasFeature(StringRef Feature) const override {
7807 return isFeatureSupportedByCPU(Feature, CPU);
7808 }
7809
7810 BuiltinVaListKind getBuiltinVaListKind() const override {
7811 return TargetInfo::VoidPtrBuiltinVaList;
7812 }
7813
7814 ArrayRef<const char *> getGCCRegNames() const override {
7815 static const char *const GCCRegNames[] = {
7816 // CPU register names
7817 // Must match second column of GCCRegAliases
7818 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10",
7819 "r11", "r12", "r13", "r14", "r15", "r16", "r17", "r18", "r19", "r20",
7820 "r21", "r22", "r23", "r24", "r25", "r26", "r27", "r28", "r29", "r30",
7821 "r31",
7822 // Floating point register names
7823 "ctl0", "ctl1", "ctl2", "ctl3", "ctl4", "ctl5", "ctl6", "ctl7", "ctl8",
7824 "ctl9", "ctl10", "ctl11", "ctl12", "ctl13", "ctl14", "ctl15"
7825 };
7826 return llvm::makeArrayRef(GCCRegNames);
7827 }
7828
7829 bool validateAsmConstraint(const char *&Name,
7830 TargetInfo::ConstraintInfo &Info) const override {
7831 switch (*Name) {
7832 default:
7833 return false;
7834
7835 case 'r': // CPU registers.
7836 case 'd': // Equivalent to "r" unless generating MIPS16 code.
7837 case 'y': // Equivalent to "r", backwards compatibility only.
7838 case 'f': // floating-point registers.
7839 case 'c': // $25 for indirect jumps
7840 case 'l': // lo register
7841 case 'x': // hilo register pair
7842 Info.setAllowsRegister();
7843 return true;
7844 }
7845 }
7846
7847 const char *getClobbers() const override { return ""; }
7848
7849 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7850 static const TargetInfo::GCCRegAlias aliases[] = {
7851 {{"zero"}, "r0"}, {{"at"}, "r1"}, {{"et"}, "r24"},
7852 {{"bt"}, "r25"}, {{"gp"}, "r26"}, {{"sp"}, "r27"},
7853 {{"fp"}, "r28"}, {{"ea"}, "r29"}, {{"ba"}, "r30"},
7854 {{"ra"}, "r31"}, {{"status"}, "ctl0"}, {{"estatus"}, "ctl1"},
7855 {{"bstatus"}, "ctl2"}, {{"ienable"}, "ctl3"}, {{"ipending"}, "ctl4"},
7856 {{"cpuid"}, "ctl5"}, {{"exception"}, "ctl7"}, {{"pteaddr"}, "ctl8"},
7857 {{"tlbacc"}, "ctl9"}, {{"tlbmisc"}, "ctl10"}, {{"badaddr"}, "ctl12"},
7858 {{"config"}, "ctl13"}, {{"mpubase"}, "ctl14"}, {{"mpuacc"}, "ctl15"},
7859 };
7860 return llvm::makeArrayRef(aliases);
7861 }
7862};
7863
7864const Builtin::Info Nios2TargetInfo::BuiltinInfo[] = {
7865#define BUILTIN(ID, TYPE, ATTRS) \
7866 {#ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr},
7867#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
7868 {#ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE},
7869#include "clang/Basic/BuiltinsNios2.def"
7870};
7871
Daniel Sanders4672af62016-05-27 11:51:02 +00007872class MipsTargetInfo : public TargetInfo {
7873 void setDataLayout() {
Daniel Sanders55e40692016-06-03 10:11:01 +00007874 StringRef Layout;
7875
7876 if (ABI == "o32")
7877 Layout = "m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
7878 else if (ABI == "n32")
Daniel Sanders6a738832016-07-19 10:49:03 +00007879 Layout = "m:e-p:32:32-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Daniel Sanders55e40692016-06-03 10:11:01 +00007880 else if (ABI == "n64")
Daniel Sanders6a738832016-07-19 10:49:03 +00007881 Layout = "m:e-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Daniel Sanders55e40692016-06-03 10:11:01 +00007882 else
7883 llvm_unreachable("Invalid ABI");
7884
7885 if (BigEndian)
7886 resetDataLayout(("E-" + Layout).str());
7887 else
7888 resetDataLayout(("e-" + Layout).str());
Daniel Sanders4672af62016-05-27 11:51:02 +00007889 }
7890
Akira Hatanaka9064e362013-10-29 18:30:33 +00007891
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00007892 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007893 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00007894 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00007895 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007896 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00007897 bool IsSingleFloat;
Simon Dardisdf827a72017-02-21 16:01:00 +00007898 bool IsNoABICalls;
7899 bool CanUseBSDABICalls;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007900 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00007901 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007902 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007903 enum DspRevEnum {
7904 NoDSP, DSP1, DSP2
7905 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00007906 bool HasMSA;
Petar Jovanovic9b5d3b62017-06-07 23:51:52 +00007907 bool DisableMadd4;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007908
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007909protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00007910 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007911 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007912
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007913public:
Daniel Sanders4672af62016-05-27 11:51:02 +00007914 MipsTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007915 : TargetInfo(Triple), IsMips16(false), IsMicromips(false),
Simon Dardisdf827a72017-02-21 16:01:00 +00007916 IsNan2008(false), IsSingleFloat(false), IsNoABICalls(false),
7917 CanUseBSDABICalls(false), FloatABI(HardFloat), DspRev(NoDSP),
Petar Jovanovic9b5d3b62017-06-07 23:51:52 +00007918 HasMSA(false), DisableMadd4(false), HasFP64(false) {
Zoran Jovanovic26a12162015-02-18 15:21:35 +00007919 TheCXXABI.set(TargetCXXABI::GenericMIPS);
Daniel Sanders4672af62016-05-27 11:51:02 +00007920
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007921 setABI((getTriple().getArch() == llvm::Triple::mips ||
7922 getTriple().getArch() == llvm::Triple::mipsel)
7923 ? "o32"
7924 : "n64");
7925
7926 CPU = ABI == "o32" ? "mips32r2" : "mips64r2";
Simon Dardisdf827a72017-02-21 16:01:00 +00007927
7928 CanUseBSDABICalls = Triple.getOS() == llvm::Triple::FreeBSD ||
7929 Triple.getOS() == llvm::Triple::OpenBSD;
Zoran Jovanovic26a12162015-02-18 15:21:35 +00007930 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007931
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007932 bool isNaN2008Default() const {
7933 return CPU == "mips32r6" || CPU == "mips64r6";
7934 }
7935
7936 bool isFP64Default() const {
7937 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
7938 }
7939
Petar Jovanovicd55ae6b2015-02-26 18:19:22 +00007940 bool isNan2008() const override {
7941 return IsNan2008;
7942 }
7943
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007944 bool processorSupportsGPR64() const {
7945 return llvm::StringSwitch<bool>(CPU)
7946 .Case("mips3", true)
7947 .Case("mips4", true)
7948 .Case("mips5", true)
7949 .Case("mips64", true)
7950 .Case("mips64r2", true)
7951 .Case("mips64r3", true)
7952 .Case("mips64r5", true)
7953 .Case("mips64r6", true)
7954 .Case("octeon", true)
7955 .Default(false);
7956 return false;
7957 }
7958
Alp Toker4925ba72014-06-07 23:30:42 +00007959 StringRef getABI() const override { return ABI; }
Daniel Sanders4672af62016-05-27 11:51:02 +00007960 bool setABI(const std::string &Name) override {
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007961 if (Name == "o32") {
7962 setO32ABITypes();
7963 ABI = Name;
7964 return true;
Daniel Sanders4672af62016-05-27 11:51:02 +00007965 }
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007966
7967 if (Name == "n32") {
7968 setN32ABITypes();
7969 ABI = Name;
7970 return true;
7971 }
7972 if (Name == "n64") {
7973 setN64ABITypes();
7974 ABI = Name;
7975 return true;
Daniel Sanders4672af62016-05-27 11:51:02 +00007976 }
7977 return false;
7978 }
7979
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007980 void setO32ABITypes() {
7981 Int64Type = SignedLongLong;
7982 IntMaxType = Int64Type;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007983 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007984 LongDoubleWidth = LongDoubleAlign = 64;
7985 LongWidth = LongAlign = 32;
7986 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
7987 PointerWidth = PointerAlign = 32;
7988 PtrDiffType = SignedInt;
7989 SizeType = UnsignedInt;
7990 SuitableAlign = 64;
7991 }
7992
7993 void setN32N64ABITypes() {
7994 LongDoubleWidth = LongDoubleAlign = 128;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007995 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007996 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
7997 LongDoubleWidth = LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007998 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007999 }
8000 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
8001 SuitableAlign = 128;
8002 }
8003
Daniel Sanders4672af62016-05-27 11:51:02 +00008004 void setN64ABITypes() {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00008005 setN32N64ABITypes();
Brad Smith8e55bd52017-03-06 23:48:31 +00008006 if (getTriple().getOS() == llvm::Triple::OpenBSD) {
8007 Int64Type = SignedLongLong;
8008 } else {
8009 Int64Type = SignedLong;
8010 }
Daniel Sanders4672af62016-05-27 11:51:02 +00008011 IntMaxType = Int64Type;
Daniel Sanders26a56ad2016-06-06 09:07:08 +00008012 LongWidth = LongAlign = 64;
8013 PointerWidth = PointerAlign = 64;
8014 PtrDiffType = SignedLong;
8015 SizeType = UnsignedLong;
Daniel Sanders4672af62016-05-27 11:51:02 +00008016 }
8017
8018 void setN32ABITypes() {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00008019 setN32N64ABITypes();
Daniel Sanders4672af62016-05-27 11:51:02 +00008020 Int64Type = SignedLongLong;
8021 IntMaxType = Int64Type;
Daniel Sanders26a56ad2016-06-06 09:07:08 +00008022 LongWidth = LongAlign = 32;
8023 PointerWidth = PointerAlign = 32;
8024 PtrDiffType = SignedInt;
8025 SizeType = UnsignedInt;
Daniel Sanders4672af62016-05-27 11:51:02 +00008026 }
8027
Craig Topper3164f332014-03-11 03:39:26 +00008028 bool setCPU(const std::string &Name) override {
Eric Christopher0b26a612010-03-02 02:41:08 +00008029 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00008030 return llvm::StringSwitch<bool>(Name)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00008031 .Case("mips1", true)
8032 .Case("mips2", true)
Simon Atanasyan26610c52014-07-04 12:36:56 +00008033 .Case("mips3", true)
8034 .Case("mips4", true)
8035 .Case("mips5", true)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00008036 .Case("mips32", true)
8037 .Case("mips32r2", true)
8038 .Case("mips32r3", true)
8039 .Case("mips32r5", true)
8040 .Case("mips32r6", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00008041 .Case("mips64", true)
8042 .Case("mips64r2", true)
Simon Atanasyan162feb52015-02-20 23:37:40 +00008043 .Case("mips64r3", true)
8044 .Case("mips64r5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00008045 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00008046 .Case("octeon", true)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00008047 .Case("p5600", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00008048 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00008049 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00008050 const std::string& getCPU() const { return CPU; }
Eric Christopher8c47b422015-10-09 18:39:55 +00008051 bool
8052 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
8053 StringRef CPU,
8054 const std::vector<std::string> &FeaturesVec) const override {
Bhushan D. Attardebacb988732016-03-04 06:56:29 +00008055 if (CPU.empty())
8056 CPU = getCPU();
Simon Atanasyan4e16a422014-07-04 12:37:04 +00008057 if (CPU == "octeon")
8058 Features["mips64r2"] = Features["cnmips"] = true;
8059 else
8060 Features[CPU] = true;
Eric Christopher007b0a02015-08-28 22:32:01 +00008061 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Eric Christopher0b26a612010-03-02 02:41:08 +00008062 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00008063
Craig Topper3164f332014-03-11 03:39:26 +00008064 void getTargetDefines(const LangOptions &Opts,
8065 MacroBuilder &Builder) const override {
Daniel Sanders4672af62016-05-27 11:51:02 +00008066 if (BigEndian) {
8067 DefineStd(Builder, "MIPSEB", Opts);
8068 Builder.defineMacro("_MIPSEB");
8069 } else {
8070 DefineStd(Builder, "MIPSEL", Opts);
8071 Builder.defineMacro("_MIPSEL");
8072 }
8073
Simon Atanasyan26292cc2014-01-27 13:59:11 +00008074 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00008075 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00008076 if (Opts.GNUMode)
8077 Builder.defineMacro("mips");
8078
Daniel Sanders26a56ad2016-06-06 09:07:08 +00008079 if (ABI == "o32") {
Daniel Sanders4672af62016-05-27 11:51:02 +00008080 Builder.defineMacro("__mips", "32");
8081 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
8082 } else {
8083 Builder.defineMacro("__mips", "64");
8084 Builder.defineMacro("__mips64");
8085 Builder.defineMacro("__mips64__");
8086 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
8087 }
8088
8089 const std::string ISARev = llvm::StringSwitch<std::string>(getCPU())
8090 .Cases("mips32", "mips64", "1")
8091 .Cases("mips32r2", "mips64r2", "2")
8092 .Cases("mips32r3", "mips64r3", "3")
8093 .Cases("mips32r5", "mips64r5", "5")
8094 .Cases("mips32r6", "mips64r6", "6")
8095 .Default("");
8096 if (!ISARev.empty())
8097 Builder.defineMacro("__mips_isa_rev", ISARev);
8098
8099 if (ABI == "o32") {
8100 Builder.defineMacro("__mips_o32");
8101 Builder.defineMacro("_ABIO32", "1");
8102 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
Daniel Sanders07c86542016-05-27 14:30:23 +00008103 } else if (ABI == "n32") {
Daniel Sanders4672af62016-05-27 11:51:02 +00008104 Builder.defineMacro("__mips_n32");
8105 Builder.defineMacro("_ABIN32", "2");
8106 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
8107 } else if (ABI == "n64") {
8108 Builder.defineMacro("__mips_n64");
8109 Builder.defineMacro("_ABI64", "3");
8110 Builder.defineMacro("_MIPS_SIM", "_ABI64");
8111 } else
8112 llvm_unreachable("Invalid ABI.");
8113
Simon Dardisdf827a72017-02-21 16:01:00 +00008114 if (!IsNoABICalls) {
8115 Builder.defineMacro("__mips_abicalls");
8116 if (CanUseBSDABICalls)
8117 Builder.defineMacro("__ABICALLS__");
8118 }
8119
Simon Atanasyan683535b2012-08-29 19:14:58 +00008120 Builder.defineMacro("__REGISTER_PREFIX__", "");
8121
Simon Atanasyan9f444d52012-07-05 15:32:46 +00008122 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00008123 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00008124 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00008125 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00008126 case SoftFloat:
8127 Builder.defineMacro("__mips_soft_float", Twine(1));
8128 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00008129 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00008130
Simon Atanasyan16071912013-04-14 14:07:30 +00008131 if (IsSingleFloat)
8132 Builder.defineMacro("__mips_single_float", Twine(1));
8133
Simon Atanasyan2c97a812013-10-18 13:13:53 +00008134 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
8135 Builder.defineMacro("_MIPS_FPSET",
8136 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
8137
Simon Atanasyan72244b62012-07-05 16:06:06 +00008138 if (IsMips16)
8139 Builder.defineMacro("__mips16", Twine(1));
8140
Simon Atanasyan60777612013-04-14 14:07:51 +00008141 if (IsMicromips)
8142 Builder.defineMacro("__mips_micromips", Twine(1));
8143
Simon Atanasyan22127ce2013-09-24 09:09:16 +00008144 if (IsNan2008)
8145 Builder.defineMacro("__mips_nan2008", Twine(1));
8146
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00008147 switch (DspRev) {
8148 default:
8149 break;
8150 case DSP1:
8151 Builder.defineMacro("__mips_dsp_rev", Twine(1));
8152 Builder.defineMacro("__mips_dsp", Twine(1));
8153 break;
8154 case DSP2:
8155 Builder.defineMacro("__mips_dsp_rev", Twine(2));
8156 Builder.defineMacro("__mips_dspr2", Twine(1));
8157 Builder.defineMacro("__mips_dsp", Twine(1));
8158 break;
8159 }
8160
Jack Carter44ff1e52013-08-12 17:20:29 +00008161 if (HasMSA)
8162 Builder.defineMacro("__mips_msa", Twine(1));
8163
Petar Jovanovic9b5d3b62017-06-07 23:51:52 +00008164 if (DisableMadd4)
8165 Builder.defineMacro("__mips_no_madd4", Twine(1));
8166
Simon Atanasyan26f19672012-04-05 19:28:31 +00008167 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
8168 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
8169 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00008170
8171 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
8172 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Daniel Sanders5176f7e2015-12-22 12:59:30 +00008173
8174 // These shouldn't be defined for MIPS-I but there's no need to check
8175 // for that since MIPS-I isn't supported.
8176 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
8177 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
8178 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
Daniel Sanders26a56ad2016-06-06 09:07:08 +00008179
8180 // 32-bit MIPS processors don't have the necessary lld/scd instructions
8181 // found in 64-bit processors. In the case of O32 on a 64-bit processor,
8182 // the instructions exist but using them violates the ABI since they
8183 // require 64-bit GPRs and O32 only supports 32-bit GPRs.
8184 if (ABI == "n32" || ABI == "n64")
Daniel Sanders4672af62016-05-27 11:51:02 +00008185 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00008186 }
8187
Craig Topper6c03a542015-10-19 04:51:35 +00008188 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
8189 return llvm::makeArrayRef(BuiltinInfo,
8190 clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin);
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008191 }
Craig Topper3164f332014-03-11 03:39:26 +00008192 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00008193 return llvm::StringSwitch<bool>(Feature)
8194 .Case("mips", true)
8195 .Case("fp64", HasFP64)
8196 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00008197 }
Craig Topper3164f332014-03-11 03:39:26 +00008198 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00008199 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008200 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008201 ArrayRef<const char *> getGCCRegNames() const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00008202 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00008203 // CPU register names
8204 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00008205 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
8206 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
8207 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00008208 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
8209 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00008210 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
8211 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
8212 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
8213 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00008214 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00008215 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Hrvoje Varga14c42ee2016-03-29 12:46:16 +00008216 "$fcc5","$fcc6","$fcc7","$ac1hi","$ac1lo","$ac2hi","$ac2lo",
8217 "$ac3hi","$ac3lo",
Daniel Sanders8b59af12013-11-12 12:56:01 +00008218 // MSA register names
8219 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
8220 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
8221 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
8222 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
8223 // MSA control register names
8224 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
8225 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00008226 };
Craig Topperf054e3a2015-10-19 03:52:27 +00008227 return llvm::makeArrayRef(GCCRegNames);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00008228 }
Craig Topper3164f332014-03-11 03:39:26 +00008229 bool validateAsmConstraint(const char *&Name,
8230 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008231 switch (*Name) {
8232 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00008233 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008234 case 'r': // CPU registers.
8235 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00008236 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008237 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00008238 case 'c': // $25 for indirect jumps
8239 case 'l': // lo register
8240 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008241 Info.setAllowsRegister();
8242 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00008243 case 'I': // Signed 16-bit constant
8244 case 'J': // Integer 0
8245 case 'K': // Unsigned 16-bit constant
8246 case 'L': // Signed 32-bit constant, lower 16-bit zeros (for lui)
8247 case 'M': // Constants not loadable via lui, addiu, or ori
8248 case 'N': // Constant -1 to -65535
8249 case 'O': // A signed 15-bit constant
8250 case 'P': // A constant between 1 go 65535
8251 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00008252 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00008253 Info.setAllowsMemory();
8254 return true;
Daniel Sanders48fa39e2015-03-30 13:47:23 +00008255 case 'Z':
8256 if (Name[1] == 'C') { // An address usable by ll, and sc.
8257 Info.setAllowsMemory();
8258 Name++; // Skip over 'Z'.
8259 return true;
8260 }
8261 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008262 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008263 }
8264
Daniel Sanders48fa39e2015-03-30 13:47:23 +00008265 std::string convertConstraint(const char *&Constraint) const override {
8266 std::string R;
8267 switch (*Constraint) {
8268 case 'Z': // Two-character constraint; add "^" hint for later parsing.
8269 if (Constraint[1] == 'C') {
8270 R = std::string("^") + std::string(Constraint, 2);
8271 Constraint++;
8272 return R;
8273 }
8274 break;
8275 }
8276 return TargetInfo::convertConstraint(Constraint);
8277 }
8278
Craig Topper3164f332014-03-11 03:39:26 +00008279 const char *getClobbers() const override {
Toma Tabacucfab40f2015-01-12 14:41:30 +00008280 // In GCC, $1 is not widely used in generated code (it's used only in a few
8281 // specific situations), so there is no real need for users to add it to
8282 // the clobbers list if they want to use it in their inline assembly code.
8283 //
8284 // In LLVM, $1 is treated as a normal GPR and is always allocatable during
8285 // code generation, so using it in inline assembly without adding it to the
8286 // clobbers list can cause conflicts between the inline assembly code and
8287 // the surrounding generated code.
8288 //
8289 // Another problem is that LLVM is allowed to choose $1 for inline assembly
8290 // operands, which will conflict with the ".set at" assembler option (which
8291 // we use only for inline assembly, in order to maintain compatibility with
8292 // GCC) and will also conflict with the user's usage of $1.
8293 //
8294 // The easiest way to avoid these conflicts and keep $1 as an allocatable
8295 // register for generated code is to automatically clobber $1 for all inline
8296 // assembly code.
8297 //
8298 // FIXME: We should automatically clobber $1 only for inline assembly code
8299 // which actually uses it. This would allow LLVM to use $1 for inline
8300 // assembly operands if the user's assembly code doesn't use it.
Toma Tabacu99411952014-12-17 12:02:58 +00008301 return "~{$1}";
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008302 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00008303
Craig Topper3164f332014-03-11 03:39:26 +00008304 bool handleTargetFeatures(std::vector<std::string> &Features,
8305 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00008306 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00008307 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00008308 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00008309 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00008310 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00008311 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00008312 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00008313
Eric Christopher610fe112015-08-26 08:21:55 +00008314 for (const auto &Feature : Features) {
8315 if (Feature == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00008316 IsSingleFloat = true;
Eric Christopher610fe112015-08-26 08:21:55 +00008317 else if (Feature == "+soft-float")
Simon Atanasyan9f444d52012-07-05 15:32:46 +00008318 FloatABI = SoftFloat;
Eric Christopher610fe112015-08-26 08:21:55 +00008319 else if (Feature == "+mips16")
Simon Atanasyan72244b62012-07-05 16:06:06 +00008320 IsMips16 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00008321 else if (Feature == "+micromips")
Simon Atanasyan60777612013-04-14 14:07:51 +00008322 IsMicromips = true;
Eric Christopher610fe112015-08-26 08:21:55 +00008323 else if (Feature == "+dsp")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00008324 DspRev = std::max(DspRev, DSP1);
Eric Christopher610fe112015-08-26 08:21:55 +00008325 else if (Feature == "+dspr2")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00008326 DspRev = std::max(DspRev, DSP2);
Eric Christopher610fe112015-08-26 08:21:55 +00008327 else if (Feature == "+msa")
Jack Carter44ff1e52013-08-12 17:20:29 +00008328 HasMSA = true;
Petar Jovanovic9b5d3b62017-06-07 23:51:52 +00008329 else if (Feature == "+nomadd4")
8330 DisableMadd4 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00008331 else if (Feature == "+fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00008332 HasFP64 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00008333 else if (Feature == "-fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00008334 HasFP64 = false;
Eric Christopher610fe112015-08-26 08:21:55 +00008335 else if (Feature == "+nan2008")
Simon Atanasyan22127ce2013-09-24 09:09:16 +00008336 IsNan2008 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00008337 else if (Feature == "-nan2008")
Daniel Sanders9500d2d2014-07-09 13:56:23 +00008338 IsNan2008 = false;
Simon Dardisdf827a72017-02-21 16:01:00 +00008339 else if (Feature == "+noabicalls")
8340 IsNoABICalls = true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00008341 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00008342
James Y Knightb214cbc2016-03-04 19:00:41 +00008343 setDataLayout();
Akira Hatanaka9064e362013-10-29 18:30:33 +00008344
Rafael Espindolaeb265472013-08-21 21:59:03 +00008345 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00008346 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00008347
Craig Topper3164f332014-03-11 03:39:26 +00008348 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00008349 if (RegNo == 0) return 4;
8350 if (RegNo == 1) return 5;
8351 return -1;
8352 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00008353
8354 bool isCLZForZeroUndef() const override { return false; }
Daniel Sanders4672af62016-05-27 11:51:02 +00008355
8356 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8357 static const TargetInfo::GCCRegAlias O32RegAliases[] = {
8358 {{"at"}, "$1"}, {{"v0"}, "$2"}, {{"v1"}, "$3"},
8359 {{"a0"}, "$4"}, {{"a1"}, "$5"}, {{"a2"}, "$6"},
8360 {{"a3"}, "$7"}, {{"t0"}, "$8"}, {{"t1"}, "$9"},
8361 {{"t2"}, "$10"}, {{"t3"}, "$11"}, {{"t4"}, "$12"},
8362 {{"t5"}, "$13"}, {{"t6"}, "$14"}, {{"t7"}, "$15"},
8363 {{"s0"}, "$16"}, {{"s1"}, "$17"}, {{"s2"}, "$18"},
8364 {{"s3"}, "$19"}, {{"s4"}, "$20"}, {{"s5"}, "$21"},
8365 {{"s6"}, "$22"}, {{"s7"}, "$23"}, {{"t8"}, "$24"},
8366 {{"t9"}, "$25"}, {{"k0"}, "$26"}, {{"k1"}, "$27"},
8367 {{"gp"}, "$28"}, {{"sp", "$sp"}, "$29"}, {{"fp", "$fp"}, "$30"},
8368 {{"ra"}, "$31"}};
8369 static const TargetInfo::GCCRegAlias NewABIRegAliases[] = {
8370 {{"at"}, "$1"}, {{"v0"}, "$2"}, {{"v1"}, "$3"},
8371 {{"a0"}, "$4"}, {{"a1"}, "$5"}, {{"a2"}, "$6"},
8372 {{"a3"}, "$7"}, {{"a4"}, "$8"}, {{"a5"}, "$9"},
8373 {{"a6"}, "$10"}, {{"a7"}, "$11"}, {{"t0"}, "$12"},
8374 {{"t1"}, "$13"}, {{"t2"}, "$14"}, {{"t3"}, "$15"},
8375 {{"s0"}, "$16"}, {{"s1"}, "$17"}, {{"s2"}, "$18"},
8376 {{"s3"}, "$19"}, {{"s4"}, "$20"}, {{"s5"}, "$21"},
8377 {{"s6"}, "$22"}, {{"s7"}, "$23"}, {{"t8"}, "$24"},
8378 {{"t9"}, "$25"}, {{"k0"}, "$26"}, {{"k1"}, "$27"},
8379 {{"gp"}, "$28"}, {{"sp", "$sp"}, "$29"}, {{"fp", "$fp"}, "$30"},
8380 {{"ra"}, "$31"}};
Daniel Sanders26a56ad2016-06-06 09:07:08 +00008381 if (ABI == "o32")
Daniel Sanders4672af62016-05-27 11:51:02 +00008382 return llvm::makeArrayRef(O32RegAliases);
8383 return llvm::makeArrayRef(NewABIRegAliases);
8384 }
8385
8386 bool hasInt128Type() const override {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00008387 return ABI == "n32" || ABI == "n64";
Daniel Sanders4672af62016-05-27 11:51:02 +00008388 }
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00008389
8390 bool validateTarget(DiagnosticsEngine &Diags) const override {
8391 // FIXME: It's valid to use O32 on a 64-bit CPU but the backend can't handle
8392 // this yet. It's better to fail here than on the backend assertion.
8393 if (processorSupportsGPR64() && ABI == "o32") {
8394 Diags.Report(diag::err_target_unsupported_abi) << ABI << CPU;
8395 return false;
8396 }
8397
8398 // 64-bit ABI's require 64-bit CPU's.
8399 if (!processorSupportsGPR64() && (ABI == "n32" || ABI == "n64")) {
8400 Diags.Report(diag::err_target_unsupported_abi) << ABI << CPU;
8401 return false;
8402 }
8403
8404 // FIXME: It's valid to use O32 on a mips64/mips64el triple but the backend
8405 // can't handle this yet. It's better to fail here than on the
8406 // backend assertion.
8407 if ((getTriple().getArch() == llvm::Triple::mips64 ||
8408 getTriple().getArch() == llvm::Triple::mips64el) &&
8409 ABI == "o32") {
8410 Diags.Report(diag::err_target_unsupported_abi_for_triple)
8411 << ABI << getTriple().str();
8412 return false;
8413 }
8414
8415 // FIXME: It's valid to use N32/N64 on a mips/mipsel triple but the backend
8416 // can't handle this yet. It's better to fail here than on the
8417 // backend assertion.
8418 if ((getTriple().getArch() == llvm::Triple::mips ||
8419 getTriple().getArch() == llvm::Triple::mipsel) &&
8420 (ABI == "n32" || ABI == "n64")) {
8421 Diags.Report(diag::err_target_unsupported_abi_for_triple)
8422 << ABI << getTriple().str();
8423 return false;
8424 }
8425
8426 return true;
8427 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008428};
8429
Daniel Sanders4672af62016-05-27 11:51:02 +00008430const Builtin::Info MipsTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00008431#define BUILTIN(ID, TYPE, ATTRS) \
8432 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
8433#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
8434 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00008435#include "clang/Basic/BuiltinsMips.def"
8436};
8437
Ivan Krasindd7403e2011-08-24 20:22:22 +00008438class PNaClTargetInfo : public TargetInfo {
8439public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008440 PNaClTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8441 : TargetInfo(Triple) {
Ivan Krasindd7403e2011-08-24 20:22:22 +00008442 this->LongAlign = 32;
8443 this->LongWidth = 32;
8444 this->PointerAlign = 32;
8445 this->PointerWidth = 32;
8446 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00008447 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00008448 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00008449 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00008450 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00008451 this->SizeType = TargetInfo::UnsignedInt;
8452 this->PtrDiffType = TargetInfo::SignedInt;
8453 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00008454 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00008455 }
8456
Craig Toppere6f17d02014-03-11 04:07:52 +00008457 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00008458 Builder.defineMacro("__le32__");
8459 Builder.defineMacro("__pnacl__");
8460 }
Craig Topper3164f332014-03-11 03:39:26 +00008461 void getTargetDefines(const LangOptions &Opts,
8462 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00008463 getArchDefines(Opts, Builder);
8464 }
Craig Topper3164f332014-03-11 03:39:26 +00008465 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00008466 return Feature == "pnacl";
8467 }
Craig Topper6c03a542015-10-19 04:51:35 +00008468 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Craig Topper3164f332014-03-11 03:39:26 +00008469 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00008470 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00008471 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008472 ArrayRef<const char *> getGCCRegNames() const override;
8473 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00008474 bool validateAsmConstraint(const char *&Name,
8475 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00008476 return false;
8477 }
8478
Craig Topper3164f332014-03-11 03:39:26 +00008479 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00008480 return "";
8481 }
8482};
8483
Craig Topperf054e3a2015-10-19 03:52:27 +00008484ArrayRef<const char *> PNaClTargetInfo::getGCCRegNames() const {
8485 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00008486}
8487
Craig Topperf054e3a2015-10-19 03:52:27 +00008488ArrayRef<TargetInfo::GCCRegAlias> PNaClTargetInfo::getGCCRegAliases() const {
8489 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00008490}
Ivan Krasindd7403e2011-08-24 20:22:22 +00008491
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008492// We attempt to use PNaCl (le32) frontend and Mips32EL backend.
Daniel Sanders4672af62016-05-27 11:51:02 +00008493class NaClMips32TargetInfo : public MipsTargetInfo {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008494public:
Daniel Sanders4672af62016-05-27 11:51:02 +00008495 NaClMips32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8496 : MipsTargetInfo(Triple, Opts) {}
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008497
8498 BuiltinVaListKind getBuiltinVaListKind() const override {
8499 return TargetInfo::PNaClABIBuiltinVaList;
8500 }
8501};
8502
JF Bastien643817d2014-09-12 17:52:47 +00008503class Le64TargetInfo : public TargetInfo {
8504 static const Builtin::Info BuiltinInfo[];
8505
8506public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008507 Le64TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
8508 : TargetInfo(Triple) {
JF Bastien643817d2014-09-12 17:52:47 +00008509 NoAsmVariants = true;
8510 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
8511 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00008512 resetDataLayout("e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128");
JF Bastien643817d2014-09-12 17:52:47 +00008513 }
8514
8515 void getTargetDefines(const LangOptions &Opts,
8516 MacroBuilder &Builder) const override {
Saleem Abdulrasool56027092017-02-07 19:00:06 +00008517 DefineStd(Builder, "unix", Opts);
JF Bastien643817d2014-09-12 17:52:47 +00008518 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
8519 Builder.defineMacro("__ELF__");
8520 }
Craig Topper6c03a542015-10-19 04:51:35 +00008521 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
8522 return llvm::makeArrayRef(BuiltinInfo,
8523 clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin);
JF Bastien643817d2014-09-12 17:52:47 +00008524 }
8525 BuiltinVaListKind getBuiltinVaListKind() const override {
8526 return TargetInfo::PNaClABIBuiltinVaList;
8527 }
8528 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00008529 ArrayRef<const char *> getGCCRegNames() const override {
8530 return None;
JF Bastien643817d2014-09-12 17:52:47 +00008531 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008532 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8533 return None;
JF Bastien643817d2014-09-12 17:52:47 +00008534 }
8535 bool validateAsmConstraint(const char *&Name,
8536 TargetInfo::ConstraintInfo &Info) const override {
8537 return false;
8538 }
8539
8540 bool hasProtectedVisibility() const override { return false; }
JF Bastien643817d2014-09-12 17:52:47 +00008541};
Dan Gohmanc2853072015-09-03 22:51:53 +00008542
8543class WebAssemblyTargetInfo : public TargetInfo {
8544 static const Builtin::Info BuiltinInfo[];
8545
8546 enum SIMDEnum {
8547 NoSIMD,
8548 SIMD128,
8549 } SIMDLevel;
8550
8551public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008552 explicit WebAssemblyTargetInfo(const llvm::Triple &T, const TargetOptions &)
Dan Gohmanc2853072015-09-03 22:51:53 +00008553 : TargetInfo(T), SIMDLevel(NoSIMD) {
Dan Gohmanc2853072015-09-03 22:51:53 +00008554 NoAsmVariants = true;
8555 SuitableAlign = 128;
8556 LargeArrayMinWidth = 128;
8557 LargeArrayAlign = 128;
8558 SimdDefaultAlign = 128;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00008559 SigAtomicType = SignedLong;
Dan Gohman6db46402015-11-10 21:01:46 +00008560 LongDoubleWidth = LongDoubleAlign = 128;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00008561 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Derek Schuffacdc8e62016-09-01 22:38:37 +00008562 SizeType = UnsignedInt;
8563 PtrDiffType = SignedInt;
8564 IntPtrType = SignedInt;
Dan Gohmanc2853072015-09-03 22:51:53 +00008565 }
8566
8567protected:
8568 void getTargetDefines(const LangOptions &Opts,
8569 MacroBuilder &Builder) const override {
8570 defineCPUMacros(Builder, "wasm", /*Tuning=*/false);
8571 if (SIMDLevel >= SIMD128)
8572 Builder.defineMacro("__wasm_simd128__");
8573 }
8574
8575private:
Eric Christopher8c47b422015-10-09 18:39:55 +00008576 bool
8577 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
8578 StringRef CPU,
8579 const std::vector<std::string> &FeaturesVec) const override {
Dan Gohmanc2853072015-09-03 22:51:53 +00008580 if (CPU == "bleeding-edge")
8581 Features["simd128"] = true;
8582 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
8583 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00008584 bool hasFeature(StringRef Feature) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00008585 return llvm::StringSwitch<bool>(Feature)
8586 .Case("simd128", SIMDLevel >= SIMD128)
8587 .Default(false);
8588 }
8589 bool handleTargetFeatures(std::vector<std::string> &Features,
Hans Wennborg7eb54642015-09-10 17:07:54 +00008590 DiagnosticsEngine &Diags) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00008591 for (const auto &Feature : Features) {
8592 if (Feature == "+simd128") {
8593 SIMDLevel = std::max(SIMDLevel, SIMD128);
8594 continue;
8595 }
8596 if (Feature == "-simd128") {
8597 SIMDLevel = std::min(SIMDLevel, SIMDEnum(SIMD128 - 1));
8598 continue;
8599 }
8600
8601 Diags.Report(diag::err_opt_not_valid_with_opt) << Feature
8602 << "-target-feature";
8603 return false;
8604 }
8605 return true;
8606 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00008607 bool setCPU(const std::string &Name) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00008608 return llvm::StringSwitch<bool>(Name)
8609 .Case("mvp", true)
8610 .Case("bleeding-edge", true)
8611 .Case("generic", true)
8612 .Default(false);
8613 }
Craig Topper6c03a542015-10-19 04:51:35 +00008614 ArrayRef<Builtin::Info> getTargetBuiltins() const final {
8615 return llvm::makeArrayRef(BuiltinInfo,
8616 clang::WebAssembly::LastTSBuiltin - Builtin::FirstTSBuiltin);
Dan Gohmanc2853072015-09-03 22:51:53 +00008617 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00008618 BuiltinVaListKind getBuiltinVaListKind() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00008619 return VoidPtrBuiltinVaList;
8620 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008621 ArrayRef<const char *> getGCCRegNames() const final {
8622 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00008623 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008624 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const final {
8625 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00008626 }
8627 bool
8628 validateAsmConstraint(const char *&Name,
Hans Wennborg7eb54642015-09-10 17:07:54 +00008629 TargetInfo::ConstraintInfo &Info) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00008630 return false;
8631 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00008632 const char *getClobbers() const final { return ""; }
8633 bool isCLZForZeroUndef() const final { return false; }
8634 bool hasInt128Type() const final { return true; }
Dan Gohmanab0e31f2015-09-14 21:49:41 +00008635 IntType getIntTypeByWidth(unsigned BitWidth,
8636 bool IsSigned) const final {
8637 // WebAssembly prefers long long for explicitly 64-bit integers.
8638 return BitWidth == 64 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
8639 : TargetInfo::getIntTypeByWidth(BitWidth, IsSigned);
8640 }
8641 IntType getLeastIntTypeByWidth(unsigned BitWidth,
8642 bool IsSigned) const final {
8643 // WebAssembly uses long long for int_least64_t and int_fast64_t.
8644 return BitWidth == 64
8645 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
8646 : TargetInfo::getLeastIntTypeByWidth(BitWidth, IsSigned);
8647 }
Dan Gohmanc2853072015-09-03 22:51:53 +00008648};
8649
8650const Builtin::Info WebAssemblyTargetInfo::BuiltinInfo[] = {
8651#define BUILTIN(ID, TYPE, ATTRS) \
8652 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
8653#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
8654 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
8655#include "clang/Basic/BuiltinsWebAssembly.def"
8656};
8657
8658class WebAssembly32TargetInfo : public WebAssemblyTargetInfo {
8659public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008660 explicit WebAssembly32TargetInfo(const llvm::Triple &T,
8661 const TargetOptions &Opts)
8662 : WebAssemblyTargetInfo(T, Opts) {
Dan Gohman7dee1712017-06-07 02:22:40 +00008663 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00008664 resetDataLayout("e-m:e-p:32:32-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00008665 }
8666
8667protected:
8668 void getTargetDefines(const LangOptions &Opts,
8669 MacroBuilder &Builder) const override {
8670 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
8671 defineCPUMacros(Builder, "wasm32", /*Tuning=*/false);
8672 }
8673};
8674
8675class WebAssembly64TargetInfo : public WebAssemblyTargetInfo {
8676public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008677 explicit WebAssembly64TargetInfo(const llvm::Triple &T,
8678 const TargetOptions &Opts)
8679 : WebAssemblyTargetInfo(T, Opts) {
Dan Gohmanc2853072015-09-03 22:51:53 +00008680 LongAlign = LongWidth = 64;
8681 PointerAlign = PointerWidth = 64;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00008682 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Derek Schuffacdc8e62016-09-01 22:38:37 +00008683 SizeType = UnsignedLong;
8684 PtrDiffType = SignedLong;
8685 IntPtrType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00008686 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00008687 }
8688
8689protected:
8690 void getTargetDefines(const LangOptions &Opts,
8691 MacroBuilder &Builder) const override {
8692 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
8693 defineCPUMacros(Builder, "wasm64", /*Tuning=*/false);
8694 }
8695};
8696
JF Bastien643817d2014-09-12 17:52:47 +00008697const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
8698#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00008699 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
JF Bastien643817d2014-09-12 17:52:47 +00008700#include "clang/Basic/BuiltinsLe64.def"
8701};
8702
Eric Christopherc48497a2015-09-18 21:26:24 +00008703static const unsigned SPIRAddrSpaceMap[] = {
Yaxun Liub34ec822017-04-11 17:24:23 +00008704 0, // Default
Eric Christopherc48497a2015-09-18 21:26:24 +00008705 1, // opencl_global
8706 3, // opencl_local
8707 2, // opencl_constant
8708 4, // opencl_generic
8709 0, // cuda_device
8710 0, // cuda_constant
8711 0 // cuda_shared
8712};
8713class SPIRTargetInfo : public TargetInfo {
8714public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008715 SPIRTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
8716 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00008717 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
8718 "SPIR target must use unknown OS");
8719 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
8720 "SPIR target must use unknown environment type");
Eric Christopherc48497a2015-09-18 21:26:24 +00008721 TLSSupported = false;
8722 LongWidth = LongAlign = 64;
8723 AddrSpaceMap = &SPIRAddrSpaceMap;
8724 UseAddrSpaceMapMangling = true;
8725 // Define available target features
8726 // These must be defined in sorted order!
8727 NoAsmVariants = true;
8728 }
8729 void getTargetDefines(const LangOptions &Opts,
8730 MacroBuilder &Builder) const override {
8731 DefineStd(Builder, "SPIR", Opts);
8732 }
8733 bool hasFeature(StringRef Feature) const override {
8734 return Feature == "spir";
8735 }
Craig Topper3164f332014-03-11 03:39:26 +00008736
Craig Topper6c03a542015-10-19 04:51:35 +00008737 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00008738 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00008739 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00008740 bool validateAsmConstraint(const char *&Name,
8741 TargetInfo::ConstraintInfo &info) const override {
8742 return true;
8743 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008744 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8745 return None;
8746 }
Eric Christopherc48497a2015-09-18 21:26:24 +00008747 BuiltinVaListKind getBuiltinVaListKind() const override {
8748 return TargetInfo::VoidPtrBuiltinVaList;
8749 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00008750
Eric Christopherc48497a2015-09-18 21:26:24 +00008751 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Nikolay Haustov8c6538b2016-06-30 09:06:33 +00008752 return (CC == CC_SpirFunction || CC == CC_OpenCLKernel) ? CCCR_OK
8753 : CCCR_Warning;
Eric Christopherc48497a2015-09-18 21:26:24 +00008754 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00008755
Eric Christopherc48497a2015-09-18 21:26:24 +00008756 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
8757 return CC_SpirFunction;
8758 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00008759
8760 void setSupportedOpenCLOpts() override {
8761 // Assume all OpenCL extensions and optional core features are supported
8762 // for SPIR since it is a generic target.
Yaxun Liu5b746652016-12-18 05:18:55 +00008763 getSupportedOpenCLOpts().supportAll();
Yaxun Liu39cf40f2016-05-16 17:06:34 +00008764 }
Eric Christopherc48497a2015-09-18 21:26:24 +00008765};
Guy Benyeib798fc92012-12-11 21:38:14 +00008766
Eric Christopherc48497a2015-09-18 21:26:24 +00008767class SPIR32TargetInfo : public SPIRTargetInfo {
8768public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008769 SPIR32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8770 : SPIRTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00008771 PointerWidth = PointerAlign = 32;
8772 SizeType = TargetInfo::UnsignedInt;
8773 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +00008774 resetDataLayout("e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
8775 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00008776 }
8777 void getTargetDefines(const LangOptions &Opts,
8778 MacroBuilder &Builder) const override {
8779 DefineStd(Builder, "SPIR32", Opts);
8780 }
8781};
Guy Benyeib798fc92012-12-11 21:38:14 +00008782
Eric Christopherc48497a2015-09-18 21:26:24 +00008783class SPIR64TargetInfo : public SPIRTargetInfo {
8784public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008785 SPIR64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8786 : SPIRTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00008787 PointerWidth = PointerAlign = 64;
8788 SizeType = TargetInfo::UnsignedLong;
8789 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00008790 resetDataLayout("e-i64:64-v16:16-v24:32-v32:32-v48:64-"
8791 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00008792 }
8793 void getTargetDefines(const LangOptions &Opts,
8794 MacroBuilder &Builder) const override {
8795 DefineStd(Builder, "SPIR64", Opts);
8796 }
8797};
Guy Benyeib798fc92012-12-11 21:38:14 +00008798
Robert Lytton0e076492013-08-13 09:43:10 +00008799class XCoreTargetInfo : public TargetInfo {
8800 static const Builtin::Info BuiltinInfo[];
8801public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008802 XCoreTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
8803 : TargetInfo(Triple) {
Robert Lytton0e076492013-08-13 09:43:10 +00008804 NoAsmVariants = true;
8805 LongLongAlign = 32;
8806 SuitableAlign = 32;
8807 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00008808 SizeType = UnsignedInt;
8809 PtrDiffType = SignedInt;
8810 IntPtrType = SignedInt;
8811 WCharType = UnsignedChar;
8812 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00008813 UseZeroLengthBitfieldAlignment = true;
James Y Knightb214cbc2016-03-04 19:00:41 +00008814 resetDataLayout("e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32"
8815 "-f64:32-a:0:32-n32");
Robert Lytton0e076492013-08-13 09:43:10 +00008816 }
Craig Topper3164f332014-03-11 03:39:26 +00008817 void getTargetDefines(const LangOptions &Opts,
8818 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008819 Builder.defineMacro("__XS1B__");
8820 }
Craig Topper6c03a542015-10-19 04:51:35 +00008821 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
8822 return llvm::makeArrayRef(BuiltinInfo,
8823 clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin);
Robert Lytton0e076492013-08-13 09:43:10 +00008824 }
Craig Topper3164f332014-03-11 03:39:26 +00008825 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008826 return TargetInfo::VoidPtrBuiltinVaList;
8827 }
Craig Topper3164f332014-03-11 03:39:26 +00008828 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008829 return "";
8830 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008831 ArrayRef<const char *> getGCCRegNames() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008832 static const char * const GCCRegNames[] = {
8833 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
8834 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
8835 };
Craig Topperf054e3a2015-10-19 03:52:27 +00008836 return llvm::makeArrayRef(GCCRegNames);
Robert Lytton0e076492013-08-13 09:43:10 +00008837 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008838 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8839 return None;
Robert Lytton0e076492013-08-13 09:43:10 +00008840 }
Craig Topper3164f332014-03-11 03:39:26 +00008841 bool validateAsmConstraint(const char *&Name,
8842 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008843 return false;
8844 }
Craig Topper3164f332014-03-11 03:39:26 +00008845 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00008846 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
8847 return (RegNo < 2)? RegNo : -1;
8848 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00008849 bool allowsLargerPreferedTypeAlignment() const override {
8850 return false;
8851 }
Robert Lytton0e076492013-08-13 09:43:10 +00008852};
8853
8854const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00008855#define BUILTIN(ID, TYPE, ATTRS) \
8856 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
8857#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
8858 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Robert Lytton0e076492013-08-13 09:43:10 +00008859#include "clang/Basic/BuiltinsXCore.def"
8860};
Robert Lytton0e076492013-08-13 09:43:10 +00008861
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008862// x86_32 Android target
8863class AndroidX86_32TargetInfo : public LinuxTargetInfo<X86_32TargetInfo> {
8864public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008865 AndroidX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8866 : LinuxTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008867 SuitableAlign = 32;
8868 LongDoubleWidth = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00008869 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008870 }
8871};
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008872
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008873// x86_64 Android target
8874class AndroidX86_64TargetInfo : public LinuxTargetInfo<X86_64TargetInfo> {
8875public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008876 AndroidX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8877 : LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Stephan Bergmann17c7f702016-12-14 11:57:17 +00008878 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008879 }
Chih-Hung Hsieh0b0eeaa2015-07-24 18:12:54 +00008880
8881 bool useFloat128ManglingForLongDouble() const override {
8882 return true;
8883 }
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008884};
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008885
8886// 32-bit RenderScript is armv7 with width and align of 'long' set to 8-bytes
8887class RenderScript32TargetInfo : public ARMleTargetInfo {
8888public:
8889 RenderScript32TargetInfo(const llvm::Triple &Triple,
8890 const TargetOptions &Opts)
8891 : ARMleTargetInfo(llvm::Triple("armv7", Triple.getVendorName(),
8892 Triple.getOSName(),
8893 Triple.getEnvironmentName()),
8894 Opts) {
Pirama Arumuga Nainarbb846a32016-07-27 19:01:51 +00008895 IsRenderScriptTarget = true;
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008896 LongWidth = LongAlign = 64;
8897 }
8898 void getTargetDefines(const LangOptions &Opts,
8899 MacroBuilder &Builder) const override {
8900 Builder.defineMacro("__RENDERSCRIPT__");
8901 ARMleTargetInfo::getTargetDefines(Opts, Builder);
8902 }
8903};
8904
8905// 64-bit RenderScript is aarch64
8906class RenderScript64TargetInfo : public AArch64leTargetInfo {
8907public:
8908 RenderScript64TargetInfo(const llvm::Triple &Triple,
8909 const TargetOptions &Opts)
8910 : AArch64leTargetInfo(llvm::Triple("aarch64", Triple.getVendorName(),
8911 Triple.getOSName(),
8912 Triple.getEnvironmentName()),
Pirama Arumuga Nainarbb846a32016-07-27 19:01:51 +00008913 Opts) {
8914 IsRenderScriptTarget = true;
8915 }
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008916
8917 void getTargetDefines(const LangOptions &Opts,
8918 MacroBuilder &Builder) const override {
8919 Builder.defineMacro("__RENDERSCRIPT__");
8920 AArch64leTargetInfo::getTargetDefines(Opts, Builder);
8921 }
8922};
8923
Dylan McKayecb6e7b2017-02-07 06:04:18 +00008924/// Information about a specific microcontroller.
8925struct MCUInfo {
8926 const char *Name;
8927 const char *DefineName;
8928};
8929
8930// This list should be kept up-to-date with AVRDevices.td in LLVM.
8931static ArrayRef<MCUInfo> AVRMcus = {
8932 { "at90s1200", "__AVR_AT90S1200__" },
Dylan McKay315edb02017-02-11 21:06:07 +00008933 { "attiny11", "__AVR_ATtiny11__" },
8934 { "attiny12", "__AVR_ATtiny12__" },
8935 { "attiny15", "__AVR_ATtiny15__" },
8936 { "attiny28", "__AVR_ATtiny28__" },
8937 { "at90s2313", "__AVR_AT90S2313__" },
8938 { "at90s2323", "__AVR_AT90S2323__" },
8939 { "at90s2333", "__AVR_AT90S2333__" },
8940 { "at90s2343", "__AVR_AT90S2343__" },
8941 { "attiny22", "__AVR_ATtiny22__" },
8942 { "attiny26", "__AVR_ATtiny26__" },
8943 { "at86rf401", "__AVR_AT86RF401__" },
8944 { "at90s4414", "__AVR_AT90S4414__" },
8945 { "at90s4433", "__AVR_AT90S4433__" },
8946 { "at90s4434", "__AVR_AT90S4434__" },
8947 { "at90s8515", "__AVR_AT90S8515__" },
8948 { "at90c8534", "__AVR_AT90c8534__" },
8949 { "at90s8535", "__AVR_AT90S8535__" },
8950 { "ata5272", "__AVR_ATA5272__" },
8951 { "attiny13", "__AVR_ATtiny13__" },
8952 { "attiny13a", "__AVR_ATtiny13A__" },
8953 { "attiny2313", "__AVR_ATtiny2313__" },
8954 { "attiny2313a", "__AVR_ATtiny2313A__" },
8955 { "attiny24", "__AVR_ATtiny24__" },
8956 { "attiny24a", "__AVR_ATtiny24A__" },
8957 { "attiny4313", "__AVR_ATtiny4313__" },
8958 { "attiny44", "__AVR_ATtiny44__" },
8959 { "attiny44a", "__AVR_ATtiny44A__" },
8960 { "attiny84", "__AVR_ATtiny84__" },
8961 { "attiny84a", "__AVR_ATtiny84A__" },
8962 { "attiny25", "__AVR_ATtiny25__" },
8963 { "attiny45", "__AVR_ATtiny45__" },
8964 { "attiny85", "__AVR_ATtiny85__" },
8965 { "attiny261", "__AVR_ATtiny261__" },
8966 { "attiny261a", "__AVR_ATtiny261A__" },
8967 { "attiny461", "__AVR_ATtiny461__" },
8968 { "attiny461a", "__AVR_ATtiny461A__" },
8969 { "attiny861", "__AVR_ATtiny861__" },
8970 { "attiny861a", "__AVR_ATtiny861A__" },
8971 { "attiny87", "__AVR_ATtiny87__" },
8972 { "attiny43u", "__AVR_ATtiny43U__" },
8973 { "attiny48", "__AVR_ATtiny48__" },
8974 { "attiny88", "__AVR_ATtiny88__" },
8975 { "attiny828", "__AVR_ATtiny828__" },
8976 { "at43usb355", "__AVR_AT43USB355__" },
8977 { "at76c711", "__AVR_AT76C711__" },
8978 { "atmega103", "__AVR_ATmega103__" },
8979 { "at43usb320", "__AVR_AT43USB320__" },
8980 { "attiny167", "__AVR_ATtiny167__" },
8981 { "at90usb82", "__AVR_AT90USB82__" },
8982 { "at90usb162", "__AVR_AT90USB162__" },
8983 { "ata5505", "__AVR_ATA5505__" },
8984 { "atmega8u2", "__AVR_ATmega8U2__" },
8985 { "atmega16u2", "__AVR_ATmega16U2__" },
8986 { "atmega32u2", "__AVR_ATmega32U2__" },
8987 { "attiny1634", "__AVR_ATtiny1634__" },
8988 { "atmega8", "__AVR_ATmega8__" },
8989 { "ata6289", "__AVR_ATA6289__" },
8990 { "atmega8a", "__AVR_ATmega8A__" },
8991 { "ata6285", "__AVR_ATA6285__" },
8992 { "ata6286", "__AVR_ATA6286__" },
8993 { "atmega48", "__AVR_ATmega48__" },
8994 { "atmega48a", "__AVR_ATmega48A__" },
8995 { "atmega48pa", "__AVR_ATmega48PA__" },
8996 { "atmega48p", "__AVR_ATmega48P__" },
8997 { "atmega88", "__AVR_ATmega88__" },
8998 { "atmega88a", "__AVR_ATmega88A__" },
8999 { "atmega88p", "__AVR_ATmega88P__" },
9000 { "atmega88pa", "__AVR_ATmega88PA__" },
9001 { "atmega8515", "__AVR_ATmega8515__" },
9002 { "atmega8535", "__AVR_ATmega8535__" },
9003 { "atmega8hva", "__AVR_ATmega8HVA__" },
9004 { "at90pwm1", "__AVR_AT90PWM1__" },
9005 { "at90pwm2", "__AVR_AT90PWM2__" },
9006 { "at90pwm2b", "__AVR_AT90PWM2B__" },
9007 { "at90pwm3", "__AVR_AT90PWM3__" },
9008 { "at90pwm3b", "__AVR_AT90PWM3B__" },
9009 { "at90pwm81", "__AVR_AT90PWM81__" },
9010 { "ata5790", "__AVR_ATA5790__" },
9011 { "ata5795", "__AVR_ATA5795__" },
9012 { "atmega16", "__AVR_ATmega16__" },
9013 { "atmega16a", "__AVR_ATmega16A__" },
9014 { "atmega161", "__AVR_ATmega161__" },
9015 { "atmega162", "__AVR_ATmega162__" },
9016 { "atmega163", "__AVR_ATmega163__" },
9017 { "atmega164a", "__AVR_ATmega164A__" },
9018 { "atmega164p", "__AVR_ATmega164P__" },
9019 { "atmega164pa", "__AVR_ATmega164PA__" },
9020 { "atmega165", "__AVR_ATmega165__" },
9021 { "atmega165a", "__AVR_ATmega165A__" },
9022 { "atmega165p", "__AVR_ATmega165P__" },
9023 { "atmega165pa", "__AVR_ATmega165PA__" },
9024 { "atmega168", "__AVR_ATmega168__" },
9025 { "atmega168a", "__AVR_ATmega168A__" },
9026 { "atmega168p", "__AVR_ATmega168P__" },
9027 { "atmega168pa", "__AVR_ATmega168PA__" },
9028 { "atmega169", "__AVR_ATmega169__" },
9029 { "atmega169a", "__AVR_ATmega169A__" },
9030 { "atmega169p", "__AVR_ATmega169P__" },
9031 { "atmega169pa", "__AVR_ATmega169PA__" },
9032 { "atmega32", "__AVR_ATmega32__" },
9033 { "atmega32a", "__AVR_ATmega32A__" },
9034 { "atmega323", "__AVR_ATmega323__" },
9035 { "atmega324a", "__AVR_ATmega324A__" },
9036 { "atmega324p", "__AVR_ATmega324P__" },
9037 { "atmega324pa", "__AVR_ATmega324PA__" },
9038 { "atmega325", "__AVR_ATmega325__" },
9039 { "atmega325a", "__AVR_ATmega325A__" },
9040 { "atmega325p", "__AVR_ATmega325P__" },
9041 { "atmega325pa", "__AVR_ATmega325PA__" },
9042 { "atmega3250", "__AVR_ATmega3250__" },
9043 { "atmega3250a", "__AVR_ATmega3250A__" },
9044 { "atmega3250p", "__AVR_ATmega3250P__" },
9045 { "atmega3250pa", "__AVR_ATmega3250PA__" },
9046 { "atmega328", "__AVR_ATmega328__" },
9047 { "atmega328p", "__AVR_ATmega328P__" },
9048 { "atmega329", "__AVR_ATmega329__" },
9049 { "atmega329a", "__AVR_ATmega329A__" },
9050 { "atmega329p", "__AVR_ATmega329P__" },
9051 { "atmega329pa", "__AVR_ATmega329PA__" },
9052 { "atmega3290", "__AVR_ATmega3290__" },
9053 { "atmega3290a", "__AVR_ATmega3290A__" },
9054 { "atmega3290p", "__AVR_ATmega3290P__" },
9055 { "atmega3290pa", "__AVR_ATmega3290PA__" },
9056 { "atmega406", "__AVR_ATmega406__" },
9057 { "atmega64", "__AVR_ATmega64__" },
9058 { "atmega64a", "__AVR_ATmega64A__" },
9059 { "atmega640", "__AVR_ATmega640__" },
9060 { "atmega644", "__AVR_ATmega644__" },
9061 { "atmega644a", "__AVR_ATmega644A__" },
9062 { "atmega644p", "__AVR_ATmega644P__" },
9063 { "atmega644pa", "__AVR_ATmega644PA__" },
9064 { "atmega645", "__AVR_ATmega645__" },
9065 { "atmega645a", "__AVR_ATmega645A__" },
9066 { "atmega645p", "__AVR_ATmega645P__" },
9067 { "atmega649", "__AVR_ATmega649__" },
9068 { "atmega649a", "__AVR_ATmega649A__" },
9069 { "atmega649p", "__AVR_ATmega649P__" },
9070 { "atmega6450", "__AVR_ATmega6450__" },
9071 { "atmega6450a", "__AVR_ATmega6450A__" },
9072 { "atmega6450p", "__AVR_ATmega6450P__" },
9073 { "atmega6490", "__AVR_ATmega6490__" },
9074 { "atmega6490a", "__AVR_ATmega6490A__" },
9075 { "atmega6490p", "__AVR_ATmega6490P__" },
9076 { "atmega64rfr2", "__AVR_ATmega64RFR2__" },
9077 { "atmega644rfr2", "__AVR_ATmega644RFR2__" },
9078 { "atmega16hva", "__AVR_ATmega16HVA__" },
9079 { "atmega16hva2", "__AVR_ATmega16HVA2__" },
9080 { "atmega16hvb", "__AVR_ATmega16HVB__" },
9081 { "atmega16hvbrevb", "__AVR_ATmega16HVBREVB__" },
9082 { "atmega32hvb", "__AVR_ATmega32HVB__" },
9083 { "atmega32hvbrevb", "__AVR_ATmega32HVBREVB__" },
9084 { "atmega64hve", "__AVR_ATmega64HVE__" },
9085 { "at90can32", "__AVR_AT90CAN32__" },
9086 { "at90can64", "__AVR_AT90CAN64__" },
9087 { "at90pwm161", "__AVR_AT90PWM161__" },
9088 { "at90pwm216", "__AVR_AT90PWM216__" },
9089 { "at90pwm316", "__AVR_AT90PWM316__" },
9090 { "atmega32c1", "__AVR_ATmega32C1__" },
9091 { "atmega64c1", "__AVR_ATmega64C1__" },
9092 { "atmega16m1", "__AVR_ATmega16M1__" },
9093 { "atmega32m1", "__AVR_ATmega32M1__" },
9094 { "atmega64m1", "__AVR_ATmega64M1__" },
9095 { "atmega16u4", "__AVR_ATmega16U4__" },
9096 { "atmega32u4", "__AVR_ATmega32U4__" },
9097 { "atmega32u6", "__AVR_ATmega32U6__" },
9098 { "at90usb646", "__AVR_AT90USB646__" },
9099 { "at90usb647", "__AVR_AT90USB647__" },
9100 { "at90scr100", "__AVR_AT90SCR100__" },
9101 { "at94k", "__AVR_AT94K__" },
9102 { "m3000", "__AVR_AT000__" },
9103 { "atmega128", "__AVR_ATmega128__" },
9104 { "atmega128a", "__AVR_ATmega128A__" },
9105 { "atmega1280", "__AVR_ATmega1280__" },
9106 { "atmega1281", "__AVR_ATmega1281__" },
9107 { "atmega1284", "__AVR_ATmega1284__" },
9108 { "atmega1284p", "__AVR_ATmega1284P__" },
9109 { "atmega128rfa1", "__AVR_ATmega128RFA1__" },
9110 { "atmega128rfr2", "__AVR_ATmega128RFR2__" },
9111 { "atmega1284rfr2", "__AVR_ATmega1284RFR2__" },
9112 { "at90can128", "__AVR_AT90CAN128__" },
9113 { "at90usb1286", "__AVR_AT90USB1286__" },
9114 { "at90usb1287", "__AVR_AT90USB1287__" },
9115 { "atmega2560", "__AVR_ATmega2560__" },
9116 { "atmega2561", "__AVR_ATmega2561__" },
9117 { "atmega256rfr2", "__AVR_ATmega256RFR2__" },
9118 { "atmega2564rfr2", "__AVR_ATmega2564RFR2__" },
9119 { "atxmega16a4", "__AVR_ATxmega16A4__" },
9120 { "atxmega16a4u", "__AVR_ATxmega16a4U__" },
9121 { "atxmega16c4", "__AVR_ATxmega16C4__" },
9122 { "atxmega16d4", "__AVR_ATxmega16D4__" },
9123 { "atxmega32a4", "__AVR_ATxmega32A4__" },
9124 { "atxmega32a4u", "__AVR_ATxmega32A4U__" },
9125 { "atxmega32c4", "__AVR_ATxmega32C4__" },
9126 { "atxmega32d4", "__AVR_ATxmega32D4__" },
9127 { "atxmega32e5", "__AVR_ATxmega32E5__" },
9128 { "atxmega16e5", "__AVR_ATxmega16E5__" },
9129 { "atxmega8e5", "__AVR_ATxmega8E5__" },
9130 { "atxmega32x1", "__AVR_ATxmega32X1__" },
9131 { "atxmega64a3", "__AVR_ATxmega64A3__" },
9132 { "atxmega64a3u", "__AVR_ATxmega64A3U__" },
9133 { "atxmega64a4u", "__AVR_ATxmega64A4U__" },
9134 { "atxmega64b1", "__AVR_ATxmega64B1__" },
9135 { "atxmega64b3", "__AVR_ATxmega64B3__" },
9136 { "atxmega64c3", "__AVR_ATxmega64C3__" },
9137 { "atxmega64d3", "__AVR_ATxmega64D3__" },
9138 { "atxmega64d4", "__AVR_ATxmega64D4__" },
9139 { "atxmega64a1", "__AVR_ATxmega64A1__" },
9140 { "atxmega64a1u", "__AVR_ATxmega64A1U__" },
9141 { "atxmega128a3", "__AVR_ATxmega128A3__" },
9142 { "atxmega128a3u", "__AVR_ATxmega128A3U__" },
9143 { "atxmega128b1", "__AVR_ATxmega128B1__" },
9144 { "atxmega128b3", "__AVR_ATxmega128B3__" },
9145 { "atxmega128c3", "__AVR_ATxmega128C3__" },
9146 { "atxmega128d3", "__AVR_ATxmega128D3__" },
9147 { "atxmega128d4", "__AVR_ATxmega128D4__" },
9148 { "atxmega192a3", "__AVR_ATxmega192A3__" },
9149 { "atxmega192a3u", "__AVR_ATxmega192A3U__" },
9150 { "atxmega192c3", "__AVR_ATxmega192C3__" },
9151 { "atxmega192d3", "__AVR_ATxmega192D3__" },
9152 { "atxmega256a3", "__AVR_ATxmega256A3__" },
9153 { "atxmega256a3u", "__AVR_ATxmega256A3U__" },
9154 { "atxmega256a3b", "__AVR_ATxmega256A3B__" },
9155 { "atxmega256a3bu", "__AVR_ATxmega256A3BU__" },
9156 { "atxmega256c3", "__AVR_ATxmega256C3__" },
9157 { "atxmega256d3", "__AVR_ATxmega256D3__" },
9158 { "atxmega384c3", "__AVR_ATxmega384C3__" },
9159 { "atxmega384d3", "__AVR_ATxmega384D3__" },
9160 { "atxmega128a1", "__AVR_ATxmega128A1__" },
9161 { "atxmega128a1u", "__AVR_ATxmega128A1U__" },
9162 { "atxmega128a4u", "__AVR_ATxmega128a4U__" },
9163 { "attiny4", "__AVR_ATtiny4__" },
9164 { "attiny5", "__AVR_ATtiny5__" },
9165 { "attiny9", "__AVR_ATtiny9__" },
9166 { "attiny10", "__AVR_ATtiny10__" },
9167 { "attiny20", "__AVR_ATtiny20__" },
9168 { "attiny40", "__AVR_ATtiny40__" },
9169 { "attiny102", "__AVR_ATtiny102__" },
9170 { "attiny104", "__AVR_ATtiny104__" },
Dylan McKayecb6e7b2017-02-07 06:04:18 +00009171};
Dylan McKay924fa3a2017-01-05 05:20:27 +00009172
9173// AVR Target
9174class AVRTargetInfo : public TargetInfo {
9175public:
9176 AVRTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
9177 : TargetInfo(Triple) {
9178 TLSSupported = false;
9179 PointerWidth = 16;
9180 PointerAlign = 8;
9181 IntWidth = 16;
9182 IntAlign = 8;
9183 LongWidth = 32;
9184 LongAlign = 8;
9185 LongLongWidth = 64;
9186 LongLongAlign = 8;
9187 SuitableAlign = 8;
9188 DefaultAlignForAttributeAligned = 8;
9189 HalfWidth = 16;
9190 HalfAlign = 8;
9191 FloatWidth = 32;
9192 FloatAlign = 8;
9193 DoubleWidth = 32;
9194 DoubleAlign = 8;
9195 DoubleFormat = &llvm::APFloat::IEEEsingle();
9196 LongDoubleWidth = 32;
9197 LongDoubleAlign = 8;
9198 LongDoubleFormat = &llvm::APFloat::IEEEsingle();
9199 SizeType = UnsignedInt;
9200 PtrDiffType = SignedInt;
9201 IntPtrType = SignedInt;
9202 Char16Type = UnsignedInt;
9203 WCharType = SignedInt;
9204 WIntType = SignedInt;
9205 Char32Type = UnsignedLong;
9206 SigAtomicType = SignedChar;
9207 resetDataLayout("e-p:16:16:16-i8:8:8-i16:16:16-i32:32:32-i64:64:64"
9208 "-f32:32:32-f64:64:64-n8");
9209 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00009210
Dylan McKay924fa3a2017-01-05 05:20:27 +00009211 void getTargetDefines(const LangOptions &Opts,
9212 MacroBuilder &Builder) const override {
Dylan McKayecb6e7b2017-02-07 06:04:18 +00009213 Builder.defineMacro("AVR");
9214 Builder.defineMacro("__AVR");
Dylan McKay924fa3a2017-01-05 05:20:27 +00009215 Builder.defineMacro("__AVR__");
Dylan McKayecb6e7b2017-02-07 06:04:18 +00009216
9217 if (!this->CPU.empty()) {
9218 auto It = std::find_if(AVRMcus.begin(), AVRMcus.end(),
9219 [&](const MCUInfo &Info) { return Info.Name == this->CPU; });
9220
9221 if (It != AVRMcus.end())
9222 Builder.defineMacro(It->DefineName);
9223 }
Dylan McKay924fa3a2017-01-05 05:20:27 +00009224 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00009225
Dylan McKay924fa3a2017-01-05 05:20:27 +00009226 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
9227 return None;
9228 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00009229
Dylan McKay924fa3a2017-01-05 05:20:27 +00009230 BuiltinVaListKind getBuiltinVaListKind() const override {
9231 return TargetInfo::VoidPtrBuiltinVaList;
9232 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00009233
Dylan McKay924fa3a2017-01-05 05:20:27 +00009234 const char *getClobbers() const override {
9235 return "";
9236 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00009237
Dylan McKay924fa3a2017-01-05 05:20:27 +00009238 ArrayRef<const char *> getGCCRegNames() const override {
9239 static const char * const GCCRegNames[] = {
9240 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
9241 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
9242 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
Dylan McKay95aa2652017-01-05 07:17:46 +00009243 "r24", "r25", "X", "Y", "Z", "SP"
Dylan McKay924fa3a2017-01-05 05:20:27 +00009244 };
9245 return llvm::makeArrayRef(GCCRegNames);
9246 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00009247
Dylan McKay924fa3a2017-01-05 05:20:27 +00009248 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
9249 return None;
9250 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00009251
Dylan McKay924fa3a2017-01-05 05:20:27 +00009252 ArrayRef<TargetInfo::AddlRegName> getGCCAddlRegNames() const override {
9253 static const TargetInfo::AddlRegName AddlRegNames[] = {
9254 { { "r26", "r27"}, 26 },
9255 { { "r28", "r29"}, 27 },
9256 { { "r30", "r31"}, 28 },
9257 { { "SPL", "SPH"}, 29 },
9258 };
9259 return llvm::makeArrayRef(AddlRegNames);
9260 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00009261
Dylan McKay924fa3a2017-01-05 05:20:27 +00009262 bool validateAsmConstraint(const char *&Name,
9263 TargetInfo::ConstraintInfo &Info) const override {
Dylan McKayd31534c2017-02-06 09:01:59 +00009264 // There aren't any multi-character AVR specific constraints.
9265 if (StringRef(Name).size() > 1) return false;
9266
9267 switch (*Name) {
9268 default: return false;
9269 case 'a': // Simple upper registers
9270 case 'b': // Base pointer registers pairs
9271 case 'd': // Upper register
9272 case 'l': // Lower registers
9273 case 'e': // Pointer register pairs
9274 case 'q': // Stack pointer register
9275 case 'r': // Any register
9276 case 'w': // Special upper register pairs
9277 case 't': // Temporary register
9278 case 'x': case 'X': // Pointer register pair X
9279 case 'y': case 'Y': // Pointer register pair Y
9280 case 'z': case 'Z': // Pointer register pair Z
9281 Info.setAllowsRegister();
9282 return true;
9283 case 'I': // 6-bit positive integer constant
9284 Info.setRequiresImmediate(0, 63);
9285 return true;
9286 case 'J': // 6-bit negative integer constant
9287 Info.setRequiresImmediate(-63, 0);
9288 return true;
9289 case 'K': // Integer constant (Range: 2)
9290 Info.setRequiresImmediate(2);
9291 return true;
9292 case 'L': // Integer constant (Range: 0)
9293 Info.setRequiresImmediate(0);
9294 return true;
9295 case 'M': // 8-bit integer constant
9296 Info.setRequiresImmediate(0, 0xff);
9297 return true;
9298 case 'N': // Integer constant (Range: -1)
9299 Info.setRequiresImmediate(-1);
9300 return true;
9301 case 'O': // Integer constant (Range: 8, 16, 24)
9302 Info.setRequiresImmediate({8, 16, 24});
9303 return true;
9304 case 'P': // Integer constant (Range: 1)
9305 Info.setRequiresImmediate(1);
9306 return true;
9307 case 'R': // Integer constant (Range: -6 to 5)
9308 Info.setRequiresImmediate(-6, 5);
9309 return true;
9310 case 'G': // Floating point constant
9311 case 'Q': // A memory address based on Y or Z pointer with displacement.
9312 return true;
9313 }
9314
Dylan McKay924fa3a2017-01-05 05:20:27 +00009315 return false;
9316 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00009317
Dylan McKay924fa3a2017-01-05 05:20:27 +00009318 IntType getIntTypeByWidth(unsigned BitWidth,
9319 bool IsSigned) const final {
9320 // AVR prefers int for 16-bit integers.
9321 return BitWidth == 16 ? (IsSigned ? SignedInt : UnsignedInt)
9322 : TargetInfo::getIntTypeByWidth(BitWidth, IsSigned);
9323 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00009324
Dylan McKay924fa3a2017-01-05 05:20:27 +00009325 IntType getLeastIntTypeByWidth(unsigned BitWidth,
9326 bool IsSigned) const final {
9327 // AVR uses int for int_least16_t and int_fast16_t.
9328 return BitWidth == 16
9329 ? (IsSigned ? SignedInt : UnsignedInt)
9330 : TargetInfo::getLeastIntTypeByWidth(BitWidth, IsSigned);
9331 }
Dylan McKayecb6e7b2017-02-07 06:04:18 +00009332
9333 bool setCPU(const std::string &Name) override {
9334 bool IsFamily = llvm::StringSwitch<bool>(Name)
9335 .Case("avr1", true)
9336 .Case("avr2", true)
9337 .Case("avr25", true)
9338 .Case("avr3", true)
9339 .Case("avr31", true)
9340 .Case("avr35", true)
9341 .Case("avr4", true)
9342 .Case("avr5", true)
9343 .Case("avr51", true)
9344 .Case("avr6", true)
9345 .Case("avrxmega1", true)
9346 .Case("avrxmega2", true)
9347 .Case("avrxmega3", true)
9348 .Case("avrxmega4", true)
9349 .Case("avrxmega5", true)
9350 .Case("avrxmega6", true)
9351 .Case("avrxmega7", true)
9352 .Case("avrtiny", true)
9353 .Default(false);
9354
9355 if (IsFamily) this->CPU = Name;
9356
9357 bool IsMCU = std::find_if(AVRMcus.begin(), AVRMcus.end(),
9358 [&](const MCUInfo &Info) { return Info.Name == Name; }) != AVRMcus.end();
9359
9360 if (IsMCU) this->CPU = Name;
9361
9362 return IsFamily || IsMCU;
9363 }
9364
9365protected:
9366 std::string CPU;
Dylan McKay924fa3a2017-01-05 05:20:27 +00009367};
9368
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009369} // end anonymous namespace
9370
Chris Lattner5ba61f02006-10-14 07:39:34 +00009371//===----------------------------------------------------------------------===//
9372// Driver code
9373//===----------------------------------------------------------------------===//
9374
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009375static TargetInfo *AllocateTarget(const llvm::Triple &Triple,
9376 const TargetOptions &Opts) {
Daniel Dunbar52322032009-08-18 05:47:58 +00009377 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00009378
Daniel Dunbar52322032009-08-18 05:47:58 +00009379 switch (Triple.getArch()) {
9380 default:
Craig Topperf1186c52014-05-08 06:41:40 +00009381 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00009382
Tim Northover2a0783d2014-05-30 14:14:07 +00009383 case llvm::Triple::xcore:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009384 return new XCoreTargetInfo(Triple, Opts);
Tim Northover2a0783d2014-05-30 14:14:07 +00009385
9386 case llvm::Triple::hexagon:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009387 return new HexagonTargetInfo(Triple, Opts);
Tim Northover2a0783d2014-05-30 14:14:07 +00009388
Jacques Pienaard964cc22016-03-28 21:02:54 +00009389 case llvm::Triple::lanai:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009390 return new LanaiTargetInfo(Triple, Opts);
Jacques Pienaard964cc22016-03-28 21:02:54 +00009391
Tim Northover2a0783d2014-05-30 14:14:07 +00009392 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00009393 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009394 return new DarwinAArch64TargetInfo(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00009395
9396 switch (os) {
Ed Schoutenea9448e2015-10-15 15:07:07 +00009397 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009398 return new CloudABITargetInfo<AArch64leTargetInfo>(Triple, Opts);
Ed Maste6a9eda52014-11-13 16:55:42 +00009399 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009400 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Petr Hosek9834fcd2016-10-24 22:55:57 +00009401 case llvm::Triple::Fuchsia:
9402 return new FuchsiaTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00009403 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009404 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple, Opts);
James Molloy5e73df52014-04-16 15:06:20 +00009405 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009406 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Brad Smith9aa2bf22017-02-21 23:13:09 +00009407 case llvm::Triple::OpenBSD:
9408 return new OpenBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00009409 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009410 return new AArch64leTargetInfo(Triple, Opts);
James Molloy5e73df52014-04-16 15:06:20 +00009411 }
9412
Christian Pirker9b019ae2014-02-25 13:51:00 +00009413 case llvm::Triple::aarch64_be:
9414 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00009415 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009416 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Petr Hosek9834fcd2016-10-24 22:55:57 +00009417 case llvm::Triple::Fuchsia:
9418 return new FuchsiaTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00009419 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009420 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00009421 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009422 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00009423 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009424 return new AArch64beTargetInfo(Triple, Opts);
Tim Northover9bb857a2013-01-31 12:13:10 +00009425 }
9426
Daniel Dunbar52322032009-08-18 05:47:58 +00009427 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00009428 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00009429 if (Triple.isOSBinFormatMachO())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009430 return new DarwinARMTargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00009431
Daniel Dunbar52322032009-08-18 05:47:58 +00009432 switch (os) {
Ed Schoutenc6d1a732016-09-05 18:38:34 +00009433 case llvm::Triple::CloudABI:
9434 return new CloudABITargetInfo<ARMleTargetInfo>(Triple, Opts);
Rafael Espindolaad8fed52010-06-10 00:46:51 +00009435 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009436 return new LinuxTargetInfo<ARMleTargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009437 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009438 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009439 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009440 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00009441 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009442 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00009443 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009444 return new BitrigTargetInfo<ARMleTargetInfo>(Triple, Opts);
Douglas Gregor9fabd852011-07-01 22:41:14 +00009445 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009446 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00009447 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009448 return new NaClTargetInfo<ARMleTargetInfo>(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00009449 case llvm::Triple::Win32:
9450 switch (Triple.getEnvironment()) {
Yaron Keren321249c2015-07-15 13:32:23 +00009451 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009452 return new CygwinARMTargetInfo(Triple, Opts);
Yaron Keren321249c2015-07-15 13:32:23 +00009453 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009454 return new MinGWARMTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00009455 case llvm::Triple::Itanium:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009456 return new ItaniumWindowsARMleTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00009457 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00009458 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009459 return new MicrosoftARMleTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00009460 }
Daniel Dunbar52322032009-08-18 05:47:58 +00009461 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009462 return new ARMleTargetInfo(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009463 }
9464
9465 case llvm::Triple::armeb:
9466 case llvm::Triple::thumbeb:
9467 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009468 return new DarwinARMTargetInfo(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009469
9470 switch (os) {
9471 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009472 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009473 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009474 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009475 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009476 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009477 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009478 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009479 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009480 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009481 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009482 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009483 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009484 return new NaClTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009485 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009486 return new ARMbeTargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009487 }
Eli Friedmanb5366062008-05-20 14:21:01 +00009488
Dylan McKay924fa3a2017-01-05 05:20:27 +00009489 case llvm::Triple::avr:
9490 return new AVRTargetInfo(Triple, Opts);
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00009491 case llvm::Triple::bpfeb:
9492 case llvm::Triple::bpfel:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009493 return new BPFTargetInfo(Triple, Opts);
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00009494
Daniel Dunbar52322032009-08-18 05:47:58 +00009495 case llvm::Triple::msp430:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009496 return new MSP430TargetInfo(Triple, Opts);
Eli Friedmanb5366062008-05-20 14:21:01 +00009497
Nikolai Bozhenov35d3c352017-06-27 09:48:24 +00009498 case llvm::Triple::nios2:
9499 return new LinuxTargetInfo<Nios2TargetInfo>(Triple, Opts);
9500
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00009501 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009502 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009503 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00009504 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009505 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00009506 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009507 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009508 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009509 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009510 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009511 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00009512 return new MipsTargetInfo(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009513 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00009514
9515 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009516 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009517 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00009518 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009519 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00009520 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009521 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009522 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009523 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009524 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00009525 case llvm::Triple::NaCl:
Daniel Sanders4672af62016-05-27 11:51:02 +00009526 return new NaClTargetInfo<NaClMips32TargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009527 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00009528 return new MipsTargetInfo(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009529 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00009530
Akira Hatanakabef17452011-09-20 19:21:49 +00009531 case llvm::Triple::mips64:
9532 switch (os) {
9533 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00009534 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009535 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00009536 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009537 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009538 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009539 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009540 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00009541 case llvm::Triple::OpenBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009542 return new OpenBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009543 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00009544 return new MipsTargetInfo(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009545 }
9546
9547 case llvm::Triple::mips64el:
9548 switch (os) {
9549 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00009550 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009551 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00009552 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009553 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009554 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009555 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009556 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00009557 case llvm::Triple::OpenBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009558 return new OpenBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009559 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00009560 return new MipsTargetInfo(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009561 }
9562
Ivan Krasindd7403e2011-08-24 20:22:22 +00009563 case llvm::Triple::le32:
9564 switch (os) {
Douglas Katzman78d7c542015-05-12 21:18:10 +00009565 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009566 return new NaClTargetInfo<PNaClTargetInfo>(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00009567 default:
9568 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00009569 }
9570
JF Bastien643817d2014-09-12 17:52:47 +00009571 case llvm::Triple::le64:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009572 return new Le64TargetInfo(Triple, Opts);
JF Bastien643817d2014-09-12 17:52:47 +00009573
Daniel Dunbar52322032009-08-18 05:47:58 +00009574 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00009575 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009576 return new DarwinPPC32TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009577 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00009578 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009579 return new LinuxTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009580 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009581 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009582 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009583 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00009584 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009585 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009586 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009587 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009588 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009589 return new PPC32TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009590 }
Daniel Dunbar52322032009-08-18 05:47:58 +00009591
9592 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00009593 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009594 return new DarwinPPC64TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009595 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00009596 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009597 return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009598 case llvm::Triple::Lv2:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009599 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009600 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009601 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009602 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009603 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009604 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009605 return new PPC64TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009606 }
Daniel Dunbar52322032009-08-18 05:47:58 +00009607
Bill Schmidt778d3872013-07-26 01:36:11 +00009608 case llvm::Triple::ppc64le:
9609 switch (os) {
9610 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009611 return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger22a2d992015-04-10 20:53:48 +00009612 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009613 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Bill Schmidt778d3872013-07-26 01:36:11 +00009614 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009615 return new PPC64TargetInfo(Triple, Opts);
Bill Schmidt778d3872013-07-26 01:36:11 +00009616 }
9617
Peter Collingbournec947aae2012-05-20 23:28:41 +00009618 case llvm::Triple::nvptx:
Justin Lebarb6626592017-01-05 16:53:21 +00009619 return new NVPTXTargetInfo(Triple, Opts, /*TargetPointerWidth=*/32);
Peter Collingbournec947aae2012-05-20 23:28:41 +00009620 case llvm::Triple::nvptx64:
Justin Lebarb6626592017-01-05 16:53:21 +00009621 return new NVPTXTargetInfo(Triple, Opts, /*TargetPointerWidth=*/64);
Peter Collingbournec947aae2012-05-20 23:28:41 +00009622
Tom Stellardd8e38a32015-01-06 20:34:47 +00009623 case llvm::Triple::amdgcn:
Eli Friedmand13b41e2012-10-12 23:32:00 +00009624 case llvm::Triple::r600:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009625 return new AMDGPUTargetInfo(Triple, Opts);
Eli Friedmand13b41e2012-10-12 23:32:00 +00009626
Daniel Dunbar52322032009-08-18 05:47:58 +00009627 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009628 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00009629 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009630 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009631 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009632 return new SolarisTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009633 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009634 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00009635 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009636 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009637 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009638 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009639 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009640 return new SparcV8TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009641 }
Daniel Dunbar52322032009-08-18 05:47:58 +00009642
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009643 // The 'sparcel' architecture copies all the above cases except for Solaris.
9644 case llvm::Triple::sparcel:
9645 switch (os) {
9646 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009647 return new LinuxTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009648 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009649 return new NetBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009650 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009651 return new OpenBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009652 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009653 return new RTEMSTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009654 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009655 return new SparcV8elTargetInfo(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009656 }
9657
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009658 case llvm::Triple::sparcv9:
9659 switch (os) {
9660 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009661 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009662 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009663 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009664 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009665 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009666 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009667 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009668 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009669 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009670 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009671 return new SparcV9TargetInfo(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009672 }
9673
Ulrich Weigand47445072013-05-06 16:26:41 +00009674 case llvm::Triple::systemz:
9675 switch (os) {
9676 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009677 return new LinuxTargetInfo<SystemZTargetInfo>(Triple, Opts);
Ulrich Weigand47445072013-05-06 16:26:41 +00009678 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009679 return new SystemZTargetInfo(Triple, Opts);
Ulrich Weigand47445072013-05-06 16:26:41 +00009680 }
9681
Eli Friedmana9c3d712009-08-19 20:47:07 +00009682 case llvm::Triple::tce:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009683 return new TCETargetInfo(Triple, Opts);
Eli Friedmana9c3d712009-08-19 20:47:07 +00009684
Pekka Jaaskelainen67354482016-11-16 15:22:31 +00009685 case llvm::Triple::tcele:
9686 return new TCELETargetInfo(Triple, Opts);
9687
Daniel Dunbar52322032009-08-18 05:47:58 +00009688 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00009689 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009690 return new DarwinI386TargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00009691
Daniel Dunbar52322032009-08-18 05:47:58 +00009692 switch (os) {
Ed Schouten4dabea22017-06-25 08:29:09 +00009693 case llvm::Triple::Ananas:
9694 return new AnanasTargetInfo<X86_32TargetInfo>(Triple, Opts);
Ed Schouten7893e682015-06-13 21:33:49 +00009695 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009696 return new CloudABITargetInfo<X86_32TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009697 case llvm::Triple::Linux: {
9698 switch (Triple.getEnvironment()) {
9699 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009700 return new LinuxTargetInfo<X86_32TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009701 case llvm::Triple::Android:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009702 return new AndroidX86_32TargetInfo(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009703 }
9704 }
Daniel Dunbar52322032009-08-18 05:47:58 +00009705 case llvm::Triple::DragonFly:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009706 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009707 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009708 return new NetBSDI386TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009709 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009710 return new OpenBSDI386TargetInfo(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00009711 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009712 return new BitrigI386TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009713 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009714 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00009715 case llvm::Triple::KFreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009716 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009717 case llvm::Triple::Minix:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009718 return new MinixTargetInfo<X86_32TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009719 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009720 return new SolarisTargetInfo<X86_32TargetInfo>(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009721 case llvm::Triple::Win32: {
9722 switch (Triple.getEnvironment()) {
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009723 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009724 return new CygwinX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009725 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009726 return new MinGWX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00009727 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009728 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00009729 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009730 return new MicrosoftX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009731 }
9732 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00009733 case llvm::Triple::Haiku:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009734 return new HaikuX86_32TargetInfo(Triple, Opts);
Douglas Gregor9fabd852011-07-01 22:41:14 +00009735 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009736 return new RTEMSX86_32TargetInfo(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00009737 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009738 return new NaClTargetInfo<X86_32TargetInfo>(Triple, Opts);
Alexey Bataevc99b0492015-11-25 09:24:26 +00009739 case llvm::Triple::ELFIAMCU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009740 return new MCUX86_32TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009741 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009742 return new X86_32TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009743 }
9744
9745 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009746 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009747 return new DarwinX86_64TargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00009748
Daniel Dunbar52322032009-08-18 05:47:58 +00009749 switch (os) {
Ed Schouten4dabea22017-06-25 08:29:09 +00009750 case llvm::Triple::Ananas:
9751 return new AnanasTargetInfo<X86_64TargetInfo>(Triple, Opts);
Ed Schoutenf33c6072015-03-11 08:42:46 +00009752 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009753 return new CloudABITargetInfo<X86_64TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009754 case llvm::Triple::Linux: {
9755 switch (Triple.getEnvironment()) {
9756 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009757 return new LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009758 case llvm::Triple::Android:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009759 return new AndroidX86_64TargetInfo(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009760 }
9761 }
Chris Lattner002ba6b2010-01-09 05:41:14 +00009762 case llvm::Triple::DragonFly:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009763 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009764 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009765 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009766 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009767 return new OpenBSDX86_64TargetInfo(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00009768 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009769 return new BitrigX86_64TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009770 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009771 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Petr Hosek9834fcd2016-10-24 22:55:57 +00009772 case llvm::Triple::Fuchsia:
9773 return new FuchsiaTargetInfo<X86_64TargetInfo>(Triple, Opts);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00009774 case llvm::Triple::KFreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009775 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009776 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009777 return new SolarisTargetInfo<X86_64TargetInfo>(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009778 case llvm::Triple::Win32: {
9779 switch (Triple.getEnvironment()) {
Yaron Kerend030d112015-07-22 17:38:19 +00009780 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009781 return new CygwinX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009782 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009783 return new MinGWX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009784 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00009785 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009786 return new MicrosoftX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009787 }
9788 }
Reid Kleckner330fb172016-05-11 16:19:05 +00009789 case llvm::Triple::Haiku:
9790 return new HaikuTargetInfo<X86_64TargetInfo>(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00009791 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009792 return new NaClTargetInfo<X86_64TargetInfo>(Triple, Opts);
Alex Rosenberg12207fa2015-01-27 14:47:44 +00009793 case llvm::Triple::PS4:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009794 return new PS4OSTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009795 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009796 return new X86_64TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009797 }
Guy Benyeib798fc92012-12-11 21:38:14 +00009798
Douglas Katzman78d7c542015-05-12 21:18:10 +00009799 case llvm::Triple::spir: {
9800 if (Triple.getOS() != llvm::Triple::UnknownOS ||
9801 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
9802 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009803 return new SPIR32TargetInfo(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00009804 }
9805 case llvm::Triple::spir64: {
9806 if (Triple.getOS() != llvm::Triple::UnknownOS ||
9807 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
9808 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009809 return new SPIR64TargetInfo(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00009810 }
Dan Gohmanc2853072015-09-03 22:51:53 +00009811 case llvm::Triple::wasm32:
Dan Gohman839f2152017-01-17 21:46:38 +00009812 if (Triple.getSubArch() != llvm::Triple::NoSubArch ||
9813 Triple.getVendor() != llvm::Triple::UnknownVendor ||
9814 Triple.getOS() != llvm::Triple::UnknownOS ||
9815 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment ||
9816 !(Triple.isOSBinFormatELF() || Triple.isOSBinFormatWasm()))
Dan Gohmanc2853072015-09-03 22:51:53 +00009817 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009818 return new WebAssemblyOSTargetInfo<WebAssembly32TargetInfo>(Triple, Opts);
Dan Gohmanc2853072015-09-03 22:51:53 +00009819 case llvm::Triple::wasm64:
Dan Gohman839f2152017-01-17 21:46:38 +00009820 if (Triple.getSubArch() != llvm::Triple::NoSubArch ||
9821 Triple.getVendor() != llvm::Triple::UnknownVendor ||
9822 Triple.getOS() != llvm::Triple::UnknownOS ||
9823 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment ||
9824 !(Triple.isOSBinFormatELF() || Triple.isOSBinFormatWasm()))
Dan Gohmanc2853072015-09-03 22:51:53 +00009825 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009826 return new WebAssemblyOSTargetInfo<WebAssembly64TargetInfo>(Triple, Opts);
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00009827
9828 case llvm::Triple::renderscript32:
9829 return new LinuxTargetInfo<RenderScript32TargetInfo>(Triple, Opts);
9830 case llvm::Triple::renderscript64:
9831 return new LinuxTargetInfo<RenderScript64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009832 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00009833}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009834
9835/// CreateTargetInfo - Return the target info object for the specified target
Eric Christophere4f73b32015-08-07 19:07:08 +00009836/// options.
Alp Toker80758082014-07-06 05:26:44 +00009837TargetInfo *
9838TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
Saleem Abdulrasool10a49722016-04-08 16:52:00 +00009839 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00009840 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009841
9842 // Construct the target
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009843 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple, *Opts));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009844 if (!Target) {
9845 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00009846 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009847 }
Alp Toker80758082014-07-06 05:26:44 +00009848 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009849
Daniel Dunbaracde99e2009-12-18 18:42:37 +00009850 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00009851 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
9852 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00009853 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00009854 }
9855
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009856 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00009857 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
9858 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00009859 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009860 }
9861
Rafael Espindolaeb265472013-08-21 21:59:03 +00009862 // Set the fp math unit.
9863 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
9864 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00009865 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00009866 }
9867
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009868 // Compute the default target features, we need the target to handle this
9869 // because features may have dependencies on one another.
9870 llvm::StringMap<bool> Features;
Eric Christopher007b0a02015-08-28 22:32:01 +00009871 if (!Target->initFeatureMap(Features, Diags, Opts->CPU,
9872 Opts->FeaturesAsWritten))
Eric Christopher6b454372015-08-25 13:45:24 +00009873 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009874
9875 // Add the features to the compile options.
Douglas Gregorf8715de2012-11-16 04:24:59 +00009876 Opts->Features.clear();
Aaron Ballmanb226d3d2015-08-12 13:38:59 +00009877 for (const auto &F : Features)
9878 Opts->Features.push_back((F.getValue() ? "+" : "-") + F.getKey().str());
9879
Eric Christopher3ff21b32013-10-16 21:26:26 +00009880 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00009881 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009882
Yaxun Liu39cf40f2016-05-16 17:06:34 +00009883 Target->setSupportedOpenCLOpts();
Alexey Bader0ea07532016-11-01 15:50:52 +00009884 Target->setOpenCLExtensionOpts();
Yaxun Liu39cf40f2016-05-16 17:06:34 +00009885
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00009886 if (!Target->validateTarget(Diags))
9887 return nullptr;
9888
Ahmed Charles9a16beb2014-03-07 19:33:25 +00009889 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009890}