blob: 9255cf8362485c50e13d65c077422d900b8e801b [file] [log] [blame]
Eric Christopherb39156d2015-08-26 04:23:11 +00001//===--- Targets.cpp - Implement target feature support -------------------===//
Chris Lattner5ba61f02006-10-14 07:39:34 +00002//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner5b12ab82007-12-29 19:59:25 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Chris Lattner5ba61f02006-10-14 07:39:34 +00007//
8//===----------------------------------------------------------------------===//
9//
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000010// This file implements construction of a TargetInfo object from a
Ted Kremenek6f6ff372007-12-12 18:05:32 +000011// target triple.
Chris Lattner5ba61f02006-10-14 07:39:34 +000012//
13//===----------------------------------------------------------------------===//
14
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000015#include "clang/Basic/Builtins.h"
Justin Lebar62907612016-07-06 21:21:39 +000016#include "clang/Basic/Cuda.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000017#include "clang/Basic/Diagnostic.h"
Chris Lattnerc7c6dd42008-12-04 22:54:33 +000018#include "clang/Basic/LangOptions.h"
Chandler Carruth26b29a02010-01-20 06:13:02 +000019#include "clang/Basic/MacroBuilder.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000020#include "clang/Basic/TargetBuiltins.h"
Justin Lebar62907612016-07-06 21:21:39 +000021#include "clang/Basic/TargetInfo.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000022#include "clang/Basic/TargetOptions.h"
Tim Northover756447a2015-10-30 16:30:36 +000023#include "clang/Basic/Version.h"
Yaxun Liu2c17e822016-08-09 19:43:38 +000024#include "clang/Frontend/CodeGenOptions.h"
Eli Friedman7cef49e2008-05-20 14:27:34 +000025#include "llvm/ADT/APFloat.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000026#include "llvm/ADT/STLExtras.h"
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +000027#include "llvm/ADT/StringExtras.h"
Daniel Dunbar58bc48c2009-08-19 20:04:03 +000028#include "llvm/ADT/StringRef.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000029#include "llvm/ADT/StringSwitch.h"
Chris Lattner859c37a2009-08-12 06:24:27 +000030#include "llvm/ADT/Triple.h"
Chris Lattner30ba6742009-08-10 19:03:04 +000031#include "llvm/MC/MCSectionMachO.h"
David Blaikie76bd3c82011-09-23 05:35:21 +000032#include "llvm/Support/ErrorHandling.h"
Renato Golinf5c4dec2015-05-27 13:33:00 +000033#include "llvm/Support/TargetParser.h"
Benjamin Kramerdc2f0062010-01-09 18:20:57 +000034#include <algorithm>
Ahmed Charlesdfca6f92014-03-09 11:36:40 +000035#include <memory>
Hans Wennborg7eb54642015-09-10 17:07:54 +000036
Chris Lattner5ba61f02006-10-14 07:39:34 +000037using namespace clang;
38
Chris Lattner5ba61f02006-10-14 07:39:34 +000039//===----------------------------------------------------------------------===//
Chris Lattner1f5ad112006-10-14 18:32:12 +000040// Common code shared among targets.
Chris Lattner5ba61f02006-10-14 07:39:34 +000041//===----------------------------------------------------------------------===//
42
Chris Lattner1e1c0b92009-03-20 16:06:38 +000043/// DefineStd - Define a macro name and standard variants. For example if
44/// MacroName is "unix", then this will define "__unix", "__unix__", and "unix"
45/// when in GNU mode.
Chris Lattner0e62c1c2011-07-23 10:55:15 +000046static void DefineStd(MacroBuilder &Builder, StringRef MacroName,
Chris Lattner1e1c0b92009-03-20 16:06:38 +000047 const LangOptions &Opts) {
48 assert(MacroName[0] != '_' && "Identifier should be in the user's namespace");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000049
Chris Lattner1e1c0b92009-03-20 16:06:38 +000050 // If in GNU mode (e.g. -std=gnu99 but not -std=c99) define the raw identifier
51 // in the user's namespace.
52 if (Opts.GNUMode)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000053 Builder.defineMacro(MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000054
Chris Lattner1e1c0b92009-03-20 16:06:38 +000055 // Define __unix.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000056 Builder.defineMacro("__" + MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000057
Chris Lattner1e1c0b92009-03-20 16:06:38 +000058 // Define __unix__.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000059 Builder.defineMacro("__" + MacroName + "__");
Chris Lattner1e1c0b92009-03-20 16:06:38 +000060}
61
Benjamin Kramere3b442d2012-01-10 11:50:09 +000062static void defineCPUMacros(MacroBuilder &Builder, StringRef CPUName,
63 bool Tuning = true) {
64 Builder.defineMacro("__" + CPUName);
65 Builder.defineMacro("__" + CPUName + "__");
66 if (Tuning)
67 Builder.defineMacro("__tune_" + CPUName + "__");
68}
69
Justin Lebar76945b22016-04-29 23:05:19 +000070static TargetInfo *AllocateTarget(const llvm::Triple &Triple,
71 const TargetOptions &Opts);
72
Chris Lattner09d98f52008-10-05 21:50:58 +000073//===----------------------------------------------------------------------===//
74// Defines specific to certain operating systems.
75//===----------------------------------------------------------------------===//
Chris Lattner30ba6742009-08-10 19:03:04 +000076
Torok Edwinb2b37c62009-06-30 17:10:35 +000077namespace {
Douglas Gregorc05d2a12009-07-01 15:12:53 +000078template<typename TgtInfo>
79class OSTargetInfo : public TgtInfo {
Torok Edwinb2b37c62009-06-30 17:10:35 +000080protected:
Daniel Dunbar40165182009-08-24 09:10:05 +000081 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000082 MacroBuilder &Builder) const=0;
Torok Edwinb2b37c62009-06-30 17:10:35 +000083public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +000084 OSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
85 : TgtInfo(Triple, Opts) {}
Craig Topper3164f332014-03-11 03:39:26 +000086 void getTargetDefines(const LangOptions &Opts,
87 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000088 TgtInfo::getTargetDefines(Opts, Builder);
89 getOSDefines(Opts, TgtInfo::getTriple(), Builder);
Torok Edwin4e054162009-06-30 17:00:25 +000090 }
Torok Edwinb2b37c62009-06-30 17:10:35 +000091
92};
Chris Lattner30ba6742009-08-10 19:03:04 +000093
Eric Christopher7d0c7252015-09-24 21:17:04 +000094// CloudABI Target
95template <typename Target>
96class CloudABITargetInfo : public OSTargetInfo<Target> {
97protected:
98 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
99 MacroBuilder &Builder) const override {
100 Builder.defineMacro("__CloudABI__");
101 Builder.defineMacro("__ELF__");
102
103 // CloudABI uses ISO/IEC 10646:2012 for wchar_t, char16_t and char32_t.
104 Builder.defineMacro("__STDC_ISO_10646__", "201206L");
105 Builder.defineMacro("__STDC_UTF_16__");
106 Builder.defineMacro("__STDC_UTF_32__");
107 }
108
109public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000110 CloudABITargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
111 : OSTargetInfo<Target>(Triple, Opts) {}
Eric Christopher7d0c7252015-09-24 21:17:04 +0000112};
113
Daniel Dunbard86666f2010-01-26 01:44:04 +0000114static void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000115 const llvm::Triple &Triple,
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000116 StringRef &PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000117 VersionTuple &PlatformMinVersion) {
Bob Wilson834400b2013-08-19 20:23:37 +0000118 Builder.defineMacro("__APPLE_CC__", "6000");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000119 Builder.defineMacro("__APPLE__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000120 Builder.defineMacro("OBJC_NEW_PROPERTIES");
Alexander Potapenkob4f81902012-09-20 10:10:01 +0000121 // AddressSanitizer doesn't play well with source fortification, which is on
122 // by default on Darwin.
Alexey Samsonovedf99a92014-11-07 22:29:38 +0000123 if (Opts.Sanitize.has(SanitizerKind::Address))
124 Builder.defineMacro("_FORTIFY_SOURCE", "0");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000125
John McCall460ce582015-10-22 18:38:17 +0000126 // Darwin defines __weak, __strong, and __unsafe_unretained even in C mode.
127 if (!Opts.ObjC1) {
John McCall31168b02011-06-15 23:02:42 +0000128 // __weak is always defined, for use in blocks and with objc pointers.
129 Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))");
John McCall460ce582015-10-22 18:38:17 +0000130 Builder.defineMacro("__strong", "");
John McCall31168b02011-06-15 23:02:42 +0000131 Builder.defineMacro("__unsafe_unretained", "");
John McCall31168b02011-06-15 23:02:42 +0000132 }
Eric Christopher0c912c52011-07-07 22:55:26 +0000133
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000134 if (Opts.Static)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000135 Builder.defineMacro("__STATIC__");
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000136 else
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000137 Builder.defineMacro("__DYNAMIC__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000138
139 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000140 Builder.defineMacro("_REENTRANT");
Daniel Dunbar497ff132009-04-10 19:52:24 +0000141
Daniel Dunbarecf13562011-04-19 21:40:34 +0000142 // Get the platform type and version number from the triple.
Daniel Dunbar497ff132009-04-10 19:52:24 +0000143 unsigned Maj, Min, Rev;
Bob Wilson8e5acc52012-01-31 23:52:58 +0000144 if (Triple.isMacOSX()) {
145 Triple.getMacOSXVersion(Maj, Min, Rev);
Manman Renccf25bb2016-06-28 20:55:30 +0000146 PlatformName = "macos";
Daniel Dunbarecf13562011-04-19 21:40:34 +0000147 } else {
Bob Wilson8e5acc52012-01-31 23:52:58 +0000148 Triple.getOSVersion(Maj, Min, Rev);
149 PlatformName = llvm::Triple::getOSTypeName(Triple.getOS());
Daniel Dunbarecf13562011-04-19 21:40:34 +0000150 }
Daniel Dunbard86666f2010-01-26 01:44:04 +0000151
Sebastian Pop422377c2012-01-20 22:01:23 +0000152 // If -target arch-pc-win32-macho option specified, we're
Eric Christopherb081ba62011-07-29 21:20:35 +0000153 // generating code for Win32 ABI. No need to emit
Chad Rosierb90e4022011-07-19 20:00:06 +0000154 // __ENVIRONMENT_XX_OS_VERSION_MIN_REQUIRED__.
155 if (PlatformName == "win32") {
156 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
157 return;
158 }
159
Evan Cheng31dd9a62014-01-26 23:12:43 +0000160 // Set the appropriate OS version define.
161 if (Triple.isiOS()) {
Bob Wilson4cf27c42016-07-18 20:29:14 +0000162 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
163 char Str[7];
164 if (Maj < 10) {
165 Str[0] = '0' + Maj;
166 Str[1] = '0' + (Min / 10);
167 Str[2] = '0' + (Min % 10);
168 Str[3] = '0' + (Rev / 10);
169 Str[4] = '0' + (Rev % 10);
170 Str[5] = '\0';
171 } else {
172 // Handle versions >= 10.
173 Str[0] = '0' + (Maj / 10);
174 Str[1] = '0' + (Maj % 10);
175 Str[2] = '0' + (Min / 10);
176 Str[3] = '0' + (Min % 10);
177 Str[4] = '0' + (Rev / 10);
178 Str[5] = '0' + (Rev % 10);
179 Str[6] = '\0';
180 }
Tim Northover67465f82015-10-30 16:30:30 +0000181 if (Triple.isTvOS())
182 Builder.defineMacro("__ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__", Str);
183 else
184 Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__",
185 Str);
186
187 } else if (Triple.isWatchOS()) {
188 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
189 char Str[6];
190 Str[0] = '0' + Maj;
191 Str[1] = '0' + (Min / 10);
192 Str[2] = '0' + (Min % 10);
193 Str[3] = '0' + (Rev / 10);
194 Str[4] = '0' + (Rev % 10);
195 Str[5] = '\0';
196 Builder.defineMacro("__ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__", Str);
Evan Cheng31dd9a62014-01-26 23:12:43 +0000197 } else if (Triple.isMacOSX()) {
198 // Note that the Driver allows versions which aren't representable in the
199 // define (because we only get a single digit for the minor and micro
200 // revision numbers). So, we limit them to the maximum representable
201 // version.
202 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
Bob Wilson2a3710e2014-08-08 21:45:53 +0000203 char Str[7];
204 if (Maj < 10 || (Maj == 10 && Min < 10)) {
205 Str[0] = '0' + (Maj / 10);
206 Str[1] = '0' + (Maj % 10);
207 Str[2] = '0' + std::min(Min, 9U);
208 Str[3] = '0' + std::min(Rev, 9U);
209 Str[4] = '\0';
210 } else {
211 // Handle versions > 10.9.
212 Str[0] = '0' + (Maj / 10);
213 Str[1] = '0' + (Maj % 10);
214 Str[2] = '0' + (Min / 10);
215 Str[3] = '0' + (Min % 10);
216 Str[4] = '0' + (Rev / 10);
217 Str[5] = '0' + (Rev % 10);
218 Str[6] = '\0';
219 }
Evan Cheng31dd9a62014-01-26 23:12:43 +0000220 Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
Daniel Dunbar497ff132009-04-10 19:52:24 +0000221 }
Daniel Dunbarecf13562011-04-19 21:40:34 +0000222
Tim Northover157d9112014-01-16 08:48:16 +0000223 // Tell users about the kernel if there is one.
224 if (Triple.isOSDarwin())
225 Builder.defineMacro("__MACH__");
226
Chris Bieneman46977b62016-04-29 17:53:00 +0000227 // The Watch ABI uses Dwarf EH.
228 if(Triple.isWatchABI())
229 Builder.defineMacro("__ARM_DWARF_EH__");
230
Daniel Dunbarecf13562011-04-19 21:40:34 +0000231 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
Eli Friedman3fd920a2008-08-20 02:34:37 +0000232}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000233
Torok Edwinb2b37c62009-06-30 17:10:35 +0000234template<typename Target>
235class DarwinTargetInfo : public OSTargetInfo<Target> {
236protected:
Craig Topper3164f332014-03-11 03:39:26 +0000237 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
238 MacroBuilder &Builder) const override {
Eric Christopher0c912c52011-07-07 22:55:26 +0000239 getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000240 this->PlatformMinVersion);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000241 }
Mike Stump11289f42009-09-09 15:08:12 +0000242
Torok Edwinb2b37c62009-06-30 17:10:35 +0000243public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000244 DarwinTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
245 : OSTargetInfo<Target>(Triple, Opts) {
Tim Northovera12d0a92016-01-07 09:04:46 +0000246 // By default, no TLS, and we whitelist permitted architecture/OS
247 // combinations.
248 this->TLSSupported = false;
249
250 if (Triple.isMacOSX())
251 this->TLSSupported = !Triple.isMacOSXVersionLT(10, 7);
252 else if (Triple.isiOS()) {
253 // 64-bit iOS supported it from 8 onwards, 32-bit from 9 onwards.
254 if (Triple.getArch() == llvm::Triple::x86_64 ||
255 Triple.getArch() == llvm::Triple::aarch64)
256 this->TLSSupported = !Triple.isOSVersionLT(8);
257 else if (Triple.getArch() == llvm::Triple::x86 ||
258 Triple.getArch() == llvm::Triple::arm ||
259 Triple.getArch() == llvm::Triple::thumb)
260 this->TLSSupported = !Triple.isOSVersionLT(9);
261 } else if (Triple.isWatchOS())
262 this->TLSSupported = !Triple.isOSVersionLT(2);
263
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000264 this->MCountName = "\01mcount";
265 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000266
Craig Topper3164f332014-03-11 03:39:26 +0000267 std::string isValidSectionSpecifier(StringRef SR) const override {
Chris Lattner30ba6742009-08-10 19:03:04 +0000268 // Let MCSectionMachO validate this.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000269 StringRef Segment, Section;
Chris Lattner30ba6742009-08-10 19:03:04 +0000270 unsigned TAA, StubSize;
Daniel Dunbar75942372011-03-19 02:06:21 +0000271 bool HasTAA;
Chris Lattner30ba6742009-08-10 19:03:04 +0000272 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
Daniel Dunbar75942372011-03-19 02:06:21 +0000273 TAA, HasTAA, StubSize);
Chris Lattner30ba6742009-08-10 19:03:04 +0000274 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000275
Craig Topper3164f332014-03-11 03:39:26 +0000276 const char *getStaticInitSectionSpecifier() const override {
Anders Carlsson851318a2010-06-08 22:47:50 +0000277 // FIXME: We should return 0 when building kexts.
278 return "__TEXT,__StaticInit,regular,pure_instructions";
279 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000280
John McCalleed64c72012-01-29 01:20:30 +0000281 /// Darwin does not support protected visibility. Darwin's "default"
282 /// is very similar to ELF's "protected"; Darwin requires a "weak"
283 /// attribute on declarations that can be dynamically replaced.
Craig Topper3164f332014-03-11 03:39:26 +0000284 bool hasProtectedVisibility() const override {
John McCalleed64c72012-01-29 01:20:30 +0000285 return false;
286 }
Akira Hatanaka68ab7fe2016-03-31 06:36:07 +0000287
288 unsigned getExnObjectAlignment() const override {
289 // The alignment of an exception object is 8-bytes for darwin since
290 // libc++abi doesn't declare _Unwind_Exception with __attribute__((aligned))
291 // and therefore doesn't guarantee 16-byte alignment.
292 return 64;
293 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000294};
295
Chris Lattner30ba6742009-08-10 19:03:04 +0000296
Torok Edwinb2b37c62009-06-30 17:10:35 +0000297// DragonFlyBSD Target
298template<typename Target>
299class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
300protected:
Craig Topper3164f332014-03-11 03:39:26 +0000301 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
302 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000303 // DragonFly defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000304 Builder.defineMacro("__DragonFly__");
305 Builder.defineMacro("__DragonFly_cc_version", "100001");
306 Builder.defineMacro("__ELF__");
307 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
308 Builder.defineMacro("__tune_i386__");
Saleem Abdulrasool56027092017-02-07 19:00:06 +0000309 DefineStd(Builder, "unix", Opts);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000310 }
311public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000312 DragonFlyBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
313 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000314 switch (Triple.getArch()) {
315 default:
316 case llvm::Triple::x86:
317 case llvm::Triple::x86_64:
318 this->MCountName = ".mcount";
319 break;
320 }
Eli Friedman4286fba2012-02-10 23:02:29 +0000321 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000322};
323
Dimitry Andricc6d924c2016-05-20 17:27:22 +0000324#ifndef FREEBSD_CC_VERSION
325#define FREEBSD_CC_VERSION 0U
326#endif
327
Torok Edwinb2b37c62009-06-30 17:10:35 +0000328// FreeBSD Target
329template<typename Target>
330class FreeBSDTargetInfo : public OSTargetInfo<Target> {
331protected:
Craig Topper3164f332014-03-11 03:39:26 +0000332 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
333 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000334 // FreeBSD defines; list based off of gcc output
335
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000336 unsigned Release = Triple.getOSMajorVersion();
337 if (Release == 0U)
Dimitry Andricc6d924c2016-05-20 17:27:22 +0000338 Release = 8U;
339 unsigned CCVersion = FREEBSD_CC_VERSION;
340 if (CCVersion == 0U)
341 CCVersion = Release * 100000U + 1U;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000342
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000343 Builder.defineMacro("__FreeBSD__", Twine(Release));
Dimitry Andricc6d924c2016-05-20 17:27:22 +0000344 Builder.defineMacro("__FreeBSD_cc_version", Twine(CCVersion));
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000345 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
Saleem Abdulrasool56027092017-02-07 19:00:06 +0000346 DefineStd(Builder, "unix", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000347 Builder.defineMacro("__ELF__");
Ed Schoutend0621462013-09-29 07:54:52 +0000348
349 // On FreeBSD, wchar_t contains the number of the code point as
350 // used by the character set of the locale. These character sets are
351 // not necessarily a superset of ASCII.
Richard Smith00a4a852015-01-13 01:47:45 +0000352 //
353 // FIXME: This is wrong; the macro refers to the numerical values
354 // of wchar_t *literals*, which are not locale-dependent. However,
355 // FreeBSD systems apparently depend on us getting this wrong, and
356 // setting this to 1 is conforming even if all the basic source
357 // character literals have the same encoding as char and wchar_t.
Ed Schoutend0621462013-09-29 07:54:52 +0000358 Builder.defineMacro("__STDC_MB_MIGHT_NEQ_WC__", "1");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000359 }
360public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000361 FreeBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
362 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000363 switch (Triple.getArch()) {
364 default:
365 case llvm::Triple::x86:
366 case llvm::Triple::x86_64:
367 this->MCountName = ".mcount";
368 break;
369 case llvm::Triple::mips:
370 case llvm::Triple::mipsel:
371 case llvm::Triple::ppc:
372 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +0000373 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000374 this->MCountName = "_mcount";
375 break;
376 case llvm::Triple::arm:
377 this->MCountName = "__mcount";
378 break;
Duncan Sands9cb27e92009-07-08 13:55:08 +0000379 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000380 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000381};
382
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000383// GNU/kFreeBSD Target
384template<typename Target>
385class KFreeBSDTargetInfo : public OSTargetInfo<Target> {
386protected:
Craig Topper3164f332014-03-11 03:39:26 +0000387 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
388 MacroBuilder &Builder) const override {
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000389 // GNU/kFreeBSD defines; list based off of gcc output
390
Saleem Abdulrasool56027092017-02-07 19:00:06 +0000391 DefineStd(Builder, "unix", Opts);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000392 Builder.defineMacro("__FreeBSD_kernel__");
393 Builder.defineMacro("__GLIBC__");
394 Builder.defineMacro("__ELF__");
395 if (Opts.POSIXThreads)
396 Builder.defineMacro("_REENTRANT");
397 if (Opts.CPlusPlus)
398 Builder.defineMacro("_GNU_SOURCE");
399 }
400public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000401 KFreeBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
402 : OSTargetInfo<Target>(Triple, Opts) {}
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000403};
404
Reid Kleckner330fb172016-05-11 16:19:05 +0000405// Haiku Target
406template<typename Target>
407class HaikuTargetInfo : public OSTargetInfo<Target> {
408protected:
409 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
410 MacroBuilder &Builder) const override {
411 // Haiku defines; list based off of gcc output
412 Builder.defineMacro("__HAIKU__");
413 Builder.defineMacro("__ELF__");
Saleem Abdulrasool56027092017-02-07 19:00:06 +0000414 DefineStd(Builder, "unix", Opts);
Reid Kleckner330fb172016-05-11 16:19:05 +0000415 }
416public:
417 HaikuTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
418 : OSTargetInfo<Target>(Triple, Opts) {
419 this->SizeType = TargetInfo::UnsignedLong;
420 this->IntPtrType = TargetInfo::SignedLong;
421 this->PtrDiffType = TargetInfo::SignedLong;
422 this->ProcessIDType = TargetInfo::SignedLong;
423 this->TLSSupported = false;
424
425 }
426};
427
Chris Lattner3e2ee142010-07-07 16:01:42 +0000428// Minix Target
429template<typename Target>
430class MinixTargetInfo : public OSTargetInfo<Target> {
431protected:
Craig Topper3164f332014-03-11 03:39:26 +0000432 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
433 MacroBuilder &Builder) const override {
Chris Lattner3e2ee142010-07-07 16:01:42 +0000434 // Minix defines
435
436 Builder.defineMacro("__minix", "3");
437 Builder.defineMacro("_EM_WSIZE", "4");
438 Builder.defineMacro("_EM_PSIZE", "4");
439 Builder.defineMacro("_EM_SSIZE", "2");
440 Builder.defineMacro("_EM_LSIZE", "4");
441 Builder.defineMacro("_EM_FSIZE", "4");
442 Builder.defineMacro("_EM_DSIZE", "8");
Eli Friedman83de5132011-12-08 23:54:21 +0000443 Builder.defineMacro("__ELF__");
Saleem Abdulrasool56027092017-02-07 19:00:06 +0000444 DefineStd(Builder, "unix", Opts);
Chris Lattner3e2ee142010-07-07 16:01:42 +0000445 }
446public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000447 MinixTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
448 : OSTargetInfo<Target>(Triple, Opts) {}
Chris Lattner3e2ee142010-07-07 16:01:42 +0000449};
450
Torok Edwinb2b37c62009-06-30 17:10:35 +0000451// Linux target
452template<typename Target>
453class LinuxTargetInfo : public OSTargetInfo<Target> {
454protected:
Craig Topper3164f332014-03-11 03:39:26 +0000455 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
456 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000457 // Linux defines; list based off of gcc output
Saleem Abdulrasool56027092017-02-07 19:00:06 +0000458 DefineStd(Builder, "unix", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000459 DefineStd(Builder, "linux", Opts);
460 Builder.defineMacro("__gnu_linux__");
461 Builder.defineMacro("__ELF__");
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +0000462 if (Triple.isAndroid()) {
Evgeniy Stepanov94dc4c92012-04-26 12:08:09 +0000463 Builder.defineMacro("__ANDROID__", "1");
Dan Albert84aee012015-03-03 18:28:38 +0000464 unsigned Maj, Min, Rev;
David Majnemer5c2589a2015-06-01 23:38:25 +0000465 Triple.getEnvironmentVersion(Maj, Min, Rev);
Dan Albert84aee012015-03-03 18:28:38 +0000466 this->PlatformName = "android";
467 this->PlatformMinVersion = VersionTuple(Maj, Min, Rev);
Stephen Hinesa89d8ff2016-11-11 01:29:39 +0000468 if (Maj)
469 Builder.defineMacro("__ANDROID_API__", Twine(Maj));
Dan Albert84aee012015-03-03 18:28:38 +0000470 }
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000471 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000472 Builder.defineMacro("_REENTRANT");
Douglas Gregor3ecc6652010-04-21 05:52:38 +0000473 if (Opts.CPlusPlus)
474 Builder.defineMacro("_GNU_SOURCE");
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +0000475 if (this->HasFloat128)
476 Builder.defineMacro("__FLOAT128__");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000477 }
478public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000479 LinuxTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
480 : OSTargetInfo<Target>(Triple, Opts) {
Douglas Gregore6d6e512011-01-12 21:19:25 +0000481 this->WIntType = TargetInfo::UnsignedInt;
Hal Finkelecdb4542014-03-30 13:00:06 +0000482
483 switch (Triple.getArch()) {
484 default:
485 break;
486 case llvm::Triple::ppc:
487 case llvm::Triple::ppc64:
488 case llvm::Triple::ppc64le:
489 this->MCountName = "_mcount";
490 break;
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +0000491 case llvm::Triple::x86:
492 case llvm::Triple::x86_64:
493 case llvm::Triple::systemz:
494 this->HasFloat128 = true;
495 break;
Hal Finkelecdb4542014-03-30 13:00:06 +0000496 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000497 }
Benjamin Kramera518b222011-10-15 17:53:33 +0000498
Craig Topper3164f332014-03-11 03:39:26 +0000499 const char *getStaticInitSectionSpecifier() const override {
Benjamin Kramera518b222011-10-15 17:53:33 +0000500 return ".text.startup";
501 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000502};
503
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000504// NetBSD Target
505template<typename Target>
506class NetBSDTargetInfo : public OSTargetInfo<Target> {
507protected:
Craig Topper3164f332014-03-11 03:39:26 +0000508 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
509 MacroBuilder &Builder) const override {
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000510 // NetBSD defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000511 Builder.defineMacro("__NetBSD__");
512 Builder.defineMacro("__unix__");
513 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000514 if (Opts.POSIXThreads)
Joerg Sonnenberger84502662017-01-16 14:07:24 +0000515 Builder.defineMacro("_REENTRANT");
Joerg Sonnenbergercc1edb52014-05-13 18:58:36 +0000516
517 switch (Triple.getArch()) {
518 default:
519 break;
520 case llvm::Triple::arm:
521 case llvm::Triple::armeb:
522 case llvm::Triple::thumb:
523 case llvm::Triple::thumbeb:
524 Builder.defineMacro("__ARM_DWARF_EH__");
525 break;
526 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000527 }
528public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000529 NetBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
530 : OSTargetInfo<Target>(Triple, Opts) {
Joerg Sonnenberger740f3f42015-04-10 21:02:53 +0000531 this->MCountName = "_mcount";
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000532 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000533};
534
Torok Edwinb2b37c62009-06-30 17:10:35 +0000535// OpenBSD Target
536template<typename Target>
537class OpenBSDTargetInfo : public OSTargetInfo<Target> {
538protected:
Craig Topper3164f332014-03-11 03:39:26 +0000539 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
540 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000541 // OpenBSD defines; list based off of gcc output
542
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000543 Builder.defineMacro("__OpenBSD__");
Saleem Abdulrasool56027092017-02-07 19:00:06 +0000544 DefineStd(Builder, "unix", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000545 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000546 if (Opts.POSIXThreads)
Chris Lattner024e12d2012-04-25 06:12:24 +0000547 Builder.defineMacro("_REENTRANT");
Brad Smith0561a5a2017-02-20 03:18:15 +0000548 if (this->HasFloat128)
549 Builder.defineMacro("__FLOAT128__");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000550 }
551public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000552 OpenBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
553 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000554 this->TLSSupported = false;
Eli Friedman3715d1f2011-12-15 02:15:56 +0000555
Eli Friedman3715d1f2011-12-15 02:15:56 +0000556 switch (Triple.getArch()) {
Eli Friedman3715d1f2011-12-15 02:15:56 +0000557 case llvm::Triple::x86:
558 case llvm::Triple::x86_64:
Brad Smith0561a5a2017-02-20 03:18:15 +0000559 this->HasFloat128 = true;
560 // FALLTHROUGH
561 default:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000562 this->MCountName = "__mcount";
563 break;
564 case llvm::Triple::mips64:
565 case llvm::Triple::mips64el:
566 case llvm::Triple::ppc:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000567 case llvm::Triple::sparcv9:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000568 this->MCountName = "_mcount";
569 break;
570 }
571 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000572};
573
Eli Friedman9fa28852012-08-08 23:57:20 +0000574// Bitrig Target
575template<typename Target>
576class BitrigTargetInfo : public OSTargetInfo<Target> {
577protected:
Craig Topper3164f332014-03-11 03:39:26 +0000578 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
579 MacroBuilder &Builder) const override {
Eli Friedman9fa28852012-08-08 23:57:20 +0000580 // Bitrig defines; list based off of gcc output
581
582 Builder.defineMacro("__Bitrig__");
Saleem Abdulrasool56027092017-02-07 19:00:06 +0000583 DefineStd(Builder, "unix", Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +0000584 Builder.defineMacro("__ELF__");
585 if (Opts.POSIXThreads)
586 Builder.defineMacro("_REENTRANT");
Renato Golin9ba39232015-02-27 16:35:48 +0000587
588 switch (Triple.getArch()) {
589 default:
590 break;
591 case llvm::Triple::arm:
592 case llvm::Triple::armeb:
593 case llvm::Triple::thumb:
594 case llvm::Triple::thumbeb:
595 Builder.defineMacro("__ARM_DWARF_EH__");
596 break;
597 }
Eli Friedman9fa28852012-08-08 23:57:20 +0000598 }
599public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000600 BitrigTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
601 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000602 this->MCountName = "__mcount";
Eli Friedman9fa28852012-08-08 23:57:20 +0000603 }
604};
605
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000606// PSP Target
607template<typename Target>
608class PSPTargetInfo : public OSTargetInfo<Target> {
609protected:
Craig Topper3164f332014-03-11 03:39:26 +0000610 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
611 MacroBuilder &Builder) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000612 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000613 Builder.defineMacro("PSP");
614 Builder.defineMacro("_PSP");
615 Builder.defineMacro("__psp__");
616 Builder.defineMacro("__ELF__");
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000617 }
618public:
James Y Knightb214cbc2016-03-04 19:00:41 +0000619 PSPTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {}
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000620};
621
John Thompsone467e192009-11-19 17:18:50 +0000622// PS3 PPU Target
623template<typename Target>
624class PS3PPUTargetInfo : 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 {
John Thompsone467e192009-11-19 17:18:50 +0000628 // PS3 PPU defines.
John Thompson957816f2010-03-25 16:18:32 +0000629 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000630 Builder.defineMacro("__PPU__");
631 Builder.defineMacro("__CELLOS_LV2__");
632 Builder.defineMacro("__ELF__");
633 Builder.defineMacro("__LP32__");
John Thompson07a61a42010-06-24 22:44:13 +0000634 Builder.defineMacro("_ARCH_PPC64");
635 Builder.defineMacro("__powerpc64__");
John Thompsone467e192009-11-19 17:18:50 +0000636 }
637public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000638 PS3PPUTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
639 : OSTargetInfo<Target>(Triple, Opts) {
Nick Lewyckyc0a61732011-12-16 22:32:39 +0000640 this->LongWidth = this->LongAlign = 32;
641 this->PointerWidth = this->PointerAlign = 32;
John Thompson07a61a42010-06-24 22:44:13 +0000642 this->IntMaxType = TargetInfo::SignedLongLong;
John Thompson07a61a42010-06-24 22:44:13 +0000643 this->Int64Type = TargetInfo::SignedLongLong;
John Thompson6f8dba72009-12-18 14:21:08 +0000644 this->SizeType = TargetInfo::UnsignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +0000645 this->resetDataLayout("E-m:e-p:32:32-i64:64-n32:64");
John Thompsone467e192009-11-19 17:18:50 +0000646 }
647};
648
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000649template <typename Target>
650class PS4OSTargetInfo : public OSTargetInfo<Target> {
651protected:
652 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
653 MacroBuilder &Builder) const override {
654 Builder.defineMacro("__FreeBSD__", "9");
655 Builder.defineMacro("__FreeBSD_cc_version", "900001");
656 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
Saleem Abdulrasool56027092017-02-07 19:00:06 +0000657 DefineStd(Builder, "unix", Opts);
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000658 Builder.defineMacro("__ELF__");
Paul Robinson9d613612016-05-16 17:22:25 +0000659 Builder.defineMacro("__ORBIS__");
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000660 }
661public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000662 PS4OSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
663 : OSTargetInfo<Target>(Triple, Opts) {
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000664 this->WCharType = this->UnsignedShort;
665
Paul Robinsond30e2ee2015-07-14 20:52:32 +0000666 // On PS4, TLS variable cannot be aligned to more than 32 bytes (256 bits).
667 this->MaxTLSAlign = 256;
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000668
Sunil Srivastava0ce2f222016-02-05 20:50:02 +0000669 // On PS4, do not honor explicit bit field alignment,
670 // as in "__attribute__((aligned(2))) int b : 1;".
671 this->UseExplicitBitFieldAlignment = false;
672
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000673 switch (Triple.getArch()) {
674 default:
675 case llvm::Triple::x86_64:
676 this->MCountName = ".mcount";
677 break;
678 }
679 }
680};
681
Torok Edwinb2b37c62009-06-30 17:10:35 +0000682// Solaris target
683template<typename Target>
684class SolarisTargetInfo : public OSTargetInfo<Target> {
685protected:
Craig Topper3164f332014-03-11 03:39:26 +0000686 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
687 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000688 DefineStd(Builder, "sun", Opts);
Saleem Abdulrasool56027092017-02-07 19:00:06 +0000689 DefineStd(Builder, "unix", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000690 Builder.defineMacro("__ELF__");
691 Builder.defineMacro("__svr4__");
692 Builder.defineMacro("__SVR4");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000693 // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and
694 // newer, but to 500 for everything else. feature_test.h has a check to
695 // ensure that you are not using C99 with an old version of X/Open or C89
Richard Smithab506ad2014-10-20 23:26:58 +0000696 // with a new version.
697 if (Opts.C99)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000698 Builder.defineMacro("_XOPEN_SOURCE", "600");
699 else
700 Builder.defineMacro("_XOPEN_SOURCE", "500");
David Chisnalle04307e2012-03-02 10:49:52 +0000701 if (Opts.CPlusPlus)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000702 Builder.defineMacro("__C99FEATURES__");
David Chisnall0c1941cb2012-02-17 18:35:11 +0000703 Builder.defineMacro("_LARGEFILE_SOURCE");
704 Builder.defineMacro("_LARGEFILE64_SOURCE");
705 Builder.defineMacro("__EXTENSIONS__");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000706 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000707 }
708public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000709 SolarisTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
710 : OSTargetInfo<Target>(Triple, Opts) {
David Chisnallb526e932012-03-28 18:04:14 +0000711 this->WCharType = this->SignedInt;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000712 // FIXME: WIntType should be SignedLong
713 }
714};
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000715
716// Windows target
717template<typename Target>
718class WindowsTargetInfo : public OSTargetInfo<Target> {
719protected:
Craig Topper3164f332014-03-11 03:39:26 +0000720 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
721 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000722 Builder.defineMacro("_WIN32");
723 }
724 void getVisualStudioDefines(const LangOptions &Opts,
725 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000726 if (Opts.CPlusPlus) {
David Majnemerf6072342014-07-01 22:24:56 +0000727 if (Opts.RTTIData)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000728 Builder.defineMacro("_CPPRTTI");
729
Reid Kleckner16514352015-01-30 21:42:55 +0000730 if (Opts.CXXExceptions)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000731 Builder.defineMacro("_CPPUNWIND");
732 }
733
David Majnemer6a658902015-07-22 22:36:26 +0000734 if (Opts.Bool)
735 Builder.defineMacro("__BOOL_DEFINED");
736
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000737 if (!Opts.CharIsSigned)
738 Builder.defineMacro("_CHAR_UNSIGNED");
739
740 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
741 // but it works for now.
742 if (Opts.POSIXThreads)
743 Builder.defineMacro("_MT");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000744
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +0000745 if (Opts.MSCompatibilityVersion) {
746 Builder.defineMacro("_MSC_VER",
747 Twine(Opts.MSCompatibilityVersion / 100000));
748 Builder.defineMacro("_MSC_FULL_VER", Twine(Opts.MSCompatibilityVersion));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000749 // FIXME We cannot encode the revision information into 32-bits
750 Builder.defineMacro("_MSC_BUILD", Twine(1));
David Majnemeraaf2b842015-03-18 07:53:18 +0000751
David Majnemerb710a932015-05-11 03:57:49 +0000752 if (Opts.CPlusPlus11 && Opts.isCompatibleWithMSVC(LangOptions::MSVC2015))
David Majnemeraaf2b842015-03-18 07:53:18 +0000753 Builder.defineMacro("_HAS_CHAR16_T_LANGUAGE_SUPPORT", Twine(1));
David Majnemer017cf352016-06-28 03:13:16 +0000754
755 if (Opts.isCompatibleWithMSVC(LangOptions::MSVC2015)) {
756 if (Opts.CPlusPlus1z)
757 Builder.defineMacro("_MSVC_LANG", "201403L");
758 else if (Opts.CPlusPlus14)
759 Builder.defineMacro("_MSVC_LANG", "201402L");
760 }
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000761 }
Reid Kleckner6f6e76d2014-04-16 20:10:16 +0000762
763 if (Opts.MicrosoftExt) {
764 Builder.defineMacro("_MSC_EXTENSIONS");
765
766 if (Opts.CPlusPlus11) {
767 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
768 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
769 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
770 }
771 }
772
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000773 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000774 }
775
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000776public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000777 WindowsTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
778 : OSTargetInfo<Target>(Triple, Opts) {}
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000779};
780
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000781template <typename Target>
782class NaClTargetInfo : public OSTargetInfo<Target> {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000783protected:
Craig Topper3164f332014-03-11 03:39:26 +0000784 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
785 MacroBuilder &Builder) const override {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000786 if (Opts.POSIXThreads)
787 Builder.defineMacro("_REENTRANT");
788 if (Opts.CPlusPlus)
789 Builder.defineMacro("_GNU_SOURCE");
790
Saleem Abdulrasool56027092017-02-07 19:00:06 +0000791 DefineStd(Builder, "unix", Opts);
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000792 Builder.defineMacro("__ELF__");
793 Builder.defineMacro("__native_client__");
794 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000795
796public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000797 NaClTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
798 : OSTargetInfo<Target>(Triple, Opts) {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000799 this->LongAlign = 32;
800 this->LongWidth = 32;
801 this->PointerAlign = 32;
802 this->PointerWidth = 32;
803 this->IntMaxType = TargetInfo::SignedLongLong;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000804 this->Int64Type = TargetInfo::SignedLongLong;
805 this->DoubleAlign = 64;
806 this->LongDoubleWidth = 64;
807 this->LongDoubleAlign = 64;
Jan Wen Voung1f9c4ee2014-01-15 21:42:41 +0000808 this->LongLongWidth = 64;
809 this->LongLongAlign = 64;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000810 this->SizeType = TargetInfo::UnsignedInt;
811 this->PtrDiffType = TargetInfo::SignedInt;
812 this->IntPtrType = TargetInfo::SignedInt;
Guy Blank294cbbd2016-08-18 08:44:33 +0000813 // RegParmMax is inherited from the underlying architecture.
Stephan Bergmann17c7f702016-12-14 11:57:17 +0000814 this->LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Rafael Espindola1c09b262013-12-18 23:41:04 +0000815 if (Triple.getArch() == llvm::Triple::arm) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +0000816 // Handled in ARM's setABI().
Rafael Espindola1c09b262013-12-18 23:41:04 +0000817 } else if (Triple.getArch() == llvm::Triple::x86) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000818 this->resetDataLayout("e-m:e-p:32:32-i64:64-n8:16:32-S128");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000819 } else if (Triple.getArch() == llvm::Triple::x86_64) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000820 this->resetDataLayout("e-m:e-p:32:32-i64:64-n8:16:32:64-S128");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000821 } else if (Triple.getArch() == llvm::Triple::mipsel) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000822 // Handled on mips' setDataLayout.
Rafael Espindola1c09b262013-12-18 23:41:04 +0000823 } else {
824 assert(Triple.getArch() == llvm::Triple::le32);
James Y Knightb214cbc2016-03-04 19:00:41 +0000825 this->resetDataLayout("e-p:32:32-i64:64");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000826 }
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000827 }
828};
Torok Edwinb2b37c62009-06-30 17:10:35 +0000829
Petr Hosek62e1d232016-10-06 06:08:09 +0000830// Fuchsia Target
831template<typename Target>
832class FuchsiaTargetInfo : public OSTargetInfo<Target> {
833protected:
834 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
835 MacroBuilder &Builder) const override {
836 Builder.defineMacro("__Fuchsia__");
837 Builder.defineMacro("__ELF__");
838 if (Opts.POSIXThreads)
839 Builder.defineMacro("_REENTRANT");
840 // Required by the libc++ locale support.
841 if (Opts.CPlusPlus)
842 Builder.defineMacro("_GNU_SOURCE");
843 }
844public:
845 FuchsiaTargetInfo(const llvm::Triple &Triple,
846 const TargetOptions &Opts)
847 : OSTargetInfo<Target>(Triple, Opts) {
848 this->MCountName = "__mcount";
849 }
850};
851
Dan Gohmanc2853072015-09-03 22:51:53 +0000852// WebAssembly target
853template <typename Target>
854class WebAssemblyOSTargetInfo : public OSTargetInfo<Target> {
855 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Hans Wennborg7eb54642015-09-10 17:07:54 +0000856 MacroBuilder &Builder) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +0000857 // A common platform macro.
858 if (Opts.POSIXThreads)
859 Builder.defineMacro("_REENTRANT");
860 // Follow g++ convention and predefine _GNU_SOURCE for C++.
861 if (Opts.CPlusPlus)
862 Builder.defineMacro("_GNU_SOURCE");
863 }
864
865 // As an optimization, group static init code together in a section.
Hans Wennborg7eb54642015-09-10 17:07:54 +0000866 const char *getStaticInitSectionSpecifier() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +0000867 return ".text.__startup";
868 }
869
870public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000871 explicit WebAssemblyOSTargetInfo(const llvm::Triple &Triple,
872 const TargetOptions &Opts)
873 : OSTargetInfo<Target>(Triple, Opts) {
Dan Gohmanc2853072015-09-03 22:51:53 +0000874 this->MCountName = "__mcount";
Dan Gohmanc2853072015-09-03 22:51:53 +0000875 this->TheCXXABI.set(TargetCXXABI::WebAssembly);
876 }
877};
Dan Gohmanc2853072015-09-03 22:51:53 +0000878
Chris Lattner09d98f52008-10-05 21:50:58 +0000879//===----------------------------------------------------------------------===//
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000880// Specific target implementations.
881//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000882
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000883// PPC abstract base class
884class PPCTargetInfo : public TargetInfo {
885 static const Builtin::Info BuiltinInfo[];
886 static const char * const GCCRegNames[];
887 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Hal Finkel8eb59282012-06-11 22:35:19 +0000888 std::string CPU;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000889
890 // Target cpu features.
Eric Christopher758aad72017-03-21 22:06:18 +0000891 bool HasAltivec;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000892 bool HasVSX;
Bill Schmidt8c184e32014-10-10 17:21:23 +0000893 bool HasP8Vector;
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +0000894 bool HasP8Crypto;
Nemanja Ivanovic35458c22015-04-11 10:43:36 +0000895 bool HasDirectMove;
Hal Finkel0d0a1a52015-03-11 19:14:15 +0000896 bool HasQPX;
Kit Barton8246f282015-03-25 19:41:41 +0000897 bool HasHTM;
Nemanja Ivanovic239eec72015-04-09 23:58:16 +0000898 bool HasBPERMD;
899 bool HasExtDiv;
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +0000900 bool HasP9Vector;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000901
Ulrich Weigand8afad612014-07-28 13:17:52 +0000902protected:
903 std::string ABI;
904
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000905public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000906 PPCTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Eric Christopher758aad72017-03-21 22:06:18 +0000907 : TargetInfo(Triple), HasAltivec(false), HasVSX(false), HasP8Vector(false),
Saleem Abdulrasool10a49722016-04-08 16:52:00 +0000908 HasP8Crypto(false), HasDirectMove(false), HasQPX(false), HasHTM(false),
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +0000909 HasBPERMD(false), HasExtDiv(false), HasP9Vector(false) {
Eric Christopher153dad42017-03-25 02:55:21 +0000910 SuitableAlign = 128;
Alexey Bataev00396512015-07-02 03:40:19 +0000911 SimdDefaultAlign = 128;
Nico Weber3435ede2012-01-31 02:07:33 +0000912 LongDoubleWidth = LongDoubleAlign = 128;
Stephan Bergmann17c7f702016-12-14 11:57:17 +0000913 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble();
Nico Weber3435ede2012-01-31 02:07:33 +0000914 }
Eli Friedman9ffd4a92009-06-05 07:05:05 +0000915
Hal Finkel6b984f02012-07-03 16:51:04 +0000916 /// \brief Flags for architecture specific defines.
917 typedef enum {
918 ArchDefineNone = 0,
919 ArchDefineName = 1 << 0, // <name> is substituted for arch name.
920 ArchDefinePpcgr = 1 << 1,
921 ArchDefinePpcsq = 1 << 2,
922 ArchDefine440 = 1 << 3,
923 ArchDefine603 = 1 << 4,
924 ArchDefine604 = 1 << 5,
925 ArchDefinePwr4 = 1 << 6,
Bill Schmidt38378a02013-02-01 20:23:10 +0000926 ArchDefinePwr5 = 1 << 7,
927 ArchDefinePwr5x = 1 << 8,
928 ArchDefinePwr6 = 1 << 9,
929 ArchDefinePwr6x = 1 << 10,
930 ArchDefinePwr7 = 1 << 11,
Will Schmidtf0487512014-06-26 13:34:10 +0000931 ArchDefinePwr8 = 1 << 12,
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +0000932 ArchDefinePwr9 = 1 << 13,
933 ArchDefineA2 = 1 << 14,
934 ArchDefineA2q = 1 << 15
Hal Finkel6b984f02012-07-03 16:51:04 +0000935 } ArchDefineTypes;
936
Eric Christopher3646e622017-03-22 06:36:09 +0000937 // Set the language option for altivec based on our value.
938 void adjust(LangOptions &Opts) override {
939 if (HasAltivec)
940 Opts.AltiVec = 1;
941 TargetInfo::adjust(Opts);
942 }
943
Bill Schmidt38378a02013-02-01 20:23:10 +0000944 // Note: GCC recognizes the following additional cpus:
945 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
946 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
947 // titan, rs64.
Craig Topper3164f332014-03-11 03:39:26 +0000948 bool setCPU(const std::string &Name) override {
Hal Finkel8eb59282012-06-11 22:35:19 +0000949 bool CPUKnown = llvm::StringSwitch<bool>(Name)
950 .Case("generic", true)
951 .Case("440", true)
952 .Case("450", true)
953 .Case("601", true)
954 .Case("602", true)
955 .Case("603", true)
956 .Case("603e", true)
957 .Case("603ev", true)
958 .Case("604", true)
959 .Case("604e", true)
960 .Case("620", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000961 .Case("630", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000962 .Case("g3", true)
963 .Case("7400", true)
964 .Case("g4", true)
965 .Case("7450", true)
966 .Case("g4+", true)
967 .Case("750", true)
968 .Case("970", true)
969 .Case("g5", true)
970 .Case("a2", true)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +0000971 .Case("a2q", true)
Hal Finkelf6d6cb02012-09-18 22:25:03 +0000972 .Case("e500mc", true)
973 .Case("e5500", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000974 .Case("power3", true)
975 .Case("pwr3", true)
976 .Case("power4", true)
977 .Case("pwr4", true)
978 .Case("power5", true)
979 .Case("pwr5", true)
980 .Case("power5x", true)
981 .Case("pwr5x", true)
982 .Case("power6", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000983 .Case("pwr6", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000984 .Case("power6x", true)
985 .Case("pwr6x", true)
986 .Case("power7", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000987 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +0000988 .Case("power8", true)
989 .Case("pwr8", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +0000990 .Case("power9", true)
991 .Case("pwr9", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000992 .Case("powerpc", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000993 .Case("ppc", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000994 .Case("powerpc64", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000995 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +0000996 .Case("powerpc64le", true)
997 .Case("ppc64le", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000998 .Default(false);
999
1000 if (CPUKnown)
1001 CPU = Name;
1002
1003 return CPUKnown;
1004 }
1005
Ulrich Weigand8afad612014-07-28 13:17:52 +00001006
1007 StringRef getABI() const override { return ABI; }
1008
Craig Topper6c03a542015-10-19 04:51:35 +00001009 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
1010 return llvm::makeArrayRef(BuiltinInfo,
1011 clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner10a5b382007-01-29 05:24:35 +00001012 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001013
Craig Topper3164f332014-03-11 03:39:26 +00001014 bool isCLZForZeroUndef() const override { return false; }
Bob Wilson19a2f2b2012-01-28 18:02:29 +00001015
Craig Topper3164f332014-03-11 03:39:26 +00001016 void getTargetDefines(const LangOptions &Opts,
1017 MacroBuilder &Builder) const override;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001018
Eric Christopher8c47b422015-10-09 18:39:55 +00001019 bool
1020 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
1021 StringRef CPU,
1022 const std::vector<std::string> &FeaturesVec) const override;
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001023
Craig Topper3164f332014-03-11 03:39:26 +00001024 bool handleTargetFeatures(std::vector<std::string> &Features,
1025 DiagnosticsEngine &Diags) override;
1026 bool hasFeature(StringRef Feature) const override;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001027 void setFeatureEnabled(llvm::StringMap<bool> &Features, StringRef Name,
1028 bool Enabled) const override;
Craig Topper3164f332014-03-11 03:39:26 +00001029
Craig Topperf054e3a2015-10-19 03:52:27 +00001030 ArrayRef<const char *> getGCCRegNames() const override;
1031 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00001032 bool validateAsmConstraint(const char *&Name,
1033 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00001034 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +00001035 default: return false;
1036 case 'O': // Zero
John Thompson07a61a42010-06-24 22:44:13 +00001037 break;
Anders Carlssonf511f642007-11-27 04:11:28 +00001038 case 'b': // Base register
1039 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +00001040 Info.setAllowsRegister();
John Thompson07a61a42010-06-24 22:44:13 +00001041 break;
1042 // FIXME: The following are added to allow parsing.
1043 // I just took a guess at what the actions should be.
1044 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001045 case 'd': // Floating point register (containing 64-bit value)
John Thompson07a61a42010-06-24 22:44:13 +00001046 case 'v': // Altivec vector register
1047 Info.setAllowsRegister();
1048 break;
1049 case 'w':
1050 switch (Name[1]) {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001051 case 'd':// VSX vector register to hold vector double data
1052 case 'f':// VSX vector register to hold vector float data
1053 case 's':// VSX vector register to hold scalar float data
1054 case 'a':// Any VSX register
Hal Finkelf7a07a52014-03-02 18:24:18 +00001055 case 'c':// An individual CR bit
John Thompson07a61a42010-06-24 22:44:13 +00001056 break;
1057 default:
1058 return false;
1059 }
1060 Info.setAllowsRegister();
1061 Name++; // Skip over 'w'.
1062 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001063 case 'h': // `MQ', `CTR', or `LINK' register
1064 case 'q': // `MQ' register
1065 case 'c': // `CTR' register
1066 case 'l': // `LINK' register
1067 case 'x': // `CR' register (condition register) number 0
1068 case 'y': // `CR' register (condition register)
1069 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson07a61a42010-06-24 22:44:13 +00001070 Info.setAllowsRegister();
1071 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001072 case 'I': // Signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +00001073 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001074 // (use `L' instead for SImode constants)
1075 case 'K': // Unsigned 16-bit constant
1076 case 'L': // Signed 16-bit constant shifted left 16 bits
1077 case 'M': // Constant larger than 31
1078 case 'N': // Exact power of 2
1079 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +00001080 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001081 // register with one instruction per word
John Thompson07a61a42010-06-24 22:44:13 +00001082 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001083 // into a register using three instructions
John Thompson07a61a42010-06-24 22:44:13 +00001084 break;
1085 case 'm': // Memory operand. Note that on PowerPC targets, m can
1086 // include addresses that update the base register. It
1087 // is therefore only safe to use `m' in an asm statement
1088 // if that asm statement accesses the operand exactly once.
1089 // The asm statement must also use `%U<opno>' as a
Sebastian Redldd008712010-08-17 22:42:34 +00001090 // placeholder for the "update" flag in the corresponding
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001091 // load or store instruction. For example:
John Thompson07a61a42010-06-24 22:44:13 +00001092 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001093 // is correct but:
John Thompson07a61a42010-06-24 22:44:13 +00001094 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
1095 // is not. Use es rather than m if you don't want the base
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001096 // register to be updated.
1097 case 'e':
John Thompsonceebdf12010-06-25 00:02:05 +00001098 if (Name[1] != 's')
1099 return false;
Sebastian Redldd008712010-08-17 22:42:34 +00001100 // es: A "stable" memory operand; that is, one which does not
John Thompson07a61a42010-06-24 22:44:13 +00001101 // include any automodification of the base register. Unlike
1102 // `m', this constraint can be used in asm statements that
1103 // might access the operand several times, or that might not
John Thompsonceebdf12010-06-25 00:02:05 +00001104 // access it at all.
John Thompson07a61a42010-06-24 22:44:13 +00001105 Info.setAllowsMemory();
John Thompsonceebdf12010-06-25 00:02:05 +00001106 Name++; // Skip over 'e'.
John Thompson07a61a42010-06-24 22:44:13 +00001107 break;
1108 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001109 // usually better to use `m' or `es' in asm statements)
John Thompson07a61a42010-06-24 22:44:13 +00001110 case 'Z': // Memory operand that is an indexed or indirect from a
1111 // register (it is usually better to use `m' or `es' in
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001112 // asm statements)
John Thompson07a61a42010-06-24 22:44:13 +00001113 Info.setAllowsMemory();
1114 Info.setAllowsRegister();
1115 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001116 case 'R': // AIX TOC entry
John Thompson07a61a42010-06-24 22:44:13 +00001117 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001118 // register (`p' is preferable for asm statements)
1119 case 'S': // Constant suitable as a 64-bit mask operand
1120 case 'T': // Constant suitable as a 32-bit mask operand
1121 case 'U': // System V Release 4 small data area reference
John Thompson07a61a42010-06-24 22:44:13 +00001122 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001123 // instructions
1124 case 'W': // Vector constant that does not require memory
1125 case 'j': // Vector constant that is all zeros.
John Thompson07a61a42010-06-24 22:44:13 +00001126 break;
1127 // End FIXME.
Anders Carlssonf511f642007-11-27 04:11:28 +00001128 }
John Thompson07a61a42010-06-24 22:44:13 +00001129 return true;
Anders Carlssonf511f642007-11-27 04:11:28 +00001130 }
Craig Topper3164f332014-03-11 03:39:26 +00001131 std::string convertConstraint(const char *&Constraint) const override {
Hal Finkelf7a07a52014-03-02 18:24:18 +00001132 std::string R;
1133 switch (*Constraint) {
1134 case 'e':
1135 case 'w':
1136 // Two-character constraint; add "^" hint for later parsing.
1137 R = std::string("^") + std::string(Constraint, 2);
1138 Constraint++;
1139 break;
1140 default:
1141 return TargetInfo::convertConstraint(Constraint);
1142 }
1143 return R;
1144 }
Craig Topper3164f332014-03-11 03:39:26 +00001145 const char *getClobbers() const override {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001146 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +00001147 }
Craig Topper3164f332014-03-11 03:39:26 +00001148 int getEHDataRegisterNumber(unsigned RegNo) const override {
Adhemerval Zanella5d874ae2013-01-22 20:02:45 +00001149 if (RegNo == 0) return 3;
1150 if (RegNo == 1) return 4;
1151 return -1;
1152 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00001153
1154 bool hasSjLjLowering() const override {
1155 return true;
1156 }
David Majnemer2617ea62015-06-09 18:05:33 +00001157
1158 bool useFloat128ManglingForLongDouble() const override {
1159 return LongDoubleWidth == 128 &&
Stephan Bergmann17c7f702016-12-14 11:57:17 +00001160 LongDoubleFormat == &llvm::APFloat::PPCDoubleDouble() &&
David Majnemer2617ea62015-06-09 18:05:33 +00001161 getTriple().isOSBinFormatELF();
1162 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001163};
Anders Carlssonf511f642007-11-27 04:11:28 +00001164
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001165const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00001166#define BUILTIN(ID, TYPE, ATTRS) \
1167 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1168#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1169 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5abdec72009-06-14 01:05:48 +00001170#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001171};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001172
Eric Christopher917e9522014-11-18 22:36:15 +00001173/// handleTargetFeatures - Perform initialization based on the user
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001174/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00001175bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001176 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00001177 for (const auto &Feature : Features) {
Eric Christopher758aad72017-03-21 22:06:18 +00001178 if (Feature == "+altivec") {
1179 HasAltivec = true;
1180 } else if (Feature == "+vsx") {
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001181 HasVSX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001182 } else if (Feature == "+bpermd") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001183 HasBPERMD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001184 } else if (Feature == "+extdiv") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001185 HasExtDiv = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001186 } else if (Feature == "+power8-vector") {
Bill Schmidt8c184e32014-10-10 17:21:23 +00001187 HasP8Vector = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001188 } else if (Feature == "+crypto") {
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001189 HasP8Crypto = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001190 } else if (Feature == "+direct-move") {
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001191 HasDirectMove = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001192 } else if (Feature == "+qpx") {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001193 HasQPX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001194 } else if (Feature == "+htm") {
Kit Barton8246f282015-03-25 19:41:41 +00001195 HasHTM = true;
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001196 } else if (Feature == "+float128") {
1197 HasFloat128 = true;
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001198 } else if (Feature == "+power9-vector") {
1199 HasP9Vector = true;
Kit Barton8246f282015-03-25 19:41:41 +00001200 }
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001201 // TODO: Finish this list and add an assert that we've handled them
1202 // all.
1203 }
Eric Christopher02c33352015-08-25 00:59:11 +00001204
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001205 return true;
1206}
1207
Chris Lattnerecd49032009-03-02 22:27:17 +00001208/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
1209/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001210void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001211 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00001212 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001213 Builder.defineMacro("__ppc__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001214 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001215 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001216 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001217 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001218 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001219 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001220 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001221 Builder.defineMacro("__ppc64__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001222 Builder.defineMacro("__PPC64__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001223 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001224
Chris Lattnerecd49032009-03-02 22:27:17 +00001225 // Target properties.
Bill Schmidt778d3872013-07-26 01:36:11 +00001226 if (getTriple().getArch() == llvm::Triple::ppc64le) {
1227 Builder.defineMacro("_LITTLE_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001228 } else {
1229 if (getTriple().getOS() != llvm::Triple::NetBSD &&
1230 getTriple().getOS() != llvm::Triple::OpenBSD)
1231 Builder.defineMacro("_BIG_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001232 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001233
Ulrich Weigand8afad612014-07-28 13:17:52 +00001234 // ABI options.
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001235 if (ABI == "elfv1" || ABI == "elfv1-qpx")
Ulrich Weigand8afad612014-07-28 13:17:52 +00001236 Builder.defineMacro("_CALL_ELF", "1");
1237 if (ABI == "elfv2")
1238 Builder.defineMacro("_CALL_ELF", "2");
1239
Eric Christopher2fd2eda2017-03-25 03:33:59 +00001240 // This typically is only for a new enough linker (bfd >= 2.16.2 or gold), but
1241 // our suppport post-dates this and it should work on all linux platforms. It
1242 // is guaranteed to work on all elfv2 platforms.
1243 if (getTriple().getOS() == llvm::Triple::Linux)
1244 Builder.defineMacro("_CALL_LINUX", "1");
1245
Chris Lattnerecd49032009-03-02 22:27:17 +00001246 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001247 Builder.defineMacro("__NATURAL_ALIGNMENT__");
1248 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001249
Chris Lattnerecd49032009-03-02 22:27:17 +00001250 // FIXME: Should be controlled by command line option.
Eric Christopheree214102017-03-25 06:37:23 +00001251 if (LongDoubleWidth == 128) {
Roman Divacky13b586f2013-07-03 19:45:54 +00001252 Builder.defineMacro("__LONG_DOUBLE_128__");
Eric Christopheree214102017-03-25 06:37:23 +00001253 Builder.defineMacro("__LONGDOUBLE128");
1254 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001255
Eric Christopher32ac5e42017-02-15 07:50:11 +00001256 // Define this for elfv2 (64-bit only) or 64-bit darwin.
1257 if (ABI == "elfv2" ||
1258 (getTriple().getOS() == llvm::Triple::Darwin && PointerWidth == 64))
1259 Builder.defineMacro("__STRUCT_PARM_ALIGN__", "16");
1260
Hal Finkel8eb59282012-06-11 22:35:19 +00001261 // CPU identification.
Eric Christopherb70819e2017-03-25 02:29:18 +00001262 ArchDefineTypes defs =
1263 (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
1264 .Case("440", ArchDefineName)
1265 .Case("450", ArchDefineName | ArchDefine440)
1266 .Case("601", ArchDefineName)
1267 .Case("602", ArchDefineName | ArchDefinePpcgr)
1268 .Case("603", ArchDefineName | ArchDefinePpcgr)
1269 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1270 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1271 .Case("604", ArchDefineName | ArchDefinePpcgr)
1272 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
1273 .Case("620", ArchDefineName | ArchDefinePpcgr)
1274 .Case("630", ArchDefineName | ArchDefinePpcgr)
1275 .Case("7400", ArchDefineName | ArchDefinePpcgr)
1276 .Case("7450", ArchDefineName | ArchDefinePpcgr)
1277 .Case("750", ArchDefineName | ArchDefinePpcgr)
1278 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr |
1279 ArchDefinePpcsq)
1280 .Case("a2", ArchDefineA2)
1281 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
1282 .Case("pwr3", ArchDefinePpcgr)
1283 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
1284 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr |
1285 ArchDefinePpcsq)
1286 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4 |
1287 ArchDefinePpcgr | ArchDefinePpcsq)
1288 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5 |
1289 ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1290 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x |
1291 ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr |
1292 ArchDefinePpcsq)
1293 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6 |
1294 ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4 |
1295 ArchDefinePpcgr | ArchDefinePpcsq)
1296 .Case("pwr8", ArchDefineName | ArchDefinePwr7 | ArchDefinePwr6x |
1297 ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5 |
1298 ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1299 .Case("pwr9", ArchDefineName | ArchDefinePwr8 | ArchDefinePwr7 |
1300 ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x |
1301 ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr |
1302 ArchDefinePpcsq)
1303 .Case("power3", ArchDefinePpcgr)
1304 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1305 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr |
1306 ArchDefinePpcsq)
1307 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4 |
1308 ArchDefinePpcgr | ArchDefinePpcsq)
1309 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5 |
1310 ArchDefinePwr4 | ArchDefinePpcgr |
1311 ArchDefinePpcsq)
1312 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x |
1313 ArchDefinePwr5 | ArchDefinePwr4 |
1314 ArchDefinePpcgr | ArchDefinePpcsq)
1315 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6 |
1316 ArchDefinePwr5x | ArchDefinePwr5 |
1317 ArchDefinePwr4 | ArchDefinePpcgr |
1318 ArchDefinePpcsq)
1319 .Case("power8", ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr6x |
1320 ArchDefinePwr6 | ArchDefinePwr5x |
1321 ArchDefinePwr5 | ArchDefinePwr4 |
1322 ArchDefinePpcgr | ArchDefinePpcsq)
1323 .Case("power9", ArchDefinePwr9 | ArchDefinePwr8 | ArchDefinePwr7 |
1324 ArchDefinePwr6x | ArchDefinePwr6 |
1325 ArchDefinePwr5x | ArchDefinePwr5 |
1326 ArchDefinePwr4 | ArchDefinePpcgr |
1327 ArchDefinePpcsq)
1328 // powerpc64le automatically defaults to at least power8.
1329 .Case("ppc64le", ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr6x |
1330 ArchDefinePwr6 | ArchDefinePwr5x |
1331 ArchDefinePwr5 | ArchDefinePwr4 |
1332 ArchDefinePpcgr | ArchDefinePpcsq)
1333 .Default(ArchDefineNone);
Hal Finkel6b984f02012-07-03 16:51:04 +00001334
1335 if (defs & ArchDefineName)
1336 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
1337 if (defs & ArchDefinePpcgr)
1338 Builder.defineMacro("_ARCH_PPCGR");
1339 if (defs & ArchDefinePpcsq)
1340 Builder.defineMacro("_ARCH_PPCSQ");
1341 if (defs & ArchDefine440)
Hal Finkel8eb59282012-06-11 22:35:19 +00001342 Builder.defineMacro("_ARCH_440");
Hal Finkel6b984f02012-07-03 16:51:04 +00001343 if (defs & ArchDefine603)
1344 Builder.defineMacro("_ARCH_603");
1345 if (defs & ArchDefine604)
1346 Builder.defineMacro("_ARCH_604");
Bill Schmidt38378a02013-02-01 20:23:10 +00001347 if (defs & ArchDefinePwr4)
Hal Finkel6b984f02012-07-03 16:51:04 +00001348 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt38378a02013-02-01 20:23:10 +00001349 if (defs & ArchDefinePwr5)
Hal Finkel6b984f02012-07-03 16:51:04 +00001350 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt38378a02013-02-01 20:23:10 +00001351 if (defs & ArchDefinePwr5x)
1352 Builder.defineMacro("_ARCH_PWR5X");
1353 if (defs & ArchDefinePwr6)
Hal Finkel8eb59282012-06-11 22:35:19 +00001354 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt38378a02013-02-01 20:23:10 +00001355 if (defs & ArchDefinePwr6x)
1356 Builder.defineMacro("_ARCH_PWR6X");
1357 if (defs & ArchDefinePwr7)
1358 Builder.defineMacro("_ARCH_PWR7");
Will Schmidtf0487512014-06-26 13:34:10 +00001359 if (defs & ArchDefinePwr8)
1360 Builder.defineMacro("_ARCH_PWR8");
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001361 if (defs & ArchDefinePwr9)
1362 Builder.defineMacro("_ARCH_PWR9");
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001363 if (defs & ArchDefineA2)
1364 Builder.defineMacro("_ARCH_A2");
1365 if (defs & ArchDefineA2q) {
1366 Builder.defineMacro("_ARCH_A2Q");
1367 Builder.defineMacro("_ARCH_QP");
1368 }
1369
1370 if (getTriple().getVendor() == llvm::Triple::BGQ) {
1371 Builder.defineMacro("__bg__");
1372 Builder.defineMacro("__THW_BLUEGENE__");
1373 Builder.defineMacro("__bgq__");
1374 Builder.defineMacro("__TOS_BGQ__");
1375 }
Bill Schmidt38378a02013-02-01 20:23:10 +00001376
Eric Christopher758aad72017-03-21 22:06:18 +00001377 if (HasAltivec) {
1378 Builder.defineMacro("__VEC__", "10206");
1379 Builder.defineMacro("__ALTIVEC__");
1380 }
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001381 if (HasVSX)
1382 Builder.defineMacro("__VSX__");
Bill Schmidt8c184e32014-10-10 17:21:23 +00001383 if (HasP8Vector)
Bill Schmidt59eb7672014-10-10 15:09:43 +00001384 Builder.defineMacro("__POWER8_VECTOR__");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001385 if (HasP8Crypto)
1386 Builder.defineMacro("__CRYPTO__");
Kit Barton8246f282015-03-25 19:41:41 +00001387 if (HasHTM)
1388 Builder.defineMacro("__HTM__");
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001389 if (HasFloat128)
1390 Builder.defineMacro("__FLOAT128__");
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001391 if (HasP9Vector)
1392 Builder.defineMacro("__POWER9_VECTOR__");
Hal Finkela57b8902015-10-01 13:39:49 +00001393
1394 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
1395 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
1396 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
1397 if (PointerWidth == 64)
1398 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001399
Eric Christopher0d361162017-03-25 05:40:13 +00001400 // We have support for the bswap intrinsics so we can define this.
1401 Builder.defineMacro("__HAVE_BSWAP__", "1");
1402
Bill Schmidt38378a02013-02-01 20:23:10 +00001403 // FIXME: The following are not yet generated here by Clang, but are
1404 // generated by GCC:
1405 //
1406 // _SOFT_FLOAT_
1407 // __RECIP_PRECISION__
1408 // __APPLE_ALTIVEC__
Bill Schmidt38378a02013-02-01 20:23:10 +00001409 // __RECIP__
1410 // __RECIPF__
1411 // __RSQRTE__
1412 // __RSQRTEF__
1413 // _SOFT_DOUBLE_
1414 // __NO_LWSYNC__
Bill Schmidt38378a02013-02-01 20:23:10 +00001415 // __LONGDOUBLE128
1416 // __CMODEL_MEDIUM__
1417 // __CMODEL_LARGE__
1418 // _CALL_SYSV
1419 // _CALL_DARWIN
1420 // __NO_FPRS__
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001421}
1422
Eric Christophera8a14c32015-08-31 18:39:16 +00001423// Handle explicit options being passed to the compiler here: if we've
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001424// explicitly turned off vsx and turned on any of:
1425// - power8-vector
1426// - direct-move
1427// - float128
1428// - power9-vector
1429// then go ahead and error since the customer has expressed an incompatible
Eric Christophera8a14c32015-08-31 18:39:16 +00001430// set of options.
1431static bool ppcUserFeaturesCheck(DiagnosticsEngine &Diags,
Eric Christopher8c47b422015-10-09 18:39:55 +00001432 const std::vector<std::string> &FeaturesVec) {
Eric Christophera8a14c32015-08-31 18:39:16 +00001433
1434 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "-vsx") !=
1435 FeaturesVec.end()) {
1436 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+power8-vector") !=
1437 FeaturesVec.end()) {
1438 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mpower8-vector"
1439 << "-mno-vsx";
1440 return false;
1441 }
1442
1443 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+direct-move") !=
1444 FeaturesVec.end()) {
1445 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mdirect-move"
1446 << "-mno-vsx";
1447 return false;
1448 }
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001449
1450 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+float128") !=
1451 FeaturesVec.end()) {
1452 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mfloat128"
1453 << "-mno-vsx";
1454 return false;
1455 }
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001456
1457 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+power9-vector") !=
1458 FeaturesVec.end()) {
1459 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mpower9-vector"
1460 << "-mno-vsx";
1461 return false;
1462 }
Eric Christophera8a14c32015-08-31 18:39:16 +00001463 }
1464
1465 return true;
1466}
1467
Eric Christopher8c47b422015-10-09 18:39:55 +00001468bool PPCTargetInfo::initFeatureMap(
1469 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
1470 const std::vector<std::string> &FeaturesVec) const {
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001471 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1472 .Case("7400", true)
1473 .Case("g4", true)
1474 .Case("7450", true)
1475 .Case("g4+", true)
1476 .Case("970", true)
1477 .Case("g5", true)
1478 .Case("pwr6", true)
1479 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +00001480 .Case("pwr8", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001481 .Case("pwr9", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001482 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +00001483 .Case("ppc64le", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001484 .Default(false);
Hal Finkelb58ce852013-02-01 18:44:19 +00001485
1486 Features["qpx"] = (CPU == "a2q");
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001487 Features["power9-vector"] = (CPU == "pwr9");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001488 Features["crypto"] = llvm::StringSwitch<bool>(CPU)
1489 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001490 .Case("pwr9", true)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001491 .Case("pwr8", true)
1492 .Default(false);
1493 Features["power8-vector"] = llvm::StringSwitch<bool>(CPU)
1494 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001495 .Case("pwr9", true)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001496 .Case("pwr8", true)
1497 .Default(false);
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001498 Features["bpermd"] = llvm::StringSwitch<bool>(CPU)
1499 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001500 .Case("pwr9", true)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001501 .Case("pwr8", true)
1502 .Case("pwr7", true)
1503 .Default(false);
1504 Features["extdiv"] = llvm::StringSwitch<bool>(CPU)
1505 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001506 .Case("pwr9", true)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001507 .Case("pwr8", true)
1508 .Case("pwr7", true)
1509 .Default(false);
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001510 Features["direct-move"] = llvm::StringSwitch<bool>(CPU)
1511 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001512 .Case("pwr9", true)
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001513 .Case("pwr8", true)
1514 .Default(false);
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001515 Features["vsx"] = llvm::StringSwitch<bool>(CPU)
1516 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001517 .Case("pwr9", true)
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001518 .Case("pwr8", true)
1519 .Case("pwr7", true)
1520 .Default(false);
Eric Christopher74fa24f2017-03-20 21:12:53 +00001521 Features["htm"] = llvm::StringSwitch<bool>(CPU)
1522 .Case("ppc64le", true)
1523 .Case("pwr9", true)
1524 .Case("pwr8", true)
1525 .Default(false);
Eric Christopheref1e2952015-08-28 02:13:58 +00001526
Eric Christophera8a14c32015-08-31 18:39:16 +00001527 if (!ppcUserFeaturesCheck(Diags, FeaturesVec))
1528 return false;
Eric Christopher007b0a02015-08-28 22:32:01 +00001529
Eric Christopher007b0a02015-08-28 22:32:01 +00001530 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001531}
1532
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001533bool PPCTargetInfo::hasFeature(StringRef Feature) const {
Bill Schmidte6e9d152014-11-02 14:56:41 +00001534 return llvm::StringSwitch<bool>(Feature)
Eric Christopher758aad72017-03-21 22:06:18 +00001535 .Case("powerpc", true)
1536 .Case("altivec", HasAltivec)
1537 .Case("vsx", HasVSX)
1538 .Case("power8-vector", HasP8Vector)
1539 .Case("crypto", HasP8Crypto)
1540 .Case("direct-move", HasDirectMove)
1541 .Case("qpx", HasQPX)
1542 .Case("htm", HasHTM)
1543 .Case("bpermd", HasBPERMD)
1544 .Case("extdiv", HasExtDiv)
1545 .Case("float128", HasFloat128)
1546 .Case("power9-vector", HasP9Vector)
1547 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001548}
Chris Lattner17df24e2008-04-21 18:56:49 +00001549
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001550void PPCTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
1551 StringRef Name, bool Enabled) const {
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001552 // If we're enabling direct-move or power8-vector go ahead and enable vsx
1553 // as well. Do the inverse if we're disabling vsx. We'll diagnose any user
1554 // incompatible options.
1555 if (Enabled) {
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001556 if (Name == "direct-move" ||
1557 Name == "power8-vector" ||
1558 Name == "float128" ||
1559 Name == "power9-vector") {
1560 // power9-vector is really a superset of power8-vector so encode that.
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001561 Features[Name] = Features["vsx"] = true;
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001562 if (Name == "power9-vector")
1563 Features["power8-vector"] = true;
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001564 } else {
1565 Features[Name] = true;
1566 }
1567 } else {
1568 if (Name == "vsx") {
1569 Features[Name] = Features["direct-move"] = Features["power8-vector"] =
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001570 Features["float128"] = Features["power9-vector"] = false;
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001571 } else {
1572 Features[Name] = false;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001573 }
1574 }
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001575}
1576
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001577const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001578 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1579 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1580 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1581 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1582 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1583 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1584 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1585 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001586 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001587 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001588 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001589 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1590 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1591 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1592 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001593 "vrsave", "vscr",
1594 "spe_acc", "spefscr",
1595 "sfp"
1596};
Chris Lattner10a5b382007-01-29 05:24:35 +00001597
Craig Topperf054e3a2015-10-19 03:52:27 +00001598ArrayRef<const char*> PPCTargetInfo::getGCCRegNames() const {
1599 return llvm::makeArrayRef(GCCRegNames);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001600}
Chris Lattner5ba61f02006-10-14 07:39:34 +00001601
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001602const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1603 // While some of these aliases do map to different registers
1604 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001605 { { "0" }, "r0" },
1606 { { "1"}, "r1" },
1607 { { "2" }, "r2" },
1608 { { "3" }, "r3" },
1609 { { "4" }, "r4" },
1610 { { "5" }, "r5" },
1611 { { "6" }, "r6" },
1612 { { "7" }, "r7" },
1613 { { "8" }, "r8" },
1614 { { "9" }, "r9" },
1615 { { "10" }, "r10" },
1616 { { "11" }, "r11" },
1617 { { "12" }, "r12" },
1618 { { "13" }, "r13" },
1619 { { "14" }, "r14" },
1620 { { "15" }, "r15" },
1621 { { "16" }, "r16" },
1622 { { "17" }, "r17" },
1623 { { "18" }, "r18" },
1624 { { "19" }, "r19" },
1625 { { "20" }, "r20" },
1626 { { "21" }, "r21" },
1627 { { "22" }, "r22" },
1628 { { "23" }, "r23" },
1629 { { "24" }, "r24" },
1630 { { "25" }, "r25" },
1631 { { "26" }, "r26" },
1632 { { "27" }, "r27" },
1633 { { "28" }, "r28" },
1634 { { "29" }, "r29" },
1635 { { "30" }, "r30" },
1636 { { "31" }, "r31" },
1637 { { "fr0" }, "f0" },
1638 { { "fr1" }, "f1" },
1639 { { "fr2" }, "f2" },
1640 { { "fr3" }, "f3" },
1641 { { "fr4" }, "f4" },
1642 { { "fr5" }, "f5" },
1643 { { "fr6" }, "f6" },
1644 { { "fr7" }, "f7" },
1645 { { "fr8" }, "f8" },
1646 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +00001647 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001648 { { "fr11" }, "f11" },
1649 { { "fr12" }, "f12" },
1650 { { "fr13" }, "f13" },
1651 { { "fr14" }, "f14" },
1652 { { "fr15" }, "f15" },
1653 { { "fr16" }, "f16" },
1654 { { "fr17" }, "f17" },
1655 { { "fr18" }, "f18" },
1656 { { "fr19" }, "f19" },
1657 { { "fr20" }, "f20" },
1658 { { "fr21" }, "f21" },
1659 { { "fr22" }, "f22" },
1660 { { "fr23" }, "f23" },
1661 { { "fr24" }, "f24" },
1662 { { "fr25" }, "f25" },
1663 { { "fr26" }, "f26" },
1664 { { "fr27" }, "f27" },
1665 { { "fr28" }, "f28" },
1666 { { "fr29" }, "f29" },
1667 { { "fr30" }, "f30" },
1668 { { "fr31" }, "f31" },
1669 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001670};
1671
Craig Topperf054e3a2015-10-19 03:52:27 +00001672ArrayRef<TargetInfo::GCCRegAlias> PPCTargetInfo::getGCCRegAliases() const {
1673 return llvm::makeArrayRef(GCCRegAliases);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001674}
Chris Lattner02dffbd2006-10-14 07:50:21 +00001675
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001676class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001677public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001678 PPC32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1679 : PPCTargetInfo(Triple, Opts) {
James Y Knightb214cbc2016-03-04 19:00:41 +00001680 resetDataLayout("E-m:e-p:32:32-i64:64-n32");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001681
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001682 switch (getTriple().getOS()) {
Nico Weber3435ede2012-01-31 02:07:33 +00001683 case llvm::Triple::Linux:
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001684 case llvm::Triple::FreeBSD:
1685 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001686 SizeType = UnsignedInt;
Hal Finkel26908382012-03-02 20:54:36 +00001687 PtrDiffType = SignedInt;
1688 IntPtrType = SignedInt;
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001689 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +00001690 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001691 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001692 }
Roman Divacky816dcd12012-03-13 16:53:54 +00001693
Roman Divacky3ffe7462012-03-13 19:20:17 +00001694 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1695 LongDoubleWidth = LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00001696 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Roman Divacky3ffe7462012-03-13 19:20:17 +00001697 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001698
1699 // PPC32 supports atomics up to 4 bytes.
1700 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divacky965b0b72011-01-06 08:27:10 +00001701 }
1702
Craig Topper3164f332014-03-11 03:39:26 +00001703 BuiltinVaListKind getBuiltinVaListKind() const override {
Roman Divacky965b0b72011-01-06 08:27:10 +00001704 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Inge5d3fb222012-06-16 03:34:49 +00001705 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman873f65a2008-08-21 00:13:15 +00001706 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001707};
Chris Lattner5ba61f02006-10-14 07:39:34 +00001708
Bill Schmidt778d3872013-07-26 01:36:11 +00001709// Note: ABI differences may eventually require us to have a separate
1710// TargetInfo for little endian.
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001711class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001712public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001713 PPC64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1714 : PPCTargetInfo(Triple, Opts) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001715 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001716 IntMaxType = SignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001717 Int64Type = SignedLong;
Roman Divacky816dcd12012-03-13 16:53:54 +00001718
Eric Christopherf6ee1f32017-02-10 04:35:21 +00001719 if ((Triple.getArch() == llvm::Triple::ppc64le)) {
1720 resetDataLayout("e-m:e-i64:64-n32:64");
Eric Christopher4855ba82017-02-10 03:32:34 +00001721 ABI = "elfv2";
Eric Christopherf6ee1f32017-02-10 04:35:21 +00001722 } else {
1723 resetDataLayout("E-m:e-i64:64-n32:64");
Eric Christopher4855ba82017-02-10 03:32:34 +00001724 ABI = "elfv1";
Eric Christopherf6ee1f32017-02-10 04:35:21 +00001725 }
Eric Christopher4855ba82017-02-10 03:32:34 +00001726
Eric Christopherf6ee1f32017-02-10 04:35:21 +00001727 switch (getTriple().getOS()) {
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001728 case llvm::Triple::FreeBSD:
Roman Divacky3ffe7462012-03-13 19:20:17 +00001729 LongDoubleWidth = LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00001730 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001731 break;
Joerg Sonnenbergeraac82c42014-10-15 19:52:03 +00001732 case llvm::Triple::NetBSD:
1733 IntMaxType = SignedLongLong;
1734 Int64Type = SignedLongLong;
1735 break;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001736 default:
1737 break;
Ulrich Weigand8afad612014-07-28 13:17:52 +00001738 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001739
1740 // PPC64 supports atomics up to 8 bytes.
1741 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001742 }
Craig Topper3164f332014-03-11 03:39:26 +00001743 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001744 return TargetInfo::CharPtrBuiltinVaList;
Roman Divacky965b0b72011-01-06 08:27:10 +00001745 }
Eric Christophere6b7cf42015-07-10 18:25:52 +00001746 // PPC64 Linux-specific ABI options.
Ulrich Weigand8afad612014-07-28 13:17:52 +00001747 bool setABI(const std::string &Name) override {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001748 if (Name == "elfv1" || Name == "elfv1-qpx" || Name == "elfv2") {
Ulrich Weigand8afad612014-07-28 13:17:52 +00001749 ABI = Name;
1750 return true;
1751 }
1752 return false;
1753 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001754};
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001755
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001756class DarwinPPC32TargetInfo : public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001757public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001758 DarwinPPC32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1759 : DarwinTargetInfo<PPC32TargetInfo>(Triple, Opts) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001760 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +00001761 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Eric Christopher917e9522014-11-18 22:36:15 +00001762 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev68d773c2012-01-17 22:40:00 +00001763 LongLongAlign = 32;
James Y Knightb214cbc2016-03-04 19:00:41 +00001764 resetDataLayout("E-m:o-p:32:32-f64:32:64-n32");
Roman Divacky965b0b72011-01-06 08:27:10 +00001765 }
Craig Topper3164f332014-03-11 03:39:26 +00001766 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001767 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001768 }
1769};
1770
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001771class DarwinPPC64TargetInfo : public DarwinTargetInfo<PPC64TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001772public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001773 DarwinPPC64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1774 : DarwinTargetInfo<PPC64TargetInfo>(Triple, Opts) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001775 HasAlignMac68kSupport = true;
James Y Knightb214cbc2016-03-04 19:00:41 +00001776 resetDataLayout("E-m:o-i64:64-n32:64");
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001777 }
1778};
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001779
Eric Christopherc48497a2015-09-18 21:26:24 +00001780static const unsigned NVPTXAddrSpaceMap[] = {
1781 1, // opencl_global
1782 3, // opencl_local
1783 4, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00001784 // FIXME: generic has to be added to the target
Eric Christopherc48497a2015-09-18 21:26:24 +00001785 0, // opencl_generic
1786 1, // cuda_device
1787 4, // cuda_constant
1788 3, // cuda_shared
1789};
1790
1791class NVPTXTargetInfo : public TargetInfo {
1792 static const char *const GCCRegNames[];
1793 static const Builtin::Info BuiltinInfo[];
Justin Lebar62907612016-07-06 21:21:39 +00001794 CudaArch GPU;
Justin Lebarb6626592017-01-05 16:53:21 +00001795 std::unique_ptr<TargetInfo> HostTarget;
Reid Klecknerbbc01782014-12-03 21:53:36 +00001796
Eric Christopherc48497a2015-09-18 21:26:24 +00001797public:
Justin Lebarb6626592017-01-05 16:53:21 +00001798 NVPTXTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts,
1799 unsigned TargetPointerWidth)
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001800 : TargetInfo(Triple) {
Justin Lebarb6626592017-01-05 16:53:21 +00001801 assert((TargetPointerWidth == 32 || TargetPointerWidth == 64) &&
1802 "NVPTX only supports 32- and 64-bit modes.");
1803
Eric Christopherc48497a2015-09-18 21:26:24 +00001804 TLSSupported = false;
Eric Christopherc48497a2015-09-18 21:26:24 +00001805 AddrSpaceMap = &NVPTXAddrSpaceMap;
1806 UseAddrSpaceMapMangling = true;
Justin Lebarb6626592017-01-05 16:53:21 +00001807
Eric Christopherc48497a2015-09-18 21:26:24 +00001808 // Define available target features
1809 // These must be defined in sorted order!
1810 NoAsmVariants = true;
Justin Lebar62907612016-07-06 21:21:39 +00001811 GPU = CudaArch::SM_20;
Justin Lebar76945b22016-04-29 23:05:19 +00001812
Justin Lebarb6626592017-01-05 16:53:21 +00001813 if (TargetPointerWidth == 32)
1814 resetDataLayout("e-p:32:32-i64:64-v16:16-v32:32-n16:32:64");
1815 else
1816 resetDataLayout("e-i64:64-v16:16-v32:32-n16:32:64");
1817
Justin Lebar76945b22016-04-29 23:05:19 +00001818 // If possible, get a TargetInfo for our host triple, so we can match its
1819 // types.
1820 llvm::Triple HostTriple(Opts.HostTriple);
Justin Lebarb6626592017-01-05 16:53:21 +00001821 if (!HostTriple.isNVPTX())
1822 HostTarget.reset(AllocateTarget(llvm::Triple(Opts.HostTriple), Opts));
1823
1824 // If no host target, make some guesses about the data layout and return.
Justin Lebar76945b22016-04-29 23:05:19 +00001825 if (!HostTarget) {
Justin Lebarb6626592017-01-05 16:53:21 +00001826 LongWidth = LongAlign = TargetPointerWidth;
1827 PointerWidth = PointerAlign = TargetPointerWidth;
1828 switch (TargetPointerWidth) {
1829 case 32:
1830 SizeType = TargetInfo::UnsignedInt;
1831 PtrDiffType = TargetInfo::SignedInt;
1832 IntPtrType = TargetInfo::SignedInt;
1833 break;
1834 case 64:
1835 SizeType = TargetInfo::UnsignedLong;
1836 PtrDiffType = TargetInfo::SignedLong;
1837 IntPtrType = TargetInfo::SignedLong;
1838 break;
1839 default:
1840 llvm_unreachable("TargetPointerWidth must be 32 or 64");
1841 }
Justin Lebar76945b22016-04-29 23:05:19 +00001842 return;
1843 }
1844
Justin Lebarb6626592017-01-05 16:53:21 +00001845 // Copy properties from host target.
Justin Lebar76945b22016-04-29 23:05:19 +00001846 PointerWidth = HostTarget->getPointerWidth(/* AddrSpace = */ 0);
1847 PointerAlign = HostTarget->getPointerAlign(/* AddrSpace = */ 0);
1848 BoolWidth = HostTarget->getBoolWidth();
1849 BoolAlign = HostTarget->getBoolAlign();
1850 IntWidth = HostTarget->getIntWidth();
1851 IntAlign = HostTarget->getIntAlign();
1852 HalfWidth = HostTarget->getHalfWidth();
1853 HalfAlign = HostTarget->getHalfAlign();
1854 FloatWidth = HostTarget->getFloatWidth();
1855 FloatAlign = HostTarget->getFloatAlign();
1856 DoubleWidth = HostTarget->getDoubleWidth();
1857 DoubleAlign = HostTarget->getDoubleAlign();
1858 LongWidth = HostTarget->getLongWidth();
1859 LongAlign = HostTarget->getLongAlign();
1860 LongLongWidth = HostTarget->getLongLongWidth();
1861 LongLongAlign = HostTarget->getLongLongAlign();
1862 MinGlobalAlign = HostTarget->getMinGlobalAlign();
Richard Smith59139022016-09-30 22:41:36 +00001863 NewAlign = HostTarget->getNewAlign();
Justin Lebar76945b22016-04-29 23:05:19 +00001864 DefaultAlignForAttributeAligned =
1865 HostTarget->getDefaultAlignForAttributeAligned();
1866 SizeType = HostTarget->getSizeType();
1867 IntMaxType = HostTarget->getIntMaxType();
1868 PtrDiffType = HostTarget->getPtrDiffType(/* AddrSpace = */ 0);
1869 IntPtrType = HostTarget->getIntPtrType();
1870 WCharType = HostTarget->getWCharType();
1871 WIntType = HostTarget->getWIntType();
1872 Char16Type = HostTarget->getChar16Type();
1873 Char32Type = HostTarget->getChar32Type();
1874 Int64Type = HostTarget->getInt64Type();
1875 SigAtomicType = HostTarget->getSigAtomicType();
1876 ProcessIDType = HostTarget->getProcessIDType();
1877
1878 UseBitFieldTypeAlignment = HostTarget->useBitFieldTypeAlignment();
1879 UseZeroLengthBitfieldAlignment =
1880 HostTarget->useZeroLengthBitfieldAlignment();
1881 UseExplicitBitFieldAlignment = HostTarget->useExplicitBitFieldAlignment();
1882 ZeroLengthBitfieldBoundary = HostTarget->getZeroLengthBitfieldBoundary();
1883
Justin Lebar5057f172016-09-09 20:35:43 +00001884 // This is a bit of a lie, but it controls __GCC_ATOMIC_XXX_LOCK_FREE, and
1885 // we need those macros to be identical on host and device, because (among
1886 // other things) they affect which standard library classes are defined, and
1887 // we need all classes to be defined on both the host and device.
1888 MaxAtomicInlineWidth = HostTarget->getMaxAtomicInlineWidth();
1889
Justin Lebar76945b22016-04-29 23:05:19 +00001890 // Properties intentionally not copied from host:
1891 // - LargeArrayMinWidth, LargeArrayAlign: Not visible across the
1892 // host/device boundary.
1893 // - SuitableAlign: Not visible across the host/device boundary, and may
1894 // correctly be different on host/device, e.g. if host has wider vector
1895 // types than device.
1896 // - LongDoubleWidth, LongDoubleAlign: nvptx's long double type is the same
1897 // as its double type, but that's not necessarily true on the host.
1898 // TODO: nvcc emits a warning when using long double on device; we should
1899 // do the same.
Eric Christopherc48497a2015-09-18 21:26:24 +00001900 }
1901 void getTargetDefines(const LangOptions &Opts,
1902 MacroBuilder &Builder) const override {
1903 Builder.defineMacro("__PTX__");
1904 Builder.defineMacro("__NVPTX__");
1905 if (Opts.CUDAIsDevice) {
1906 // Set __CUDA_ARCH__ for the GPU specified.
Justin Lebaref1aaac2016-07-06 21:21:14 +00001907 std::string CUDAArchCode = [this] {
1908 switch (GPU) {
Simon Pilgrim13dff572016-07-07 22:32:26 +00001909 case CudaArch::UNKNOWN:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001910 assert(false && "No GPU arch when compiling CUDA device code.");
1911 return "";
Justin Lebar62907612016-07-06 21:21:39 +00001912 case CudaArch::SM_20:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001913 return "200";
Justin Lebar62907612016-07-06 21:21:39 +00001914 case CudaArch::SM_21:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001915 return "210";
Justin Lebar62907612016-07-06 21:21:39 +00001916 case CudaArch::SM_30:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001917 return "300";
Justin Lebar62907612016-07-06 21:21:39 +00001918 case CudaArch::SM_32:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001919 return "320";
Justin Lebar62907612016-07-06 21:21:39 +00001920 case CudaArch::SM_35:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001921 return "350";
Justin Lebar62907612016-07-06 21:21:39 +00001922 case CudaArch::SM_37:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001923 return "370";
Justin Lebar62907612016-07-06 21:21:39 +00001924 case CudaArch::SM_50:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001925 return "500";
Justin Lebar62907612016-07-06 21:21:39 +00001926 case CudaArch::SM_52:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001927 return "520";
Justin Lebar62907612016-07-06 21:21:39 +00001928 case CudaArch::SM_53:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001929 return "530";
Justin Lebar62907612016-07-06 21:21:39 +00001930 case CudaArch::SM_60:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001931 return "600";
Justin Lebar62907612016-07-06 21:21:39 +00001932 case CudaArch::SM_61:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001933 return "610";
Justin Lebar62907612016-07-06 21:21:39 +00001934 case CudaArch::SM_62:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001935 return "620";
1936 }
Simon Pilgrim13dff572016-07-07 22:32:26 +00001937 llvm_unreachable("unhandled CudaArch");
Justin Lebaref1aaac2016-07-06 21:21:14 +00001938 }();
Eric Christopherc48497a2015-09-18 21:26:24 +00001939 Builder.defineMacro("__CUDA_ARCH__", CUDAArchCode);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001940 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001941 }
Craig Topper6c03a542015-10-19 04:51:35 +00001942 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
1943 return llvm::makeArrayRef(BuiltinInfo,
1944 clang::NVPTX::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eric Christopherc48497a2015-09-18 21:26:24 +00001945 }
Artem Belevichfda99052016-09-28 17:47:35 +00001946 bool
1947 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
1948 StringRef CPU,
1949 const std::vector<std::string> &FeaturesVec) const override {
1950 Features["satom"] = GPU >= CudaArch::SM_60;
1951 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
1952 }
1953
Eric Christopherc48497a2015-09-18 21:26:24 +00001954 bool hasFeature(StringRef Feature) const override {
Artem Belevichfda99052016-09-28 17:47:35 +00001955 return llvm::StringSwitch<bool>(Feature)
1956 .Cases("ptx", "nvptx", true)
1957 .Case("satom", GPU >= CudaArch::SM_60) // Atomics w/ scope.
1958 .Default(false);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001959 }
1960
Craig Topperf054e3a2015-10-19 03:52:27 +00001961 ArrayRef<const char *> getGCCRegNames() const override;
1962 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00001963 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00001964 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00001965 }
1966 bool validateAsmConstraint(const char *&Name,
1967 TargetInfo::ConstraintInfo &Info) const override {
1968 switch (*Name) {
1969 default:
1970 return false;
1971 case 'c':
1972 case 'h':
1973 case 'r':
1974 case 'l':
1975 case 'f':
1976 case 'd':
1977 Info.setAllowsRegister();
1978 return true;
Eli Bendersky13467172015-04-01 20:29:18 +00001979 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001980 }
1981 const char *getClobbers() const override {
1982 // FIXME: Is this really right?
1983 return "";
1984 }
1985 BuiltinVaListKind getBuiltinVaListKind() const override {
1986 // FIXME: implement
1987 return TargetInfo::CharPtrBuiltinVaList;
1988 }
1989 bool setCPU(const std::string &Name) override {
Justin Lebar62907612016-07-06 21:21:39 +00001990 GPU = StringToCudaArch(Name);
1991 return GPU != CudaArch::UNKNOWN;
Eric Christopherc48497a2015-09-18 21:26:24 +00001992 }
Jan Vesely9674bd42016-06-17 19:02:14 +00001993 void setSupportedOpenCLOpts() override {
1994 auto &Opts = getSupportedOpenCLOpts();
Yaxun Liu5b746652016-12-18 05:18:55 +00001995 Opts.support("cl_clang_storage_class_specifiers");
1996 Opts.support("cl_khr_gl_sharing");
1997 Opts.support("cl_khr_icd");
Jan Vesely9674bd42016-06-17 19:02:14 +00001998
Yaxun Liu5b746652016-12-18 05:18:55 +00001999 Opts.support("cl_khr_fp64");
2000 Opts.support("cl_khr_byte_addressable_store");
2001 Opts.support("cl_khr_global_int32_base_atomics");
2002 Opts.support("cl_khr_global_int32_extended_atomics");
2003 Opts.support("cl_khr_local_int32_base_atomics");
2004 Opts.support("cl_khr_local_int32_extended_atomics");
Jan Vesely9674bd42016-06-17 19:02:14 +00002005 }
Justin Lebar86c4e632017-01-05 16:53:38 +00002006
2007 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
2008 // CUDA compilations support all of the host's calling conventions.
2009 //
2010 // TODO: We should warn if you apply a non-default CC to anything other than
2011 // a host function.
2012 if (HostTarget)
2013 return HostTarget->checkCallingConvention(CC);
2014 return CCCR_Warning;
2015 }
Eric Christopherc48497a2015-09-18 21:26:24 +00002016};
2017
2018const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
2019#define BUILTIN(ID, TYPE, ATTRS) \
2020 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
2021#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
2022 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Artem Belevichfda99052016-09-28 17:47:35 +00002023#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
2024 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Eric Christopherc48497a2015-09-18 21:26:24 +00002025#include "clang/Basic/BuiltinsNVPTX.def"
2026};
2027
2028const char *const NVPTXTargetInfo::GCCRegNames[] = {"r0"};
2029
Craig Topperf054e3a2015-10-19 03:52:27 +00002030ArrayRef<const char *> NVPTXTargetInfo::getGCCRegNames() const {
2031 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00002032}
2033
Yaxun Liu3464f922017-03-25 03:46:25 +00002034static const LangAS::Map AMDGPUPrivateIsZeroMap = {
2035 1, // opencl_global
2036 3, // opencl_local
2037 2, // opencl_constant
2038 4, // opencl_generic
2039 1, // cuda_device
2040 2, // cuda_constant
2041 3 // cuda_shared
2042};
2043static const LangAS::Map AMDGPUGenericIsZeroMap = {
2044 1, // opencl_global
2045 3, // opencl_local
2046 4, // opencl_constant
2047 0, // opencl_generic
2048 1, // cuda_device
2049 4, // cuda_constant
2050 3 // cuda_shared
Eli Friedmand13b41e2012-10-12 23:32:00 +00002051};
2052
Tom Stellarda96344b2014-08-21 13:58:40 +00002053// If you edit the description strings, make sure you update
2054// getPointerWidthV().
2055
Craig Topper273dbc62015-10-18 05:29:26 +00002056static const char *const DataLayoutStringR600 =
Rafael Espindola29db13a2014-01-03 18:13:17 +00002057 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
2058 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00002059
Yaxun Liu3464f922017-03-25 03:46:25 +00002060static const char *const DataLayoutStringSIPrivateIsZero =
Matt Arsenault6dc455f2016-05-31 16:58:18 +00002061 "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 +00002062 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
2063 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00002064
Yaxun Liu3464f922017-03-25 03:46:25 +00002065static const char *const DataLayoutStringSIGenericIsZero =
2066 "e-p:64:64-p1:64:64-p2:64:64-p3:32:32-p4:64:64-p5:32:32"
2067 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
2068 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
2069
Matt Arsenault250024f2016-06-08 01:56:42 +00002070class AMDGPUTargetInfo final : public TargetInfo {
Matt Arsenault56f008d2014-06-24 20:45:01 +00002071 static const Builtin::Info BuiltinInfo[];
Tom Stellard7b1059b2015-04-14 14:36:56 +00002072 static const char * const GCCRegNames[];
Matt Arsenault56f008d2014-06-24 20:45:01 +00002073
Yaxun Liu3464f922017-03-25 03:46:25 +00002074 struct AddrSpace {
2075 unsigned Generic, Global, Local, Constant, Private;
2076 AddrSpace(bool IsGenericZero_ = false){
2077 if (IsGenericZero_) {
2078 Generic = 0;
2079 Global = 1;
2080 Local = 3;
2081 Constant = 4;
2082 Private = 5;
2083 } else {
2084 Generic = 4;
2085 Global = 1;
2086 Local = 3;
2087 Constant = 2;
2088 Private = 0;
2089 }
2090 }
2091 };
2092
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002093 /// \brief The GPU profiles supported by the AMDGPU target.
Tom Stellardc74b1e02013-03-04 17:40:53 +00002094 enum GPUKind {
2095 GK_NONE,
2096 GK_R600,
2097 GK_R600_DOUBLE_OPS,
2098 GK_R700,
2099 GK_R700_DOUBLE_OPS,
2100 GK_EVERGREEN,
2101 GK_EVERGREEN_DOUBLE_OPS,
2102 GK_NORTHERN_ISLANDS,
2103 GK_CAYMAN,
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002104 GK_GFX6,
2105 GK_GFX7,
Matt Arsenaulteb952fd2017-02-18 19:02:41 +00002106 GK_GFX8,
2107 GK_GFX9
Tom Stellardc74b1e02013-03-04 17:40:53 +00002108 } GPU;
2109
Jan Veselyeebeaea2015-05-04 19:53:36 +00002110 bool hasFP64:1;
2111 bool hasFMAF:1;
2112 bool hasLDEXPF:1;
Yaxun Liud3e85b92016-09-13 17:37:09 +00002113 bool hasFullSpeedFP32Denorms:1;
Jan Veselya3abd6d2015-05-01 17:38:13 +00002114
Matt Arsenault250024f2016-06-08 01:56:42 +00002115 static bool isAMDGCN(const llvm::Triple &TT) {
2116 return TT.getArch() == llvm::Triple::amdgcn;
2117 }
2118
Yaxun Liu3464f922017-03-25 03:46:25 +00002119 static bool isGenericZero(const llvm::Triple &TT) {
2120 return TT.getEnvironmentName() == "amdgiz" ||
2121 TT.getEnvironmentName() == "amdgizcl";
2122 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00002123public:
Yaxun Liu2c17e822016-08-09 19:43:38 +00002124 AMDGPUTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Matt Arsenault250024f2016-06-08 01:56:42 +00002125 : TargetInfo(Triple) ,
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002126 GPU(isAMDGCN(Triple) ? GK_GFX6 : GK_R600),
Matt Arsenault250024f2016-06-08 01:56:42 +00002127 hasFP64(false),
2128 hasFMAF(false),
Yaxun Liu2c17e822016-08-09 19:43:38 +00002129 hasLDEXPF(false),
Yaxun Liu3464f922017-03-25 03:46:25 +00002130 hasFullSpeedFP32Denorms(false),
2131 AS(isGenericZero(Triple)){
Matt Arsenault250024f2016-06-08 01:56:42 +00002132 if (getTriple().getArch() == llvm::Triple::amdgcn) {
Jan Veselya3abd6d2015-05-01 17:38:13 +00002133 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00002134 hasFMAF = true;
2135 hasLDEXPF = true;
Tom Stellardd99fb952015-01-28 15:38:44 +00002136 }
Yaxun Liu3464f922017-03-25 03:46:25 +00002137 auto IsGenericZero = isGenericZero(Triple);
Matt Arsenault250024f2016-06-08 01:56:42 +00002138 resetDataLayout(getTriple().getArch() == llvm::Triple::amdgcn ?
Yaxun Liu3464f922017-03-25 03:46:25 +00002139 (IsGenericZero ? DataLayoutStringSIGenericIsZero :
2140 DataLayoutStringSIPrivateIsZero)
2141 : DataLayoutStringR600);
Matt Arsenault250024f2016-06-08 01:56:42 +00002142
Yaxun Liu3464f922017-03-25 03:46:25 +00002143 AddrSpaceMap = IsGenericZero ? &AMDGPUGenericIsZeroMap :
2144 &AMDGPUPrivateIsZeroMap;
David Tweed31d09b02013-09-13 12:04:22 +00002145 UseAddrSpaceMapMangling = true;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002146 }
2147
Tom Stellarda96344b2014-08-21 13:58:40 +00002148 uint64_t getPointerWidthV(unsigned AddrSpace) const override {
2149 if (GPU <= GK_CAYMAN)
2150 return 32;
2151
Yaxun Liu3464f922017-03-25 03:46:25 +00002152 if (AddrSpace == AS.Private || AddrSpace == AS.Local) {
2153 return 32;
Tom Stellarda96344b2014-08-21 13:58:40 +00002154 }
Yaxun Liu3464f922017-03-25 03:46:25 +00002155 return 64;
Tom Stellarda96344b2014-08-21 13:58:40 +00002156 }
2157
Yaxun Liu26f75662016-08-19 05:17:25 +00002158 uint64_t getMaxPointerWidth() const override {
2159 return getTriple().getArch() == llvm::Triple::amdgcn ? 64 : 32;
2160 }
2161
Craig Topper3164f332014-03-11 03:39:26 +00002162 const char * getClobbers() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00002163 return "";
2164 }
2165
Craig Topperf054e3a2015-10-19 03:52:27 +00002166 ArrayRef<const char *> getGCCRegNames() const override;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002167
Craig Topperf054e3a2015-10-19 03:52:27 +00002168 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
2169 return None;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002170 }
2171
Craig Topper3164f332014-03-11 03:39:26 +00002172 bool validateAsmConstraint(const char *&Name,
Tom Stellardd097e942015-11-19 22:11:58 +00002173 TargetInfo::ConstraintInfo &Info) const override {
2174 switch (*Name) {
2175 default: break;
2176 case 'v': // vgpr
2177 case 's': // sgpr
2178 Info.setAllowsRegister();
2179 return true;
2180 }
2181 return false;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002182 }
2183
Matt Arsenault250024f2016-06-08 01:56:42 +00002184 bool initFeatureMap(llvm::StringMap<bool> &Features,
2185 DiagnosticsEngine &Diags, StringRef CPU,
2186 const std::vector<std::string> &FeatureVec) const override;
2187
Yaxun Liu2c17e822016-08-09 19:43:38 +00002188 void adjustTargetOptions(const CodeGenOptions &CGOpts,
2189 TargetOptions &TargetOpts) const override {
Yaxun Liu2c17e822016-08-09 19:43:38 +00002190 bool hasFP32Denormals = false;
2191 bool hasFP64Denormals = false;
2192 for (auto &I : TargetOpts.FeaturesAsWritten) {
2193 if (I == "+fp32-denormals" || I == "-fp32-denormals")
2194 hasFP32Denormals = true;
Matt Arsenault09cca092017-01-23 22:31:14 +00002195 if (I == "+fp64-fp16-denormals" || I == "-fp64-fp16-denormals")
Yaxun Liu2c17e822016-08-09 19:43:38 +00002196 hasFP64Denormals = true;
2197 }
2198 if (!hasFP32Denormals)
Yaxun Liud3e85b92016-09-13 17:37:09 +00002199 TargetOpts.Features.push_back((Twine(hasFullSpeedFP32Denorms &&
2200 !CGOpts.FlushDenorm ? '+' : '-') + Twine("fp32-denormals")).str());
Matt Arsenault09cca092017-01-23 22:31:14 +00002201 // Always do not flush fp64 or fp16 denorms.
Yaxun Liu2c17e822016-08-09 19:43:38 +00002202 if (!hasFP64Denormals && hasFP64)
Matt Arsenault09cca092017-01-23 22:31:14 +00002203 TargetOpts.Features.push_back("+fp64-fp16-denormals");
Yaxun Liu2c17e822016-08-09 19:43:38 +00002204 }
2205
Craig Topper6c03a542015-10-19 04:51:35 +00002206 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
2207 return llvm::makeArrayRef(BuiltinInfo,
2208 clang::AMDGPU::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eli Friedmand13b41e2012-10-12 23:32:00 +00002209 }
2210
Craig Topper3164f332014-03-11 03:39:26 +00002211 void getTargetDefines(const LangOptions &Opts,
2212 MacroBuilder &Builder) const override {
Matt Arsenault5e020b22016-02-27 09:06:26 +00002213 if (getTriple().getArch() == llvm::Triple::amdgcn)
2214 Builder.defineMacro("__AMDGCN__");
2215 else
2216 Builder.defineMacro("__R600__");
2217
Jan Veselyeebeaea2015-05-04 19:53:36 +00002218 if (hasFMAF)
2219 Builder.defineMacro("__HAS_FMAF__");
2220 if (hasLDEXPF)
2221 Builder.defineMacro("__HAS_LDEXPF__");
Jan Vesely211ba782016-06-17 02:25:03 +00002222 if (hasFP64)
2223 Builder.defineMacro("__HAS_FP64__");
Eli Friedmand13b41e2012-10-12 23:32:00 +00002224 }
2225
Craig Topper3164f332014-03-11 03:39:26 +00002226 BuiltinVaListKind getBuiltinVaListKind() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00002227 return TargetInfo::CharPtrBuiltinVaList;
2228 }
2229
Matt Arsenault250024f2016-06-08 01:56:42 +00002230 static GPUKind parseR600Name(StringRef Name) {
2231 return llvm::StringSwitch<GPUKind>(Name)
Tom Stellardc74b1e02013-03-04 17:40:53 +00002232 .Case("r600" , GK_R600)
2233 .Case("rv610", GK_R600)
2234 .Case("rv620", GK_R600)
2235 .Case("rv630", GK_R600)
2236 .Case("rv635", GK_R600)
2237 .Case("rs780", GK_R600)
2238 .Case("rs880", GK_R600)
2239 .Case("rv670", GK_R600_DOUBLE_OPS)
2240 .Case("rv710", GK_R700)
2241 .Case("rv730", GK_R700)
2242 .Case("rv740", GK_R700_DOUBLE_OPS)
2243 .Case("rv770", GK_R700_DOUBLE_OPS)
2244 .Case("palm", GK_EVERGREEN)
2245 .Case("cedar", GK_EVERGREEN)
2246 .Case("sumo", GK_EVERGREEN)
2247 .Case("sumo2", GK_EVERGREEN)
2248 .Case("redwood", GK_EVERGREEN)
2249 .Case("juniper", GK_EVERGREEN)
2250 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
2251 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
2252 .Case("barts", GK_NORTHERN_ISLANDS)
2253 .Case("turks", GK_NORTHERN_ISLANDS)
2254 .Case("caicos", GK_NORTHERN_ISLANDS)
2255 .Case("cayman", GK_CAYMAN)
2256 .Case("aruba", GK_CAYMAN)
Matt Arsenault250024f2016-06-08 01:56:42 +00002257 .Default(GK_NONE);
2258 }
2259
2260 static GPUKind parseAMDGCNName(StringRef Name) {
2261 return llvm::StringSwitch<GPUKind>(Name)
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002262 .Case("tahiti", GK_GFX6)
2263 .Case("pitcairn", GK_GFX6)
2264 .Case("verde", GK_GFX6)
2265 .Case("oland", GK_GFX6)
2266 .Case("hainan", GK_GFX6)
2267 .Case("bonaire", GK_GFX7)
2268 .Case("kabini", GK_GFX7)
2269 .Case("kaveri", GK_GFX7)
2270 .Case("hawaii", GK_GFX7)
2271 .Case("mullins", GK_GFX7)
Yaxun Liue59a0bc2016-10-26 16:40:21 +00002272 .Case("gfx700", GK_GFX7)
2273 .Case("gfx701", GK_GFX7)
2274 .Case("gfx702", GK_GFX7)
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002275 .Case("tonga", GK_GFX8)
2276 .Case("iceland", GK_GFX8)
2277 .Case("carrizo", GK_GFX8)
2278 .Case("fiji", GK_GFX8)
2279 .Case("stoney", GK_GFX8)
2280 .Case("polaris10", GK_GFX8)
2281 .Case("polaris11", GK_GFX8)
Yaxun Liue59a0bc2016-10-26 16:40:21 +00002282 .Case("gfx800", GK_GFX8)
2283 .Case("gfx801", GK_GFX8)
2284 .Case("gfx802", GK_GFX8)
2285 .Case("gfx803", GK_GFX8)
2286 .Case("gfx804", GK_GFX8)
2287 .Case("gfx810", GK_GFX8)
Matt Arsenaulteb952fd2017-02-18 19:02:41 +00002288 .Case("gfx900", GK_GFX9)
2289 .Case("gfx901", GK_GFX9)
Tom Stellardc74b1e02013-03-04 17:40:53 +00002290 .Default(GK_NONE);
Matt Arsenault250024f2016-06-08 01:56:42 +00002291 }
Tom Stellardc74b1e02013-03-04 17:40:53 +00002292
Matt Arsenault250024f2016-06-08 01:56:42 +00002293 bool setCPU(const std::string &Name) override {
2294 if (getTriple().getArch() == llvm::Triple::amdgcn)
2295 GPU = parseAMDGCNName(Name);
2296 else
2297 GPU = parseR600Name(Name);
Tom Stellardc74b1e02013-03-04 17:40:53 +00002298
Matt Arsenault250024f2016-06-08 01:56:42 +00002299 return GPU != GK_NONE;
Tom Stellardc74b1e02013-03-04 17:40:53 +00002300 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002301
Jan Vesely211ba782016-06-17 02:25:03 +00002302 void setSupportedOpenCLOpts() override {
2303 auto &Opts = getSupportedOpenCLOpts();
Yaxun Liu5b746652016-12-18 05:18:55 +00002304 Opts.support("cl_clang_storage_class_specifiers");
2305 Opts.support("cl_khr_icd");
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002306
Jan Vesely211ba782016-06-17 02:25:03 +00002307 if (hasFP64)
Yaxun Liu5b746652016-12-18 05:18:55 +00002308 Opts.support("cl_khr_fp64");
Jan Vesely211ba782016-06-17 02:25:03 +00002309 if (GPU >= GK_EVERGREEN) {
Yaxun Liu5b746652016-12-18 05:18:55 +00002310 Opts.support("cl_khr_byte_addressable_store");
2311 Opts.support("cl_khr_global_int32_base_atomics");
2312 Opts.support("cl_khr_global_int32_extended_atomics");
2313 Opts.support("cl_khr_local_int32_base_atomics");
2314 Opts.support("cl_khr_local_int32_extended_atomics");
Jan Vesely211ba782016-06-17 02:25:03 +00002315 }
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002316 if (GPU >= GK_GFX6) {
Yaxun Liu5b746652016-12-18 05:18:55 +00002317 Opts.support("cl_khr_fp16");
2318 Opts.support("cl_khr_int64_base_atomics");
2319 Opts.support("cl_khr_int64_extended_atomics");
2320 Opts.support("cl_khr_mipmap_image");
2321 Opts.support("cl_khr_subgroups");
2322 Opts.support("cl_khr_3d_image_writes");
2323 Opts.support("cl_amd_media_ops");
2324 Opts.support("cl_amd_media_ops2");
Jan Vesely211ba782016-06-17 02:25:03 +00002325 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002326 }
Nikolay Haustov8c6538b2016-06-30 09:06:33 +00002327
Yaxun Liu99444cb2016-08-03 20:38:06 +00002328 LangAS::ID getOpenCLImageAddrSpace() const override {
2329 return LangAS::opencl_constant;
2330 }
2331
Konstantin Zhuravlyovd1ba16e2017-03-08 23:56:48 +00002332 /// \returns Target specific vtbl ptr address space.
2333 unsigned getVtblPtrAddressSpace() const override {
2334 // \todo: We currently have address spaces defined in AMDGPU Backend. It
2335 // would be nice if we could use it here instead of using bare numbers (same
2336 // applies to getDWARFAddressSpace).
2337 return 2; // constant.
2338 }
2339
2340 /// \returns If a target requires an address within a target specific address
2341 /// space \p AddressSpace to be converted in order to be used, then return the
2342 /// corresponding target specific DWARF address space.
2343 ///
2344 /// \returns Otherwise return None and no conversion will be emitted in the
2345 /// DWARF.
2346 Optional<unsigned> getDWARFAddressSpace(
2347 unsigned AddressSpace) const override {
Yaxun Liu3464f922017-03-25 03:46:25 +00002348 const unsigned DWARF_Private = 1;
2349 const unsigned DWARF_Local = 2;
2350 if (AddressSpace == AS.Private) {
2351 return DWARF_Private;
2352 } else if (AddressSpace == AS.Local) {
2353 return DWARF_Local;
2354 } else {
Konstantin Zhuravlyovd1ba16e2017-03-08 23:56:48 +00002355 return None;
2356 }
2357 }
2358
Nikolay Haustov8c6538b2016-06-30 09:06:33 +00002359 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
2360 switch (CC) {
2361 default:
2362 return CCCR_Warning;
2363 case CC_C:
2364 case CC_OpenCLKernel:
2365 return CCCR_OK;
2366 }
2367 }
Yaxun Liu402804b2016-12-15 08:09:08 +00002368
2369 // In amdgcn target the null pointer in global, constant, and generic
2370 // address space has value 0 but in private and local address space has
2371 // value ~0.
2372 uint64_t getNullPointerValue(unsigned AS) const override {
Matt Arsenaultbf5e3e42017-03-13 19:47:53 +00002373 return AS == LangAS::opencl_local ? ~0 : 0;
Yaxun Liu402804b2016-12-15 08:09:08 +00002374 }
Yaxun Liu3464f922017-03-25 03:46:25 +00002375
2376 const AddrSpace AS;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002377};
2378
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002379const Builtin::Info AMDGPUTargetInfo::BuiltinInfo[] = {
Matt Arsenault56f008d2014-06-24 20:45:01 +00002380#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00002381 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Matt Arsenault250024f2016-06-08 01:56:42 +00002382#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
2383 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002384#include "clang/Basic/BuiltinsAMDGPU.def"
Matt Arsenault56f008d2014-06-24 20:45:01 +00002385};
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002386const char * const AMDGPUTargetInfo::GCCRegNames[] = {
Tom Stellard7b1059b2015-04-14 14:36:56 +00002387 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
2388 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
2389 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
2390 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
2391 "v32", "v33", "v34", "v35", "v36", "v37", "v38", "v39",
2392 "v40", "v41", "v42", "v43", "v44", "v45", "v46", "v47",
2393 "v48", "v49", "v50", "v51", "v52", "v53", "v54", "v55",
2394 "v56", "v57", "v58", "v59", "v60", "v61", "v62", "v63",
2395 "v64", "v65", "v66", "v67", "v68", "v69", "v70", "v71",
2396 "v72", "v73", "v74", "v75", "v76", "v77", "v78", "v79",
2397 "v80", "v81", "v82", "v83", "v84", "v85", "v86", "v87",
2398 "v88", "v89", "v90", "v91", "v92", "v93", "v94", "v95",
2399 "v96", "v97", "v98", "v99", "v100", "v101", "v102", "v103",
2400 "v104", "v105", "v106", "v107", "v108", "v109", "v110", "v111",
2401 "v112", "v113", "v114", "v115", "v116", "v117", "v118", "v119",
2402 "v120", "v121", "v122", "v123", "v124", "v125", "v126", "v127",
2403 "v128", "v129", "v130", "v131", "v132", "v133", "v134", "v135",
2404 "v136", "v137", "v138", "v139", "v140", "v141", "v142", "v143",
2405 "v144", "v145", "v146", "v147", "v148", "v149", "v150", "v151",
2406 "v152", "v153", "v154", "v155", "v156", "v157", "v158", "v159",
2407 "v160", "v161", "v162", "v163", "v164", "v165", "v166", "v167",
2408 "v168", "v169", "v170", "v171", "v172", "v173", "v174", "v175",
2409 "v176", "v177", "v178", "v179", "v180", "v181", "v182", "v183",
2410 "v184", "v185", "v186", "v187", "v188", "v189", "v190", "v191",
2411 "v192", "v193", "v194", "v195", "v196", "v197", "v198", "v199",
2412 "v200", "v201", "v202", "v203", "v204", "v205", "v206", "v207",
2413 "v208", "v209", "v210", "v211", "v212", "v213", "v214", "v215",
2414 "v216", "v217", "v218", "v219", "v220", "v221", "v222", "v223",
2415 "v224", "v225", "v226", "v227", "v228", "v229", "v230", "v231",
2416 "v232", "v233", "v234", "v235", "v236", "v237", "v238", "v239",
2417 "v240", "v241", "v242", "v243", "v244", "v245", "v246", "v247",
2418 "v248", "v249", "v250", "v251", "v252", "v253", "v254", "v255",
2419 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
2420 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
2421 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
2422 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
2423 "s32", "s33", "s34", "s35", "s36", "s37", "s38", "s39",
2424 "s40", "s41", "s42", "s43", "s44", "s45", "s46", "s47",
2425 "s48", "s49", "s50", "s51", "s52", "s53", "s54", "s55",
2426 "s56", "s57", "s58", "s59", "s60", "s61", "s62", "s63",
2427 "s64", "s65", "s66", "s67", "s68", "s69", "s70", "s71",
2428 "s72", "s73", "s74", "s75", "s76", "s77", "s78", "s79",
2429 "s80", "s81", "s82", "s83", "s84", "s85", "s86", "s87",
2430 "s88", "s89", "s90", "s91", "s92", "s93", "s94", "s95",
2431 "s96", "s97", "s98", "s99", "s100", "s101", "s102", "s103",
2432 "s104", "s105", "s106", "s107", "s108", "s109", "s110", "s111",
2433 "s112", "s113", "s114", "s115", "s116", "s117", "s118", "s119",
Etienne Bergerone8ae26f2016-03-24 18:29:24 +00002434 "s120", "s121", "s122", "s123", "s124", "s125", "s126", "s127",
Matt Arsenaultb015d622016-02-27 09:06:22 +00002435 "exec", "vcc", "scc", "m0", "flat_scratch", "exec_lo", "exec_hi",
2436 "vcc_lo", "vcc_hi", "flat_scratch_lo", "flat_scratch_hi"
Tom Stellard7b1059b2015-04-14 14:36:56 +00002437};
2438
Craig Topperf054e3a2015-10-19 03:52:27 +00002439ArrayRef<const char *> AMDGPUTargetInfo::getGCCRegNames() const {
2440 return llvm::makeArrayRef(GCCRegNames);
Tom Stellard7b1059b2015-04-14 14:36:56 +00002441}
Matt Arsenault56f008d2014-06-24 20:45:01 +00002442
Matt Arsenault250024f2016-06-08 01:56:42 +00002443bool AMDGPUTargetInfo::initFeatureMap(
2444 llvm::StringMap<bool> &Features,
2445 DiagnosticsEngine &Diags, StringRef CPU,
2446 const std::vector<std::string> &FeatureVec) const {
2447
2448 // XXX - What does the member GPU mean if device name string passed here?
2449 if (getTriple().getArch() == llvm::Triple::amdgcn) {
2450 if (CPU.empty())
2451 CPU = "tahiti";
2452
2453 switch (parseAMDGCNName(CPU)) {
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002454 case GK_GFX6:
2455 case GK_GFX7:
Matt Arsenault250024f2016-06-08 01:56:42 +00002456 break;
2457
Matt Arsenaulta0c6dca2017-02-22 20:55:59 +00002458 case GK_GFX9:
2459 Features["gfx9-insts"] = true;
2460 LLVM_FALLTHROUGH;
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002461 case GK_GFX8:
Matt Arsenault250024f2016-06-08 01:56:42 +00002462 Features["s-memrealtime"] = true;
2463 Features["16-bit-insts"] = true;
Yaxun Liu4d867992017-03-10 01:30:46 +00002464 Features["dpp"] = true;
Matt Arsenault250024f2016-06-08 01:56:42 +00002465 break;
2466
2467 case GK_NONE:
2468 return false;
2469 default:
2470 llvm_unreachable("unhandled subtarget");
2471 }
2472 } else {
2473 if (CPU.empty())
2474 CPU = "r600";
2475
2476 switch (parseR600Name(CPU)) {
2477 case GK_R600:
2478 case GK_R700:
2479 case GK_EVERGREEN:
2480 case GK_NORTHERN_ISLANDS:
2481 break;
2482 case GK_R600_DOUBLE_OPS:
2483 case GK_R700_DOUBLE_OPS:
2484 case GK_EVERGREEN_DOUBLE_OPS:
2485 case GK_CAYMAN:
2486 Features["fp64"] = true;
2487 break;
2488 case GK_NONE:
2489 return false;
2490 default:
2491 llvm_unreachable("unhandled subtarget");
2492 }
2493 }
2494
2495 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeatureVec);
2496}
2497
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00002498const Builtin::Info BuiltinInfoX86[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00002499#define BUILTIN(ID, TYPE, ATTRS) \
2500 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002501#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
Craig Topper07d3b622015-08-07 05:14:44 +00002502 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Albert Gutowski727ab8a2016-09-14 21:19:43 +00002503#define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANGS, FEATURE) \
2504 { #ID, TYPE, ATTRS, HEADER, LANGS, FEATURE },
Chris Lattner5abdec72009-06-14 01:05:48 +00002505#include "clang/Basic/BuiltinsX86.def"
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00002506
2507#define BUILTIN(ID, TYPE, ATTRS) \
2508 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Albert Gutowski0fd6e962016-10-12 17:28:44 +00002509#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
2510 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00002511#define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANGS, FEATURE) \
2512 { #ID, TYPE, ATTRS, HEADER, LANGS, FEATURE },
2513#include "clang/Basic/BuiltinsX86_64.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00002514};
Eli Friedmanb5366062008-05-20 14:21:01 +00002515
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00002516
Nuno Lopescfca1f02009-12-23 17:49:57 +00002517static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002518 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
2519 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00002520 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002521 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
2522 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
2523 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00002524 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00002525 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
2526 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Marina Yatsina41c45fa2016-02-03 11:32:08 +00002527 "xmm16", "xmm17", "xmm18", "xmm19", "xmm20", "xmm21", "xmm22", "xmm23",
2528 "xmm24", "xmm25", "xmm26", "xmm27", "xmm28", "xmm29", "xmm30", "xmm31",
2529 "ymm16", "ymm17", "ymm18", "ymm19", "ymm20", "ymm21", "ymm22", "ymm23",
2530 "ymm24", "ymm25", "ymm26", "ymm27", "ymm28", "ymm29", "ymm30", "ymm31",
2531 "zmm0", "zmm1", "zmm2", "zmm3", "zmm4", "zmm5", "zmm6", "zmm7",
2532 "zmm8", "zmm9", "zmm10", "zmm11", "zmm12", "zmm13", "zmm14", "zmm15",
2533 "zmm16", "zmm17", "zmm18", "zmm19", "zmm20", "zmm21", "zmm22", "zmm23",
2534 "zmm24", "zmm25", "zmm26", "zmm27", "zmm28", "zmm29", "zmm30", "zmm31",
Michael Zuckerman15604b92016-10-31 14:16:57 +00002535 "k0", "k1", "k2", "k3", "k4", "k5", "k6", "k7",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002536};
2537
Eric Christophercdd36352011-06-21 00:05:20 +00002538const TargetInfo::AddlRegName AddlRegNames[] = {
2539 { { "al", "ah", "eax", "rax" }, 0 },
2540 { { "bl", "bh", "ebx", "rbx" }, 3 },
2541 { { "cl", "ch", "ecx", "rcx" }, 2 },
2542 { { "dl", "dh", "edx", "rdx" }, 1 },
2543 { { "esi", "rsi" }, 4 },
2544 { { "edi", "rdi" }, 5 },
2545 { { "esp", "rsp" }, 7 },
2546 { { "ebp", "rbp" }, 6 },
Alexey Bataeva7ab1b42015-09-04 03:42:23 +00002547 { { "r8d", "r8w", "r8b" }, 38 },
2548 { { "r9d", "r9w", "r9b" }, 39 },
2549 { { "r10d", "r10w", "r10b" }, 40 },
2550 { { "r11d", "r11w", "r11b" }, 41 },
2551 { { "r12d", "r12w", "r12b" }, 42 },
2552 { { "r13d", "r13w", "r13b" }, 43 },
2553 { { "r14d", "r14w", "r14b" }, 44 },
2554 { { "r15d", "r15w", "r15b" }, 45 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00002555};
2556
2557// X86 target abstract base class; x86-32 and x86-64 are very close, so
2558// most of the implementation can be shared.
2559class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00002560 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002561 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Craig Topper543f3bd2015-10-14 23:47:57 +00002562 } SSELevel = NoSSE;
Eli Friedman33465822011-07-08 23:31:17 +00002563 enum MMX3DNowEnum {
2564 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
Craig Topper543f3bd2015-10-14 23:47:57 +00002565 } MMX3DNowLevel = NoMMX3DNow;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002566 enum XOPEnum {
2567 NoXOP,
2568 SSE4A,
2569 FMA4,
2570 XOP
Craig Topper543f3bd2015-10-14 23:47:57 +00002571 } XOPLevel = NoXOP;
Anders Carlssone437c682010-01-27 03:47:49 +00002572
Craig Topper543f3bd2015-10-14 23:47:57 +00002573 bool HasAES = false;
2574 bool HasPCLMUL = false;
2575 bool HasLZCNT = false;
2576 bool HasRDRND = false;
2577 bool HasFSGSBASE = false;
2578 bool HasBMI = false;
2579 bool HasBMI2 = false;
2580 bool HasPOPCNT = false;
2581 bool HasRTM = false;
2582 bool HasPRFCHW = false;
2583 bool HasRDSEED = false;
2584 bool HasADX = false;
2585 bool HasTBM = false;
2586 bool HasFMA = false;
2587 bool HasF16C = false;
2588 bool HasAVX512CD = false;
2589 bool HasAVX512ER = false;
2590 bool HasAVX512PF = false;
2591 bool HasAVX512DQ = false;
2592 bool HasAVX512BW = false;
2593 bool HasAVX512VL = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002594 bool HasAVX512VBMI = false;
2595 bool HasAVX512IFMA = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002596 bool HasSHA = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002597 bool HasMPX = false;
2598 bool HasSGX = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002599 bool HasCX16 = false;
Craig Toppere33f51f2015-10-16 06:22:36 +00002600 bool HasFXSR = false;
Craig Topperda9fe562015-10-15 05:23:38 +00002601 bool HasXSAVE = false;
2602 bool HasXSAVEOPT = false;
2603 bool HasXSAVEC = false;
2604 bool HasXSAVES = false;
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00002605 bool HasMWAITX = false;
Craig Topper45742262017-02-09 06:10:14 +00002606 bool HasCLZERO = false;
Asaf Badouha9d1e182015-12-31 14:14:07 +00002607 bool HasPKU = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002608 bool HasCLFLUSHOPT = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002609 bool HasCLWB = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002610 bool HasMOVBE = false;
2611 bool HasPREFETCHWT1 = false;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00002612
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002613 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
2614 ///
2615 /// Each enumeration represents a particular CPU supported by Clang. These
2616 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
2617 enum CPUKind {
2618 CK_Generic,
2619
2620 /// \name i386
2621 /// i386-generation processors.
2622 //@{
2623 CK_i386,
2624 //@}
2625
2626 /// \name i486
2627 /// i486-generation processors.
2628 //@{
2629 CK_i486,
2630 CK_WinChipC6,
2631 CK_WinChip2,
2632 CK_C3,
2633 //@}
2634
2635 /// \name i586
2636 /// i586-generation processors, P5 microarchitecture based.
2637 //@{
2638 CK_i586,
2639 CK_Pentium,
2640 CK_PentiumMMX,
2641 //@}
2642
2643 /// \name i686
2644 /// i686-generation processors, P6 / Pentium M microarchitecture based.
2645 //@{
2646 CK_i686,
2647 CK_PentiumPro,
2648 CK_Pentium2,
2649 CK_Pentium3,
2650 CK_Pentium3M,
2651 CK_PentiumM,
2652 CK_C3_2,
2653
2654 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
2655 /// Clang however has some logic to suport this.
2656 // FIXME: Warn, deprecate, and potentially remove this.
2657 CK_Yonah,
2658 //@}
2659
2660 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00002661 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002662 //@{
2663 CK_Pentium4,
2664 CK_Pentium4M,
2665 CK_Prescott,
2666 CK_Nocona,
2667 //@}
2668
2669 /// \name Core
2670 /// Core microarchitecture based processors.
2671 //@{
2672 CK_Core2,
2673
2674 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
2675 /// codename which GCC no longer accepts as an option to -march, but Clang
2676 /// has some logic for recognizing it.
2677 // FIXME: Warn, deprecate, and potentially remove this.
2678 CK_Penryn,
2679 //@}
2680
2681 /// \name Atom
2682 /// Atom processors
2683 //@{
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002684 CK_Bonnell,
Preston Gurda3c58c02013-09-13 19:27:17 +00002685 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002686 //@}
2687
2688 /// \name Nehalem
2689 /// Nehalem microarchitecture based processors.
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002690 CK_Nehalem,
2691
2692 /// \name Westmere
2693 /// Westmere microarchitecture based processors.
2694 CK_Westmere,
2695
2696 /// \name Sandy Bridge
2697 /// Sandy Bridge microarchitecture based processors.
2698 CK_SandyBridge,
2699
2700 /// \name Ivy Bridge
2701 /// Ivy Bridge microarchitecture based processors.
2702 CK_IvyBridge,
2703
2704 /// \name Haswell
2705 /// Haswell microarchitecture based processors.
2706 CK_Haswell,
2707
2708 /// \name Broadwell
2709 /// Broadwell microarchitecture based processors.
Robert Khasanov50e6f582014-09-19 09:53:48 +00002710 CK_Broadwell,
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002711
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002712 /// \name Skylake Client
2713 /// Skylake client microarchitecture based processors.
2714 CK_SkylakeClient,
2715
2716 /// \name Skylake Server
2717 /// Skylake server microarchitecture based processors.
2718 CK_SkylakeServer,
2719
2720 /// \name Cannonlake Client
2721 /// Cannonlake client microarchitecture based processors.
2722 CK_Cannonlake,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002723
Craig Topper449314e2013-08-20 07:09:39 +00002724 /// \name Knights Landing
2725 /// Knights Landing processor.
2726 CK_KNL,
2727
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002728 /// \name Lakemont
2729 /// Lakemont microarchitecture based processors.
2730 CK_Lakemont,
2731
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002732 /// \name K6
2733 /// K6 architecture processors.
2734 //@{
2735 CK_K6,
2736 CK_K6_2,
2737 CK_K6_3,
2738 //@}
2739
2740 /// \name K7
2741 /// K7 architecture processors.
2742 //@{
2743 CK_Athlon,
2744 CK_AthlonThunderbird,
2745 CK_Athlon4,
2746 CK_AthlonXP,
2747 CK_AthlonMP,
2748 //@}
2749
2750 /// \name K8
2751 /// K8 architecture processors.
2752 //@{
2753 CK_Athlon64,
2754 CK_Athlon64SSE3,
2755 CK_AthlonFX,
2756 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00002757 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002758 CK_Opteron,
2759 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00002760 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002761 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002762
Benjamin Kramer569f2152012-01-10 11:50:18 +00002763 /// \name Bobcat
2764 /// Bobcat architecture processors.
2765 //@{
2766 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002767 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002768 //@}
2769
2770 /// \name Bulldozer
2771 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002772 //@{
2773 CK_BDVER1,
2774 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002775 CK_BDVER3,
Benjamin Kramer56c58222014-05-02 15:47:51 +00002776 CK_BDVER4,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002777 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002778
Craig Topperc45744a2017-01-10 06:02:12 +00002779 /// \name zen
2780 /// Zen architecture processors.
2781 //@{
2782 CK_ZNVER1,
2783 //@}
2784
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002785 /// This specification is deprecated and will be removed in the future.
2786 /// Users should prefer \see CK_K8.
2787 // FIXME: Warn on this when the CPU is set to it.
Saleem Abdulrasoolcb29c1a2014-11-17 18:40:15 +00002788 //@{
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002789 CK_x86_64,
2790 //@}
2791
2792 /// \name Geode
2793 /// Geode processors.
2794 //@{
2795 CK_Geode
2796 //@}
Craig Topper543f3bd2015-10-14 23:47:57 +00002797 } CPU = CK_Generic;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002798
Eric Christopherc50738f2015-08-27 00:05:50 +00002799 CPUKind getCPUKind(StringRef CPU) const {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002800 return llvm::StringSwitch<CPUKind>(CPU)
2801 .Case("i386", CK_i386)
2802 .Case("i486", CK_i486)
2803 .Case("winchip-c6", CK_WinChipC6)
2804 .Case("winchip2", CK_WinChip2)
2805 .Case("c3", CK_C3)
2806 .Case("i586", CK_i586)
2807 .Case("pentium", CK_Pentium)
2808 .Case("pentium-mmx", CK_PentiumMMX)
2809 .Case("i686", CK_i686)
2810 .Case("pentiumpro", CK_PentiumPro)
2811 .Case("pentium2", CK_Pentium2)
2812 .Case("pentium3", CK_Pentium3)
2813 .Case("pentium3m", CK_Pentium3M)
2814 .Case("pentium-m", CK_PentiumM)
2815 .Case("c3-2", CK_C3_2)
2816 .Case("yonah", CK_Yonah)
2817 .Case("pentium4", CK_Pentium4)
2818 .Case("pentium4m", CK_Pentium4M)
2819 .Case("prescott", CK_Prescott)
2820 .Case("nocona", CK_Nocona)
2821 .Case("core2", CK_Core2)
2822 .Case("penryn", CK_Penryn)
2823 .Case("bonnell", CK_Bonnell)
2824 .Case("atom", CK_Bonnell) // Legacy name.
2825 .Case("silvermont", CK_Silvermont)
2826 .Case("slm", CK_Silvermont) // Legacy name.
2827 .Case("nehalem", CK_Nehalem)
2828 .Case("corei7", CK_Nehalem) // Legacy name.
2829 .Case("westmere", CK_Westmere)
2830 .Case("sandybridge", CK_SandyBridge)
2831 .Case("corei7-avx", CK_SandyBridge) // Legacy name.
2832 .Case("ivybridge", CK_IvyBridge)
2833 .Case("core-avx-i", CK_IvyBridge) // Legacy name.
2834 .Case("haswell", CK_Haswell)
2835 .Case("core-avx2", CK_Haswell) // Legacy name.
2836 .Case("broadwell", CK_Broadwell)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002837 .Case("skylake", CK_SkylakeClient)
2838 .Case("skylake-avx512", CK_SkylakeServer)
2839 .Case("skx", CK_SkylakeServer) // Legacy name.
2840 .Case("cannonlake", CK_Cannonlake)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002841 .Case("knl", CK_KNL)
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002842 .Case("lakemont", CK_Lakemont)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002843 .Case("k6", CK_K6)
2844 .Case("k6-2", CK_K6_2)
2845 .Case("k6-3", CK_K6_3)
2846 .Case("athlon", CK_Athlon)
2847 .Case("athlon-tbird", CK_AthlonThunderbird)
2848 .Case("athlon-4", CK_Athlon4)
2849 .Case("athlon-xp", CK_AthlonXP)
2850 .Case("athlon-mp", CK_AthlonMP)
2851 .Case("athlon64", CK_Athlon64)
2852 .Case("athlon64-sse3", CK_Athlon64SSE3)
2853 .Case("athlon-fx", CK_AthlonFX)
2854 .Case("k8", CK_K8)
2855 .Case("k8-sse3", CK_K8SSE3)
2856 .Case("opteron", CK_Opteron)
2857 .Case("opteron-sse3", CK_OpteronSSE3)
2858 .Case("barcelona", CK_AMDFAM10)
2859 .Case("amdfam10", CK_AMDFAM10)
2860 .Case("btver1", CK_BTVER1)
2861 .Case("btver2", CK_BTVER2)
2862 .Case("bdver1", CK_BDVER1)
2863 .Case("bdver2", CK_BDVER2)
2864 .Case("bdver3", CK_BDVER3)
2865 .Case("bdver4", CK_BDVER4)
Craig Topperc45744a2017-01-10 06:02:12 +00002866 .Case("znver1", CK_ZNVER1)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002867 .Case("x86-64", CK_x86_64)
2868 .Case("geode", CK_Geode)
2869 .Default(CK_Generic);
2870 }
2871
Rafael Espindolaeb265472013-08-21 21:59:03 +00002872 enum FPMathKind {
2873 FP_Default,
2874 FP_SSE,
2875 FP_387
Craig Topper543f3bd2015-10-14 23:47:57 +00002876 } FPMath = FP_Default;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002877
Eli Friedman3fd920a2008-08-20 02:34:37 +00002878public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00002879 X86TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
2880 : TargetInfo(Triple) {
Stephan Bergmann17c7f702016-12-14 11:57:17 +00002881 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended();
Chris Lattner1f5ad112006-10-14 18:32:12 +00002882 }
Craig Topper3164f332014-03-11 03:39:26 +00002883 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00002884 // X87 evaluates with 80 bits "long double" precision.
2885 return SSELevel == NoSSE ? 2 : 0;
2886 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002887 ArrayRef<const char *> getGCCRegNames() const override {
2888 return llvm::makeArrayRef(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00002889 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002890 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
2891 return None;
Eric Christophercdd36352011-06-21 00:05:20 +00002892 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002893 ArrayRef<TargetInfo::AddlRegName> getGCCAddlRegNames() const override {
2894 return llvm::makeArrayRef(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00002895 }
Eric Christopherd9832702015-06-29 21:00:05 +00002896 bool validateCpuSupports(StringRef Name) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002897 bool validateAsmConstraint(const char *&Name,
Eric Christopher917e9522014-11-18 22:36:15 +00002898 TargetInfo::ConstraintInfo &info) const override;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002899
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00002900 bool validateGlobalRegisterVariable(StringRef RegName,
2901 unsigned RegSize,
2902 bool &HasSizeMismatch) const override {
2903 // esp and ebp are the only 32-bit registers the x86 backend can currently
2904 // handle.
2905 if (RegName.equals("esp") || RegName.equals("ebp")) {
2906 // Check that the register size is 32-bit.
2907 HasSizeMismatch = RegSize != 32;
2908 return true;
2909 }
2910
2911 return false;
2912 }
2913
Akira Hatanaka974131e2014-09-18 18:17:18 +00002914 bool validateOutputSize(StringRef Constraint, unsigned Size) const override;
2915
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002916 bool validateInputSize(StringRef Constraint, unsigned Size) const override;
2917
Akira Hatanaka974131e2014-09-18 18:17:18 +00002918 virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const;
2919
Craig Topper3164f332014-03-11 03:39:26 +00002920 std::string convertConstraint(const char *&Constraint) const override;
2921 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002922 return "~{dirflag},~{fpsr},~{flags}";
2923 }
Marina Yatsinac42fd032016-12-26 12:23:42 +00002924
2925 StringRef getConstraintRegister(const StringRef &Constraint,
2926 const StringRef &Expression) const override {
2927 StringRef::iterator I, E;
2928 for (I = Constraint.begin(), E = Constraint.end(); I != E; ++I) {
2929 if (isalpha(*I))
2930 break;
2931 }
2932 if (I == E)
2933 return "";
2934 switch (*I) {
2935 // For the register constraints, return the matching register name
2936 case 'a':
2937 return "ax";
2938 case 'b':
2939 return "bx";
2940 case 'c':
2941 return "cx";
2942 case 'd':
2943 return "dx";
2944 case 'S':
2945 return "si";
2946 case 'D':
2947 return "di";
2948 // In case the constraint is 'r' we need to return Expression
2949 case 'r':
2950 return Expression;
2951 default:
2952 // Default value if there is no constraint for the register
2953 return "";
2954 }
2955 return "";
2956 }
2957
Craig Topper3164f332014-03-11 03:39:26 +00002958 void getTargetDefines(const LangOptions &Opts,
2959 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00002960 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
2961 bool Enabled);
2962 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
2963 bool Enabled);
2964 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
2965 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002966 void setFeatureEnabled(llvm::StringMap<bool> &Features,
2967 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00002968 setFeatureEnabledImpl(Features, Name, Enabled);
2969 }
2970 // This exists purely to cut down on the number of virtual calls in
Eric Christopheref1e2952015-08-28 02:13:58 +00002971 // initFeatureMap which calls this repeatedly.
Craig Topper86d79ef2013-09-17 04:51:29 +00002972 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2973 StringRef Name, bool Enabled);
Eric Christopher8c47b422015-10-09 18:39:55 +00002974 bool
2975 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
2976 StringRef CPU,
2977 const std::vector<std::string> &FeaturesVec) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002978 bool hasFeature(StringRef Feature) const override;
2979 bool handleTargetFeatures(std::vector<std::string> &Features,
2980 DiagnosticsEngine &Diags) override;
Alp Toker4925ba72014-06-07 23:30:42 +00002981 StringRef getABI() const override {
Ahmed Bougacha0b938282015-06-22 21:31:43 +00002982 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX512F)
2983 return "avx512";
Craig Topperd945d502015-10-20 00:00:17 +00002984 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002985 return "avx";
Craig Topperd945d502015-10-20 00:00:17 +00002986 if (getTriple().getArch() == llvm::Triple::x86 &&
Derek Schuffc7dd7222012-10-11 15:52:22 +00002987 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002988 return "no-mmx";
2989 return "";
Eli Friedman33465822011-07-08 23:31:17 +00002990 }
Craig Topper3164f332014-03-11 03:39:26 +00002991 bool setCPU(const std::string &Name) override {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002992 CPU = getCPUKind(Name);
Chandler Carruth212334f2011-09-28 08:55:37 +00002993
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002994 // Perform any per-CPU checks necessary to determine if this CPU is
2995 // acceptable.
2996 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
2997 // invalid without explaining *why*.
2998 switch (CPU) {
2999 case CK_Generic:
3000 // No processor selected!
3001 return false;
3002
3003 case CK_i386:
3004 case CK_i486:
3005 case CK_WinChipC6:
3006 case CK_WinChip2:
3007 case CK_C3:
3008 case CK_i586:
3009 case CK_Pentium:
3010 case CK_PentiumMMX:
3011 case CK_i686:
3012 case CK_PentiumPro:
3013 case CK_Pentium2:
3014 case CK_Pentium3:
3015 case CK_Pentium3M:
3016 case CK_PentiumM:
3017 case CK_Yonah:
3018 case CK_C3_2:
3019 case CK_Pentium4:
3020 case CK_Pentium4M:
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003021 case CK_Lakemont:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00003022 case CK_Prescott:
3023 case CK_K6:
3024 case CK_K6_2:
3025 case CK_K6_3:
3026 case CK_Athlon:
3027 case CK_AthlonThunderbird:
3028 case CK_Athlon4:
3029 case CK_AthlonXP:
3030 case CK_AthlonMP:
3031 case CK_Geode:
3032 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00003033 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00003034 return false;
3035
3036 // Fallthrough
3037 case CK_Nocona:
3038 case CK_Core2:
3039 case CK_Penryn:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003040 case CK_Bonnell:
Preston Gurda3c58c02013-09-13 19:27:17 +00003041 case CK_Silvermont:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003042 case CK_Nehalem:
3043 case CK_Westmere:
3044 case CK_SandyBridge:
3045 case CK_IvyBridge:
3046 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00003047 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003048 case CK_SkylakeClient:
3049 case CK_SkylakeServer:
3050 case CK_Cannonlake:
Craig Topper449314e2013-08-20 07:09:39 +00003051 case CK_KNL:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00003052 case CK_Athlon64:
3053 case CK_Athlon64SSE3:
3054 case CK_AthlonFX:
3055 case CK_K8:
3056 case CK_K8SSE3:
3057 case CK_Opteron:
3058 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00003059 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00003060 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003061 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003062 case CK_BDVER1:
3063 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003064 case CK_BDVER3:
Benjamin Kramer56c58222014-05-02 15:47:51 +00003065 case CK_BDVER4:
Craig Topperc45744a2017-01-10 06:02:12 +00003066 case CK_ZNVER1:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00003067 case CK_x86_64:
3068 return true;
3069 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00003070 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003071 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003072
Craig Topper3164f332014-03-11 03:39:26 +00003073 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00003074
Craig Topper3164f332014-03-11 03:39:26 +00003075 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00003076 // Most of the non-ARM calling conventions are i386 conventions.
3077 switch (CC) {
3078 case CC_X86ThisCall:
3079 case CC_X86FastCall:
3080 case CC_X86StdCall:
3081 case CC_X86VectorCall:
Erich Keane757d3172016-11-02 18:29:35 +00003082 case CC_X86RegCall:
John McCall477f2bb2016-03-03 06:39:32 +00003083 case CC_C:
3084 case CC_Swift:
3085 case CC_X86Pascal:
3086 case CC_IntelOclBicc:
3087 return CCCR_OK;
3088 default:
3089 return CCCR_Warning;
3090 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003091 }
3092
Craig Topper3164f332014-03-11 03:39:26 +00003093 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00003094 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003095 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00003096
3097 bool hasSjLjLowering() const override {
3098 return true;
3099 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00003100
3101 void setSupportedOpenCLOpts() override {
Yaxun Liu5b746652016-12-18 05:18:55 +00003102 getSupportedOpenCLOpts().supportAll();
Yaxun Liu39cf40f2016-05-16 17:06:34 +00003103 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00003104};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00003105
Rafael Espindolaeb265472013-08-21 21:59:03 +00003106bool X86TargetInfo::setFPMath(StringRef Name) {
3107 if (Name == "387") {
3108 FPMath = FP_387;
3109 return true;
3110 }
3111 if (Name == "sse") {
3112 FPMath = FP_SSE;
3113 return true;
3114 }
3115 return false;
3116}
3117
Eric Christopher007b0a02015-08-28 22:32:01 +00003118bool X86TargetInfo::initFeatureMap(
3119 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
Eric Christopher8c47b422015-10-09 18:39:55 +00003120 const std::vector<std::string> &FeaturesVec) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003121 // FIXME: This *really* should not be here.
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003122 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00003123 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00003124 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003125
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003126 const CPUKind Kind = getCPUKind(CPU);
Andrey Turetskiy5f1cf5f2016-03-23 11:15:10 +00003127
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003128 // Enable X87 for all X86 processors but Lakemont.
3129 if (Kind != CK_Lakemont)
3130 setFeatureEnabledImpl(Features, "x87", true);
3131
3132 switch (Kind) {
Chandler Carruth212334f2011-09-28 08:55:37 +00003133 case CK_Generic:
3134 case CK_i386:
3135 case CK_i486:
3136 case CK_i586:
3137 case CK_Pentium:
3138 case CK_i686:
3139 case CK_PentiumPro:
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003140 case CK_Lakemont:
Chandler Carruth212334f2011-09-28 08:55:37 +00003141 break;
3142 case CK_PentiumMMX:
3143 case CK_Pentium2:
Craig Topperdb4dc082014-11-06 05:52:19 +00003144 case CK_K6:
3145 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00003146 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003147 break;
3148 case CK_Pentium3:
3149 case CK_Pentium3M:
Craig Topperdb4dc082014-11-06 05:52:19 +00003150 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00003151 setFeatureEnabledImpl(Features, "sse", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003152 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003153 break;
3154 case CK_PentiumM:
3155 case CK_Pentium4:
3156 case CK_Pentium4M:
3157 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00003158 setFeatureEnabledImpl(Features, "sse2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003159 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003160 break;
3161 case CK_Yonah:
3162 case CK_Prescott:
3163 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00003164 setFeatureEnabledImpl(Features, "sse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003165 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003166 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003167 break;
3168 case CK_Core2:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003169 case CK_Bonnell:
Craig Topper86d79ef2013-09-17 04:51:29 +00003170 setFeatureEnabledImpl(Features, "ssse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003171 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003172 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003173 break;
3174 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00003175 setFeatureEnabledImpl(Features, "sse4.1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003176 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003177 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003178 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003179 case CK_Cannonlake:
3180 setFeatureEnabledImpl(Features, "avx512ifma", true);
3181 setFeatureEnabledImpl(Features, "avx512vbmi", true);
3182 setFeatureEnabledImpl(Features, "sha", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003183 LLVM_FALLTHROUGH;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003184 case CK_SkylakeServer:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003185 setFeatureEnabledImpl(Features, "avx512f", true);
3186 setFeatureEnabledImpl(Features, "avx512cd", true);
3187 setFeatureEnabledImpl(Features, "avx512dq", true);
3188 setFeatureEnabledImpl(Features, "avx512bw", true);
3189 setFeatureEnabledImpl(Features, "avx512vl", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003190 setFeatureEnabledImpl(Features, "pku", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003191 setFeatureEnabledImpl(Features, "clwb", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003192 LLVM_FALLTHROUGH;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003193 case CK_SkylakeClient:
Craig Topperda9fe562015-10-15 05:23:38 +00003194 setFeatureEnabledImpl(Features, "xsavec", true);
3195 setFeatureEnabledImpl(Features, "xsaves", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003196 setFeatureEnabledImpl(Features, "mpx", true);
3197 setFeatureEnabledImpl(Features, "sgx", true);
3198 setFeatureEnabledImpl(Features, "clflushopt", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003199 LLVM_FALLTHROUGH;
Craig Topperdb4dc082014-11-06 05:52:19 +00003200 case CK_Broadwell:
3201 setFeatureEnabledImpl(Features, "rdseed", true);
3202 setFeatureEnabledImpl(Features, "adx", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003203 LLVM_FALLTHROUGH;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003204 case CK_Haswell:
Craig Topperdb4dc082014-11-06 05:52:19 +00003205 setFeatureEnabledImpl(Features, "avx2", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003206 setFeatureEnabledImpl(Features, "lzcnt", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003207 setFeatureEnabledImpl(Features, "bmi", true);
3208 setFeatureEnabledImpl(Features, "bmi2", true);
3209 setFeatureEnabledImpl(Features, "rtm", true);
3210 setFeatureEnabledImpl(Features, "fma", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003211 setFeatureEnabledImpl(Features, "movbe", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003212 LLVM_FALLTHROUGH;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003213 case CK_IvyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00003214 setFeatureEnabledImpl(Features, "rdrnd", true);
3215 setFeatureEnabledImpl(Features, "f16c", true);
3216 setFeatureEnabledImpl(Features, "fsgsbase", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003217 LLVM_FALLTHROUGH;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003218 case CK_SandyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00003219 setFeatureEnabledImpl(Features, "avx", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003220 setFeatureEnabledImpl(Features, "xsave", true);
3221 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003222 LLVM_FALLTHROUGH;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003223 case CK_Westmere:
Craig Topperdb4dc082014-11-06 05:52:19 +00003224 case CK_Silvermont:
3225 setFeatureEnabledImpl(Features, "aes", true);
3226 setFeatureEnabledImpl(Features, "pclmul", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003227 LLVM_FALLTHROUGH;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003228 case CK_Nehalem:
Craig Topperdb4dc082014-11-06 05:52:19 +00003229 setFeatureEnabledImpl(Features, "sse4.2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003230 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00003231 setFeatureEnabledImpl(Features, "cx16", true);
3232 break;
3233 case CK_KNL:
3234 setFeatureEnabledImpl(Features, "avx512f", true);
3235 setFeatureEnabledImpl(Features, "avx512cd", true);
3236 setFeatureEnabledImpl(Features, "avx512er", true);
3237 setFeatureEnabledImpl(Features, "avx512pf", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003238 setFeatureEnabledImpl(Features, "prefetchwt1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003239 setFeatureEnabledImpl(Features, "fxsr", true);
Robert Khasanov50e6f582014-09-19 09:53:48 +00003240 setFeatureEnabledImpl(Features, "rdseed", true);
3241 setFeatureEnabledImpl(Features, "adx", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00003242 setFeatureEnabledImpl(Features, "lzcnt", true);
3243 setFeatureEnabledImpl(Features, "bmi", true);
3244 setFeatureEnabledImpl(Features, "bmi2", true);
3245 setFeatureEnabledImpl(Features, "rtm", true);
3246 setFeatureEnabledImpl(Features, "fma", true);
3247 setFeatureEnabledImpl(Features, "rdrnd", true);
3248 setFeatureEnabledImpl(Features, "f16c", true);
3249 setFeatureEnabledImpl(Features, "fsgsbase", true);
3250 setFeatureEnabledImpl(Features, "aes", true);
3251 setFeatureEnabledImpl(Features, "pclmul", true);
3252 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003253 setFeatureEnabledImpl(Features, "xsaveopt", true);
3254 setFeatureEnabledImpl(Features, "xsave", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003255 setFeatureEnabledImpl(Features, "movbe", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003256 break;
3257 case CK_K6_2:
3258 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00003259 case CK_WinChip2:
3260 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00003261 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003262 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00003263 case CK_Athlon:
3264 case CK_AthlonThunderbird:
3265 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00003266 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00003267 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003268 case CK_Athlon4:
3269 case CK_AthlonXP:
3270 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00003271 setFeatureEnabledImpl(Features, "sse", true);
3272 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003273 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003274 break;
3275 case CK_K8:
3276 case CK_Opteron:
3277 case CK_Athlon64:
3278 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00003279 setFeatureEnabledImpl(Features, "sse2", true);
3280 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003281 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003282 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00003283 case CK_AMDFAM10:
3284 setFeatureEnabledImpl(Features, "sse4a", true);
3285 setFeatureEnabledImpl(Features, "lzcnt", true);
3286 setFeatureEnabledImpl(Features, "popcnt", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003287 LLVM_FALLTHROUGH;
Chandler Carruth212334f2011-09-28 08:55:37 +00003288 case CK_K8SSE3:
3289 case CK_OpteronSSE3:
3290 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00003291 setFeatureEnabledImpl(Features, "sse3", true);
3292 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003293 setFeatureEnabledImpl(Features, "fxsr", true);
Roman Divackyce253d82011-10-30 13:47:56 +00003294 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00003295 case CK_BTVER2:
3296 setFeatureEnabledImpl(Features, "avx", true);
3297 setFeatureEnabledImpl(Features, "aes", true);
3298 setFeatureEnabledImpl(Features, "pclmul", true);
3299 setFeatureEnabledImpl(Features, "bmi", true);
3300 setFeatureEnabledImpl(Features, "f16c", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003301 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003302 LLVM_FALLTHROUGH;
Benjamin Kramer569f2152012-01-10 11:50:18 +00003303 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00003304 setFeatureEnabledImpl(Features, "ssse3", true);
3305 setFeatureEnabledImpl(Features, "sse4a", true);
3306 setFeatureEnabledImpl(Features, "lzcnt", true);
3307 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00003308 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003309 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003310 setFeatureEnabledImpl(Features, "fxsr", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003311 break;
Craig Topperc45744a2017-01-10 06:02:12 +00003312 case CK_ZNVER1:
3313 setFeatureEnabledImpl(Features, "adx", true);
3314 setFeatureEnabledImpl(Features, "aes", true);
3315 setFeatureEnabledImpl(Features, "avx2", true);
3316 setFeatureEnabledImpl(Features, "bmi", true);
3317 setFeatureEnabledImpl(Features, "bmi2", true);
3318 setFeatureEnabledImpl(Features, "clflushopt", true);
Craig Topper45742262017-02-09 06:10:14 +00003319 setFeatureEnabledImpl(Features, "clzero", true);
Craig Topperc45744a2017-01-10 06:02:12 +00003320 setFeatureEnabledImpl(Features, "cx16", true);
3321 setFeatureEnabledImpl(Features, "f16c", true);
3322 setFeatureEnabledImpl(Features, "fma", true);
3323 setFeatureEnabledImpl(Features, "fsgsbase", true);
3324 setFeatureEnabledImpl(Features, "fxsr", true);
3325 setFeatureEnabledImpl(Features, "lzcnt", true);
3326 setFeatureEnabledImpl(Features, "mwaitx", true);
3327 setFeatureEnabledImpl(Features, "movbe", true);
3328 setFeatureEnabledImpl(Features, "pclmul", true);
3329 setFeatureEnabledImpl(Features, "popcnt", true);
3330 setFeatureEnabledImpl(Features, "prfchw", true);
3331 setFeatureEnabledImpl(Features, "rdrnd", true);
3332 setFeatureEnabledImpl(Features, "rdseed", true);
3333 setFeatureEnabledImpl(Features, "sha", true);
3334 setFeatureEnabledImpl(Features, "sse4a", true);
3335 setFeatureEnabledImpl(Features, "xsave", true);
3336 setFeatureEnabledImpl(Features, "xsavec", true);
3337 setFeatureEnabledImpl(Features, "xsaveopt", true);
3338 setFeatureEnabledImpl(Features, "xsaves", true);
3339 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003340 case CK_BDVER4:
3341 setFeatureEnabledImpl(Features, "avx2", true);
3342 setFeatureEnabledImpl(Features, "bmi2", true);
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003343 setFeatureEnabledImpl(Features, "mwaitx", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003344 LLVM_FALLTHROUGH;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003345 case CK_BDVER3:
Craig Topper8c7f2512014-11-03 06:51:41 +00003346 setFeatureEnabledImpl(Features, "fsgsbase", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003347 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003348 LLVM_FALLTHROUGH;
Craig Topper8c7f2512014-11-03 06:51:41 +00003349 case CK_BDVER2:
Andrea Di Biagio9760a442014-11-06 12:08:57 +00003350 setFeatureEnabledImpl(Features, "bmi", true);
3351 setFeatureEnabledImpl(Features, "fma", true);
3352 setFeatureEnabledImpl(Features, "f16c", true);
3353 setFeatureEnabledImpl(Features, "tbm", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003354 LLVM_FALLTHROUGH;
Andrea Di Biagio9760a442014-11-06 12:08:57 +00003355 case CK_BDVER1:
3356 // xop implies avx, sse4a and fma4.
Craig Topper86d79ef2013-09-17 04:51:29 +00003357 setFeatureEnabledImpl(Features, "xop", true);
3358 setFeatureEnabledImpl(Features, "lzcnt", true);
3359 setFeatureEnabledImpl(Features, "aes", true);
3360 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00003361 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003362 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003363 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003364 setFeatureEnabledImpl(Features, "xsave", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003365 break;
Eli Friedman33465822011-07-08 23:31:17 +00003366 }
Eric Christopherbbd746d2015-10-08 20:10:14 +00003367 if (!TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec))
3368 return false;
3369
3370 // Can't do this earlier because we need to be able to explicitly enable
3371 // or disable these features and the things that they depend upon.
3372
3373 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
3374 auto I = Features.find("sse4.2");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003375 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00003376 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-popcnt") ==
3377 FeaturesVec.end())
3378 Features["popcnt"] = true;
3379
3380 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
3381 I = Features.find("3dnow");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003382 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00003383 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-prfchw") ==
3384 FeaturesVec.end())
3385 Features["prfchw"] = true;
3386
Eric Christophera7260af2015-10-08 20:10:18 +00003387 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
3388 // then enable MMX.
3389 I = Features.find("sse");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003390 if (I != Features.end() && I->getValue() &&
Eric Christophera7260af2015-10-08 20:10:18 +00003391 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-mmx") ==
3392 FeaturesVec.end())
3393 Features["mmx"] = true;
3394
Eric Christopherbbd746d2015-10-08 20:10:14 +00003395 return true;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003396}
3397
Rafael Espindolae62e2792013-08-20 13:44:29 +00003398void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00003399 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003400 if (Enabled) {
3401 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003402 case AVX512F:
3403 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003404 case AVX2:
3405 Features["avx2"] = true;
3406 case AVX:
3407 Features["avx"] = true;
Craig Topperda9fe562015-10-15 05:23:38 +00003408 Features["xsave"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003409 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00003410 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003411 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00003412 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003413 case SSSE3:
3414 Features["ssse3"] = true;
3415 case SSE3:
3416 Features["sse3"] = true;
3417 case SSE2:
3418 Features["sse2"] = true;
3419 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00003420 Features["sse"] = true;
3421 case NoSSE:
3422 break;
3423 }
3424 return;
3425 }
3426
3427 switch (Level) {
3428 case NoSSE:
3429 case SSE1:
3430 Features["sse"] = false;
3431 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00003432 Features["sse2"] = Features["pclmul"] = Features["aes"] =
3433 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003434 case SSE3:
3435 Features["sse3"] = false;
3436 setXOPLevel(Features, NoXOP, false);
3437 case SSSE3:
3438 Features["ssse3"] = false;
3439 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00003440 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003441 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00003442 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003443 case AVX:
Craig Topperda9fe562015-10-15 05:23:38 +00003444 Features["fma"] = Features["avx"] = Features["f16c"] = Features["xsave"] =
3445 Features["xsaveopt"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00003446 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003447 case AVX2:
3448 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00003449 case AVX512F:
Eric Christopher917e9522014-11-18 22:36:15 +00003450 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
Craig Toppera31a5da2014-12-27 06:59:37 +00003451 Features["avx512pf"] = Features["avx512dq"] = Features["avx512bw"] =
Craig Topperb4f83a02016-02-29 06:51:38 +00003452 Features["avx512vl"] = Features["avx512vbmi"] =
3453 Features["avx512ifma"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003454 }
3455}
3456
3457void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00003458 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003459 if (Enabled) {
3460 switch (Level) {
3461 case AMD3DNowAthlon:
3462 Features["3dnowa"] = true;
3463 case AMD3DNow:
3464 Features["3dnow"] = true;
3465 case MMX:
3466 Features["mmx"] = true;
3467 case NoMMX3DNow:
3468 break;
3469 }
3470 return;
3471 }
3472
3473 switch (Level) {
3474 case NoMMX3DNow:
3475 case MMX:
3476 Features["mmx"] = false;
3477 case AMD3DNow:
3478 Features["3dnow"] = false;
3479 case AMD3DNowAthlon:
3480 Features["3dnowa"] = false;
3481 }
3482}
3483
3484void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00003485 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003486 if (Enabled) {
3487 switch (Level) {
3488 case XOP:
3489 Features["xop"] = true;
3490 case FMA4:
3491 Features["fma4"] = true;
3492 setSSELevel(Features, AVX, true);
3493 case SSE4A:
3494 Features["sse4a"] = true;
3495 setSSELevel(Features, SSE3, true);
3496 case NoXOP:
3497 break;
3498 }
3499 return;
3500 }
3501
3502 switch (Level) {
3503 case NoXOP:
3504 case SSE4A:
3505 Features["sse4a"] = false;
3506 case FMA4:
3507 Features["fma4"] = false;
3508 case XOP:
3509 Features["xop"] = false;
3510 }
3511}
3512
Craig Topper86d79ef2013-09-17 04:51:29 +00003513void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
3514 StringRef Name, bool Enabled) {
Eric Christopher298ac302015-07-01 00:08:32 +00003515 // This is a bit of a hack to deal with the sse4 target feature when used
3516 // as part of the target attribute. We handle sse4 correctly everywhere
3517 // else. See below for more information on how we handle the sse4 options.
3518 if (Name != "sse4")
3519 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00003520
Craig Topper29561122013-09-19 01:13:07 +00003521 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003522 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003523 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003524 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003525 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003526 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003527 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003528 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003529 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003530 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003531 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003532 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003533 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003534 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003535 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003536 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003537 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003538 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003539 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003540 if (Enabled)
3541 setSSELevel(Features, SSE2, Enabled);
3542 } else if (Name == "pclmul") {
3543 if (Enabled)
3544 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003545 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003546 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003547 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003548 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003549 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003550 setSSELevel(Features, AVX512F, Enabled);
Craig Topperb4f83a02016-02-29 06:51:38 +00003551 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf" ||
3552 Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl" ||
3553 Name == "avx512vbmi" || Name == "avx512ifma") {
Craig Topper679b53a2013-08-21 05:29:10 +00003554 if (Enabled)
3555 setSSELevel(Features, AVX512F, Enabled);
Craig Topper6c7ecc52016-11-09 04:51:03 +00003556 // Enable BWI instruction if VBMI is being enabled.
3557 if (Name == "avx512vbmi" && Enabled)
3558 Features["avx512bw"] = true;
3559 // Also disable VBMI if BWI is being disabled.
3560 if (Name == "avx512bw" && !Enabled)
3561 Features["avx512vbmi"] = false;
Craig Topper679b53a2013-08-21 05:29:10 +00003562 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003563 if (Enabled)
3564 setSSELevel(Features, AVX, Enabled);
3565 } else if (Name == "fma4") {
3566 setXOPLevel(Features, FMA4, Enabled);
3567 } else if (Name == "xop") {
3568 setXOPLevel(Features, XOP, Enabled);
3569 } else if (Name == "sse4a") {
3570 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00003571 } else if (Name == "f16c") {
3572 if (Enabled)
3573 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00003574 } else if (Name == "sha") {
3575 if (Enabled)
3576 setSSELevel(Features, SSE2, Enabled);
Eric Christopher298ac302015-07-01 00:08:32 +00003577 } else if (Name == "sse4") {
3578 // We can get here via the __target__ attribute since that's not controlled
3579 // via the -msse4/-mno-sse4 command line alias. Handle this the same way
3580 // here - turn on the sse4.2 if enabled, turn off the sse4.1 level if
3581 // disabled.
3582 if (Enabled)
3583 setSSELevel(Features, SSE42, Enabled);
3584 else
3585 setSSELevel(Features, SSE41, Enabled);
Craig Topperda9fe562015-10-15 05:23:38 +00003586 } else if (Name == "xsave") {
Craig Topper840927e2016-02-29 06:51:34 +00003587 if (!Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003588 Features["xsaveopt"] = false;
3589 } else if (Name == "xsaveopt" || Name == "xsavec" || Name == "xsaves") {
Craig Topper840927e2016-02-29 06:51:34 +00003590 if (Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003591 Features["xsave"] = true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003592 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003593}
3594
Eric Christopher3ff21b32013-10-16 21:26:26 +00003595/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003596/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00003597bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00003598 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00003599 for (const auto &Feature : Features) {
3600 if (Feature[0] != '+')
Daniel Dunbar979586e2009-11-11 09:38:56 +00003601 continue;
3602
Eric Christopher610fe112015-08-26 08:21:55 +00003603 if (Feature == "+aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00003604 HasAES = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003605 } else if (Feature == "+pclmul") {
Craig Topper3f122a72012-05-31 05:18:48 +00003606 HasPCLMUL = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003607 } else if (Feature == "+lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00003608 HasLZCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003609 } else if (Feature == "+rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00003610 HasRDRND = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003611 } else if (Feature == "+fsgsbase") {
Craig Topper8c7f2512014-11-03 06:51:41 +00003612 HasFSGSBASE = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003613 } else if (Feature == "+bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00003614 HasBMI = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003615 } else if (Feature == "+bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00003616 HasBMI2 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003617 } else if (Feature == "+popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00003618 HasPOPCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003619 } else if (Feature == "+rtm") {
Michael Liao625a8752012-11-10 05:17:46 +00003620 HasRTM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003621 } else if (Feature == "+prfchw") {
Michael Liao74f4eaf2013-03-26 17:52:08 +00003622 HasPRFCHW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003623 } else if (Feature == "+rdseed") {
Michael Liaoffaae352013-03-29 05:17:55 +00003624 HasRDSEED = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003625 } else if (Feature == "+adx") {
Robert Khasanov50e6f582014-09-19 09:53:48 +00003626 HasADX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003627 } else if (Feature == "+tbm") {
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003628 HasTBM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003629 } else if (Feature == "+fma") {
Craig Topperbba778b2012-06-03 21:46:30 +00003630 HasFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003631 } else if (Feature == "+f16c") {
Manman Rena45358c2012-10-11 00:59:55 +00003632 HasF16C = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003633 } else if (Feature == "+avx512cd") {
Craig Topper679b53a2013-08-21 05:29:10 +00003634 HasAVX512CD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003635 } else if (Feature == "+avx512er") {
Craig Topper679b53a2013-08-21 05:29:10 +00003636 HasAVX512ER = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003637 } else if (Feature == "+avx512pf") {
Craig Topper679b53a2013-08-21 05:29:10 +00003638 HasAVX512PF = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003639 } else if (Feature == "+avx512dq") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003640 HasAVX512DQ = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003641 } else if (Feature == "+avx512bw") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003642 HasAVX512BW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003643 } else if (Feature == "+avx512vl") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003644 HasAVX512VL = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003645 } else if (Feature == "+avx512vbmi") {
3646 HasAVX512VBMI = true;
3647 } else if (Feature == "+avx512ifma") {
3648 HasAVX512IFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003649 } else if (Feature == "+sha") {
Ben Langmuir58078d02013-09-19 13:22:04 +00003650 HasSHA = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003651 } else if (Feature == "+mpx") {
3652 HasMPX = true;
3653 } else if (Feature == "+movbe") {
3654 HasMOVBE = true;
3655 } else if (Feature == "+sgx") {
3656 HasSGX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003657 } else if (Feature == "+cx16") {
Nick Lewycky50e8f482013-10-05 20:14:27 +00003658 HasCX16 = true;
Craig Toppere33f51f2015-10-16 06:22:36 +00003659 } else if (Feature == "+fxsr") {
3660 HasFXSR = true;
Craig Topperda9fe562015-10-15 05:23:38 +00003661 } else if (Feature == "+xsave") {
3662 HasXSAVE = true;
3663 } else if (Feature == "+xsaveopt") {
3664 HasXSAVEOPT = true;
3665 } else if (Feature == "+xsavec") {
3666 HasXSAVEC = true;
3667 } else if (Feature == "+xsaves") {
3668 HasXSAVES = true;
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003669 } else if (Feature == "+mwaitx") {
3670 HasMWAITX = true;
Asaf Badouha9d1e182015-12-31 14:14:07 +00003671 } else if (Feature == "+pku") {
3672 HasPKU = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003673 } else if (Feature == "+clflushopt") {
3674 HasCLFLUSHOPT = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003675 } else if (Feature == "+clwb") {
3676 HasCLWB = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003677 } else if (Feature == "+prefetchwt1") {
3678 HasPREFETCHWT1 = true;
Craig Topper45742262017-02-09 06:10:14 +00003679 } else if (Feature == "+clzero") {
3680 HasCLZERO = true;
Nick Lewycky50e8f482013-10-05 20:14:27 +00003681 }
3682
Benjamin Kramer27402c62012-03-05 15:10:44 +00003683 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003684 .Case("+avx512f", AVX512F)
3685 .Case("+avx2", AVX2)
3686 .Case("+avx", AVX)
3687 .Case("+sse4.2", SSE42)
3688 .Case("+sse4.1", SSE41)
3689 .Case("+ssse3", SSSE3)
3690 .Case("+sse3", SSE3)
3691 .Case("+sse2", SSE2)
3692 .Case("+sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00003693 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003694 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003695
Eli Friedman33465822011-07-08 23:31:17 +00003696 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00003697 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003698 .Case("+3dnowa", AMD3DNowAthlon)
3699 .Case("+3dnow", AMD3DNow)
3700 .Case("+mmx", MMX)
Eli Friedman33465822011-07-08 23:31:17 +00003701 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00003702 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003703
3704 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003705 .Case("+xop", XOP)
3706 .Case("+fma4", FMA4)
3707 .Case("+sse4a", SSE4A)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003708 .Default(NoXOP);
3709 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003710 }
Eli Friedman33465822011-07-08 23:31:17 +00003711
Rafael Espindolaeb265472013-08-21 21:59:03 +00003712 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
3713 // matches the selected sse level.
Craig Topperd945d502015-10-20 00:00:17 +00003714 if ((FPMath == FP_SSE && SSELevel < SSE1) ||
3715 (FPMath == FP_387 && SSELevel >= SSE1)) {
3716 Diags.Report(diag::err_target_unsupported_fpmath) <<
3717 (FPMath == FP_SSE ? "sse" : "387");
Rafael Espindolaeb265472013-08-21 21:59:03 +00003718 return false;
3719 }
3720
Alexey Bataev00396512015-07-02 03:40:19 +00003721 SimdDefaultAlign =
Ahmed Bougacha68bf64e2015-08-27 22:24:56 +00003722 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Rafael Espindolaeb265472013-08-21 21:59:03 +00003723 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00003724}
Chris Lattnerecd49032009-03-02 22:27:17 +00003725
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003726/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
3727/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00003728void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003729 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00003730 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00003731 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003732 Builder.defineMacro("__amd64__");
3733 Builder.defineMacro("__amd64");
3734 Builder.defineMacro("__x86_64");
3735 Builder.defineMacro("__x86_64__");
Bob Wilsona2acb1e2014-08-08 23:46:28 +00003736 if (getTriple().getArchName() == "x86_64h") {
3737 Builder.defineMacro("__x86_64h");
3738 Builder.defineMacro("__x86_64h__");
3739 }
Chris Lattnerecd49032009-03-02 22:27:17 +00003740 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003741 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00003742 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003743
Chris Lattnerecd49032009-03-02 22:27:17 +00003744 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003745 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
3746 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00003747 switch (CPU) {
3748 case CK_Generic:
3749 break;
3750 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003751 // The rest are coming from the i386 define above.
3752 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003753 break;
3754 case CK_i486:
3755 case CK_WinChipC6:
3756 case CK_WinChip2:
3757 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003758 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00003759 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003760 case CK_PentiumMMX:
3761 Builder.defineMacro("__pentium_mmx__");
3762 Builder.defineMacro("__tune_pentium_mmx__");
3763 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003764 case CK_i586:
3765 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003766 defineCPUMacros(Builder, "i586");
3767 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00003768 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003769 case CK_Pentium3:
3770 case CK_Pentium3M:
3771 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003772 Builder.defineMacro("__tune_pentium3__");
3773 // Fallthrough
3774 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00003775 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003776 Builder.defineMacro("__tune_pentium2__");
3777 // Fallthrough
3778 case CK_PentiumPro:
3779 Builder.defineMacro("__tune_i686__");
3780 Builder.defineMacro("__tune_pentiumpro__");
3781 // Fallthrough
3782 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003783 Builder.defineMacro("__i686");
3784 Builder.defineMacro("__i686__");
3785 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
3786 Builder.defineMacro("__pentiumpro");
3787 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003788 break;
3789 case CK_Pentium4:
3790 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003791 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00003792 break;
3793 case CK_Yonah:
3794 case CK_Prescott:
3795 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003796 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00003797 break;
3798 case CK_Core2:
3799 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003800 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00003801 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003802 case CK_Bonnell:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003803 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00003804 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00003805 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00003806 defineCPUMacros(Builder, "slm");
3807 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003808 case CK_Nehalem:
3809 case CK_Westmere:
3810 case CK_SandyBridge:
3811 case CK_IvyBridge:
3812 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00003813 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003814 case CK_SkylakeClient:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003815 // FIXME: Historically, we defined this legacy name, it would be nice to
3816 // remove it at some point. We've never exposed fine-grained names for
3817 // recent primary x86 CPUs, and we should keep it that way.
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003818 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00003819 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003820 case CK_SkylakeServer:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003821 defineCPUMacros(Builder, "skx");
3822 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003823 case CK_Cannonlake:
3824 break;
Craig Topper449314e2013-08-20 07:09:39 +00003825 case CK_KNL:
3826 defineCPUMacros(Builder, "knl");
3827 break;
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003828 case CK_Lakemont:
3829 Builder.defineMacro("__tune_lakemont__");
3830 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003831 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003832 Builder.defineMacro("__k6_2__");
3833 Builder.defineMacro("__tune_k6_2__");
3834 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003835 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003836 if (CPU != CK_K6_2) { // In case of fallthrough
3837 // FIXME: GCC may be enabling these in cases where some other k6
3838 // architecture is specified but -m3dnow is explicitly provided. The
3839 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003840 Builder.defineMacro("__k6_3__");
3841 Builder.defineMacro("__tune_k6_3__");
3842 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003843 // Fallthrough
3844 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003845 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00003846 break;
3847 case CK_Athlon:
3848 case CK_AthlonThunderbird:
3849 case CK_Athlon4:
3850 case CK_AthlonXP:
3851 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003852 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003853 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003854 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003855 Builder.defineMacro("__tune_athlon_sse__");
3856 }
Chandler Carruth212334f2011-09-28 08:55:37 +00003857 break;
3858 case CK_K8:
3859 case CK_K8SSE3:
3860 case CK_x86_64:
3861 case CK_Opteron:
3862 case CK_OpteronSSE3:
3863 case CK_Athlon64:
3864 case CK_Athlon64SSE3:
3865 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003866 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00003867 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00003868 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003869 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00003870 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00003871 case CK_BTVER1:
3872 defineCPUMacros(Builder, "btver1");
3873 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003874 case CK_BTVER2:
3875 defineCPUMacros(Builder, "btver2");
3876 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003877 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003878 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003879 break;
3880 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003881 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003882 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003883 case CK_BDVER3:
3884 defineCPUMacros(Builder, "bdver3");
3885 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003886 case CK_BDVER4:
3887 defineCPUMacros(Builder, "bdver4");
3888 break;
Craig Topperc45744a2017-01-10 06:02:12 +00003889 case CK_ZNVER1:
3890 defineCPUMacros(Builder, "znver1");
3891 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003892 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003893 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00003894 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003895 }
Chris Lattner96e43572009-03-02 22:40:39 +00003896
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003897 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003898 Builder.defineMacro("__REGISTER_PREFIX__", "");
3899
Chris Lattner6df41af2009-04-19 17:32:33 +00003900 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
3901 // functions in glibc header files that use FP Stack inline asm which the
3902 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003903 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003904
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003905 if (HasAES)
3906 Builder.defineMacro("__AES__");
3907
Craig Topper3f122a72012-05-31 05:18:48 +00003908 if (HasPCLMUL)
3909 Builder.defineMacro("__PCLMUL__");
3910
Craig Topper22967d42011-12-25 05:06:45 +00003911 if (HasLZCNT)
3912 Builder.defineMacro("__LZCNT__");
3913
Benjamin Kramer1e250392012-07-07 09:39:18 +00003914 if (HasRDRND)
3915 Builder.defineMacro("__RDRND__");
3916
Craig Topper8c7f2512014-11-03 06:51:41 +00003917 if (HasFSGSBASE)
3918 Builder.defineMacro("__FSGSBASE__");
3919
Craig Topper22967d42011-12-25 05:06:45 +00003920 if (HasBMI)
3921 Builder.defineMacro("__BMI__");
3922
3923 if (HasBMI2)
3924 Builder.defineMacro("__BMI2__");
3925
Craig Topper1de83482011-12-29 16:10:46 +00003926 if (HasPOPCNT)
3927 Builder.defineMacro("__POPCNT__");
3928
Michael Liao625a8752012-11-10 05:17:46 +00003929 if (HasRTM)
3930 Builder.defineMacro("__RTM__");
3931
Michael Liao74f4eaf2013-03-26 17:52:08 +00003932 if (HasPRFCHW)
3933 Builder.defineMacro("__PRFCHW__");
3934
Michael Liaoffaae352013-03-29 05:17:55 +00003935 if (HasRDSEED)
3936 Builder.defineMacro("__RDSEED__");
3937
Robert Khasanov50e6f582014-09-19 09:53:48 +00003938 if (HasADX)
3939 Builder.defineMacro("__ADX__");
3940
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003941 if (HasTBM)
3942 Builder.defineMacro("__TBM__");
3943
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003944 if (HasMWAITX)
3945 Builder.defineMacro("__MWAITX__");
3946
Rafael Espindolae62e2792013-08-20 13:44:29 +00003947 switch (XOPLevel) {
3948 case XOP:
3949 Builder.defineMacro("__XOP__");
3950 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00003951 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00003952 case SSE4A:
3953 Builder.defineMacro("__SSE4A__");
3954 case NoXOP:
3955 break;
3956 }
Craig Topperffdb46c2011-12-30 07:33:42 +00003957
Craig Topperbba778b2012-06-03 21:46:30 +00003958 if (HasFMA)
3959 Builder.defineMacro("__FMA__");
3960
Manman Rena45358c2012-10-11 00:59:55 +00003961 if (HasF16C)
3962 Builder.defineMacro("__F16C__");
3963
Craig Topper679b53a2013-08-21 05:29:10 +00003964 if (HasAVX512CD)
3965 Builder.defineMacro("__AVX512CD__");
3966 if (HasAVX512ER)
3967 Builder.defineMacro("__AVX512ER__");
3968 if (HasAVX512PF)
3969 Builder.defineMacro("__AVX512PF__");
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003970 if (HasAVX512DQ)
3971 Builder.defineMacro("__AVX512DQ__");
3972 if (HasAVX512BW)
3973 Builder.defineMacro("__AVX512BW__");
3974 if (HasAVX512VL)
3975 Builder.defineMacro("__AVX512VL__");
Craig Topperb4f83a02016-02-29 06:51:38 +00003976 if (HasAVX512VBMI)
3977 Builder.defineMacro("__AVX512VBMI__");
3978 if (HasAVX512IFMA)
3979 Builder.defineMacro("__AVX512IFMA__");
Craig Topper679b53a2013-08-21 05:29:10 +00003980
Ben Langmuir58078d02013-09-19 13:22:04 +00003981 if (HasSHA)
3982 Builder.defineMacro("__SHA__");
3983
Craig Toppere33f51f2015-10-16 06:22:36 +00003984 if (HasFXSR)
3985 Builder.defineMacro("__FXSR__");
Craig Topperda9fe562015-10-15 05:23:38 +00003986 if (HasXSAVE)
3987 Builder.defineMacro("__XSAVE__");
3988 if (HasXSAVEOPT)
3989 Builder.defineMacro("__XSAVEOPT__");
3990 if (HasXSAVEC)
3991 Builder.defineMacro("__XSAVEC__");
3992 if (HasXSAVES)
3993 Builder.defineMacro("__XSAVES__");
Asaf Badouha9d1e182015-12-31 14:14:07 +00003994 if (HasPKU)
3995 Builder.defineMacro("__PKU__");
Nick Lewycky50e8f482013-10-05 20:14:27 +00003996 if (HasCX16)
3997 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
Craig Topper78b47872017-02-08 06:48:58 +00003998 if (HasCLFLUSHOPT)
3999 Builder.defineMacro("__CLFLUSHOPT__");
Craig Topper8c708cf2017-02-08 07:36:58 +00004000 if (HasCLWB)
4001 Builder.defineMacro("__CLWB__");
Craig Topperb16cb822017-02-08 07:56:42 +00004002 if (HasMPX)
4003 Builder.defineMacro("__MPX__");
Craig Topper204ecff2017-02-08 08:23:17 +00004004 if (HasSGX)
4005 Builder.defineMacro("__SGX__");
Craig Topperd2bf7b02017-02-08 08:23:40 +00004006 if (HasPREFETCHWT1)
4007 Builder.defineMacro("__PREFETCHWT1__");
Craig Topper45742262017-02-09 06:10:14 +00004008 if (HasCLZERO)
4009 Builder.defineMacro("__CLZERO__");
Nick Lewycky50e8f482013-10-05 20:14:27 +00004010
Chris Lattner96e43572009-03-02 22:40:39 +00004011 // Each case falls through to the previous one here.
4012 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00004013 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00004014 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00004015 case AVX2:
4016 Builder.defineMacro("__AVX2__");
4017 case AVX:
4018 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00004019 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004020 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00004021 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004022 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00004023 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004024 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00004025 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004026 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00004027 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004028 Builder.defineMacro("__SSE2__");
4029 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00004030 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004031 Builder.defineMacro("__SSE__");
4032 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00004033 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00004034 break;
4035 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004036
Derek Schuffc7dd7222012-10-11 15:52:22 +00004037 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004038 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00004039 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00004040 case AVX2:
4041 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004042 case SSE42:
4043 case SSE41:
4044 case SSSE3:
4045 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004046 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004047 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004048 break;
4049 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004050 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004051 break;
4052 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004053 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004054 }
4055 }
4056
Anders Carlssone437c682010-01-27 03:47:49 +00004057 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00004058 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00004059 case AMD3DNowAthlon:
4060 Builder.defineMacro("__3dNOW_A__");
4061 case AMD3DNow:
4062 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00004063 case MMX:
4064 Builder.defineMacro("__MMX__");
4065 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00004066 break;
4067 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00004068
4069 if (CPU >= CK_i486) {
4070 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
4071 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
4072 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
4073 }
4074 if (CPU >= CK_i586)
4075 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00004076}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004077
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004078bool X86TargetInfo::hasFeature(StringRef Feature) const {
4079 return llvm::StringSwitch<bool>(Feature)
4080 .Case("aes", HasAES)
4081 .Case("avx", SSELevel >= AVX)
4082 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00004083 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00004084 .Case("avx512cd", HasAVX512CD)
4085 .Case("avx512er", HasAVX512ER)
4086 .Case("avx512pf", HasAVX512PF)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00004087 .Case("avx512dq", HasAVX512DQ)
4088 .Case("avx512bw", HasAVX512BW)
4089 .Case("avx512vl", HasAVX512VL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00004090 .Case("avx512vbmi", HasAVX512VBMI)
4091 .Case("avx512ifma", HasAVX512IFMA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004092 .Case("bmi", HasBMI)
4093 .Case("bmi2", HasBMI2)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00004094 .Case("clflushopt", HasCLFLUSHOPT)
4095 .Case("clwb", HasCLWB)
Craig Topper45742262017-02-09 06:10:14 +00004096 .Case("clzero", HasCLZERO)
Nick Lewycky50e8f482013-10-05 20:14:27 +00004097 .Case("cx16", HasCX16)
4098 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00004099 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00004100 .Case("fma4", XOPLevel >= FMA4)
Craig Topper8c7f2512014-11-03 06:51:41 +00004101 .Case("fsgsbase", HasFSGSBASE)
Craig Toppere33f51f2015-10-16 06:22:36 +00004102 .Case("fxsr", HasFXSR)
Craig Topper8dbc5842014-11-03 07:05:26 +00004103 .Case("lzcnt", HasLZCNT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004104 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
4105 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
4106 .Case("mmx", MMX3DNowLevel >= MMX)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00004107 .Case("movbe", HasMOVBE)
4108 .Case("mpx", HasMPX)
Craig Topper3f122a72012-05-31 05:18:48 +00004109 .Case("pclmul", HasPCLMUL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00004110 .Case("pku", HasPKU)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004111 .Case("popcnt", HasPOPCNT)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00004112 .Case("prefetchwt1", HasPREFETCHWT1)
Michael Liao74f4eaf2013-03-26 17:52:08 +00004113 .Case("prfchw", HasPRFCHW)
Craig Topper8dbc5842014-11-03 07:05:26 +00004114 .Case("rdrnd", HasRDRND)
Michael Liaoffaae352013-03-29 05:17:55 +00004115 .Case("rdseed", HasRDSEED)
Craig Topper8dbc5842014-11-03 07:05:26 +00004116 .Case("rtm", HasRTM)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00004117 .Case("sgx", HasSGX)
Ben Langmuir58078d02013-09-19 13:22:04 +00004118 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004119 .Case("sse", SSELevel >= SSE1)
4120 .Case("sse2", SSELevel >= SSE2)
4121 .Case("sse3", SSELevel >= SSE3)
4122 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00004123 .Case("sse4.1", SSELevel >= SSE41)
4124 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00004125 .Case("sse4a", XOPLevel >= SSE4A)
Craig Topper8dbc5842014-11-03 07:05:26 +00004126 .Case("tbm", HasTBM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004127 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00004128 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
4129 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00004130 .Case("xop", XOPLevel >= XOP)
Craig Topperda9fe562015-10-15 05:23:38 +00004131 .Case("xsave", HasXSAVE)
4132 .Case("xsavec", HasXSAVEC)
4133 .Case("xsaves", HasXSAVES)
4134 .Case("xsaveopt", HasXSAVEOPT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004135 .Default(false);
4136}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004137
Eric Christopherd9832702015-06-29 21:00:05 +00004138// We can't use a generic validation scheme for the features accepted here
4139// versus subtarget features accepted in the target attribute because the
4140// bitfield structure that's initialized in the runtime only supports the
4141// below currently rather than the full range of subtarget features. (See
4142// X86TargetInfo::hasFeature for a somewhat comprehensive list).
4143bool X86TargetInfo::validateCpuSupports(StringRef FeatureStr) const {
4144 return llvm::StringSwitch<bool>(FeatureStr)
4145 .Case("cmov", true)
4146 .Case("mmx", true)
4147 .Case("popcnt", true)
4148 .Case("sse", true)
4149 .Case("sse2", true)
4150 .Case("sse3", true)
Benjamin Kramerf4c520d2016-05-20 15:21:08 +00004151 .Case("ssse3", true)
Eric Christopherd9832702015-06-29 21:00:05 +00004152 .Case("sse4.1", true)
4153 .Case("sse4.2", true)
4154 .Case("avx", true)
4155 .Case("avx2", true)
4156 .Case("sse4a", true)
4157 .Case("fma4", true)
4158 .Case("xop", true)
4159 .Case("fma", true)
4160 .Case("avx512f", true)
4161 .Case("bmi", true)
4162 .Case("bmi2", true)
Benjamin Kramerf4c520d2016-05-20 15:21:08 +00004163 .Case("aes", true)
4164 .Case("pclmul", true)
4165 .Case("avx512vl", true)
4166 .Case("avx512bw", true)
4167 .Case("avx512dq", true)
4168 .Case("avx512cd", true)
4169 .Case("avx512er", true)
4170 .Case("avx512pf", true)
4171 .Case("avx512vbmi", true)
4172 .Case("avx512ifma", true)
Eric Christopherd9832702015-06-29 21:00:05 +00004173 .Default(false);
4174}
4175
Eli Friedman3fd920a2008-08-20 02:34:37 +00004176bool
Anders Carlsson58436352009-02-28 17:11:49 +00004177X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00004178 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00004179 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004180 default: return false;
Alexey Bataev91e58602015-07-20 12:08:00 +00004181 // Constant constraints.
4182 case 'e': // 32-bit signed integer constant for use with sign-extending x86_64
4183 // instructions.
4184 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
4185 // x86_64 instructions.
4186 case 's':
4187 Info.setRequiresImmediate();
4188 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00004189 case 'I':
4190 Info.setRequiresImmediate(0, 31);
4191 return true;
4192 case 'J':
4193 Info.setRequiresImmediate(0, 63);
4194 return true;
4195 case 'K':
4196 Info.setRequiresImmediate(-128, 127);
4197 return true;
4198 case 'L':
Alexey Bataev91e58602015-07-20 12:08:00 +00004199 Info.setRequiresImmediate({ int(0xff), int(0xffff), int(0xffffffff) });
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00004200 return true;
4201 case 'M':
4202 Info.setRequiresImmediate(0, 3);
4203 return true;
4204 case 'N':
4205 Info.setRequiresImmediate(0, 255);
4206 return true;
4207 case 'O':
4208 Info.setRequiresImmediate(0, 127);
4209 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00004210 // Register constraints.
4211 case 'Y': // 'Y' is the first character for several 2-character constraints.
4212 // Shift the pointer to the second character of the constraint.
4213 Name++;
4214 switch (*Name) {
4215 default:
4216 return false;
4217 case '0': // First SSE register.
4218 case 't': // Any SSE register, when SSE2 is enabled.
4219 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
4220 case 'm': // Any MMX register, when inter-unit moves enabled.
Michael Zuckerman849a6a52016-10-31 17:23:52 +00004221 case 'k': // AVX512 arch mask registers: k1-k7.
Alexey Bataev91e58602015-07-20 12:08:00 +00004222 Info.setAllowsRegister();
4223 return true;
4224 }
4225 case 'f': // Any x87 floating point stack register.
Akira Hatanaka88ef7282014-07-18 23:30:30 +00004226 // Constraint 'f' cannot be used for output operands.
4227 if (Info.ConstraintStr[0] == '=')
4228 return false;
Akira Hatanaka88ef7282014-07-18 23:30:30 +00004229 Info.setAllowsRegister();
4230 return true;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004231 case 'a': // eax.
4232 case 'b': // ebx.
4233 case 'c': // ecx.
4234 case 'd': // edx.
4235 case 'S': // esi.
4236 case 'D': // edi.
4237 case 'A': // edx:eax.
Alexey Bataev91e58602015-07-20 12:08:00 +00004238 case 't': // Top of floating point stack.
4239 case 'u': // Second from top of floating point stack.
Eli Friedman3fd920a2008-08-20 02:34:37 +00004240 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00004241 case 'y': // Any MMX register.
Michael Zuckerman62f516f2016-11-01 13:16:44 +00004242 case 'v': // Any {X,Y,Z}MM register (Arch & context dependent)
Anders Carlsson5f7ee682008-10-06 19:17:39 +00004243 case 'x': // Any SSE register.
Michael Zuckerman849a6a52016-10-31 17:23:52 +00004244 case 'k': // Any AVX512 mask register (same as Yk, additionaly allows k0
4245 // for intermideate k reg operations).
Eli Friedman3fd920a2008-08-20 02:34:37 +00004246 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00004247 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
4248 case 'l': // "Index" registers: any general register that can be used as an
4249 // index in a base+index memory access.
4250 Info.setAllowsRegister();
4251 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00004252 // Floating point constant constraints.
Dale Johannesen46742a42010-08-24 22:33:12 +00004253 case 'C': // SSE floating point constant.
4254 case 'G': // x87 floating point constant.
Eli Friedman3fd920a2008-08-20 02:34:37 +00004255 return true;
4256 }
4257}
4258
Akira Hatanaka974131e2014-09-18 18:17:18 +00004259bool X86TargetInfo::validateOutputSize(StringRef Constraint,
4260 unsigned Size) const {
4261 // Strip off constraint modifiers.
4262 while (Constraint[0] == '=' ||
4263 Constraint[0] == '+' ||
4264 Constraint[0] == '&')
4265 Constraint = Constraint.substr(1);
4266
4267 return validateOperandSize(Constraint, Size);
4268}
4269
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004270bool X86TargetInfo::validateInputSize(StringRef Constraint,
4271 unsigned Size) const {
Akira Hatanaka974131e2014-09-18 18:17:18 +00004272 return validateOperandSize(Constraint, Size);
4273}
4274
4275bool X86TargetInfo::validateOperandSize(StringRef Constraint,
4276 unsigned Size) const {
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004277 switch (Constraint[0]) {
4278 default: break;
Michael Zuckerman849a6a52016-10-31 17:23:52 +00004279 case 'k':
4280 // Registers k0-k7 (AVX512) size limit is 64 bit.
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004281 case 'y':
4282 return Size <= 64;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004283 case 'f':
4284 case 't':
4285 case 'u':
4286 return Size <= 128;
Michael Zuckerman62f516f2016-11-01 13:16:44 +00004287 case 'v':
Hans Wennborg3c619a42014-09-18 20:24:04 +00004288 case 'x':
Alexey Bataev91e58602015-07-20 12:08:00 +00004289 if (SSELevel >= AVX512F)
4290 // 512-bit zmm registers can be used if target supports AVX512F.
4291 return Size <= 512U;
4292 else if (SSELevel >= AVX)
4293 // 256-bit ymm registers can be used if target supports AVX.
4294 return Size <= 256U;
4295 return Size <= 128U;
4296 case 'Y':
4297 // 'Y' is the first character for several 2-character constraints.
4298 switch (Constraint[1]) {
4299 default: break;
4300 case 'm':
4301 // 'Ym' is synonymous with 'y'.
Michael Zuckerman849a6a52016-10-31 17:23:52 +00004302 case 'k':
Alexey Bataev91e58602015-07-20 12:08:00 +00004303 return Size <= 64;
4304 case 'i':
4305 case 't':
4306 // 'Yi' and 'Yt' are synonymous with 'x' when SSE2 is enabled.
4307 if (SSELevel >= AVX512F)
4308 return Size <= 512U;
4309 else if (SSELevel >= AVX)
4310 return Size <= 256U;
4311 return SSELevel >= SSE2 && Size <= 128U;
4312 }
4313
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004314 }
4315
4316 return true;
4317}
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00004318
Eli Friedman3fd920a2008-08-20 02:34:37 +00004319std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004320X86TargetInfo::convertConstraint(const char *&Constraint) const {
4321 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004322 case 'a': return std::string("{ax}");
4323 case 'b': return std::string("{bx}");
4324 case 'c': return std::string("{cx}");
4325 case 'd': return std::string("{dx}");
4326 case 'S': return std::string("{si}");
4327 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00004328 case 'p': // address
4329 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00004330 case 't': // top of floating point stack.
4331 return std::string("{st}");
4332 case 'u': // second from top of floating point stack.
4333 return std::string("{st(1)}"); // second from top of floating point stack.
Michael Zuckerman849a6a52016-10-31 17:23:52 +00004334 case 'Y':
4335 switch (Constraint[1]) {
4336 default:
4337 // Break from inner switch and fall through (copy single char),
4338 // continue parsing after copying the current constraint into
4339 // the return string.
4340 break;
4341 case 'k':
4342 // "^" hints llvm that this is a 2 letter constraint.
4343 // "Constraint++" is used to promote the string iterator
4344 // to the next constraint.
4345 return std::string("^") + std::string(Constraint++, 2);
4346 }
4347 LLVM_FALLTHROUGH;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004348 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004349 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00004350 }
4351}
Chris Lattner5ba61f02006-10-14 07:39:34 +00004352
Eli Friedman3fd920a2008-08-20 02:34:37 +00004353// X86-32 generic target
4354class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00004355public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004356 X86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4357 : X86TargetInfo(Triple, Opts) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004358 DoubleAlign = LongLongAlign = 32;
4359 LongDoubleWidth = 96;
4360 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00004361 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00004362 resetDataLayout("e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128");
Eli Friedman32ca82a2009-03-29 20:31:09 +00004363 SizeType = UnsignedInt;
4364 PtrDiffType = SignedInt;
4365 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00004366 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00004367
4368 // Use fpret for all types.
4369 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
4370 (1 << TargetInfo::Double) |
4371 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004372
4373 // x86-32 has atomics up to 8 bytes
4374 // FIXME: Check that we actually have cmpxchg8b before setting
4375 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
4376 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004377 }
Craig Topper3164f332014-03-11 03:39:26 +00004378 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004379 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004380 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004381
Craig Topper3164f332014-03-11 03:39:26 +00004382 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00004383 if (RegNo == 0) return 0;
4384 if (RegNo == 1) return 2;
4385 return -1;
4386 }
Akira Hatanaka974131e2014-09-18 18:17:18 +00004387 bool validateOperandSize(StringRef Constraint,
4388 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00004389 switch (Constraint[0]) {
4390 default: break;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004391 case 'R':
4392 case 'q':
4393 case 'Q':
Bill Wendling887b4852012-11-12 06:42:51 +00004394 case 'a':
4395 case 'b':
4396 case 'c':
4397 case 'd':
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004398 case 'S':
4399 case 'D':
Bill Wendling3c7fed82012-11-12 18:52:32 +00004400 return Size <= 32;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004401 case 'A':
4402 return Size <= 64;
Bill Wendling887b4852012-11-12 06:42:51 +00004403 }
4404
Akira Hatanaka974131e2014-09-18 18:17:18 +00004405 return X86TargetInfo::validateOperandSize(Constraint, Size);
Bill Wendling887b4852012-11-12 06:42:51 +00004406 }
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00004407 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
4408 return llvm::makeArrayRef(BuiltinInfoX86, clang::X86::LastX86CommonBuiltin -
4409 Builtin::FirstTSBuiltin + 1);
4410 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004411};
Eli Friedman3fd920a2008-08-20 02:34:37 +00004412
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004413class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
4414public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004415 NetBSDI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4416 : NetBSDTargetInfo<X86_32TargetInfo>(Triple, Opts) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004417
Craig Topper3164f332014-03-11 03:39:26 +00004418 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00004419 unsigned Major, Minor, Micro;
4420 getTriple().getOSVersion(Major, Minor, Micro);
4421 // New NetBSD uses the default rounding mode.
4422 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
4423 return X86_32TargetInfo::getFloatEvalMethod();
4424 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004425 return 1;
4426 }
4427};
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004428
Eli Friedmane3aa4542009-07-05 18:47:56 +00004429class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
4430public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004431 OpenBSDI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4432 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00004433 SizeType = UnsignedLong;
4434 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004435 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00004436 }
4437};
Eli Friedmane3aa4542009-07-05 18:47:56 +00004438
Eli Friedman9fa28852012-08-08 23:57:20 +00004439class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
4440public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004441 BitrigI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4442 : BitrigTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman9fa28852012-08-08 23:57:20 +00004443 SizeType = UnsignedLong;
4444 IntPtrType = SignedLong;
4445 PtrDiffType = SignedLong;
4446 }
4447};
Eli Friedman9fa28852012-08-08 23:57:20 +00004448
Torok Edwinb2b37c62009-06-30 17:10:35 +00004449class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004450public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004451 DarwinI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4452 : DarwinTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004453 LongDoubleWidth = 128;
4454 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004455 SuitableAlign = 128;
Tim Northover5627d392015-10-30 16:30:45 +00004456 MaxVectorAlign = 256;
4457 // The watchOS simulator uses the builtin bool type for Objective-C.
4458 llvm::Triple T = llvm::Triple(Triple);
4459 if (T.isWatchOS())
4460 UseSignedCharForObjCBool = false;
Eli Friedman32ca82a2009-03-29 20:31:09 +00004461 SizeType = UnsignedLong;
4462 IntPtrType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00004463 resetDataLayout("e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128");
Daniel Dunbarbd606522010-05-27 00:35:16 +00004464 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00004465 }
4466
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004467 bool handleTargetFeatures(std::vector<std::string> &Features,
4468 DiagnosticsEngine &Diags) override {
4469 if (!DarwinTargetInfo<X86_32TargetInfo>::handleTargetFeatures(Features,
4470 Diags))
4471 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004472 // We now know the features we have: we can decide how to align vectors.
4473 MaxVectorAlign =
4474 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004475 return true;
4476 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004477};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004478
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004479// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004480class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004481public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004482 WindowsX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4483 : WindowsTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Chris Lattner46be2e12009-06-24 17:12:15 +00004484 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00004485 DoubleAlign = LongLongAlign = 64;
Reid Kleckner7510c092015-04-01 16:45:06 +00004486 bool IsWinCOFF =
4487 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
James Y Knightb214cbc2016-03-04 19:00:41 +00004488 resetDataLayout(IsWinCOFF
4489 ? "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
4490 : "e-m:e-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32");
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004491 }
Craig Topper3164f332014-03-11 03:39:26 +00004492 void getTargetDefines(const LangOptions &Opts,
4493 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004494 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
4495 }
4496};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004497
4498// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004499class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004500public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004501 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple,
4502 const TargetOptions &Opts)
4503 : WindowsX86_32TargetInfo(Triple, Opts) {
Eli Friedman015d6282011-03-22 21:25:11 +00004504 LongDoubleWidth = LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00004505 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004506 }
Craig Topper3164f332014-03-11 03:39:26 +00004507 void getTargetDefines(const LangOptions &Opts,
4508 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004509 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
4510 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
4511 // The value of the following reflects processor type.
4512 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
4513 // We lost the original triple, so we use the default.
4514 Builder.defineMacro("_M_IX86", "600");
4515 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004516};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004517
David Majnemerae1ed0e2015-05-28 04:36:18 +00004518static void addCygMingDefines(const LangOptions &Opts, MacroBuilder &Builder) {
Eric Christopherb093d692015-10-09 18:39:59 +00004519 // Mingw and cygwin define __declspec(a) to __attribute__((a)). Clang
4520 // supports __declspec natively under -fms-extensions, but we define a no-op
4521 // __declspec macro anyway for pre-processor compatibility.
Reid Kleckner47606832014-04-21 20:58:00 +00004522 if (Opts.MicrosoftExt)
4523 Builder.defineMacro("__declspec", "__declspec");
4524 else
4525 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
4526
4527 if (!Opts.MicrosoftExt) {
4528 // Provide macros for all the calling convention keywords. Provide both
4529 // single and double underscore prefixed variants. These are available on
4530 // x64 as well as x86, even though they have no effect.
4531 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
4532 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00004533 std::string GCCSpelling = "__attribute__((__";
4534 GCCSpelling += CC;
4535 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00004536 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
4537 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
4538 }
4539 }
4540}
4541
David Majnemerae1ed0e2015-05-28 04:36:18 +00004542static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
4543 Builder.defineMacro("__MSVCRT__");
4544 Builder.defineMacro("__MINGW32__");
4545 addCygMingDefines(Opts, Builder);
4546}
4547
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004548// x86-32 MinGW target
4549class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
4550public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004551 MinGWX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4552 : WindowsX86_32TargetInfo(Triple, Opts) {}
Craig Topper3164f332014-03-11 03:39:26 +00004553 void getTargetDefines(const LangOptions &Opts,
4554 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004555 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004556 DefineStd(Builder, "WIN32", Opts);
4557 DefineStd(Builder, "WINNT", Opts);
4558 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00004559 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004560 }
4561};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004562
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004563// x86-32 Cygwin target
4564class CygwinX86_32TargetInfo : public X86_32TargetInfo {
4565public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004566 CygwinX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4567 : X86_32TargetInfo(Triple, Opts) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004568 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004569 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00004570 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 +00004571 }
Craig Topper3164f332014-03-11 03:39:26 +00004572 void getTargetDefines(const LangOptions &Opts,
4573 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004574 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00004575 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004576 Builder.defineMacro("__CYGWIN__");
4577 Builder.defineMacro("__CYGWIN32__");
David Majnemerae1ed0e2015-05-28 04:36:18 +00004578 addCygMingDefines(Opts, Builder);
Saleem Abdulrasool56027092017-02-07 19:00:06 +00004579 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00004580 if (Opts.CPlusPlus)
4581 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00004582 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004583};
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004584
Chris Lattnerb986aba2010-04-11 19:29:39 +00004585// x86-32 Haiku target
Reid Kleckner330fb172016-05-11 16:19:05 +00004586class HaikuX86_32TargetInfo : public HaikuTargetInfo<X86_32TargetInfo> {
Chris Lattnerb986aba2010-04-11 19:29:39 +00004587public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004588 HaikuX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Reid Kleckner330fb172016-05-11 16:19:05 +00004589 : HaikuTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman04831922010-08-22 01:00:03 +00004590 }
Craig Topper3164f332014-03-11 03:39:26 +00004591 void getTargetDefines(const LangOptions &Opts,
4592 MacroBuilder &Builder) const override {
Reid Kleckner330fb172016-05-11 16:19:05 +00004593 HaikuTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
Chris Lattnerb986aba2010-04-11 19:29:39 +00004594 Builder.defineMacro("__INTEL__");
Chris Lattnerb986aba2010-04-11 19:29:39 +00004595 }
4596};
Chris Lattnerb986aba2010-04-11 19:29:39 +00004597
Alexey Bataevc99b0492015-11-25 09:24:26 +00004598// X86-32 MCU target
4599class MCUX86_32TargetInfo : public X86_32TargetInfo {
4600public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004601 MCUX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4602 : X86_32TargetInfo(Triple, Opts) {
Alexey Bataevc99b0492015-11-25 09:24:26 +00004603 LongDoubleWidth = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00004604 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
James Y Knightb214cbc2016-03-04 19:00:41 +00004605 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 +00004606 WIntType = UnsignedInt;
Alexey Bataevc99b0492015-11-25 09:24:26 +00004607 }
4608
4609 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
4610 // On MCU we support only C calling convention.
4611 return CC == CC_C ? CCCR_OK : CCCR_Warning;
4612 }
4613
4614 void getTargetDefines(const LangOptions &Opts,
4615 MacroBuilder &Builder) const override {
4616 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4617 Builder.defineMacro("__iamcu");
4618 Builder.defineMacro("__iamcu__");
4619 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00004620
4621 bool allowsLargerPreferedTypeAlignment() const override {
4622 return false;
4623 }
Alexey Bataevc99b0492015-11-25 09:24:26 +00004624};
4625
Douglas Gregor9fabd852011-07-01 22:41:14 +00004626// RTEMS Target
4627template<typename Target>
4628class RTEMSTargetInfo : public OSTargetInfo<Target> {
4629protected:
Craig Topper3164f332014-03-11 03:39:26 +00004630 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4631 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004632 // RTEMS defines; list based off of gcc output
4633
Douglas Gregor9fabd852011-07-01 22:41:14 +00004634 Builder.defineMacro("__rtems__");
4635 Builder.defineMacro("__ELF__");
4636 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004637
Douglas Gregor9fabd852011-07-01 22:41:14 +00004638public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004639 RTEMSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4640 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004641 switch (Triple.getArch()) {
4642 default:
4643 case llvm::Triple::x86:
4644 // this->MCountName = ".mcount";
4645 break;
4646 case llvm::Triple::mips:
4647 case llvm::Triple::mipsel:
4648 case llvm::Triple::ppc:
4649 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00004650 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004651 // this->MCountName = "_mcount";
4652 break;
4653 case llvm::Triple::arm:
4654 // this->MCountName = "__mcount";
4655 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004656 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004657 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00004658};
4659
Douglas Gregor9fabd852011-07-01 22:41:14 +00004660// x86-32 RTEMS target
4661class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
4662public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004663 RTEMSX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4664 : X86_32TargetInfo(Triple, Opts) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004665 SizeType = UnsignedLong;
4666 IntPtrType = SignedLong;
4667 PtrDiffType = SignedLong;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004668 }
Craig Topper3164f332014-03-11 03:39:26 +00004669 void getTargetDefines(const LangOptions &Opts,
4670 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004671 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4672 Builder.defineMacro("__INTEL__");
4673 Builder.defineMacro("__rtems__");
4674 }
4675};
Douglas Gregor9fabd852011-07-01 22:41:14 +00004676
Eli Friedman3fd920a2008-08-20 02:34:37 +00004677// x86-64 generic target
4678class X86_64TargetInfo : public X86TargetInfo {
4679public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004680 X86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4681 : X86TargetInfo(Triple, Opts) {
David Blaikie40f842d2014-07-10 18:46:15 +00004682 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
David Majnemer8fa8c382015-03-17 23:55:00 +00004683 bool IsWinCOFF =
4684 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Zinovy Nis1db95732014-07-10 15:27:19 +00004685 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00004686 LongDoubleWidth = 128;
4687 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00004688 LargeArrayMinWidth = 128;
4689 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004690 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00004691 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
4692 PtrDiffType = IsX32 ? SignedInt : SignedLong;
4693 IntPtrType = IsX32 ? SignedInt : SignedLong;
4694 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00004695 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00004696 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00004697
Eric Christopher917e9522014-11-18 22:36:15 +00004698 // Pointers are 32-bit in x32.
Eric Christopherf6ee1f32017-02-10 04:35:21 +00004699 resetDataLayout(IsX32
4700 ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128"
4701 : IsWinCOFF ? "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
4702 : "e-m:e-i64:64-f80:128-n8:16:32:64-S128");
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00004703
4704 // Use fpret only for long double.
4705 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004706
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00004707 // Use fp2ret for _Complex long double.
4708 ComplexLongDoubleUsesFP2Ret = true;
4709
Charles Davisc7d5c942015-09-17 20:55:33 +00004710 // Make __builtin_ms_va_list available.
4711 HasBuiltinMSVaList = true;
4712
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004713 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004714 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00004715 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00004716 }
Craig Topper3164f332014-03-11 03:39:26 +00004717 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004718 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00004719 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004720
Craig Topper3164f332014-03-11 03:39:26 +00004721 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00004722 if (RegNo == 0) return 0;
4723 if (RegNo == 1) return 1;
4724 return -1;
4725 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004726
Craig Topper3164f332014-03-11 03:39:26 +00004727 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00004728 switch (CC) {
4729 case CC_C:
4730 case CC_Swift:
4731 case CC_X86VectorCall:
4732 case CC_IntelOclBicc:
4733 case CC_X86_64Win64:
Roman Levenstein35aa5ce2016-03-16 18:00:46 +00004734 case CC_PreserveMost:
4735 case CC_PreserveAll:
Erich Keane757d3172016-11-02 18:29:35 +00004736 case CC_X86RegCall:
John McCall477f2bb2016-03-03 06:39:32 +00004737 return CCCR_OK;
4738 default:
4739 return CCCR_Warning;
4740 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004741 }
4742
Craig Topper3164f332014-03-11 03:39:26 +00004743 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00004744 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004745 }
4746
Pavel Chupinfd223e12014-08-04 12:39:43 +00004747 // for x32 we need it here explicitly
4748 bool hasInt128Type() const override { return true; }
Reid Klecknerf27e7522016-02-01 18:58:24 +00004749 unsigned getUnwindWordWidth() const override { return 64; }
4750 unsigned getRegisterWidth() const override { return 64; }
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00004751
4752 bool validateGlobalRegisterVariable(StringRef RegName,
4753 unsigned RegSize,
4754 bool &HasSizeMismatch) const override {
4755 // rsp and rbp are the only 64-bit registers the x86 backend can currently
4756 // handle.
4757 if (RegName.equals("rsp") || RegName.equals("rbp")) {
4758 // Check that the register size is 64-bit.
4759 HasSizeMismatch = RegSize != 64;
4760 return true;
4761 }
4762
4763 // Check if the register is a 32-bit register the backend can handle.
4764 return X86TargetInfo::validateGlobalRegisterVariable(RegName, RegSize,
4765 HasSizeMismatch);
4766 }
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00004767 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
4768 return llvm::makeArrayRef(BuiltinInfoX86,
4769 X86::LastTSBuiltin - Builtin::FirstTSBuiltin);
4770 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004771};
Eli Friedman3fd920a2008-08-20 02:34:37 +00004772
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004773// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004774class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004775public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004776 WindowsX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4777 : WindowsTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004778 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00004779 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004780 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004781 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004782 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00004783 SizeType = UnsignedLongLong;
4784 PtrDiffType = SignedLongLong;
4785 IntPtrType = SignedLongLong;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004786 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004787
Craig Topper3164f332014-03-11 03:39:26 +00004788 void getTargetDefines(const LangOptions &Opts,
4789 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004790 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004791 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004792 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004793
Craig Topper3164f332014-03-11 03:39:26 +00004794 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004795 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00004796 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004797
Craig Topper3164f332014-03-11 03:39:26 +00004798 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004799 switch (CC) {
4800 case CC_X86StdCall:
4801 case CC_X86ThisCall:
4802 case CC_X86FastCall:
4803 return CCCR_Ignore;
4804 case CC_C:
4805 case CC_X86VectorCall:
4806 case CC_IntelOclBicc:
4807 case CC_X86_64SysV:
Arnold Schwaighofer4fc955e2016-10-12 18:59:24 +00004808 case CC_Swift:
Erich Keane757d3172016-11-02 18:29:35 +00004809 case CC_X86RegCall:
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004810 return CCCR_OK;
4811 default:
4812 return CCCR_Warning;
4813 }
Charles Davisb5a214e2013-08-30 04:39:01 +00004814 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004815};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004816
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004817// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004818class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004819public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004820 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple,
4821 const TargetOptions &Opts)
4822 : WindowsX86_64TargetInfo(Triple, Opts) {
Eli Friedman015d6282011-03-22 21:25:11 +00004823 LongDoubleWidth = LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00004824 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004825 }
Craig Topper3164f332014-03-11 03:39:26 +00004826 void getTargetDefines(const LangOptions &Opts,
4827 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004828 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
4829 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
David Majnemerb856e8f2015-07-26 23:17:29 +00004830 Builder.defineMacro("_M_X64", "100");
4831 Builder.defineMacro("_M_AMD64", "100");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004832 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004833};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004834
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004835// x86-64 MinGW target
4836class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
4837public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004838 MinGWX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4839 : WindowsX86_64TargetInfo(Triple, Opts) {
Reid Kleckner11a17192015-10-28 22:29:52 +00004840 // Mingw64 rounds long double size and alignment up to 16 bytes, but sticks
4841 // with x86 FP ops. Weird.
4842 LongDoubleWidth = LongDoubleAlign = 128;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00004843 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended();
Reid Kleckner11a17192015-10-28 22:29:52 +00004844 }
4845
Craig Topper3164f332014-03-11 03:39:26 +00004846 void getTargetDefines(const LangOptions &Opts,
4847 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004848 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004849 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004850 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00004851 addMinGWDefines(Opts, Builder);
Reid Klecknere070b992014-11-14 02:01:10 +00004852
4853 // GCC defines this macro when it is using __gxx_personality_seh0.
4854 if (!Opts.SjLjExceptions)
4855 Builder.defineMacro("__SEH__");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004856 }
4857};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004858
Yaron Kerend030d112015-07-22 17:38:19 +00004859// x86-64 Cygwin target
4860class CygwinX86_64TargetInfo : public X86_64TargetInfo {
4861public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004862 CygwinX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4863 : X86_64TargetInfo(Triple, Opts) {
Yaron Kerend030d112015-07-22 17:38:19 +00004864 TLSSupported = false;
4865 WCharType = UnsignedShort;
4866 }
4867 void getTargetDefines(const LangOptions &Opts,
4868 MacroBuilder &Builder) const override {
4869 X86_64TargetInfo::getTargetDefines(Opts, Builder);
4870 Builder.defineMacro("__x86_64__");
4871 Builder.defineMacro("__CYGWIN__");
4872 Builder.defineMacro("__CYGWIN64__");
4873 addCygMingDefines(Opts, Builder);
Saleem Abdulrasool56027092017-02-07 19:00:06 +00004874 DefineStd(Builder, "unix", Opts);
Yaron Kerend030d112015-07-22 17:38:19 +00004875 if (Opts.CPlusPlus)
4876 Builder.defineMacro("_GNU_SOURCE");
4877
4878 // GCC defines this macro when it is using __gxx_personality_seh0.
4879 if (!Opts.SjLjExceptions)
4880 Builder.defineMacro("__SEH__");
4881 }
4882};
4883
Eli Friedman2857ccb2009-07-01 03:36:11 +00004884class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
4885public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004886 DarwinX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4887 : DarwinTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00004888 Int64Type = SignedLongLong;
Tim Northovera2ee4332014-03-29 15:09:45 +00004889 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
4890 llvm::Triple T = llvm::Triple(Triple);
Bob Wilson946c04c2014-10-19 02:19:27 +00004891 if (T.isiOS())
Tim Northovera2ee4332014-03-29 15:09:45 +00004892 UseSignedCharForObjCBool = false;
James Y Knightb214cbc2016-03-04 19:00:41 +00004893 resetDataLayout("e-m:o-i64:64-f80:128-n8:16:32:64-S128");
Eli Friedman2857ccb2009-07-01 03:36:11 +00004894 }
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004895
4896 bool handleTargetFeatures(std::vector<std::string> &Features,
4897 DiagnosticsEngine &Diags) override {
4898 if (!DarwinTargetInfo<X86_64TargetInfo>::handleTargetFeatures(Features,
4899 Diags))
4900 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004901 // We now know the features we have: we can decide how to align vectors.
4902 MaxVectorAlign =
4903 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004904 return true;
4905 }
Eli Friedman2857ccb2009-07-01 03:36:11 +00004906};
Eli Friedman2857ccb2009-07-01 03:36:11 +00004907
Eli Friedman245f2292009-07-05 22:31:18 +00004908class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
4909public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004910 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4911 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Eli Friedman245f2292009-07-05 22:31:18 +00004912 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004913 Int64Type = SignedLongLong;
4914 }
4915};
Eli Friedman245f2292009-07-05 22:31:18 +00004916
Eli Friedman9fa28852012-08-08 23:57:20 +00004917class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
4918public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004919 BitrigX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4920 : BitrigTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004921 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004922 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00004923 }
4924};
Tim Northover9bb857a2013-01-31 12:13:10 +00004925
Eli Friedmanf05b7722008-08-20 07:44:10 +00004926class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004927 // Possible FPU choices.
4928 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004929 VFP2FPU = (1 << 0),
4930 VFP3FPU = (1 << 1),
4931 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00004932 NeonFPU = (1 << 3),
4933 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004934 };
4935
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004936 // Possible HWDiv features.
4937 enum HWDivMode {
4938 HWDivThumb = (1 << 0),
4939 HWDivARM = (1 << 1)
4940 };
4941
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004942 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004943 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004944 }
4945
4946 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4947 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004948
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004949 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004950
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004951 StringRef CPUProfile;
4952 StringRef CPUAttr;
4953
Rafael Espindolaeb265472013-08-21 21:59:03 +00004954 enum {
4955 FP_Default,
4956 FP_VFP,
4957 FP_Neon
4958 } FPMath;
4959
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004960 unsigned ArchISA;
Renato Goline84b0002015-10-08 16:43:26 +00004961 unsigned ArchKind = llvm::ARM::AK_ARMV4T;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004962 unsigned ArchProfile;
4963 unsigned ArchVersion;
4964
Bernard Ogdenda13af32013-10-24 18:32:51 +00004965 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004966
Logan Chien57086ce2012-10-10 06:56:20 +00004967 unsigned IsAAPCS : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004968 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004969
4970 // Initialized via features.
4971 unsigned SoftFloat : 1;
4972 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004973
Bernard Ogden18b57012013-10-29 09:47:51 +00004974 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00004975 unsigned Crypto : 1;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004976 unsigned DSP : 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004977 unsigned Unaligned : 1;
4978
4979 enum {
4980 LDREX_B = (1 << 0), /// byte (8-bit)
4981 LDREX_H = (1 << 1), /// half (16-bit)
4982 LDREX_W = (1 << 2), /// word (32-bit)
4983 LDREX_D = (1 << 3), /// double (64-bit)
4984 };
4985
4986 uint32_t LDREX;
Bernard Ogden18b57012013-10-29 09:47:51 +00004987
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004988 // ACLE 6.5.1 Hardware floating point
4989 enum {
4990 HW_FP_HP = (1 << 1), /// half (16-bit)
4991 HW_FP_SP = (1 << 2), /// single (32-bit)
4992 HW_FP_DP = (1 << 3), /// double (64-bit)
4993 };
4994 uint32_t HW_FP;
4995
Chris Lattner5cc15e02010-03-03 19:03:45 +00004996 static const Builtin::Info BuiltinInfo[];
4997
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004998 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004999 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00005000
5001 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00005002 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00005003
Renato Golin0201a9e2016-09-22 19:28:20 +00005004 // size_t is unsigned long on MachO-derived environments, NetBSD,
5005 // OpenBSD and Bitrig.
Renato Golin9ba39232015-02-27 16:35:48 +00005006 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD ||
Renato Golin0201a9e2016-09-22 19:28:20 +00005007 T.getOS() == llvm::Triple::OpenBSD ||
Renato Golin9ba39232015-02-27 16:35:48 +00005008 T.getOS() == llvm::Triple::Bitrig)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00005009 SizeType = UnsignedLong;
5010 else
5011 SizeType = UnsignedInt;
5012
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00005013 switch (T.getOS()) {
5014 case llvm::Triple::NetBSD:
Renato Golin0201a9e2016-09-22 19:28:20 +00005015 case llvm::Triple::OpenBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00005016 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00005017 break;
5018 case llvm::Triple::Win32:
5019 WCharType = UnsignedShort;
5020 break;
5021 case llvm::Triple::Linux:
5022 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00005023 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
5024 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00005025 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00005026 }
5027
5028 UseBitFieldTypeAlignment = true;
5029
5030 ZeroLengthBitfieldBoundary = 0;
5031
Tim Northover147cd2f2014-10-14 22:12:21 +00005032 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
5033 // so set preferred for small types to 32.
5034 if (T.isOSBinFormatMachO()) {
James Y Knightb214cbc2016-03-04 19:00:41 +00005035 resetDataLayout(BigEndian
5036 ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
5037 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Tim Northover147cd2f2014-10-14 22:12:21 +00005038 } else if (T.isOSWindows()) {
Tim Northover147cd2f2014-10-14 22:12:21 +00005039 assert(!BigEndian && "Windows on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00005040 resetDataLayout("e"
5041 "-m:w"
5042 "-p:32:32"
5043 "-i64:64"
5044 "-v128:64:128"
5045 "-a:0:32"
5046 "-n32"
5047 "-S64");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00005048 } else if (T.isOSNaCl()) {
5049 assert(!BigEndian && "NaCl on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00005050 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00005051 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00005052 resetDataLayout(BigEndian
5053 ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
5054 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00005055 }
5056
5057 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00005058 }
5059
Tim Northover5627d392015-10-30 16:30:45 +00005060 void setABIAPCS(bool IsAAPCS16) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00005061 const llvm::Triple &T = getTriple();
5062
Rafael Espindolaafa854c2013-12-18 20:24:51 +00005063 IsAAPCS = false;
5064
Tim Northover5627d392015-10-30 16:30:45 +00005065 if (IsAAPCS16)
5066 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
5067 else
5068 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00005069
Rafael Espindolad6c2b722013-12-18 19:47:32 +00005070 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00005071 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00005072 SizeType = UnsignedInt;
5073 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00005074 SizeType = UnsignedLong;
5075
5076 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
5077 WCharType = SignedInt;
5078
5079 // Do not respect the alignment of bit-field types when laying out
5080 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
5081 UseBitFieldTypeAlignment = false;
5082
5083 /// gcc forces the alignment to 4 bytes, regardless of the type of the
5084 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
5085 /// gcc.
5086 ZeroLengthBitfieldBoundary = 32;
5087
Tim Northover5627d392015-10-30 16:30:45 +00005088 if (T.isOSBinFormatMachO() && IsAAPCS16) {
5089 assert(!BigEndian && "AAPCS16 does not support big-endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00005090 resetDataLayout("e-m:o-p:32:32-i64:64-a:0:32-n32-S128");
Tim Northover5627d392015-10-30 16:30:45 +00005091 } else if (T.isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00005092 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00005093 BigEndian
5094 ? "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 +00005095 : "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 +00005096 else
James Y Knightb214cbc2016-03-04 19:00:41 +00005097 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00005098 BigEndian
5099 ? "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 +00005100 : "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 +00005101
5102 // FIXME: Override "preferred align" for double and long long.
5103 }
5104
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005105 void setArchInfo() {
5106 StringRef ArchName = getTriple().getArchName();
5107
Renato Goline84b0002015-10-08 16:43:26 +00005108 ArchISA = llvm::ARM::parseArchISA(ArchName);
5109 CPU = llvm::ARM::getDefaultCPU(ArchName);
5110 unsigned AK = llvm::ARM::parseArch(ArchName);
5111 if (AK != llvm::ARM::AK_INVALID)
5112 ArchKind = AK;
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005113 setArchInfo(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005114 }
5115
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005116 void setArchInfo(unsigned Kind) {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005117 StringRef SubArch;
5118
5119 // cache TargetParser info
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005120 ArchKind = Kind;
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00005121 SubArch = llvm::ARM::getSubArch(ArchKind);
5122 ArchProfile = llvm::ARM::parseArchProfile(SubArch);
5123 ArchVersion = llvm::ARM::parseArchVersion(SubArch);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005124
5125 // cache CPU related strings
5126 CPUAttr = getCPUAttr();
5127 CPUProfile = getCPUProfile();
5128 }
5129
5130 void setAtomic() {
Eric Christopherb093d692015-10-09 18:39:59 +00005131 // when triple does not specify a sub arch,
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005132 // then we are not using inline atomics
Renato Goline84b0002015-10-08 16:43:26 +00005133 bool ShouldUseInlineAtomic =
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005134 (ArchISA == llvm::ARM::IK_ARM && ArchVersion >= 6) ||
5135 (ArchISA == llvm::ARM::IK_THUMB && ArchVersion >= 7);
Eric Christopherb093d692015-10-09 18:39:59 +00005136 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005137 if (ArchProfile == llvm::ARM::PK_M) {
5138 MaxAtomicPromoteWidth = 32;
5139 if (ShouldUseInlineAtomic)
5140 MaxAtomicInlineWidth = 32;
5141 }
5142 else {
5143 MaxAtomicPromoteWidth = 64;
5144 if (ShouldUseInlineAtomic)
5145 MaxAtomicInlineWidth = 64;
Eric Christopherb093d692015-10-09 18:39:59 +00005146 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005147 }
5148
5149 bool isThumb() const {
5150 return (ArchISA == llvm::ARM::IK_THUMB);
5151 }
5152
5153 bool supportsThumb() const {
5154 return CPUAttr.count('T') || ArchVersion >= 6;
5155 }
5156
5157 bool supportsThumb2() const {
Bradley Smithf4affc12016-03-03 13:52:22 +00005158 return CPUAttr.equals("6T2") ||
5159 (ArchVersion >= 7 && !CPUAttr.equals("8M_BASE"));
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005160 }
5161
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005162 StringRef getCPUAttr() const {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005163 // For most sub-arches, the build attribute CPU name is enough.
5164 // For Cortex variants, it's slightly different.
5165 switch(ArchKind) {
5166 default:
Chandler Carruthd96f37a2015-08-30 07:51:18 +00005167 return llvm::ARM::getCPUAttr(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005168 case llvm::ARM::AK_ARMV6M:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005169 return "6M";
Tim Northover525c73c2015-07-21 21:47:33 +00005170 case llvm::ARM::AK_ARMV7S:
5171 return "7S";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005172 case llvm::ARM::AK_ARMV7A:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005173 return "7A";
5174 case llvm::ARM::AK_ARMV7R:
5175 return "7R";
5176 case llvm::ARM::AK_ARMV7M:
5177 return "7M";
5178 case llvm::ARM::AK_ARMV7EM:
5179 return "7EM";
George Burgess IVfc970562017-02-09 23:30:10 +00005180 case llvm::ARM::AK_ARMV7VE:
5181 return "7VE";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005182 case llvm::ARM::AK_ARMV8A:
5183 return "8A";
5184 case llvm::ARM::AK_ARMV8_1A:
5185 return "8_1A";
Oliver Stannard3086c042016-02-11 16:05:52 +00005186 case llvm::ARM::AK_ARMV8_2A:
5187 return "8_2A";
Bradley Smithf4affc12016-03-03 13:52:22 +00005188 case llvm::ARM::AK_ARMV8MBaseline:
5189 return "8M_BASE";
5190 case llvm::ARM::AK_ARMV8MMainline:
5191 return "8M_MAIN";
Javed Absar00b74442016-10-07 12:08:41 +00005192 case llvm::ARM::AK_ARMV8R:
5193 return "8R";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005194 }
5195 }
5196
5197 StringRef getCPUProfile() const {
5198 switch(ArchProfile) {
5199 case llvm::ARM::PK_A:
5200 return "A";
5201 case llvm::ARM::PK_R:
5202 return "R";
5203 case llvm::ARM::PK_M:
5204 return "M";
5205 default:
5206 return "";
5207 }
5208 }
5209
Chris Lattner17df24e2008-04-21 18:56:49 +00005210public:
Matt Arsenaultf333de32016-09-07 07:08:02 +00005211 ARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005212 : TargetInfo(Triple), FPMath(FP_Default), IsAAPCS(true), LDREX(0),
5213 HW_FP(0) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005214
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00005215 switch (getTriple().getOS()) {
5216 case llvm::Triple::NetBSD:
Renato Golin0201a9e2016-09-22 19:28:20 +00005217 case llvm::Triple::OpenBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00005218 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00005219 break;
5220 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00005221 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00005222 break;
5223 }
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00005224
Renato Goline84b0002015-10-08 16:43:26 +00005225 // Cache arch related info.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005226 setArchInfo();
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00005227
Chris Lattner1a8f3942010-04-23 16:29:58 +00005228 // {} in inline assembly are neon specifiers, not assembly variant
5229 // specifiers.
5230 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005231
Eric Christopher0e261882014-12-05 01:06:59 +00005232 // FIXME: This duplicates code from the driver that sets the -target-abi
5233 // option - this code is used if -target-abi isn't passed and should
5234 // be unified in some way.
5235 if (Triple.isOSBinFormatMachO()) {
5236 // The backend is hardwired to assume AAPCS for M-class processors, ensure
5237 // the frontend matches that.
5238 if (Triple.getEnvironment() == llvm::Triple::EABI ||
5239 Triple.getOS() == llvm::Triple::UnknownOS ||
Zijiao Ma56a83722016-08-17 02:13:33 +00005240 ArchProfile == llvm::ARM::PK_M) {
Eric Christopher0e261882014-12-05 01:06:59 +00005241 setABI("aapcs");
Tim Northoverd88ecb32016-01-27 19:32:40 +00005242 } else if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00005243 setABI("aapcs16");
Eric Christopher0e261882014-12-05 01:06:59 +00005244 } else {
5245 setABI("apcs-gnu");
5246 }
5247 } else if (Triple.isOSWindows()) {
5248 // FIXME: this is invalid for WindowsCE
5249 setABI("aapcs");
5250 } else {
5251 // Select the default based on the platform.
5252 switch (Triple.getEnvironment()) {
5253 case llvm::Triple::Android:
5254 case llvm::Triple::GNUEABI:
5255 case llvm::Triple::GNUEABIHF:
Rafael Espindola0fa66802016-06-24 21:35:06 +00005256 case llvm::Triple::MuslEABI:
5257 case llvm::Triple::MuslEABIHF:
Eric Christopher0e261882014-12-05 01:06:59 +00005258 setABI("aapcs-linux");
5259 break;
5260 case llvm::Triple::EABIHF:
5261 case llvm::Triple::EABI:
5262 setABI("aapcs");
5263 break;
Eric Christopher560cc4f2014-12-18 02:08:55 +00005264 case llvm::Triple::GNU:
Renato Goline84b0002015-10-08 16:43:26 +00005265 setABI("apcs-gnu");
5266 break;
Eric Christopher0e261882014-12-05 01:06:59 +00005267 default:
5268 if (Triple.getOS() == llvm::Triple::NetBSD)
5269 setABI("apcs-gnu");
Brad Smith3d648b32017-02-28 03:20:26 +00005270 else if (Triple.getOS() == llvm::Triple::OpenBSD)
5271 setABI("aapcs-linux");
Eric Christopher0e261882014-12-05 01:06:59 +00005272 else
5273 setABI("aapcs");
5274 break;
5275 }
5276 }
John McCall86353412010-08-21 22:46:04 +00005277
5278 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00005279 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005280
Renato Golin15b86152015-07-03 16:41:13 +00005281 // ARM has atomics up to 8 bytes
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005282 setAtomic();
Rafael Espindola5ab8e2e2015-07-02 15:14:10 +00005283
James Molloya7139222012-03-12 09:14:10 +00005284 // Do force alignment of members that follow zero length bitfields. If
Eric Christopher917e9522014-11-18 22:36:15 +00005285 // the alignment of the zero-length bitfield is greater than the member
5286 // that follows it, `bar', `bar' will be aligned as the type of the
James Molloya7139222012-03-12 09:14:10 +00005287 // zero length bitfield.
5288 UseZeroLengthBitfieldAlignment = true;
Saleem Abdulrasool9b5ba542016-04-10 03:19:47 +00005289
5290 if (Triple.getOS() == llvm::Triple::Linux ||
5291 Triple.getOS() == llvm::Triple::UnknownOS)
5292 this->MCountName =
5293 Opts.EABIVersion == "gnu" ? "\01__gnu_mcount_nc" : "\01mcount";
Eli Friedmanb5366062008-05-20 14:21:01 +00005294 }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00005295
Alp Toker4925ba72014-06-07 23:30:42 +00005296 StringRef getABI() const override { return ABI; }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00005297
Craig Topper3164f332014-03-11 03:39:26 +00005298 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00005299 ABI = Name;
5300
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00005301 // The defaults (above) are for AAPCS, check if we need to change them.
5302 //
5303 // FIXME: We need support for -meabi... we could just mangle it into the
5304 // name.
Tim Northover756447a2015-10-30 16:30:36 +00005305 if (Name == "apcs-gnu" || Name == "aapcs16") {
Tim Northover5627d392015-10-30 16:30:45 +00005306 setABIAPCS(Name == "aapcs16");
Rafael Espindolad6c2b722013-12-18 19:47:32 +00005307 return true;
5308 }
5309 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
5310 setABIAAPCS();
5311 return true;
5312 }
5313 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00005314 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00005315
Renato Golinf5c4dec2015-05-27 13:33:00 +00005316 // FIXME: This should be based on Arch attributes, not CPU names.
Eric Christopher8c47b422015-10-09 18:39:55 +00005317 bool
5318 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
5319 StringRef CPU,
5320 const std::vector<std::string> &FeaturesVec) const override {
5321
Mehdi Aminia0016ec2016-10-07 08:37:29 +00005322 std::vector<StringRef> TargetFeatures;
Bradley Smithb3501962015-11-16 11:16:36 +00005323 unsigned Arch = llvm::ARM::parseArch(getTriple().getArchName());
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005324
5325 // get default FPU features
Bradley Smithb3501962015-11-16 11:16:36 +00005326 unsigned FPUKind = llvm::ARM::getDefaultFPU(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005327 llvm::ARM::getFPUFeatures(FPUKind, TargetFeatures);
5328
5329 // get default Extension features
Bradley Smithb3501962015-11-16 11:16:36 +00005330 unsigned Extensions = llvm::ARM::getDefaultExtensions(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005331 llvm::ARM::getExtensionFeatures(Extensions, TargetFeatures);
5332
Mehdi Aminia0016ec2016-10-07 08:37:29 +00005333 for (auto Feature : TargetFeatures)
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005334 if (Feature[0] == '+')
Mehdi Aminia0016ec2016-10-07 08:37:29 +00005335 Features[Feature.drop_front(1)] = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005336
Eric Christopher007b0a02015-08-28 22:32:01 +00005337 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005338 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005339
Craig Topper3164f332014-03-11 03:39:26 +00005340 bool handleTargetFeatures(std::vector<std::string> &Features,
5341 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005342 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00005343 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00005344 Crypto = 0;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005345 DSP = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005346 Unaligned = 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005347 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005348 HWDiv = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005349
Ranjeet Singhac08e532015-06-24 23:39:25 +00005350 // This does not diagnose illegal cases like having both
5351 // "+vfpv2" and "+vfpv3" or having "+neon" and "+fp-only-sp".
5352 uint32_t HW_FP_remove = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005353 for (const auto &Feature : Features) {
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005354 if (Feature == "+soft-float") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00005355 SoftFloat = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005356 } else if (Feature == "+soft-float-abi") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00005357 SoftFloatABI = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005358 } else if (Feature == "+vfp2") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005359 FPU |= VFP2FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005360 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005361 } else if (Feature == "+vfp3") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005362 FPU |= VFP3FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005363 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005364 } else if (Feature == "+vfp4") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005365 FPU |= VFP4FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005366 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005367 } else if (Feature == "+fp-armv8") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00005368 FPU |= FPARMV8;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005369 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005370 } else if (Feature == "+neon") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005371 FPU |= NeonFPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005372 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005373 } else if (Feature == "+hwdiv") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005374 HWDiv |= HWDivThumb;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005375 } else if (Feature == "+hwdiv-arm") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005376 HWDiv |= HWDivARM;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005377 } else if (Feature == "+crc") {
Bernard Ogden18b57012013-10-29 09:47:51 +00005378 CRC = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005379 } else if (Feature == "+crypto") {
Tim Northover02e38602014-02-03 17:28:04 +00005380 Crypto = 1;
Artyom Skrobov05d85ae2015-10-23 17:19:02 +00005381 } else if (Feature == "+dsp") {
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005382 DSP = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005383 } else if (Feature == "+fp-only-sp") {
Matt Arsenault250024f2016-06-08 01:56:42 +00005384 HW_FP_remove |= HW_FP_DP;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005385 } else if (Feature == "+strict-align") {
5386 Unaligned = 0;
5387 } else if (Feature == "+fp16") {
5388 HW_FP |= HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005389 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00005390 }
Ranjeet Singhac08e532015-06-24 23:39:25 +00005391 HW_FP &= ~HW_FP_remove;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005392
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005393 switch (ArchVersion) {
5394 case 6:
5395 if (ArchProfile == llvm::ARM::PK_M)
5396 LDREX = 0;
5397 else if (ArchKind == llvm::ARM::AK_ARMV6K)
5398 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5399 else
5400 LDREX = LDREX_W;
5401 break;
5402 case 7:
5403 if (ArchProfile == llvm::ARM::PK_M)
5404 LDREX = LDREX_W | LDREX_H | LDREX_B ;
5405 else
5406 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5407 break;
5408 case 8:
5409 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5410 }
5411
Rafael Espindolaeb265472013-08-21 21:59:03 +00005412 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
5413 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
5414 return false;
5415 }
5416
5417 if (FPMath == FP_Neon)
5418 Features.push_back("+neonfp");
5419 else if (FPMath == FP_VFP)
5420 Features.push_back("-neonfp");
5421
Daniel Dunbar893d4752009-12-19 04:15:38 +00005422 // Remove front-end specific options which the backend handles differently.
Eric Christopher9e172d22015-05-12 01:26:21 +00005423 auto Feature =
5424 std::find(Features.begin(), Features.end(), "+soft-float-abi");
5425 if (Feature != Features.end())
5426 Features.erase(Feature);
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005427
Rafael Espindolaeb265472013-08-21 21:59:03 +00005428 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005429 }
5430
Craig Topper3164f332014-03-11 03:39:26 +00005431 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005432 return llvm::StringSwitch<bool>(Feature)
5433 .Case("arm", true)
Ben Langmuir587aeaf2015-08-07 01:59:56 +00005434 .Case("aarch32", true)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005435 .Case("softfloat", SoftFloat)
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005436 .Case("thumb", isThumb())
Amara Emerson8c3de542013-09-16 18:07:35 +00005437 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005438 .Case("hwdiv", HWDiv & HWDivThumb)
5439 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005440 .Default(false);
5441 }
Renato Golin15b86152015-07-03 16:41:13 +00005442
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005443 bool setCPU(const std::string &Name) override {
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005444 if (Name != "generic")
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00005445 setArchInfo(llvm::ARM::parseCPUArch(Name));
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005446
Renato Golin15b86152015-07-03 16:41:13 +00005447 if (ArchKind == llvm::ARM::AK_INVALID)
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005448 return false;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005449 setAtomic();
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005450 CPU = Name;
5451 return true;
5452 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005453
Craig Topper3164f332014-03-11 03:39:26 +00005454 bool setFPMath(StringRef Name) override;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005455
Craig Topper3164f332014-03-11 03:39:26 +00005456 void getTargetDefines(const LangOptions &Opts,
5457 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00005458 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005459 Builder.defineMacro("__arm");
5460 Builder.defineMacro("__arm__");
Weiming Zhaob0613132016-04-18 16:25:46 +00005461 // For bare-metal none-eabi.
5462 if (getTriple().getOS() == llvm::Triple::UnknownOS &&
5463 getTriple().getEnvironment() == llvm::Triple::EABI)
5464 Builder.defineMacro("__ELF__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00005465
Chris Lattnerecd49032009-03-02 22:27:17 +00005466 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005467 Builder.defineMacro("__REGISTER_PREFIX__", "");
Tim Northover5627d392015-10-30 16:30:45 +00005468
5469 // Unfortunately, __ARM_ARCH_7K__ is now more of an ABI descriptor. The CPU
5470 // happens to be Cortex-A7 though, so it should still get __ARM_ARCH_7A__.
Tim Northoverd88ecb32016-01-27 19:32:40 +00005471 if (getTriple().isWatchABI())
Tim Northover5627d392015-10-30 16:30:45 +00005472 Builder.defineMacro("__ARM_ARCH_7K__", "2");
5473
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005474 if (!CPUAttr.empty())
5475 Builder.defineMacro("__ARM_ARCH_" + CPUAttr + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005476
5477 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005478 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
Benjamin Kramerb42d9a52015-12-24 10:07:37 +00005479 Builder.defineMacro("__ARM_ARCH", Twine(ArchVersion));
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005480
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005481 if (ArchVersion >= 8) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005482 // ACLE 6.5.7 Crypto Extension
5483 if (Crypto)
5484 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
5485 // ACLE 6.5.8 CRC32 Extension
5486 if (CRC)
5487 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
5488 // ACLE 6.5.10 Numeric Maximum and Minimum
5489 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
5490 // ACLE 6.5.9 Directed Rounding
5491 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
James Molloy0ffb0932014-09-15 11:25:38 +00005492 }
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005493
5494 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
5495 // is not defined for the M-profile.
Bradley Smithf4affc12016-03-03 13:52:22 +00005496 // NOTE that the default profile is assumed to be 'A'
5497 if (CPUProfile.empty() || ArchProfile != llvm::ARM::PK_M)
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005498 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
5499
Bradley Smithf4affc12016-03-03 13:52:22 +00005500 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supports the original
5501 // Thumb ISA (including v6-M and v8-M Baseline). It is set to 2 if the
5502 // core supports the Thumb-2 ISA as found in the v6T2 architecture and all
5503 // v7 and v8 architectures excluding v8-M Baseline.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005504 if (supportsThumb2())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005505 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005506 else if (supportsThumb())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005507 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
5508
5509 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
5510 // instruction set such as ARM or Thumb.
5511 Builder.defineMacro("__ARM_32BIT_STATE", "1");
5512
5513 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
5514
5515 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005516 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005517 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00005518
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005519 // ACLE 6.4.3 Unaligned access supported in hardware
Eric Christopherb093d692015-10-09 18:39:59 +00005520 if (Unaligned)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005521 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Eric Christopherb093d692015-10-09 18:39:59 +00005522
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005523 // ACLE 6.4.4 LDREX/STREX
5524 if (LDREX)
5525 Builder.defineMacro("__ARM_FEATURE_LDREX", "0x" + llvm::utohexstr(LDREX));
5526
5527 // ACLE 6.4.5 CLZ
Eric Christopherb093d692015-10-09 18:39:59 +00005528 if (ArchVersion == 5 ||
5529 (ArchVersion == 6 && CPUProfile != "M") ||
5530 ArchVersion > 6)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005531 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
5532
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005533 // ACLE 6.5.1 Hardware Floating Point
5534 if (HW_FP)
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +00005535 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005536
Yi Konga44c4d72014-06-27 21:25:42 +00005537 // ACLE predefines.
5538 Builder.defineMacro("__ARM_ACLE", "200");
5539
Oliver Stannarddc2854c2015-09-03 12:40:58 +00005540 // FP16 support (we currently only support IEEE format).
5541 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
5542 Builder.defineMacro("__ARM_FP16_ARGS", "1");
5543
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005544 // ACLE 6.5.3 Fused multiply-accumulate (FMA)
Silviu Baranga632fdc52016-04-28 11:29:08 +00005545 if (ArchVersion >= 7 && (FPU & VFP4FPU))
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005546 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
5547
Mike Stump9d54bd72009-04-08 02:07:04 +00005548 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005549
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005550 // FIXME: It's more complicated than this and we don't really support
5551 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005552 // Windows on ARM does not "support" interworking
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005553 if (5 <= ArchVersion && ArchVersion <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005554 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005555
David Tweed8f676532012-10-25 13:33:01 +00005556 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00005557 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005558 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
Tim Northover862eaf82016-05-13 21:26:45 +00005559 if (!getTriple().isOSBinFormatMachO() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00005560 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005561 Builder.defineMacro("__ARM_PCS", "1");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005562 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005563
Tim Northover28fc0e12016-04-28 13:59:55 +00005564 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp" ||
5565 ABI == "aapcs16")
5566 Builder.defineMacro("__ARM_PCS_VFP", "1");
5567
Daniel Dunbar893d4752009-12-19 04:15:38 +00005568 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005569 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005570
Zijiao Ma56a83722016-08-17 02:13:33 +00005571 if (ArchKind == llvm::ARM::AK_XSCALE)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005572 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005573
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005574 if (isThumb()) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005575 Builder.defineMacro("__THUMBEL__");
5576 Builder.defineMacro("__thumb__");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005577 if (supportsThumb2())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005578 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005579 }
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005580
5581 // ACLE 6.4.9 32-bit SIMD instructions
5582 if (ArchVersion >= 6 && (CPUProfile != "M" || CPUAttr == "7EM"))
5583 Builder.defineMacro("__ARM_FEATURE_SIMD32", "1");
5584
5585 // ACLE 6.4.10 Hardware Integer Divide
Eric Christopherb093d692015-10-09 18:39:59 +00005586 if (((HWDiv & HWDivThumb) && isThumb()) ||
5587 ((HWDiv & HWDivARM) && !isThumb())) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005588 Builder.defineMacro("__ARM_FEATURE_IDIV", "1");
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005589 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005590 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005591
5592 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005593 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005594
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005595 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005596 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005597 if (FPU & VFP2FPU)
5598 Builder.defineMacro("__ARM_VFPV2__");
5599 if (FPU & VFP3FPU)
5600 Builder.defineMacro("__ARM_VFPV3__");
5601 if (FPU & VFP4FPU)
5602 Builder.defineMacro("__ARM_VFPV4__");
Tim Northoverc67803f2016-12-21 20:49:43 +00005603 if (FPU & FPARMV8)
5604 Builder.defineMacro("__ARM_FPV5__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005605 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00005606
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005607 // This only gets set when Neon instructions are actually available, unlike
5608 // the VFP define, hence the soft float and arch check. This is subtly
5609 // different from gcc, we follow the intent which was that it should be set
5610 // when Neon instructions are actually available.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005611 if ((FPU & NeonFPU) && !SoftFloat && ArchVersion >= 7) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005612 Builder.defineMacro("__ARM_NEON", "1");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005613 Builder.defineMacro("__ARM_NEON__");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005614 // current AArch32 NEON implementations do not support double-precision
5615 // floating-point even when it is present in VFP.
Eric Christopherb093d692015-10-09 18:39:59 +00005616 Builder.defineMacro("__ARM_NEON_FP",
5617 "0x" + llvm::utohexstr(HW_FP & ~HW_FP_DP));
Tim Northover5bb34ca2013-11-21 12:36:34 +00005618 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00005619
Bradley Smith0f28f0c2014-01-20 10:52:00 +00005620 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
5621 Opts.ShortWChar ? "2" : "4");
5622
5623 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5624 Opts.ShortEnums ? "1" : "4");
5625
Bradley Smithf4affc12016-03-03 13:52:22 +00005626 if (ArchVersion >= 6 && CPUAttr != "6M" && CPUAttr != "8M_BASE") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00005627 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5628 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5629 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5630 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
5631 }
Sergey Dmitrouk745f5302014-11-25 08:57:36 +00005632
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005633 // ACLE 6.4.7 DSP instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005634 if (DSP) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005635 Builder.defineMacro("__ARM_FEATURE_DSP", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005636 }
5637
5638 // ACLE 6.4.8 Saturation instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005639 bool SAT = false;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005640 if ((ArchVersion == 6 && CPUProfile != "M") || ArchVersion > 6 ) {
5641 Builder.defineMacro("__ARM_FEATURE_SAT", "1");
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005642 SAT = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005643 }
5644
5645 // ACLE 6.4.6 Q (saturation) flag
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005646 if (DSP || SAT)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005647 Builder.defineMacro("__ARM_FEATURE_QBIT", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005648
5649 if (Opts.UnsafeFPMath)
5650 Builder.defineMacro("__ARM_FP_FAST", "1");
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005651
5652 if (ArchKind == llvm::ARM::AK_ARMV8_1A)
5653 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
Chris Lattner17df24e2008-04-21 18:56:49 +00005654 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005655
Craig Topper6c03a542015-10-19 04:51:35 +00005656 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5657 return llvm::makeArrayRef(BuiltinInfo,
5658 clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner17df24e2008-04-21 18:56:49 +00005659 }
Craig Topper3164f332014-03-11 03:39:26 +00005660 bool isCLZForZeroUndef() const override { return false; }
5661 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northover5627d392015-10-30 16:30:45 +00005662 return IsAAPCS
5663 ? AAPCSABIBuiltinVaList
Tim Northoverd88ecb32016-01-27 19:32:40 +00005664 : (getTriple().isWatchABI() ? TargetInfo::CharPtrBuiltinVaList
5665 : TargetInfo::VoidPtrBuiltinVaList);
Chris Lattner17df24e2008-04-21 18:56:49 +00005666 }
Craig Topperf054e3a2015-10-19 03:52:27 +00005667 ArrayRef<const char *> getGCCRegNames() const override;
5668 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00005669 bool validateAsmConstraint(const char *&Name,
5670 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00005671 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00005672 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00005673 case 'l': // r0-r7
5674 case 'h': // r8-r15
JF Bastien750caef2016-02-19 06:54:45 +00005675 case 't': // VFP Floating point register single precision
5676 case 'w': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00005677 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00005678 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005679 case 'I':
5680 case 'J':
5681 case 'K':
5682 case 'L':
5683 case 'M':
5684 // FIXME
5685 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00005686 case 'Q': // A memory address that is a single base register.
5687 Info.setAllowsMemory();
5688 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005689 case 'U': // a memory reference...
5690 switch (Name[1]) {
5691 case 'q': // ...ARMV4 ldrsb
5692 case 'v': // ...VFP load/store (reg+constant offset)
5693 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00005694 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00005695 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00005696 case 'n': // valid address for Neon doubleword vector load/store
5697 case 'm': // valid address for Neon element and structure load/store
5698 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00005699 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005700 Info.setAllowsMemory();
5701 Name++;
5702 return true;
5703 }
Nate Begeman2908fa02008-04-22 05:03:19 +00005704 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005705 return false;
5706 }
Craig Topper3164f332014-03-11 03:39:26 +00005707 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005708 std::string R;
5709 switch (*Constraint) {
5710 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00005711 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005712 Constraint++;
5713 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00005714 case 'p': // 'p' should be translated to 'r' by default.
5715 R = std::string("r");
5716 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005717 default:
5718 return std::string(1, *Constraint);
5719 }
5720 return R;
5721 }
Akira Hatanaka987f1862014-08-22 06:05:21 +00005722 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005723 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005724 std::string &SuggestedModifier) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00005725 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00005726 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00005727
Bill Wendling9d1ee112012-10-25 23:28:48 +00005728 // Strip off constraint modifiers.
5729 while (Constraint[0] == '=' ||
5730 Constraint[0] == '+' ||
5731 Constraint[0] == '&')
5732 Constraint = Constraint.substr(1);
5733
5734 switch (Constraint[0]) {
5735 default: break;
5736 case 'r': {
5737 switch (Modifier) {
5738 default:
Tim Northover8f24b172013-12-08 15:24:55 +00005739 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00005740 case 'q':
5741 // A register of size 32 cannot fit a vector type.
5742 return false;
5743 }
5744 }
5745 }
5746
5747 return true;
5748 }
Craig Topper3164f332014-03-11 03:39:26 +00005749 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00005750 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00005751 return "";
5752 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005753
Craig Topper3164f332014-03-11 03:39:26 +00005754 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00005755 switch (CC) {
5756 case CC_AAPCS:
5757 case CC_AAPCS_VFP:
5758 case CC_Swift:
5759 return CCCR_OK;
5760 default:
5761 return CCCR_Warning;
5762 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005763 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00005764
Craig Topper3164f332014-03-11 03:39:26 +00005765 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00005766 if (RegNo == 0) return 0;
5767 if (RegNo == 1) return 1;
5768 return -1;
5769 }
Matthias Braund1e2fad2015-07-17 00:15:22 +00005770
5771 bool hasSjLjLowering() const override {
5772 return true;
5773 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005774};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005775
Rafael Espindolaeb265472013-08-21 21:59:03 +00005776bool ARMTargetInfo::setFPMath(StringRef Name) {
5777 if (Name == "neon") {
5778 FPMath = FP_Neon;
5779 return true;
5780 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
5781 Name == "vfp4") {
5782 FPMath = FP_VFP;
5783 return true;
5784 }
5785 return false;
5786}
5787
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005788const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005789 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005790 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005791 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
5792
5793 // Float registers
5794 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
5795 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
5796 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005797 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005798
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005799 // Double registers
5800 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
5801 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005802 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
5803 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005804
5805 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005806 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
5807 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005808};
5809
Craig Topperf054e3a2015-10-19 03:52:27 +00005810ArrayRef<const char *> ARMTargetInfo::getGCCRegNames() const {
5811 return llvm::makeArrayRef(GCCRegNames);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005812}
5813
5814const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005815 { { "a1" }, "r0" },
5816 { { "a2" }, "r1" },
5817 { { "a3" }, "r2" },
5818 { { "a4" }, "r3" },
5819 { { "v1" }, "r4" },
5820 { { "v2" }, "r5" },
5821 { { "v3" }, "r6" },
5822 { { "v4" }, "r7" },
5823 { { "v5" }, "r8" },
5824 { { "v6", "rfp" }, "r9" },
5825 { { "sl" }, "r10" },
5826 { { "fp" }, "r11" },
5827 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00005828 { { "r13" }, "sp" },
5829 { { "r14" }, "lr" },
5830 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005831 // The S, D and Q registers overlap, but aren't really aliases; we
5832 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005833};
5834
Craig Topperf054e3a2015-10-19 03:52:27 +00005835ArrayRef<TargetInfo::GCCRegAlias> ARMTargetInfo::getGCCRegAliases() const {
5836 return llvm::makeArrayRef(GCCRegAliases);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005837}
Chris Lattner5cc15e02010-03-03 19:03:45 +00005838
5839const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00005840#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005841 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005842#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5843 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00005844#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00005845
Craig Topper07d3b622015-08-07 05:14:44 +00005846#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005847 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005848#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005849 { #ID, TYPE, ATTRS, nullptr, LANG, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005850#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5851 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Albert Gutowski2a0621e2016-10-12 22:01:05 +00005852#define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANGS, FEATURE) \
5853 { #ID, TYPE, ATTRS, HEADER, LANGS, FEATURE },
Chris Lattner5cc15e02010-03-03 19:03:45 +00005854#include "clang/Basic/BuiltinsARM.def"
5855};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005856
5857class ARMleTargetInfo : public ARMTargetInfo {
5858public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005859 ARMleTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Matt Arsenaultf333de32016-09-07 07:08:02 +00005860 : ARMTargetInfo(Triple, Opts) {}
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005861 void getTargetDefines(const LangOptions &Opts,
5862 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005863 Builder.defineMacro("__ARMEL__");
5864 ARMTargetInfo::getTargetDefines(Opts, Builder);
5865 }
5866};
5867
5868class ARMbeTargetInfo : public ARMTargetInfo {
5869public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005870 ARMbeTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Matt Arsenaultf333de32016-09-07 07:08:02 +00005871 : ARMTargetInfo(Triple, Opts) {}
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005872 void getTargetDefines(const LangOptions &Opts,
5873 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005874 Builder.defineMacro("__ARMEB__");
5875 Builder.defineMacro("__ARM_BIG_ENDIAN");
5876 ARMTargetInfo::getTargetDefines(Opts, Builder);
5877 }
5878};
Chris Lattner17df24e2008-04-21 18:56:49 +00005879
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005880class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
5881 const llvm::Triple Triple;
5882public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005883 WindowsARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5884 : WindowsTargetInfo<ARMleTargetInfo>(Triple, Opts), Triple(Triple) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005885 WCharType = UnsignedShort;
5886 SizeType = UnsignedInt;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005887 }
5888 void getVisualStudioDefines(const LangOptions &Opts,
5889 MacroBuilder &Builder) const {
5890 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
5891
5892 // FIXME: this is invalid for WindowsCE
5893 Builder.defineMacro("_M_ARM_NT", "1");
5894 Builder.defineMacro("_M_ARMT", "_M_ARM");
5895 Builder.defineMacro("_M_THUMB", "_M_ARM");
5896
5897 assert((Triple.getArch() == llvm::Triple::arm ||
5898 Triple.getArch() == llvm::Triple::thumb) &&
5899 "invalid architecture for Windows ARM target info");
5900 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
5901 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
5902
5903 // TODO map the complete set of values
5904 // 31: VFPv3 40: VFPv4
5905 Builder.defineMacro("_M_ARM_FP", "31");
5906 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00005907 BuiltinVaListKind getBuiltinVaListKind() const override {
5908 return TargetInfo::CharPtrBuiltinVaList;
5909 }
Martell Malone7ccda3c2015-08-14 18:00:09 +00005910 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5911 switch (CC) {
5912 case CC_X86StdCall:
5913 case CC_X86ThisCall:
5914 case CC_X86FastCall:
5915 case CC_X86VectorCall:
5916 return CCCR_Ignore;
5917 case CC_C:
5918 return CCCR_OK;
5919 default:
5920 return CCCR_Warning;
5921 }
5922 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005923};
5924
5925// Windows ARM + Itanium C++ ABI Target
5926class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
5927public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005928 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple,
5929 const TargetOptions &Opts)
5930 : WindowsARMTargetInfo(Triple, Opts) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005931 TheCXXABI.set(TargetCXXABI::GenericARM);
5932 }
5933
5934 void getTargetDefines(const LangOptions &Opts,
5935 MacroBuilder &Builder) const override {
5936 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5937
5938 if (Opts.MSVCCompat)
5939 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5940 }
5941};
5942
5943// Windows ARM, MS (C++) ABI
5944class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
5945public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005946 MicrosoftARMleTargetInfo(const llvm::Triple &Triple,
5947 const TargetOptions &Opts)
5948 : WindowsARMTargetInfo(Triple, Opts) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005949 TheCXXABI.set(TargetCXXABI::Microsoft);
5950 }
5951
5952 void getTargetDefines(const LangOptions &Opts,
5953 MacroBuilder &Builder) const override {
5954 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5955 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5956 }
5957};
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005958
Yaron Keren321249c2015-07-15 13:32:23 +00005959// ARM MinGW target
5960class MinGWARMTargetInfo : public WindowsARMTargetInfo {
5961public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005962 MinGWARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5963 : WindowsARMTargetInfo(Triple, Opts) {
Yaron Keren321249c2015-07-15 13:32:23 +00005964 TheCXXABI.set(TargetCXXABI::GenericARM);
5965 }
5966
5967 void getTargetDefines(const LangOptions &Opts,
5968 MacroBuilder &Builder) const override {
5969 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5970 DefineStd(Builder, "WIN32", Opts);
5971 DefineStd(Builder, "WINNT", Opts);
5972 Builder.defineMacro("_ARM_");
5973 addMinGWDefines(Opts, Builder);
5974 }
5975};
5976
5977// ARM Cygwin target
5978class CygwinARMTargetInfo : public ARMleTargetInfo {
5979public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005980 CygwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5981 : ARMleTargetInfo(Triple, Opts) {
Yaron Keren321249c2015-07-15 13:32:23 +00005982 TLSSupported = false;
5983 WCharType = UnsignedShort;
5984 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00005985 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Yaron Keren321249c2015-07-15 13:32:23 +00005986 }
5987 void getTargetDefines(const LangOptions &Opts,
5988 MacroBuilder &Builder) const override {
5989 ARMleTargetInfo::getTargetDefines(Opts, Builder);
5990 Builder.defineMacro("_ARM_");
5991 Builder.defineMacro("__CYGWIN__");
5992 Builder.defineMacro("__CYGWIN32__");
Saleem Abdulrasool56027092017-02-07 19:00:06 +00005993 DefineStd(Builder, "unix", Opts);
Yaron Keren321249c2015-07-15 13:32:23 +00005994 if (Opts.CPlusPlus)
5995 Builder.defineMacro("_GNU_SOURCE");
5996 }
5997};
5998
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005999class DarwinARMTargetInfo : public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00006000protected:
Craig Topper3164f332014-03-11 03:39:26 +00006001 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
6002 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00006003 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00006004 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00006005
Torok Edwinb2b37c62009-06-30 17:10:35 +00006006public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006007 DarwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6008 : DarwinTargetInfo<ARMleTargetInfo>(Triple, Opts) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00006009 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00006010 // iOS always has 64-bit atomic instructions.
Eric Christopher917e9522014-11-18 22:36:15 +00006011 // FIXME: This should be based off of the target features in
6012 // ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00006013 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00006014
Tim Northoverd88ecb32016-01-27 19:32:40 +00006015 if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00006016 // Darwin on iOS uses a variant of the ARM C++ ABI.
6017 TheCXXABI.set(TargetCXXABI::WatchOS);
6018
6019 // The 32-bit ABI is silent on what ptrdiff_t should be, but given that
6020 // size_t is long, it's a bit weird for it to be int.
6021 PtrDiffType = SignedLong;
6022
6023 // BOOL should be a real boolean on the new ABI
6024 UseSignedCharForObjCBool = false;
6025 } else
6026 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00006027 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00006028};
Eli Friedmanf05b7722008-08-20 07:44:10 +00006029
Tim Northover573cbee2014-05-24 12:52:07 +00006030class AArch64TargetInfo : public TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00006031 virtual void setDataLayout() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00006032 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6033 static const char *const GCCRegNames[];
6034
James Molloy75f5f9e2014-04-16 15:33:48 +00006035 enum FPUModeEnum {
6036 FPUMode,
6037 NeonMode
6038 };
6039
6040 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00006041 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00006042 unsigned Crypto;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006043 unsigned Unaligned;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00006044 unsigned V8_1A;
James Molloy75f5f9e2014-04-16 15:33:48 +00006045
Tim Northovera2ee4332014-03-29 15:09:45 +00006046 static const Builtin::Info BuiltinInfo[];
6047
6048 std::string ABI;
6049
6050public:
Saleem Abdulrasool9b5ba542016-04-10 03:19:47 +00006051 AArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Tim Northovera2ee4332014-03-29 15:09:45 +00006052 : TargetInfo(Triple), ABI("aapcs") {
Brad Smith9aa2bf22017-02-21 23:13:09 +00006053 if (getTriple().getOS() == llvm::Triple::NetBSD ||
6054 getTriple().getOS() == llvm::Triple::OpenBSD) {
Tim Northover25e8a672014-05-24 12:51:25 +00006055 WCharType = SignedInt;
6056
6057 // NetBSD apparently prefers consistency across ARM targets to consistency
6058 // across 64-bit targets.
6059 Int64Type = SignedLongLong;
6060 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00006061 } else {
6062 WCharType = UnsignedInt;
6063 Int64Type = SignedLong;
6064 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00006065 }
6066
Tim Northovera2ee4332014-03-29 15:09:45 +00006067 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00006068 MaxVectorAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00006069 MaxAtomicInlineWidth = 128;
6070 MaxAtomicPromoteWidth = 128;
6071
Tim Northovera6a19f12015-02-06 01:25:07 +00006072 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 128;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00006073 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Tim Northovera2ee4332014-03-29 15:09:45 +00006074
Tim Northovera2ee4332014-03-29 15:09:45 +00006075 // {} in inline assembly are neon specifiers, not assembly variant
6076 // specifiers.
6077 NoAsmVariants = true;
6078
Tim Northover7ad87af2015-01-16 18:44:04 +00006079 // AAPCS gives rules for bitfields. 7.1.7 says: "The container type
6080 // contributes to the alignment of the containing aggregate in the same way
6081 // a plain (non bit-field) member of that type would, without exception for
6082 // zero-sized or anonymous bit-fields."
Tim Northover5627d392015-10-30 16:30:45 +00006083 assert(UseBitFieldTypeAlignment && "bitfields affect type alignment");
Tim Northover7ad87af2015-01-16 18:44:04 +00006084 UseZeroLengthBitfieldAlignment = true;
6085
Tim Northover573cbee2014-05-24 12:52:07 +00006086 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00006087 TheCXXABI.set(TargetCXXABI::GenericAArch64);
Saleem Abdulrasoolc066d9c2016-04-12 03:05:03 +00006088
Eric Christopherfb834a82017-02-28 17:22:05 +00006089 if (Triple.getOS() == llvm::Triple::Linux)
6090 this->MCountName = "\01_mcount";
6091 else if (Triple.getOS() == llvm::Triple::UnknownOS)
Saleem Abdulrasoolc066d9c2016-04-12 03:05:03 +00006092 this->MCountName = Opts.EABIVersion == "gnu" ? "\01_mcount" : "mcount";
Tim Northovera2ee4332014-03-29 15:09:45 +00006093 }
6094
Alp Toker4925ba72014-06-07 23:30:42 +00006095 StringRef getABI() const override { return ABI; }
David Blaikie1cbb9712014-11-14 19:09:44 +00006096 bool setABI(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006097 if (Name != "aapcs" && Name != "darwinpcs")
6098 return false;
6099
6100 ABI = Name;
6101 return true;
6102 }
6103
David Blaikie1cbb9712014-11-14 19:09:44 +00006104 bool setCPU(const std::string &Name) override {
Zijiao Ma33e95212016-07-28 06:24:48 +00006105 return Name == "generic" ||
6106 llvm::AArch64::parseCPUArch(Name) !=
6107 static_cast<unsigned>(llvm::AArch64::ArchKind::AK_INVALID);
Tim Northovera2ee4332014-03-29 15:09:45 +00006108 }
6109
Alexander Kornienko34eb2072015-04-11 02:00:23 +00006110 void getTargetDefines(const LangOptions &Opts,
6111 MacroBuilder &Builder) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006112 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00006113 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00006114
6115 // Target properties.
6116 Builder.defineMacro("_LP64");
6117 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00006118
6119 // ACLE predefines. Many can only have one possible value on v8 AArch64.
6120 Builder.defineMacro("__ARM_ACLE", "200");
6121 Builder.defineMacro("__ARM_ARCH", "8");
6122 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
6123
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006124 Builder.defineMacro("__ARM_64BIT_STATE", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00006125 Builder.defineMacro("__ARM_PCS_AAPCS64", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006126 Builder.defineMacro("__ARM_ARCH_ISA_A64", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00006127
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006128 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
6129 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
6130 Builder.defineMacro("__ARM_FEATURE_LDREX", "0xF");
6131 Builder.defineMacro("__ARM_FEATURE_IDIV", "1"); // As specified in ACLE
James Molloy0ffb0932014-09-15 11:25:38 +00006132 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006133 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
6134 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00006135
6136 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
6137
6138 // 0xe implies support for half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006139 Builder.defineMacro("__ARM_FP", "0xE");
Tim Northovera2ee4332014-03-29 15:09:45 +00006140
6141 // PCS specifies this for SysV variants, which is all we support. Other ABIs
6142 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006143 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
6144 Builder.defineMacro("__ARM_FP16_ARGS", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00006145
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00006146 if (Opts.UnsafeFPMath)
6147 Builder.defineMacro("__ARM_FP_FAST", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00006148
6149 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
6150
6151 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
6152 Opts.ShortEnums ? "1" : "4");
6153
James Molloy75f5f9e2014-04-16 15:33:48 +00006154 if (FPU == NeonMode) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006155 Builder.defineMacro("__ARM_NEON", "1");
James Molloy75f5f9e2014-04-16 15:33:48 +00006156 // 64-bit NEON supports half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006157 Builder.defineMacro("__ARM_NEON_FP", "0xE");
James Molloy75f5f9e2014-04-16 15:33:48 +00006158 }
Tim Northovera2ee4332014-03-29 15:09:45 +00006159
Bradley Smith418c5932014-05-02 15:17:51 +00006160 if (CRC)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006161 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
Bradley Smith418c5932014-05-02 15:17:51 +00006162
James Molloy75f5f9e2014-04-16 15:33:48 +00006163 if (Crypto)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006164 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
6165
6166 if (Unaligned)
6167 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Reid Klecknerd167d422015-05-06 15:31:46 +00006168
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00006169 if (V8_1A)
6170 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
6171
Reid Klecknerd167d422015-05-06 15:31:46 +00006172 // All of the __sync_(bool|val)_compare_and_swap_(1|2|4|8) builtins work.
6173 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
6174 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
6175 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
6176 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Tim Northovera2ee4332014-03-29 15:09:45 +00006177 }
6178
Craig Topper6c03a542015-10-19 04:51:35 +00006179 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6180 return llvm::makeArrayRef(BuiltinInfo,
6181 clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin);
Tim Northovera2ee4332014-03-29 15:09:45 +00006182 }
6183
David Blaikie1cbb9712014-11-14 19:09:44 +00006184 bool hasFeature(StringRef Feature) const override {
James Molloy75f5f9e2014-04-16 15:33:48 +00006185 return Feature == "aarch64" ||
6186 Feature == "arm64" ||
Ben Langmuir587aeaf2015-08-07 01:59:56 +00006187 Feature == "arm" ||
James Molloy75f5f9e2014-04-16 15:33:48 +00006188 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00006189 }
6190
James Molloy5e73df52014-04-16 15:06:20 +00006191 bool handleTargetFeatures(std::vector<std::string> &Features,
6192 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00006193 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00006194 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00006195 Crypto = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006196 Unaligned = 1;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00006197 V8_1A = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006198
Eric Christopher610fe112015-08-26 08:21:55 +00006199 for (const auto &Feature : Features) {
6200 if (Feature == "+neon")
James Molloy75f5f9e2014-04-16 15:33:48 +00006201 FPU = NeonMode;
Eric Christopher610fe112015-08-26 08:21:55 +00006202 if (Feature == "+crc")
Bradley Smith418c5932014-05-02 15:17:51 +00006203 CRC = 1;
Eric Christopher610fe112015-08-26 08:21:55 +00006204 if (Feature == "+crypto")
James Molloy75f5f9e2014-04-16 15:33:48 +00006205 Crypto = 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006206 if (Feature == "+strict-align")
6207 Unaligned = 0;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00006208 if (Feature == "+v8.1a")
6209 V8_1A = 1;
James Molloy75f5f9e2014-04-16 15:33:48 +00006210 }
6211
James Y Knightb214cbc2016-03-04 19:00:41 +00006212 setDataLayout();
James Molloy5e73df52014-04-16 15:06:20 +00006213
6214 return true;
6215 }
6216
John McCall477f2bb2016-03-03 06:39:32 +00006217 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
6218 switch (CC) {
6219 case CC_C:
6220 case CC_Swift:
Roman Levenstein35aa5ce2016-03-16 18:00:46 +00006221 case CC_PreserveMost:
6222 case CC_PreserveAll:
John McCall477f2bb2016-03-03 06:39:32 +00006223 return CCCR_OK;
6224 default:
6225 return CCCR_Warning;
6226 }
6227 }
6228
David Blaikie1cbb9712014-11-14 19:09:44 +00006229 bool isCLZForZeroUndef() const override { return false; }
Tim Northovera2ee4332014-03-29 15:09:45 +00006230
David Blaikie1cbb9712014-11-14 19:09:44 +00006231 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006232 return TargetInfo::AArch64ABIBuiltinVaList;
6233 }
6234
Craig Topperf054e3a2015-10-19 03:52:27 +00006235 ArrayRef<const char *> getGCCRegNames() const override;
6236 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00006237
Alexander Kornienko34eb2072015-04-11 02:00:23 +00006238 bool validateAsmConstraint(const char *&Name,
6239 TargetInfo::ConstraintInfo &Info) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006240 switch (*Name) {
6241 default:
6242 return false;
6243 case 'w': // Floating point and SIMD registers (V0-V31)
6244 Info.setAllowsRegister();
6245 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00006246 case 'I': // Constant that can be used with an ADD instruction
6247 case 'J': // Constant that can be used with a SUB instruction
6248 case 'K': // Constant that can be used with a 32-bit logical instruction
6249 case 'L': // Constant that can be used with a 64-bit logical instruction
6250 case 'M': // Constant that can be used as a 32-bit MOV immediate
6251 case 'N': // Constant that can be used as a 64-bit MOV immediate
6252 case 'Y': // Floating point constant zero
6253 case 'Z': // Integer constant zero
6254 return true;
6255 case 'Q': // A memory reference with base register and no offset
6256 Info.setAllowsMemory();
6257 return true;
6258 case 'S': // A symbolic address
6259 Info.setAllowsRegister();
6260 return true;
6261 case 'U':
Eric Christopher917e9522014-11-18 22:36:15 +00006262 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
6263 // Utf: A memory address suitable for ldp/stp in TF mode.
6264 // Usa: An absolute symbolic address.
6265 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
6266 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
Tim Northovera2ee4332014-03-29 15:09:45 +00006267 case 'z': // Zero register, wzr or xzr
6268 Info.setAllowsRegister();
6269 return true;
6270 case 'x': // Floating point and SIMD registers (V0-V15)
6271 Info.setAllowsRegister();
6272 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00006273 }
6274 return false;
6275 }
6276
Akira Hatanaka987f1862014-08-22 06:05:21 +00006277 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00006278 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00006279 std::string &SuggestedModifier) const override {
James Molloy8a157bf2014-07-25 10:19:47 +00006280 // Strip off constraint modifiers.
6281 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
6282 Constraint = Constraint.substr(1);
6283
6284 switch (Constraint[0]) {
6285 default:
6286 return true;
6287 case 'z':
6288 case 'r': {
6289 switch (Modifier) {
6290 case 'x':
6291 case 'w':
6292 // For now assume that the person knows what they're
6293 // doing with the modifier.
6294 return true;
6295 default:
6296 // By default an 'r' constraint will be in the 'x'
6297 // registers.
Akira Hatanaka987f1862014-08-22 06:05:21 +00006298 if (Size == 64)
6299 return true;
6300
6301 SuggestedModifier = "w";
6302 return false;
James Molloy8a157bf2014-07-25 10:19:47 +00006303 }
6304 }
6305 }
6306 }
6307
David Blaikie1cbb9712014-11-14 19:09:44 +00006308 const char *getClobbers() const override { return ""; }
Tim Northovera2ee4332014-03-29 15:09:45 +00006309
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00006310 int getEHDataRegisterNumber(unsigned RegNo) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006311 if (RegNo == 0)
6312 return 0;
6313 if (RegNo == 1)
6314 return 1;
6315 return -1;
6316 }
6317};
6318
Tim Northover573cbee2014-05-24 12:52:07 +00006319const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00006320 // 32-bit Integer registers
6321 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
6322 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
6323 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
6324
6325 // 64-bit Integer registers
6326 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
6327 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
6328 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
6329
6330 // 32-bit floating point regsisters
6331 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
6332 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
6333 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
6334
6335 // 64-bit floating point regsisters
6336 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
6337 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
6338 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
6339
6340 // Vector registers
6341 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
6342 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
6343 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
6344};
6345
Craig Topperf054e3a2015-10-19 03:52:27 +00006346ArrayRef<const char *> AArch64TargetInfo::getGCCRegNames() const {
6347 return llvm::makeArrayRef(GCCRegNames);
Tim Northovera2ee4332014-03-29 15:09:45 +00006348}
6349
Tim Northover573cbee2014-05-24 12:52:07 +00006350const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00006351 { { "w31" }, "wsp" },
6352 { { "x29" }, "fp" },
6353 { { "x30" }, "lr" },
6354 { { "x31" }, "sp" },
6355 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
6356 // don't want to substitute one of these for a different-sized one.
6357};
6358
Craig Topperf054e3a2015-10-19 03:52:27 +00006359ArrayRef<TargetInfo::GCCRegAlias> AArch64TargetInfo::getGCCRegAliases() const {
6360 return llvm::makeArrayRef(GCCRegAliases);
Tim Northovera2ee4332014-03-29 15:09:45 +00006361}
6362
Tim Northover573cbee2014-05-24 12:52:07 +00006363const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00006364#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006365 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00006366#include "clang/Basic/BuiltinsNEON.def"
6367
6368#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006369 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northover573cbee2014-05-24 12:52:07 +00006370#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00006371};
James Molloy5e73df52014-04-16 15:06:20 +00006372
Tim Northover573cbee2014-05-24 12:52:07 +00006373class AArch64leTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00006374 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00006375 if (getTriple().isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00006376 resetDataLayout("e-m:o-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006377 else
Chad Rosier4c077aa2016-07-07 20:02:25 +00006378 resetDataLayout("e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006379 }
6380
6381public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006382 AArch64leTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6383 : AArch64TargetInfo(Triple, Opts) {
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006384 }
James Molloy5e73df52014-04-16 15:06:20 +00006385 void getTargetDefines(const LangOptions &Opts,
6386 MacroBuilder &Builder) const override {
6387 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00006388 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00006389 }
6390};
6391
Tim Northover573cbee2014-05-24 12:52:07 +00006392class AArch64beTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00006393 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00006394 assert(!getTriple().isOSBinFormatMachO());
Chad Rosier4c077aa2016-07-07 20:02:25 +00006395 resetDataLayout("E-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006396 }
6397
6398public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006399 AArch64beTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6400 : AArch64TargetInfo(Triple, Opts) {}
James Molloy5e73df52014-04-16 15:06:20 +00006401 void getTargetDefines(const LangOptions &Opts,
6402 MacroBuilder &Builder) const override {
6403 Builder.defineMacro("__AARCH64EB__");
6404 Builder.defineMacro("__AARCH_BIG_ENDIAN");
6405 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00006406 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00006407 }
6408};
Tim Northovera2ee4332014-03-29 15:09:45 +00006409
Tim Northover573cbee2014-05-24 12:52:07 +00006410class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00006411protected:
6412 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
6413 MacroBuilder &Builder) const override {
6414 Builder.defineMacro("__AARCH64_SIMD__");
6415 Builder.defineMacro("__ARM64_ARCH_8__");
6416 Builder.defineMacro("__ARM_NEON__");
6417 Builder.defineMacro("__LITTLE_ENDIAN__");
6418 Builder.defineMacro("__REGISTER_PREFIX__", "");
6419 Builder.defineMacro("__arm64", "1");
6420 Builder.defineMacro("__arm64__", "1");
6421
6422 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
6423 }
6424
Tim Northovera2ee4332014-03-29 15:09:45 +00006425public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006426 DarwinAArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6427 : DarwinTargetInfo<AArch64leTargetInfo>(Triple, Opts) {
Tim Northovera2ee4332014-03-29 15:09:45 +00006428 Int64Type = SignedLongLong;
6429 WCharType = SignedInt;
6430 UseSignedCharForObjCBool = false;
6431
Tim Northovera6a19f12015-02-06 01:25:07 +00006432 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00006433 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Tim Northovera2ee4332014-03-29 15:09:45 +00006434
6435 TheCXXABI.set(TargetCXXABI::iOS64);
6436 }
6437
David Blaikie1cbb9712014-11-14 19:09:44 +00006438 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006439 return TargetInfo::CharPtrBuiltinVaList;
6440 }
6441};
Tim Northovera2ee4332014-03-29 15:09:45 +00006442
Tony Linthicum76329bf2011-12-12 21:14:55 +00006443// Hexagon abstract base class
6444class HexagonTargetInfo : public TargetInfo {
6445 static const Builtin::Info BuiltinInfo[];
6446 static const char * const GCCRegNames[];
6447 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6448 std::string CPU;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006449 bool HasHVX, HasHVXDouble;
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006450 bool UseLongCalls;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006451
Tony Linthicum76329bf2011-12-12 21:14:55 +00006452public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006453 HexagonTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6454 : TargetInfo(Triple) {
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00006455 // Specify the vector alignment explicitly. For v512x1, the calculated
6456 // alignment would be 512*alignment(i1), which is 512 bytes, instead of
6457 // the required minimum of 64 bytes.
James Y Knightb214cbc2016-03-04 19:00:41 +00006458 resetDataLayout("e-m:e-p:32:32:32-a:0-n16:32-"
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00006459 "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 +00006460 "v32:32:32-v64:64:64-v512:512:512-v1024:1024:1024-v2048:2048:2048");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006461 SizeType = UnsignedInt;
6462 PtrDiffType = SignedInt;
6463 IntPtrType = SignedInt;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006464
6465 // {} in inline assembly are packet specifiers, not assembly variant
6466 // specifiers.
6467 NoAsmVariants = true;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006468
6469 LargeArrayMinWidth = 64;
6470 LargeArrayAlign = 64;
6471 UseBitFieldTypeAlignment = true;
6472 ZeroLengthBitfieldBoundary = 32;
6473 HasHVX = HasHVXDouble = false;
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006474 UseLongCalls = false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006475 }
6476
Craig Topper6c03a542015-10-19 04:51:35 +00006477 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6478 return llvm::makeArrayRef(BuiltinInfo,
6479 clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006480 }
6481
Craig Topper3164f332014-03-11 03:39:26 +00006482 bool validateAsmConstraint(const char *&Name,
6483 TargetInfo::ConstraintInfo &Info) const override {
Krzysztof Parzyszeke0026e42016-05-18 14:56:14 +00006484 switch (*Name) {
6485 case 'v':
6486 case 'q':
6487 if (HasHVX) {
6488 Info.setAllowsRegister();
6489 return true;
6490 }
6491 break;
Krzysztof Parzyszek89fb4412016-05-20 13:50:32 +00006492 case 's':
6493 // Relocatable constant.
6494 return true;
Krzysztof Parzyszeke0026e42016-05-18 14:56:14 +00006495 }
6496 return false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006497 }
6498
Craig Topper3164f332014-03-11 03:39:26 +00006499 void getTargetDefines(const LangOptions &Opts,
6500 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006501
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006502 bool isCLZForZeroUndef() const override { return false; }
6503
Craig Topper3164f332014-03-11 03:39:26 +00006504 bool hasFeature(StringRef Feature) const override {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006505 return llvm::StringSwitch<bool>(Feature)
6506 .Case("hexagon", true)
6507 .Case("hvx", HasHVX)
6508 .Case("hvx-double", HasHVXDouble)
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006509 .Case("long-calls", UseLongCalls)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006510 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006511 }
Craig Topper3164f332014-03-11 03:39:26 +00006512
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006513 bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6514 StringRef CPU, const std::vector<std::string> &FeaturesVec)
6515 const override;
6516
6517 bool handleTargetFeatures(std::vector<std::string> &Features,
6518 DiagnosticsEngine &Diags) override;
6519
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006520 void setFeatureEnabled(llvm::StringMap<bool> &Features, StringRef Name,
6521 bool Enabled) const override;
6522
Craig Topper3164f332014-03-11 03:39:26 +00006523 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006524 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006525 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006526 ArrayRef<const char *> getGCCRegNames() const override;
6527 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00006528 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006529 return "";
6530 }
Sebastian Pop86500282012-01-13 20:37:10 +00006531
6532 static const char *getHexagonCPUSuffix(StringRef Name) {
6533 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00006534 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006535 .Case("hexagonv5", "5")
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006536 .Case("hexagonv55", "55")
6537 .Case("hexagonv60", "60")
Krzysztof Parzyszekff7f6672017-03-14 20:29:23 +00006538 .Case("hexagonv62", "62")
Craig Topperf1186c52014-05-08 06:41:40 +00006539 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00006540 }
6541
Craig Topper3164f332014-03-11 03:39:26 +00006542 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00006543 if (!getHexagonCPUSuffix(Name))
6544 return false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006545 CPU = Name;
6546 return true;
6547 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006548
6549 int getEHDataRegisterNumber(unsigned RegNo) const override {
6550 return RegNo < 2 ? RegNo : -1;
6551 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006552};
6553
6554void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006555 MacroBuilder &Builder) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006556 Builder.defineMacro("__qdsp6__", "1");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006557 Builder.defineMacro("__hexagon__", "1");
6558
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006559 if (CPU == "hexagonv4") {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006560 Builder.defineMacro("__HEXAGON_V4__");
6561 Builder.defineMacro("__HEXAGON_ARCH__", "4");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006562 if (Opts.HexagonQdsp6Compat) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006563 Builder.defineMacro("__QDSP6_V4__");
6564 Builder.defineMacro("__QDSP6_ARCH__", "4");
6565 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006566 } else if (CPU == "hexagonv5") {
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006567 Builder.defineMacro("__HEXAGON_V5__");
6568 Builder.defineMacro("__HEXAGON_ARCH__", "5");
6569 if(Opts.HexagonQdsp6Compat) {
6570 Builder.defineMacro("__QDSP6_V5__");
6571 Builder.defineMacro("__QDSP6_ARCH__", "5");
6572 }
Krzysztof Parzyszeka58ff512016-04-21 14:30:04 +00006573 } else if (CPU == "hexagonv55") {
6574 Builder.defineMacro("__HEXAGON_V55__");
6575 Builder.defineMacro("__HEXAGON_ARCH__", "55");
6576 Builder.defineMacro("__QDSP6_V55__");
6577 Builder.defineMacro("__QDSP6_ARCH__", "55");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006578 } else if (CPU == "hexagonv60") {
6579 Builder.defineMacro("__HEXAGON_V60__");
6580 Builder.defineMacro("__HEXAGON_ARCH__", "60");
6581 Builder.defineMacro("__QDSP6_V60__");
6582 Builder.defineMacro("__QDSP6_ARCH__", "60");
Krzysztof Parzyszekff7f6672017-03-14 20:29:23 +00006583 } else if (CPU == "hexagonv62") {
6584 Builder.defineMacro("__HEXAGON_V62__");
6585 Builder.defineMacro("__HEXAGON_ARCH__", "62");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006586 }
Krzysztof Parzyszek7f0756c2016-04-18 18:38:11 +00006587
6588 if (hasFeature("hvx")) {
6589 Builder.defineMacro("__HVX__");
6590 if (hasFeature("hvx-double"))
6591 Builder.defineMacro("__HVXDBL__");
6592 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006593}
6594
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006595bool HexagonTargetInfo::initFeatureMap(llvm::StringMap<bool> &Features,
6596 DiagnosticsEngine &Diags, StringRef CPU,
6597 const std::vector<std::string> &FeaturesVec) const {
6598 // Default for v60: -hvx, -hvx-double.
6599 Features["hvx"] = false;
6600 Features["hvx-double"] = false;
6601 Features["long-calls"] = false;
6602
6603 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
6604}
6605
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006606bool HexagonTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
6607 DiagnosticsEngine &Diags) {
6608 for (auto &F : Features) {
6609 if (F == "+hvx")
6610 HasHVX = true;
6611 else if (F == "-hvx")
6612 HasHVX = HasHVXDouble = false;
6613 else if (F == "+hvx-double")
6614 HasHVX = HasHVXDouble = true;
6615 else if (F == "-hvx-double")
6616 HasHVXDouble = false;
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006617
6618 if (F == "+long-calls")
6619 UseLongCalls = true;
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006620 else if (F == "-long-calls")
6621 UseLongCalls = false;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006622 }
6623 return true;
6624}
6625
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006626void HexagonTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
6627 StringRef Name, bool Enabled) const {
6628 if (Enabled) {
6629 if (Name == "hvx-double")
6630 Features["hvx"] = true;
6631 } else {
6632 if (Name == "hvx")
6633 Features["hvx-double"] = false;
6634 }
6635 Features[Name] = Enabled;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006636}
6637
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006638const char *const HexagonTargetInfo::GCCRegNames[] = {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006639 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6640 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6641 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6642 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
6643 "p0", "p1", "p2", "p3",
6644 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
6645};
6646
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006647ArrayRef<const char*> HexagonTargetInfo::getGCCRegNames() const {
Craig Topperf054e3a2015-10-19 03:52:27 +00006648 return llvm::makeArrayRef(GCCRegNames);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006649}
6650
Tony Linthicum76329bf2011-12-12 21:14:55 +00006651const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
6652 { { "sp" }, "r29" },
6653 { { "fp" }, "r30" },
6654 { { "lr" }, "r31" },
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006655};
Tony Linthicum76329bf2011-12-12 21:14:55 +00006656
Craig Topperf054e3a2015-10-19 03:52:27 +00006657ArrayRef<TargetInfo::GCCRegAlias> HexagonTargetInfo::getGCCRegAliases() const {
6658 return llvm::makeArrayRef(GCCRegAliases);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006659}
6660
6661
6662const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00006663#define BUILTIN(ID, TYPE, ATTRS) \
6664 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
6665#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
6666 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tony Linthicum76329bf2011-12-12 21:14:55 +00006667#include "clang/Basic/BuiltinsHexagon.def"
6668};
Tony Linthicum76329bf2011-12-12 21:14:55 +00006669
Jacques Pienaard964cc22016-03-28 21:02:54 +00006670class LanaiTargetInfo : public TargetInfo {
6671 // Class for Lanai (32-bit).
6672 // The CPU profiles supported by the Lanai backend
6673 enum CPUKind {
6674 CK_NONE,
6675 CK_V11,
6676 } CPU;
6677
6678 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6679 static const char *const GCCRegNames[];
6680
6681public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006682 LanaiTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6683 : TargetInfo(Triple) {
Jacques Pienaard964cc22016-03-28 21:02:54 +00006684 // Description string has to be kept in sync with backend.
6685 resetDataLayout("E" // Big endian
6686 "-m:e" // ELF name manging
6687 "-p:32:32" // 32 bit pointers, 32 bit aligned
6688 "-i64:64" // 64 bit integers, 64 bit aligned
6689 "-a:0:32" // 32 bit alignment of objects of aggregate type
6690 "-n32" // 32 bit native integer width
6691 "-S64" // 64 bit natural stack alignment
6692 );
6693
6694 // Setting RegParmMax equal to what mregparm was set to in the old
6695 // toolchain
6696 RegParmMax = 4;
6697
6698 // Set the default CPU to V11
6699 CPU = CK_V11;
6700
6701 // Temporary approach to make everything at least word-aligned and allow for
6702 // safely casting between pointers with different alignment requirements.
6703 // TODO: Remove this when there are no more cast align warnings on the
6704 // firmware.
6705 MinGlobalAlign = 32;
6706 }
6707
6708 void getTargetDefines(const LangOptions &Opts,
6709 MacroBuilder &Builder) const override {
6710 // Define __lanai__ when building for target lanai.
6711 Builder.defineMacro("__lanai__");
6712
6713 // Set define for the CPU specified.
6714 switch (CPU) {
6715 case CK_V11:
6716 Builder.defineMacro("__LANAI_V11__");
6717 break;
6718 case CK_NONE:
6719 llvm_unreachable("Unhandled target CPU");
6720 }
6721 }
6722
6723 bool setCPU(const std::string &Name) override {
6724 CPU = llvm::StringSwitch<CPUKind>(Name)
6725 .Case("v11", CK_V11)
6726 .Default(CK_NONE);
6727
6728 return CPU != CK_NONE;
6729 }
6730
6731 bool hasFeature(StringRef Feature) const override {
6732 return llvm::StringSwitch<bool>(Feature).Case("lanai", true).Default(false);
6733 }
6734
6735 ArrayRef<const char *> getGCCRegNames() const override;
6736
6737 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
6738
6739 BuiltinVaListKind getBuiltinVaListKind() const override {
6740 return TargetInfo::VoidPtrBuiltinVaList;
6741 }
6742
6743 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
6744
6745 bool validateAsmConstraint(const char *&Name,
6746 TargetInfo::ConstraintInfo &info) const override {
6747 return false;
6748 }
6749
6750 const char *getClobbers() const override { return ""; }
6751};
6752
6753const char *const LanaiTargetInfo::GCCRegNames[] = {
6754 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10",
6755 "r11", "r12", "r13", "r14", "r15", "r16", "r17", "r18", "r19", "r20", "r21",
6756 "r22", "r23", "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"};
6757
6758ArrayRef<const char *> LanaiTargetInfo::getGCCRegNames() const {
6759 return llvm::makeArrayRef(GCCRegNames);
6760}
6761
6762const TargetInfo::GCCRegAlias LanaiTargetInfo::GCCRegAliases[] = {
6763 {{"pc"}, "r2"},
6764 {{"sp"}, "r4"},
6765 {{"fp"}, "r5"},
6766 {{"rv"}, "r8"},
6767 {{"rr1"}, "r10"},
6768 {{"rr2"}, "r11"},
6769 {{"rca"}, "r15"},
6770};
6771
6772ArrayRef<TargetInfo::GCCRegAlias> LanaiTargetInfo::getGCCRegAliases() const {
6773 return llvm::makeArrayRef(GCCRegAliases);
6774}
6775
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006776// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
6777class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00006778 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6779 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006780 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00006781public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006782 SparcTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
James Y Knighta3518ad2016-01-27 01:04:51 +00006783 : TargetInfo(Triple), SoftFloat(false) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006784
Joerg Sonnenbergerd0be8dc2016-03-07 17:19:15 +00006785 int getEHDataRegisterNumber(unsigned RegNo) const override {
6786 if (RegNo == 0) return 24;
6787 if (RegNo == 1) return 25;
6788 return -1;
6789 }
6790
Craig Topper3164f332014-03-11 03:39:26 +00006791 bool handleTargetFeatures(std::vector<std::string> &Features,
6792 DiagnosticsEngine &Diags) override {
Jacob Baungard Hansen13a49372016-05-24 08:30:08 +00006793 // Check if software floating point is enabled
Eric Christopherfb481a42015-04-29 23:32:17 +00006794 auto Feature = std::find(Features.begin(), Features.end(), "+soft-float");
6795 if (Feature != Features.end()) {
6796 SoftFloat = true;
Eric Christopherfb481a42015-04-29 23:32:17 +00006797 }
Rafael Espindolaeb265472013-08-21 21:59:03 +00006798 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006799 }
Craig Topper3164f332014-03-11 03:39:26 +00006800 void getTargetDefines(const LangOptions &Opts,
6801 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006802 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006803 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006804
6805 if (SoftFloat)
6806 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00006807 }
Craig Topper3164f332014-03-11 03:39:26 +00006808
6809 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006810 return llvm::StringSwitch<bool>(Feature)
6811 .Case("softfloat", SoftFloat)
6812 .Case("sparc", true)
6813 .Default(false);
6814 }
Craig Topper3164f332014-03-11 03:39:26 +00006815
Chris Dewhurst0381cd72016-06-15 12:44:47 +00006816 bool hasSjLjLowering() const override {
6817 return true;
6818 }
6819
Craig Topper6c03a542015-10-19 04:51:35 +00006820 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006821 // FIXME: Implement!
Craig Topper6c03a542015-10-19 04:51:35 +00006822 return None;
Gabor Greif49991682008-02-21 16:29:08 +00006823 }
Craig Topper3164f332014-03-11 03:39:26 +00006824 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006825 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00006826 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006827 ArrayRef<const char *> getGCCRegNames() const override;
6828 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00006829 bool validateAsmConstraint(const char *&Name,
6830 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006831 // FIXME: Implement!
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00006832 switch (*Name) {
6833 case 'I': // Signed 13-bit constant
6834 case 'J': // Zero
6835 case 'K': // 32-bit constant with the low 12 bits clear
6836 case 'L': // A constant in the range supported by movcc (11-bit signed imm)
6837 case 'M': // A constant in the range supported by movrcc (19-bit signed imm)
6838 case 'N': // Same as 'K' but zext (required for SIMode)
6839 case 'O': // The constant 4096
6840 return true;
6841 }
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006842 return false;
Gabor Greif49991682008-02-21 16:29:08 +00006843 }
Craig Topper3164f332014-03-11 03:39:26 +00006844 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006845 // FIXME: Implement!
6846 return "";
Gabor Greif49991682008-02-21 16:29:08 +00006847 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006848
6849 // No Sparc V7 for now, the backend doesn't support it anyway.
6850 enum CPUKind {
6851 CK_GENERIC,
6852 CK_V8,
6853 CK_SUPERSPARC,
6854 CK_SPARCLITE,
6855 CK_F934,
6856 CK_HYPERSPARC,
6857 CK_SPARCLITE86X,
6858 CK_SPARCLET,
6859 CK_TSC701,
6860 CK_V9,
6861 CK_ULTRASPARC,
6862 CK_ULTRASPARC3,
6863 CK_NIAGARA,
6864 CK_NIAGARA2,
6865 CK_NIAGARA3,
Douglas Katzman6871afc2016-03-15 22:34:02 +00006866 CK_NIAGARA4,
Douglas Katzman87da5f42016-07-25 16:36:02 +00006867 CK_MYRIAD2100,
6868 CK_MYRIAD2150,
6869 CK_MYRIAD2450,
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006870 CK_LEON2,
6871 CK_LEON2_AT697E,
6872 CK_LEON2_AT697F,
6873 CK_LEON3,
6874 CK_LEON3_UT699,
6875 CK_LEON3_GR712RC,
6876 CK_LEON4,
6877 CK_LEON4_GR740
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006878 } CPU = CK_GENERIC;
6879
6880 enum CPUGeneration {
6881 CG_V8,
6882 CG_V9,
6883 };
6884
6885 CPUGeneration getCPUGeneration(CPUKind Kind) const {
6886 switch (Kind) {
6887 case CK_GENERIC:
6888 case CK_V8:
6889 case CK_SUPERSPARC:
6890 case CK_SPARCLITE:
6891 case CK_F934:
6892 case CK_HYPERSPARC:
6893 case CK_SPARCLITE86X:
6894 case CK_SPARCLET:
6895 case CK_TSC701:
Douglas Katzman87da5f42016-07-25 16:36:02 +00006896 case CK_MYRIAD2100:
6897 case CK_MYRIAD2150:
6898 case CK_MYRIAD2450:
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006899 case CK_LEON2:
6900 case CK_LEON2_AT697E:
6901 case CK_LEON2_AT697F:
6902 case CK_LEON3:
6903 case CK_LEON3_UT699:
6904 case CK_LEON3_GR712RC:
6905 case CK_LEON4:
6906 case CK_LEON4_GR740:
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006907 return CG_V8;
6908 case CK_V9:
6909 case CK_ULTRASPARC:
6910 case CK_ULTRASPARC3:
6911 case CK_NIAGARA:
6912 case CK_NIAGARA2:
6913 case CK_NIAGARA3:
6914 case CK_NIAGARA4:
6915 return CG_V9;
6916 }
Aaron Ballmana9a72852015-11-11 13:42:02 +00006917 llvm_unreachable("Unexpected CPU kind");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006918 }
6919
6920 CPUKind getCPUKind(StringRef Name) const {
6921 return llvm::StringSwitch<CPUKind>(Name)
6922 .Case("v8", CK_V8)
6923 .Case("supersparc", CK_SUPERSPARC)
6924 .Case("sparclite", CK_SPARCLITE)
6925 .Case("f934", CK_F934)
6926 .Case("hypersparc", CK_HYPERSPARC)
6927 .Case("sparclite86x", CK_SPARCLITE86X)
6928 .Case("sparclet", CK_SPARCLET)
6929 .Case("tsc701", CK_TSC701)
6930 .Case("v9", CK_V9)
6931 .Case("ultrasparc", CK_ULTRASPARC)
6932 .Case("ultrasparc3", CK_ULTRASPARC3)
6933 .Case("niagara", CK_NIAGARA)
6934 .Case("niagara2", CK_NIAGARA2)
6935 .Case("niagara3", CK_NIAGARA3)
6936 .Case("niagara4", CK_NIAGARA4)
Douglas Katzman87da5f42016-07-25 16:36:02 +00006937 .Case("ma2100", CK_MYRIAD2100)
6938 .Case("ma2150", CK_MYRIAD2150)
6939 .Case("ma2450", CK_MYRIAD2450)
6940 // FIXME: the myriad2[.n] spellings are obsolete,
6941 // but a grace period is needed to allow updating dependent builds.
6942 .Case("myriad2", CK_MYRIAD2100)
6943 .Case("myriad2.1", CK_MYRIAD2100)
6944 .Case("myriad2.2", CK_MYRIAD2150)
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006945 .Case("leon2", CK_LEON2)
6946 .Case("at697e", CK_LEON2_AT697E)
6947 .Case("at697f", CK_LEON2_AT697F)
6948 .Case("leon3", CK_LEON3)
6949 .Case("ut699", CK_LEON3_UT699)
6950 .Case("gr712rc", CK_LEON3_GR712RC)
6951 .Case("leon4", CK_LEON4)
6952 .Case("gr740", CK_LEON4_GR740)
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006953 .Default(CK_GENERIC);
6954 }
6955
6956 bool setCPU(const std::string &Name) override {
6957 CPU = getCPUKind(Name);
6958 return CPU != CK_GENERIC;
6959 }
Gabor Greif49991682008-02-21 16:29:08 +00006960};
6961
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006962const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00006963 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6964 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6965 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6966 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
6967};
6968
Craig Topperf054e3a2015-10-19 03:52:27 +00006969ArrayRef<const char *> SparcTargetInfo::getGCCRegNames() const {
6970 return llvm::makeArrayRef(GCCRegNames);
Chris Lattner9b415d62009-01-27 01:58:38 +00006971}
6972
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006973const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00006974 { { "g0" }, "r0" },
6975 { { "g1" }, "r1" },
6976 { { "g2" }, "r2" },
6977 { { "g3" }, "r3" },
6978 { { "g4" }, "r4" },
6979 { { "g5" }, "r5" },
6980 { { "g6" }, "r6" },
6981 { { "g7" }, "r7" },
6982 { { "o0" }, "r8" },
6983 { { "o1" }, "r9" },
6984 { { "o2" }, "r10" },
6985 { { "o3" }, "r11" },
6986 { { "o4" }, "r12" },
6987 { { "o5" }, "r13" },
6988 { { "o6", "sp" }, "r14" },
6989 { { "o7" }, "r15" },
6990 { { "l0" }, "r16" },
6991 { { "l1" }, "r17" },
6992 { { "l2" }, "r18" },
6993 { { "l3" }, "r19" },
6994 { { "l4" }, "r20" },
6995 { { "l5" }, "r21" },
6996 { { "l6" }, "r22" },
6997 { { "l7" }, "r23" },
6998 { { "i0" }, "r24" },
6999 { { "i1" }, "r25" },
7000 { { "i2" }, "r26" },
7001 { { "i3" }, "r27" },
7002 { { "i4" }, "r28" },
7003 { { "i5" }, "r29" },
7004 { { "i6", "fp" }, "r30" },
7005 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00007006};
7007
Craig Topperf054e3a2015-10-19 03:52:27 +00007008ArrayRef<TargetInfo::GCCRegAlias> SparcTargetInfo::getGCCRegAliases() const {
7009 return llvm::makeArrayRef(GCCRegAliases);
Chris Lattner9b415d62009-01-27 01:58:38 +00007010}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007011
7012// SPARC v8 is the 32-bit mode selected by Triple::sparc.
7013class SparcV8TargetInfo : public SparcTargetInfo {
7014public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007015 SparcV8TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7016 : SparcTargetInfo(Triple, Opts) {
James Y Knightb214cbc2016-03-04 19:00:41 +00007017 resetDataLayout("E-m:e-p:32:32-i64:64-f128:64-n32-S64");
Brad Smith73859112015-08-13 21:45:57 +00007018 // NetBSD / OpenBSD use long (same as llvm default); everyone else uses int.
7019 switch (getTriple().getOS()) {
7020 default:
James Y Knight4b4d19e2015-06-04 15:36:29 +00007021 SizeType = UnsignedInt;
7022 IntPtrType = SignedInt;
7023 PtrDiffType = SignedInt;
Brad Smith73859112015-08-13 21:45:57 +00007024 break;
7025 case llvm::Triple::NetBSD:
7026 case llvm::Triple::OpenBSD:
7027 SizeType = UnsignedLong;
7028 IntPtrType = SignedLong;
7029 PtrDiffType = SignedLong;
7030 break;
Brad Smith56495d52015-08-13 22:00:53 +00007031 }
Douglas Katzman13f4a912016-11-09 15:43:51 +00007032 // Up to 32 bits are lock-free atomic, but we're willing to do atomic ops
7033 // on up to 64 bits.
7034 MaxAtomicPromoteWidth = 64;
7035 MaxAtomicInlineWidth = 32;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007036 }
7037
Craig Topper3164f332014-03-11 03:39:26 +00007038 void getTargetDefines(const LangOptions &Opts,
7039 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007040 SparcTargetInfo::getTargetDefines(Opts, Builder);
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00007041 switch (getCPUGeneration(CPU)) {
7042 case CG_V8:
7043 Builder.defineMacro("__sparcv8");
7044 if (getTriple().getOS() != llvm::Triple::Solaris)
7045 Builder.defineMacro("__sparcv8__");
7046 break;
7047 case CG_V9:
7048 Builder.defineMacro("__sparcv9");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00007049 if (getTriple().getOS() != llvm::Triple::Solaris) {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00007050 Builder.defineMacro("__sparcv9__");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00007051 Builder.defineMacro("__sparc_v9__");
7052 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00007053 break;
7054 }
Douglas Katzman6871afc2016-03-15 22:34:02 +00007055 if (getTriple().getVendor() == llvm::Triple::Myriad) {
Douglas Katzman87da5f42016-07-25 16:36:02 +00007056 std::string MyriadArchValue, Myriad2Value;
7057 Builder.defineMacro("__sparc_v8__");
7058 Builder.defineMacro("__leon__");
Douglas Katzman6871afc2016-03-15 22:34:02 +00007059 switch (CPU) {
Douglas Katzman87da5f42016-07-25 16:36:02 +00007060 case CK_MYRIAD2150:
7061 MyriadArchValue = "__ma2150";
7062 Myriad2Value = "2";
Douglas Katzman6871afc2016-03-15 22:34:02 +00007063 break;
Douglas Katzman87da5f42016-07-25 16:36:02 +00007064 case CK_MYRIAD2450:
7065 MyriadArchValue = "__ma2450";
7066 Myriad2Value = "2";
Douglas Katzman6871afc2016-03-15 22:34:02 +00007067 break;
7068 default:
Douglas Katzman87da5f42016-07-25 16:36:02 +00007069 MyriadArchValue = "__ma2100";
7070 Myriad2Value = "1";
Douglas Katzman6871afc2016-03-15 22:34:02 +00007071 break;
7072 }
Douglas Katzman87da5f42016-07-25 16:36:02 +00007073 Builder.defineMacro(MyriadArchValue, "1");
7074 Builder.defineMacro(MyriadArchValue+"__", "1");
7075 Builder.defineMacro("__myriad2__", Myriad2Value);
7076 Builder.defineMacro("__myriad2", Myriad2Value);
Douglas Katzman6871afc2016-03-15 22:34:02 +00007077 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007078 }
Chris Dewhurst69fa1922016-05-04 09:33:30 +00007079
7080 bool hasSjLjLowering() const override {
7081 return true;
7082 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007083};
7084
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007085// SPARCV8el is the 32-bit little-endian mode selected by Triple::sparcel.
7086class SparcV8elTargetInfo : public SparcV8TargetInfo {
7087 public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007088 SparcV8elTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7089 : SparcV8TargetInfo(Triple, Opts) {
7090 resetDataLayout("e-m:e-p:32:32-i64:64-f128:64-n32-S64");
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007091 }
7092};
7093
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007094// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
7095class SparcV9TargetInfo : public SparcTargetInfo {
7096public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007097 SparcV9TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7098 : SparcTargetInfo(Triple, Opts) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007099 // FIXME: Support Sparc quad-precision long double?
James Y Knightb214cbc2016-03-04 19:00:41 +00007100 resetDataLayout("E-m:e-i64:64-n32:64-S128");
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00007101 // This is an LP64 platform.
7102 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00007103
7104 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00007105 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00007106 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00007107 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00007108 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00007109 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00007110
7111 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
7112 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
7113 LongDoubleWidth = 128;
7114 LongDoubleAlign = 128;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007115 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00007116 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007117 }
7118
Craig Topper3164f332014-03-11 03:39:26 +00007119 void getTargetDefines(const LangOptions &Opts,
7120 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007121 SparcTargetInfo::getTargetDefines(Opts, Builder);
7122 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00007123 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00007124 // Solaris doesn't need these variants, but the BSDs do.
7125 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00007126 Builder.defineMacro("__sparc64__");
7127 Builder.defineMacro("__sparc_v9__");
7128 Builder.defineMacro("__sparcv9__");
7129 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007130 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00007131
Craig Topper3164f332014-03-11 03:39:26 +00007132 bool setCPU(const std::string &Name) override {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00007133 if (!SparcTargetInfo::setCPU(Name))
7134 return false;
7135 return getCPUGeneration(CPU) == CG_V9;
Roman Divackyb1ae3d42014-02-25 18:35:30 +00007136 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007137};
7138
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007139class SystemZTargetInfo : public TargetInfo {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007140 static const Builtin::Info BuiltinInfo[];
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007141 static const char *const GCCRegNames[];
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007142 std::string CPU;
7143 bool HasTransactionalExecution;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007144 bool HasVector;
Ulrich Weigand47445072013-05-06 16:26:41 +00007145
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007146public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007147 SystemZTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Eric Christopherb093d692015-10-09 18:39:59 +00007148 : TargetInfo(Triple), CPU("z10"), HasTransactionalExecution(false),
7149 HasVector(false) {
Ulrich Weigand881497a2015-03-30 13:50:21 +00007150 IntMaxType = SignedLong;
7151 Int64Type = SignedLong;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007152 TLSSupported = true;
7153 IntWidth = IntAlign = 32;
7154 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
7155 PointerWidth = PointerAlign = 64;
7156 LongDoubleWidth = 128;
7157 LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007158 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Ulrich Weigandca3cb7f2015-04-21 17:29:35 +00007159 DefaultAlignForAttributeAligned = 64;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007160 MinGlobalAlign = 16;
James Y Knightb214cbc2016-03-04 19:00:41 +00007161 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 +00007162 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
7163 }
7164 void getTargetDefines(const LangOptions &Opts,
7165 MacroBuilder &Builder) const override {
7166 Builder.defineMacro("__s390__");
7167 Builder.defineMacro("__s390x__");
7168 Builder.defineMacro("__zarch__");
7169 Builder.defineMacro("__LONG_DOUBLE_128__");
Ulrich Weigandb038a522016-02-05 21:34:28 +00007170
Ulrich Weigand82a86cb2017-02-06 17:04:22 +00007171 const std::string ISARev = llvm::StringSwitch<std::string>(CPU)
7172 .Cases("arch8", "z10", "8")
7173 .Cases("arch9", "z196", "9")
7174 .Cases("arch10", "zEC12", "10")
7175 .Cases("arch11", "z13", "11")
7176 .Default("");
7177 if (!ISARev.empty())
7178 Builder.defineMacro("__ARCH__", ISARev);
7179
Ulrich Weigandb038a522016-02-05 21:34:28 +00007180 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
7181 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
7182 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
7183 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
7184
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007185 if (HasTransactionalExecution)
7186 Builder.defineMacro("__HTM__");
Ulrich Weigand82a86cb2017-02-06 17:04:22 +00007187 if (HasVector)
7188 Builder.defineMacro("__VX__");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00007189 if (Opts.ZVector)
7190 Builder.defineMacro("__VEC__", "10301");
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007191 }
Craig Topper6c03a542015-10-19 04:51:35 +00007192 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7193 return llvm::makeArrayRef(BuiltinInfo,
7194 clang::SystemZ::LastTSBuiltin-Builtin::FirstTSBuiltin);
Ulrich Weigand47445072013-05-06 16:26:41 +00007195 }
7196
Craig Topperf054e3a2015-10-19 03:52:27 +00007197 ArrayRef<const char *> getGCCRegNames() const override;
7198 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007199 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00007200 return None;
Ulrich Weigand47445072013-05-06 16:26:41 +00007201 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007202 bool validateAsmConstraint(const char *&Name,
7203 TargetInfo::ConstraintInfo &info) const override;
7204 const char *getClobbers() const override {
7205 // FIXME: Is this really right?
7206 return "";
7207 }
7208 BuiltinVaListKind getBuiltinVaListKind() const override {
7209 return TargetInfo::SystemZBuiltinVaList;
7210 }
7211 bool setCPU(const std::string &Name) override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007212 CPU = Name;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007213 bool CPUKnown = llvm::StringSwitch<bool>(Name)
7214 .Case("z10", true)
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007215 .Case("arch8", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007216 .Case("z196", true)
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007217 .Case("arch9", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007218 .Case("zEC12", true)
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007219 .Case("arch10", true)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007220 .Case("z13", true)
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007221 .Case("arch11", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007222 .Default(false);
7223
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007224 return CPUKnown;
7225 }
Eric Christopher8c47b422015-10-09 18:39:55 +00007226 bool
7227 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7228 StringRef CPU,
7229 const std::vector<std::string> &FeaturesVec) const override {
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007230 if (CPU == "zEC12" || CPU == "arch10")
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007231 Features["transactional-execution"] = true;
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007232 if (CPU == "z13" || CPU == "arch11") {
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007233 Features["transactional-execution"] = true;
7234 Features["vector"] = true;
7235 }
Eric Christopher007b0a02015-08-28 22:32:01 +00007236 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007237 }
7238
7239 bool handleTargetFeatures(std::vector<std::string> &Features,
7240 DiagnosticsEngine &Diags) override {
7241 HasTransactionalExecution = false;
Eric Christopher610fe112015-08-26 08:21:55 +00007242 for (const auto &Feature : Features) {
7243 if (Feature == "+transactional-execution")
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007244 HasTransactionalExecution = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007245 else if (Feature == "+vector")
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007246 HasVector = true;
7247 }
7248 // If we use the vector ABI, vector types are 64-bit aligned.
7249 if (HasVector) {
7250 MaxVectorAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00007251 resetDataLayout("E-m:e-i1:8:16-i8:8:16-i64:64-f128:64"
7252 "-v128:64-a:8:16-n32:64");
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007253 }
7254 return true;
7255 }
7256
7257 bool hasFeature(StringRef Feature) const override {
7258 return llvm::StringSwitch<bool>(Feature)
Ulrich Weigandcc673442015-04-01 14:15:35 +00007259 .Case("systemz", true)
7260 .Case("htm", HasTransactionalExecution)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007261 .Case("vx", HasVector)
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007262 .Default(false);
7263 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007264
Bryan Chane3f1ed52016-04-28 13:56:43 +00007265 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
7266 switch (CC) {
7267 case CC_C:
7268 case CC_Swift:
7269 return CCCR_OK;
7270 default:
7271 return CCCR_Warning;
7272 }
7273 }
7274
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007275 StringRef getABI() const override {
7276 if (HasVector)
7277 return "vector";
7278 return "";
7279 }
Ulrich Weigand47fd2532015-06-16 15:21:47 +00007280
7281 bool useFloat128ManglingForLongDouble() const override {
7282 return true;
7283 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007284};
7285
7286const Builtin::Info SystemZTargetInfo::BuiltinInfo[] = {
7287#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00007288 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Jonas Paulsson3ace74a2016-03-30 15:51:24 +00007289#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
7290 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007291#include "clang/Basic/BuiltinsSystemZ.def"
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007292};
7293
7294const char *const SystemZTargetInfo::GCCRegNames[] = {
7295 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
7296 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
7297 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
7298 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
7299};
7300
Craig Topperf054e3a2015-10-19 03:52:27 +00007301ArrayRef<const char *> SystemZTargetInfo::getGCCRegNames() const {
7302 return llvm::makeArrayRef(GCCRegNames);
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007303}
7304
7305bool SystemZTargetInfo::
7306validateAsmConstraint(const char *&Name,
7307 TargetInfo::ConstraintInfo &Info) const {
7308 switch (*Name) {
7309 default:
7310 return false;
7311
7312 case 'a': // Address register
7313 case 'd': // Data register (equivalent to 'r')
7314 case 'f': // Floating-point register
7315 Info.setAllowsRegister();
7316 return true;
7317
7318 case 'I': // Unsigned 8-bit constant
7319 case 'J': // Unsigned 12-bit constant
7320 case 'K': // Signed 16-bit constant
7321 case 'L': // Signed 20-bit displacement (on all targets we support)
7322 case 'M': // 0x7fffffff
7323 return true;
7324
7325 case 'Q': // Memory with base and unsigned 12-bit displacement
7326 case 'R': // Likewise, plus an index
7327 case 'S': // Memory with base and signed 20-bit displacement
7328 case 'T': // Likewise, plus an index
7329 Info.setAllowsMemory();
7330 return true;
7331 }
7332}
Ulrich Weigand47445072013-05-06 16:26:41 +00007333
Eric Christopherc48497a2015-09-18 21:26:24 +00007334class MSP430TargetInfo : public TargetInfo {
7335 static const char *const GCCRegNames[];
Anton Korobeynikova0f54372009-05-03 13:43:08 +00007336
Eric Christopherc48497a2015-09-18 21:26:24 +00007337public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007338 MSP430TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7339 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007340 TLSSupported = false;
7341 IntWidth = 16;
7342 IntAlign = 16;
7343 LongWidth = 32;
7344 LongLongWidth = 64;
7345 LongAlign = LongLongAlign = 16;
7346 PointerWidth = 16;
7347 PointerAlign = 16;
7348 SuitableAlign = 16;
7349 SizeType = UnsignedInt;
7350 IntMaxType = SignedLongLong;
7351 IntPtrType = SignedInt;
7352 PtrDiffType = SignedInt;
7353 SigAtomicType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00007354 resetDataLayout("e-m:e-p:16:16-i32:16:32-a:16-n8:16");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00007355 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007356 void getTargetDefines(const LangOptions &Opts,
7357 MacroBuilder &Builder) const override {
7358 Builder.defineMacro("MSP430");
7359 Builder.defineMacro("__MSP430__");
7360 // FIXME: defines for different 'flavours' of MCU
7361 }
Craig Topper6c03a542015-10-19 04:51:35 +00007362 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00007363 // FIXME: Implement.
Craig Topper6c03a542015-10-19 04:51:35 +00007364 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00007365 }
7366 bool hasFeature(StringRef Feature) const override {
7367 return Feature == "msp430";
7368 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007369 ArrayRef<const char *> getGCCRegNames() const override;
7370 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00007371 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00007372 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00007373 }
7374 bool validateAsmConstraint(const char *&Name,
7375 TargetInfo::ConstraintInfo &info) const override {
7376 // FIXME: implement
7377 switch (*Name) {
7378 case 'K': // the constant 1
7379 case 'L': // constant -1^20 .. 1^19
7380 case 'M': // constant 1-4:
Eli Friedmana9c3d712009-08-19 20:47:07 +00007381 return true;
7382 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007383 // No target constraints for now.
7384 return false;
7385 }
7386 const char *getClobbers() const override {
7387 // FIXME: Is this really right?
7388 return "";
7389 }
7390 BuiltinVaListKind getBuiltinVaListKind() const override {
7391 // FIXME: implement
7392 return TargetInfo::CharPtrBuiltinVaList;
7393 }
7394};
7395
7396const char *const MSP430TargetInfo::GCCRegNames[] = {
7397 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
7398 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"};
7399
Craig Topperf054e3a2015-10-19 03:52:27 +00007400ArrayRef<const char *> MSP430TargetInfo::getGCCRegNames() const {
7401 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00007402}
7403
7404// LLVM and Clang cannot be used directly to output native binaries for
7405// target, but is used to compile C code to llvm bitcode with correct
7406// type and alignment information.
7407//
7408// TCE uses the llvm bitcode as input and uses it for generating customized
7409// target processor and program binary. TCE co-design environment is
7410// publicly available in http://tce.cs.tut.fi
7411
7412static const unsigned TCEOpenCLAddrSpaceMap[] = {
7413 3, // opencl_global
7414 4, // opencl_local
7415 5, // opencl_constant
7416 // FIXME: generic has to be added to the target
7417 0, // opencl_generic
7418 0, // cuda_device
7419 0, // cuda_constant
7420 0 // cuda_shared
7421};
7422
7423class TCETargetInfo : public TargetInfo {
7424public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007425 TCETargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7426 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007427 TLSSupported = false;
7428 IntWidth = 32;
7429 LongWidth = LongLongWidth = 32;
7430 PointerWidth = 32;
7431 IntAlign = 32;
7432 LongAlign = LongLongAlign = 32;
7433 PointerAlign = 32;
7434 SuitableAlign = 32;
7435 SizeType = UnsignedInt;
7436 IntMaxType = SignedLong;
7437 IntPtrType = SignedInt;
7438 PtrDiffType = SignedInt;
7439 FloatWidth = 32;
7440 FloatAlign = 32;
7441 DoubleWidth = 32;
7442 DoubleAlign = 32;
7443 LongDoubleWidth = 32;
7444 LongDoubleAlign = 32;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007445 FloatFormat = &llvm::APFloat::IEEEsingle();
7446 DoubleFormat = &llvm::APFloat::IEEEsingle();
7447 LongDoubleFormat = &llvm::APFloat::IEEEsingle();
Pekka Jaaskelainen67354482016-11-16 15:22:31 +00007448 resetDataLayout("E-p:32:32:32-i1:8:8-i8:8:32-"
7449 "i16:16:32-i32:32:32-i64:32:32-"
7450 "f32:32:32-f64:32:32-v64:32:32-"
7451 "v128:32:32-v256:32:32-v512:32:32-"
7452 "v1024:32:32-a0:0:32-n32");
Eric Christopherc48497a2015-09-18 21:26:24 +00007453 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
7454 UseAddrSpaceMapMangling = true;
7455 }
7456
7457 void getTargetDefines(const LangOptions &Opts,
7458 MacroBuilder &Builder) const override {
7459 DefineStd(Builder, "tce", Opts);
7460 Builder.defineMacro("__TCE__");
7461 Builder.defineMacro("__TCE_V1__");
7462 }
7463 bool hasFeature(StringRef Feature) const override { return Feature == "tce"; }
7464
Craig Topper6c03a542015-10-19 04:51:35 +00007465 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007466 const char *getClobbers() const override { return ""; }
7467 BuiltinVaListKind getBuiltinVaListKind() const override {
7468 return TargetInfo::VoidPtrBuiltinVaList;
7469 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007470 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007471 bool validateAsmConstraint(const char *&Name,
7472 TargetInfo::ConstraintInfo &info) const override {
7473 return true;
7474 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007475 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7476 return None;
7477 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007478};
Eli Friedmana9c3d712009-08-19 20:47:07 +00007479
Pekka Jaaskelainen67354482016-11-16 15:22:31 +00007480class TCELETargetInfo : public TCETargetInfo {
7481public:
7482 TCELETargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7483 : TCETargetInfo(Triple, Opts) {
7484 BigEndian = false;
7485
7486 resetDataLayout("e-p:32:32:32-i1:8:8-i8:8:32-"
7487 "i16:16:32-i32:32:32-i64:32:32-"
7488 "f32:32:32-f64:32:32-v64:32:32-"
7489 "v128:32:32-v256:32:32-v512:32:32-"
7490 "v1024:32:32-a0:0:32-n32");
7491
7492 }
7493
7494 virtual void getTargetDefines(const LangOptions &Opts,
7495 MacroBuilder &Builder) const {
7496 DefineStd(Builder, "tcele", Opts);
7497 Builder.defineMacro("__TCE__");
7498 Builder.defineMacro("__TCE_V1__");
7499 Builder.defineMacro("__TCELE__");
7500 Builder.defineMacro("__TCELE_V1__");
7501 }
7502
7503};
7504
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007505class BPFTargetInfo : public TargetInfo {
7506public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007507 BPFTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7508 : TargetInfo(Triple) {
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007509 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
7510 SizeType = UnsignedLong;
7511 PtrDiffType = SignedLong;
7512 IntPtrType = SignedLong;
7513 IntMaxType = SignedLong;
7514 Int64Type = SignedLong;
7515 RegParmMax = 5;
7516 if (Triple.getArch() == llvm::Triple::bpfeb) {
James Y Knightb214cbc2016-03-04 19:00:41 +00007517 resetDataLayout("E-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007518 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00007519 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007520 }
7521 MaxAtomicPromoteWidth = 64;
7522 MaxAtomicInlineWidth = 64;
7523 TLSSupported = false;
7524 }
7525 void getTargetDefines(const LangOptions &Opts,
7526 MacroBuilder &Builder) const override {
7527 DefineStd(Builder, "bpf", Opts);
7528 Builder.defineMacro("__BPF__");
7529 }
7530 bool hasFeature(StringRef Feature) const override {
7531 return Feature == "bpf";
7532 }
7533
Craig Topper6c03a542015-10-19 04:51:35 +00007534 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007535 const char *getClobbers() const override {
7536 return "";
7537 }
7538 BuiltinVaListKind getBuiltinVaListKind() const override {
7539 return TargetInfo::VoidPtrBuiltinVaList;
7540 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007541 ArrayRef<const char *> getGCCRegNames() const override {
7542 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007543 }
7544 bool validateAsmConstraint(const char *&Name,
7545 TargetInfo::ConstraintInfo &info) const override {
7546 return true;
7547 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007548 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7549 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007550 }
7551};
7552
Daniel Sanders4672af62016-05-27 11:51:02 +00007553class MipsTargetInfo : public TargetInfo {
7554 void setDataLayout() {
Daniel Sanders55e40692016-06-03 10:11:01 +00007555 StringRef Layout;
7556
7557 if (ABI == "o32")
7558 Layout = "m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
7559 else if (ABI == "n32")
Daniel Sanders6a738832016-07-19 10:49:03 +00007560 Layout = "m:e-p:32:32-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Daniel Sanders55e40692016-06-03 10:11:01 +00007561 else if (ABI == "n64")
Daniel Sanders6a738832016-07-19 10:49:03 +00007562 Layout = "m:e-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Daniel Sanders55e40692016-06-03 10:11:01 +00007563 else
7564 llvm_unreachable("Invalid ABI");
7565
7566 if (BigEndian)
7567 resetDataLayout(("E-" + Layout).str());
7568 else
7569 resetDataLayout(("e-" + Layout).str());
Daniel Sanders4672af62016-05-27 11:51:02 +00007570 }
7571
Akira Hatanaka9064e362013-10-29 18:30:33 +00007572
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00007573 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007574 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00007575 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00007576 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007577 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00007578 bool IsSingleFloat;
Simon Dardisdf827a72017-02-21 16:01:00 +00007579 bool IsNoABICalls;
7580 bool CanUseBSDABICalls;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007581 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00007582 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007583 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007584 enum DspRevEnum {
7585 NoDSP, DSP1, DSP2
7586 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00007587 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007588
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007589protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00007590 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007591 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007592
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007593public:
Daniel Sanders4672af62016-05-27 11:51:02 +00007594 MipsTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007595 : TargetInfo(Triple), IsMips16(false), IsMicromips(false),
Simon Dardisdf827a72017-02-21 16:01:00 +00007596 IsNan2008(false), IsSingleFloat(false), IsNoABICalls(false),
7597 CanUseBSDABICalls(false), FloatABI(HardFloat), DspRev(NoDSP),
7598 HasMSA(false), HasFP64(false) {
Zoran Jovanovic26a12162015-02-18 15:21:35 +00007599 TheCXXABI.set(TargetCXXABI::GenericMIPS);
Daniel Sanders4672af62016-05-27 11:51:02 +00007600
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007601 setABI((getTriple().getArch() == llvm::Triple::mips ||
7602 getTriple().getArch() == llvm::Triple::mipsel)
7603 ? "o32"
7604 : "n64");
7605
7606 CPU = ABI == "o32" ? "mips32r2" : "mips64r2";
Simon Dardisdf827a72017-02-21 16:01:00 +00007607
7608 CanUseBSDABICalls = Triple.getOS() == llvm::Triple::FreeBSD ||
7609 Triple.getOS() == llvm::Triple::OpenBSD;
Zoran Jovanovic26a12162015-02-18 15:21:35 +00007610 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007611
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007612 bool isNaN2008Default() const {
7613 return CPU == "mips32r6" || CPU == "mips64r6";
7614 }
7615
7616 bool isFP64Default() const {
7617 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
7618 }
7619
Petar Jovanovicd55ae6b2015-02-26 18:19:22 +00007620 bool isNan2008() const override {
7621 return IsNan2008;
7622 }
7623
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007624 bool processorSupportsGPR64() const {
7625 return llvm::StringSwitch<bool>(CPU)
7626 .Case("mips3", true)
7627 .Case("mips4", true)
7628 .Case("mips5", true)
7629 .Case("mips64", true)
7630 .Case("mips64r2", true)
7631 .Case("mips64r3", true)
7632 .Case("mips64r5", true)
7633 .Case("mips64r6", true)
7634 .Case("octeon", true)
7635 .Default(false);
7636 return false;
7637 }
7638
Alp Toker4925ba72014-06-07 23:30:42 +00007639 StringRef getABI() const override { return ABI; }
Daniel Sanders4672af62016-05-27 11:51:02 +00007640 bool setABI(const std::string &Name) override {
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007641 if (Name == "o32") {
7642 setO32ABITypes();
7643 ABI = Name;
7644 return true;
Daniel Sanders4672af62016-05-27 11:51:02 +00007645 }
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007646
7647 if (Name == "n32") {
7648 setN32ABITypes();
7649 ABI = Name;
7650 return true;
7651 }
7652 if (Name == "n64") {
7653 setN64ABITypes();
7654 ABI = Name;
7655 return true;
Daniel Sanders4672af62016-05-27 11:51:02 +00007656 }
7657 return false;
7658 }
7659
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007660 void setO32ABITypes() {
7661 Int64Type = SignedLongLong;
7662 IntMaxType = Int64Type;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007663 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007664 LongDoubleWidth = LongDoubleAlign = 64;
7665 LongWidth = LongAlign = 32;
7666 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
7667 PointerWidth = PointerAlign = 32;
7668 PtrDiffType = SignedInt;
7669 SizeType = UnsignedInt;
7670 SuitableAlign = 64;
7671 }
7672
7673 void setN32N64ABITypes() {
7674 LongDoubleWidth = LongDoubleAlign = 128;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007675 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007676 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
7677 LongDoubleWidth = LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007678 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007679 }
7680 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
7681 SuitableAlign = 128;
7682 }
7683
Daniel Sanders4672af62016-05-27 11:51:02 +00007684 void setN64ABITypes() {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007685 setN32N64ABITypes();
Brad Smith8e55bd52017-03-06 23:48:31 +00007686 if (getTriple().getOS() == llvm::Triple::OpenBSD) {
7687 Int64Type = SignedLongLong;
7688 } else {
7689 Int64Type = SignedLong;
7690 }
Daniel Sanders4672af62016-05-27 11:51:02 +00007691 IntMaxType = Int64Type;
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007692 LongWidth = LongAlign = 64;
7693 PointerWidth = PointerAlign = 64;
7694 PtrDiffType = SignedLong;
7695 SizeType = UnsignedLong;
Daniel Sanders4672af62016-05-27 11:51:02 +00007696 }
7697
7698 void setN32ABITypes() {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007699 setN32N64ABITypes();
Daniel Sanders4672af62016-05-27 11:51:02 +00007700 Int64Type = SignedLongLong;
7701 IntMaxType = Int64Type;
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007702 LongWidth = LongAlign = 32;
7703 PointerWidth = PointerAlign = 32;
7704 PtrDiffType = SignedInt;
7705 SizeType = UnsignedInt;
Daniel Sanders4672af62016-05-27 11:51:02 +00007706 }
7707
Craig Topper3164f332014-03-11 03:39:26 +00007708 bool setCPU(const std::string &Name) override {
Eric Christopher0b26a612010-03-02 02:41:08 +00007709 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007710 return llvm::StringSwitch<bool>(Name)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007711 .Case("mips1", true)
7712 .Case("mips2", true)
Simon Atanasyan26610c52014-07-04 12:36:56 +00007713 .Case("mips3", true)
7714 .Case("mips4", true)
7715 .Case("mips5", true)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007716 .Case("mips32", true)
7717 .Case("mips32r2", true)
7718 .Case("mips32r3", true)
7719 .Case("mips32r5", true)
7720 .Case("mips32r6", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007721 .Case("mips64", true)
7722 .Case("mips64r2", true)
Simon Atanasyan162feb52015-02-20 23:37:40 +00007723 .Case("mips64r3", true)
7724 .Case("mips64r5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007725 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00007726 .Case("octeon", true)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007727 .Case("p5600", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007728 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00007729 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00007730 const std::string& getCPU() const { return CPU; }
Eric Christopher8c47b422015-10-09 18:39:55 +00007731 bool
7732 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7733 StringRef CPU,
7734 const std::vector<std::string> &FeaturesVec) const override {
Bhushan D. Attardebacb988732016-03-04 06:56:29 +00007735 if (CPU.empty())
7736 CPU = getCPU();
Simon Atanasyan4e16a422014-07-04 12:37:04 +00007737 if (CPU == "octeon")
7738 Features["mips64r2"] = Features["cnmips"] = true;
7739 else
7740 Features[CPU] = true;
Eric Christopher007b0a02015-08-28 22:32:01 +00007741 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Eric Christopher0b26a612010-03-02 02:41:08 +00007742 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007743
Craig Topper3164f332014-03-11 03:39:26 +00007744 void getTargetDefines(const LangOptions &Opts,
7745 MacroBuilder &Builder) const override {
Daniel Sanders4672af62016-05-27 11:51:02 +00007746 if (BigEndian) {
7747 DefineStd(Builder, "MIPSEB", Opts);
7748 Builder.defineMacro("_MIPSEB");
7749 } else {
7750 DefineStd(Builder, "MIPSEL", Opts);
7751 Builder.defineMacro("_MIPSEL");
7752 }
7753
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007754 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00007755 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007756 if (Opts.GNUMode)
7757 Builder.defineMacro("mips");
7758
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007759 if (ABI == "o32") {
Daniel Sanders4672af62016-05-27 11:51:02 +00007760 Builder.defineMacro("__mips", "32");
7761 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
7762 } else {
7763 Builder.defineMacro("__mips", "64");
7764 Builder.defineMacro("__mips64");
7765 Builder.defineMacro("__mips64__");
7766 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
7767 }
7768
7769 const std::string ISARev = llvm::StringSwitch<std::string>(getCPU())
7770 .Cases("mips32", "mips64", "1")
7771 .Cases("mips32r2", "mips64r2", "2")
7772 .Cases("mips32r3", "mips64r3", "3")
7773 .Cases("mips32r5", "mips64r5", "5")
7774 .Cases("mips32r6", "mips64r6", "6")
7775 .Default("");
7776 if (!ISARev.empty())
7777 Builder.defineMacro("__mips_isa_rev", ISARev);
7778
7779 if (ABI == "o32") {
7780 Builder.defineMacro("__mips_o32");
7781 Builder.defineMacro("_ABIO32", "1");
7782 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
Daniel Sanders07c86542016-05-27 14:30:23 +00007783 } else if (ABI == "n32") {
Daniel Sanders4672af62016-05-27 11:51:02 +00007784 Builder.defineMacro("__mips_n32");
7785 Builder.defineMacro("_ABIN32", "2");
7786 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
7787 } else if (ABI == "n64") {
7788 Builder.defineMacro("__mips_n64");
7789 Builder.defineMacro("_ABI64", "3");
7790 Builder.defineMacro("_MIPS_SIM", "_ABI64");
7791 } else
7792 llvm_unreachable("Invalid ABI.");
7793
Simon Dardisdf827a72017-02-21 16:01:00 +00007794 if (!IsNoABICalls) {
7795 Builder.defineMacro("__mips_abicalls");
7796 if (CanUseBSDABICalls)
7797 Builder.defineMacro("__ABICALLS__");
7798 }
7799
Simon Atanasyan683535b2012-08-29 19:14:58 +00007800 Builder.defineMacro("__REGISTER_PREFIX__", "");
7801
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007802 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007803 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00007804 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007805 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007806 case SoftFloat:
7807 Builder.defineMacro("__mips_soft_float", Twine(1));
7808 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00007809 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00007810
Simon Atanasyan16071912013-04-14 14:07:30 +00007811 if (IsSingleFloat)
7812 Builder.defineMacro("__mips_single_float", Twine(1));
7813
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007814 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
7815 Builder.defineMacro("_MIPS_FPSET",
7816 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
7817
Simon Atanasyan72244b62012-07-05 16:06:06 +00007818 if (IsMips16)
7819 Builder.defineMacro("__mips16", Twine(1));
7820
Simon Atanasyan60777612013-04-14 14:07:51 +00007821 if (IsMicromips)
7822 Builder.defineMacro("__mips_micromips", Twine(1));
7823
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007824 if (IsNan2008)
7825 Builder.defineMacro("__mips_nan2008", Twine(1));
7826
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007827 switch (DspRev) {
7828 default:
7829 break;
7830 case DSP1:
7831 Builder.defineMacro("__mips_dsp_rev", Twine(1));
7832 Builder.defineMacro("__mips_dsp", Twine(1));
7833 break;
7834 case DSP2:
7835 Builder.defineMacro("__mips_dsp_rev", Twine(2));
7836 Builder.defineMacro("__mips_dspr2", Twine(1));
7837 Builder.defineMacro("__mips_dsp", Twine(1));
7838 break;
7839 }
7840
Jack Carter44ff1e52013-08-12 17:20:29 +00007841 if (HasMSA)
7842 Builder.defineMacro("__mips_msa", Twine(1));
7843
Simon Atanasyan26f19672012-04-05 19:28:31 +00007844 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
7845 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
7846 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00007847
7848 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
7849 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Daniel Sanders5176f7e2015-12-22 12:59:30 +00007850
7851 // These shouldn't be defined for MIPS-I but there's no need to check
7852 // for that since MIPS-I isn't supported.
7853 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
7854 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
7855 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007856
7857 // 32-bit MIPS processors don't have the necessary lld/scd instructions
7858 // found in 64-bit processors. In the case of O32 on a 64-bit processor,
7859 // the instructions exist but using them violates the ABI since they
7860 // require 64-bit GPRs and O32 only supports 32-bit GPRs.
7861 if (ABI == "n32" || ABI == "n64")
Daniel Sanders4672af62016-05-27 11:51:02 +00007862 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007863 }
7864
Craig Topper6c03a542015-10-19 04:51:35 +00007865 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7866 return llvm::makeArrayRef(BuiltinInfo,
7867 clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin);
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007868 }
Craig Topper3164f332014-03-11 03:39:26 +00007869 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00007870 return llvm::StringSwitch<bool>(Feature)
7871 .Case("mips", true)
7872 .Case("fp64", HasFP64)
7873 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00007874 }
Craig Topper3164f332014-03-11 03:39:26 +00007875 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00007876 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007877 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007878 ArrayRef<const char *> getGCCRegNames() const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00007879 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00007880 // CPU register names
7881 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007882 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
7883 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
7884 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00007885 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
7886 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007887 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
7888 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
7889 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
7890 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00007891 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007892 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Hrvoje Varga14c42ee2016-03-29 12:46:16 +00007893 "$fcc5","$fcc6","$fcc7","$ac1hi","$ac1lo","$ac2hi","$ac2lo",
7894 "$ac3hi","$ac3lo",
Daniel Sanders8b59af12013-11-12 12:56:01 +00007895 // MSA register names
7896 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
7897 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
7898 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
7899 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
7900 // MSA control register names
7901 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
7902 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007903 };
Craig Topperf054e3a2015-10-19 03:52:27 +00007904 return llvm::makeArrayRef(GCCRegNames);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007905 }
Craig Topper3164f332014-03-11 03:39:26 +00007906 bool validateAsmConstraint(const char *&Name,
7907 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007908 switch (*Name) {
7909 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00007910 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007911 case 'r': // CPU registers.
7912 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00007913 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007914 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00007915 case 'c': // $25 for indirect jumps
7916 case 'l': // lo register
7917 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007918 Info.setAllowsRegister();
7919 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00007920 case 'I': // Signed 16-bit constant
7921 case 'J': // Integer 0
7922 case 'K': // Unsigned 16-bit constant
7923 case 'L': // Signed 32-bit constant, lower 16-bit zeros (for lui)
7924 case 'M': // Constants not loadable via lui, addiu, or ori
7925 case 'N': // Constant -1 to -65535
7926 case 'O': // A signed 15-bit constant
7927 case 'P': // A constant between 1 go 65535
7928 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00007929 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00007930 Info.setAllowsMemory();
7931 return true;
Daniel Sanders48fa39e2015-03-30 13:47:23 +00007932 case 'Z':
7933 if (Name[1] == 'C') { // An address usable by ll, and sc.
7934 Info.setAllowsMemory();
7935 Name++; // Skip over 'Z'.
7936 return true;
7937 }
7938 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007939 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007940 }
7941
Daniel Sanders48fa39e2015-03-30 13:47:23 +00007942 std::string convertConstraint(const char *&Constraint) const override {
7943 std::string R;
7944 switch (*Constraint) {
7945 case 'Z': // Two-character constraint; add "^" hint for later parsing.
7946 if (Constraint[1] == 'C') {
7947 R = std::string("^") + std::string(Constraint, 2);
7948 Constraint++;
7949 return R;
7950 }
7951 break;
7952 }
7953 return TargetInfo::convertConstraint(Constraint);
7954 }
7955
Craig Topper3164f332014-03-11 03:39:26 +00007956 const char *getClobbers() const override {
Toma Tabacucfab40f2015-01-12 14:41:30 +00007957 // In GCC, $1 is not widely used in generated code (it's used only in a few
7958 // specific situations), so there is no real need for users to add it to
7959 // the clobbers list if they want to use it in their inline assembly code.
7960 //
7961 // In LLVM, $1 is treated as a normal GPR and is always allocatable during
7962 // code generation, so using it in inline assembly without adding it to the
7963 // clobbers list can cause conflicts between the inline assembly code and
7964 // the surrounding generated code.
7965 //
7966 // Another problem is that LLVM is allowed to choose $1 for inline assembly
7967 // operands, which will conflict with the ".set at" assembler option (which
7968 // we use only for inline assembly, in order to maintain compatibility with
7969 // GCC) and will also conflict with the user's usage of $1.
7970 //
7971 // The easiest way to avoid these conflicts and keep $1 as an allocatable
7972 // register for generated code is to automatically clobber $1 for all inline
7973 // assembly code.
7974 //
7975 // FIXME: We should automatically clobber $1 only for inline assembly code
7976 // which actually uses it. This would allow LLVM to use $1 for inline
7977 // assembly operands if the user's assembly code doesn't use it.
Toma Tabacu99411952014-12-17 12:02:58 +00007978 return "~{$1}";
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007979 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007980
Craig Topper3164f332014-03-11 03:39:26 +00007981 bool handleTargetFeatures(std::vector<std::string> &Features,
7982 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00007983 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00007984 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007985 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00007986 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007987 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007988 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007989 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007990
Eric Christopher610fe112015-08-26 08:21:55 +00007991 for (const auto &Feature : Features) {
7992 if (Feature == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00007993 IsSingleFloat = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007994 else if (Feature == "+soft-float")
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007995 FloatABI = SoftFloat;
Eric Christopher610fe112015-08-26 08:21:55 +00007996 else if (Feature == "+mips16")
Simon Atanasyan72244b62012-07-05 16:06:06 +00007997 IsMips16 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007998 else if (Feature == "+micromips")
Simon Atanasyan60777612013-04-14 14:07:51 +00007999 IsMicromips = true;
Eric Christopher610fe112015-08-26 08:21:55 +00008000 else if (Feature == "+dsp")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00008001 DspRev = std::max(DspRev, DSP1);
Eric Christopher610fe112015-08-26 08:21:55 +00008002 else if (Feature == "+dspr2")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00008003 DspRev = std::max(DspRev, DSP2);
Eric Christopher610fe112015-08-26 08:21:55 +00008004 else if (Feature == "+msa")
Jack Carter44ff1e52013-08-12 17:20:29 +00008005 HasMSA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00008006 else if (Feature == "+fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00008007 HasFP64 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00008008 else if (Feature == "-fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00008009 HasFP64 = false;
Eric Christopher610fe112015-08-26 08:21:55 +00008010 else if (Feature == "+nan2008")
Simon Atanasyan22127ce2013-09-24 09:09:16 +00008011 IsNan2008 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00008012 else if (Feature == "-nan2008")
Daniel Sanders9500d2d2014-07-09 13:56:23 +00008013 IsNan2008 = false;
Simon Dardisdf827a72017-02-21 16:01:00 +00008014 else if (Feature == "+noabicalls")
8015 IsNoABICalls = true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00008016 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00008017
James Y Knightb214cbc2016-03-04 19:00:41 +00008018 setDataLayout();
Akira Hatanaka9064e362013-10-29 18:30:33 +00008019
Rafael Espindolaeb265472013-08-21 21:59:03 +00008020 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00008021 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00008022
Craig Topper3164f332014-03-11 03:39:26 +00008023 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00008024 if (RegNo == 0) return 4;
8025 if (RegNo == 1) return 5;
8026 return -1;
8027 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00008028
8029 bool isCLZForZeroUndef() const override { return false; }
Daniel Sanders4672af62016-05-27 11:51:02 +00008030
8031 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8032 static const TargetInfo::GCCRegAlias O32RegAliases[] = {
8033 {{"at"}, "$1"}, {{"v0"}, "$2"}, {{"v1"}, "$3"},
8034 {{"a0"}, "$4"}, {{"a1"}, "$5"}, {{"a2"}, "$6"},
8035 {{"a3"}, "$7"}, {{"t0"}, "$8"}, {{"t1"}, "$9"},
8036 {{"t2"}, "$10"}, {{"t3"}, "$11"}, {{"t4"}, "$12"},
8037 {{"t5"}, "$13"}, {{"t6"}, "$14"}, {{"t7"}, "$15"},
8038 {{"s0"}, "$16"}, {{"s1"}, "$17"}, {{"s2"}, "$18"},
8039 {{"s3"}, "$19"}, {{"s4"}, "$20"}, {{"s5"}, "$21"},
8040 {{"s6"}, "$22"}, {{"s7"}, "$23"}, {{"t8"}, "$24"},
8041 {{"t9"}, "$25"}, {{"k0"}, "$26"}, {{"k1"}, "$27"},
8042 {{"gp"}, "$28"}, {{"sp", "$sp"}, "$29"}, {{"fp", "$fp"}, "$30"},
8043 {{"ra"}, "$31"}};
8044 static const TargetInfo::GCCRegAlias NewABIRegAliases[] = {
8045 {{"at"}, "$1"}, {{"v0"}, "$2"}, {{"v1"}, "$3"},
8046 {{"a0"}, "$4"}, {{"a1"}, "$5"}, {{"a2"}, "$6"},
8047 {{"a3"}, "$7"}, {{"a4"}, "$8"}, {{"a5"}, "$9"},
8048 {{"a6"}, "$10"}, {{"a7"}, "$11"}, {{"t0"}, "$12"},
8049 {{"t1"}, "$13"}, {{"t2"}, "$14"}, {{"t3"}, "$15"},
8050 {{"s0"}, "$16"}, {{"s1"}, "$17"}, {{"s2"}, "$18"},
8051 {{"s3"}, "$19"}, {{"s4"}, "$20"}, {{"s5"}, "$21"},
8052 {{"s6"}, "$22"}, {{"s7"}, "$23"}, {{"t8"}, "$24"},
8053 {{"t9"}, "$25"}, {{"k0"}, "$26"}, {{"k1"}, "$27"},
8054 {{"gp"}, "$28"}, {{"sp", "$sp"}, "$29"}, {{"fp", "$fp"}, "$30"},
8055 {{"ra"}, "$31"}};
Daniel Sanders26a56ad2016-06-06 09:07:08 +00008056 if (ABI == "o32")
Daniel Sanders4672af62016-05-27 11:51:02 +00008057 return llvm::makeArrayRef(O32RegAliases);
8058 return llvm::makeArrayRef(NewABIRegAliases);
8059 }
8060
8061 bool hasInt128Type() const override {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00008062 return ABI == "n32" || ABI == "n64";
Daniel Sanders4672af62016-05-27 11:51:02 +00008063 }
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00008064
8065 bool validateTarget(DiagnosticsEngine &Diags) const override {
8066 // FIXME: It's valid to use O32 on a 64-bit CPU but the backend can't handle
8067 // this yet. It's better to fail here than on the backend assertion.
8068 if (processorSupportsGPR64() && ABI == "o32") {
8069 Diags.Report(diag::err_target_unsupported_abi) << ABI << CPU;
8070 return false;
8071 }
8072
8073 // 64-bit ABI's require 64-bit CPU's.
8074 if (!processorSupportsGPR64() && (ABI == "n32" || ABI == "n64")) {
8075 Diags.Report(diag::err_target_unsupported_abi) << ABI << CPU;
8076 return false;
8077 }
8078
8079 // FIXME: It's valid to use O32 on a mips64/mips64el triple but the backend
8080 // can't handle this yet. It's better to fail here than on the
8081 // backend assertion.
8082 if ((getTriple().getArch() == llvm::Triple::mips64 ||
8083 getTriple().getArch() == llvm::Triple::mips64el) &&
8084 ABI == "o32") {
8085 Diags.Report(diag::err_target_unsupported_abi_for_triple)
8086 << ABI << getTriple().str();
8087 return false;
8088 }
8089
8090 // FIXME: It's valid to use N32/N64 on a mips/mipsel triple but the backend
8091 // can't handle this yet. It's better to fail here than on the
8092 // backend assertion.
8093 if ((getTriple().getArch() == llvm::Triple::mips ||
8094 getTriple().getArch() == llvm::Triple::mipsel) &&
8095 (ABI == "n32" || ABI == "n64")) {
8096 Diags.Report(diag::err_target_unsupported_abi_for_triple)
8097 << ABI << getTriple().str();
8098 return false;
8099 }
8100
8101 return true;
8102 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008103};
8104
Daniel Sanders4672af62016-05-27 11:51:02 +00008105const Builtin::Info MipsTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00008106#define BUILTIN(ID, TYPE, ATTRS) \
8107 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
8108#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
8109 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00008110#include "clang/Basic/BuiltinsMips.def"
8111};
8112
Ivan Krasindd7403e2011-08-24 20:22:22 +00008113class PNaClTargetInfo : public TargetInfo {
8114public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008115 PNaClTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8116 : TargetInfo(Triple) {
Ivan Krasindd7403e2011-08-24 20:22:22 +00008117 this->LongAlign = 32;
8118 this->LongWidth = 32;
8119 this->PointerAlign = 32;
8120 this->PointerWidth = 32;
8121 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00008122 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00008123 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00008124 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00008125 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00008126 this->SizeType = TargetInfo::UnsignedInt;
8127 this->PtrDiffType = TargetInfo::SignedInt;
8128 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00008129 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00008130 }
8131
Craig Toppere6f17d02014-03-11 04:07:52 +00008132 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00008133 Builder.defineMacro("__le32__");
8134 Builder.defineMacro("__pnacl__");
8135 }
Craig Topper3164f332014-03-11 03:39:26 +00008136 void getTargetDefines(const LangOptions &Opts,
8137 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00008138 getArchDefines(Opts, Builder);
8139 }
Craig Topper3164f332014-03-11 03:39:26 +00008140 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00008141 return Feature == "pnacl";
8142 }
Craig Topper6c03a542015-10-19 04:51:35 +00008143 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Craig Topper3164f332014-03-11 03:39:26 +00008144 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00008145 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00008146 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008147 ArrayRef<const char *> getGCCRegNames() const override;
8148 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00008149 bool validateAsmConstraint(const char *&Name,
8150 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00008151 return false;
8152 }
8153
Craig Topper3164f332014-03-11 03:39:26 +00008154 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00008155 return "";
8156 }
8157};
8158
Craig Topperf054e3a2015-10-19 03:52:27 +00008159ArrayRef<const char *> PNaClTargetInfo::getGCCRegNames() const {
8160 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00008161}
8162
Craig Topperf054e3a2015-10-19 03:52:27 +00008163ArrayRef<TargetInfo::GCCRegAlias> PNaClTargetInfo::getGCCRegAliases() const {
8164 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00008165}
Ivan Krasindd7403e2011-08-24 20:22:22 +00008166
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008167// We attempt to use PNaCl (le32) frontend and Mips32EL backend.
Daniel Sanders4672af62016-05-27 11:51:02 +00008168class NaClMips32TargetInfo : public MipsTargetInfo {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008169public:
Daniel Sanders4672af62016-05-27 11:51:02 +00008170 NaClMips32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8171 : MipsTargetInfo(Triple, Opts) {}
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008172
8173 BuiltinVaListKind getBuiltinVaListKind() const override {
8174 return TargetInfo::PNaClABIBuiltinVaList;
8175 }
8176};
8177
JF Bastien643817d2014-09-12 17:52:47 +00008178class Le64TargetInfo : public TargetInfo {
8179 static const Builtin::Info BuiltinInfo[];
8180
8181public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008182 Le64TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
8183 : TargetInfo(Triple) {
JF Bastien643817d2014-09-12 17:52:47 +00008184 NoAsmVariants = true;
8185 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
8186 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00008187 resetDataLayout("e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128");
JF Bastien643817d2014-09-12 17:52:47 +00008188 }
8189
8190 void getTargetDefines(const LangOptions &Opts,
8191 MacroBuilder &Builder) const override {
Saleem Abdulrasool56027092017-02-07 19:00:06 +00008192 DefineStd(Builder, "unix", Opts);
JF Bastien643817d2014-09-12 17:52:47 +00008193 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
8194 Builder.defineMacro("__ELF__");
8195 }
Craig Topper6c03a542015-10-19 04:51:35 +00008196 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
8197 return llvm::makeArrayRef(BuiltinInfo,
8198 clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin);
JF Bastien643817d2014-09-12 17:52:47 +00008199 }
8200 BuiltinVaListKind getBuiltinVaListKind() const override {
8201 return TargetInfo::PNaClABIBuiltinVaList;
8202 }
8203 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00008204 ArrayRef<const char *> getGCCRegNames() const override {
8205 return None;
JF Bastien643817d2014-09-12 17:52:47 +00008206 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008207 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8208 return None;
JF Bastien643817d2014-09-12 17:52:47 +00008209 }
8210 bool validateAsmConstraint(const char *&Name,
8211 TargetInfo::ConstraintInfo &Info) const override {
8212 return false;
8213 }
8214
8215 bool hasProtectedVisibility() const override { return false; }
JF Bastien643817d2014-09-12 17:52:47 +00008216};
Dan Gohmanc2853072015-09-03 22:51:53 +00008217
8218class WebAssemblyTargetInfo : public TargetInfo {
8219 static const Builtin::Info BuiltinInfo[];
8220
8221 enum SIMDEnum {
8222 NoSIMD,
8223 SIMD128,
8224 } SIMDLevel;
8225
8226public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008227 explicit WebAssemblyTargetInfo(const llvm::Triple &T, const TargetOptions &)
Dan Gohmanc2853072015-09-03 22:51:53 +00008228 : TargetInfo(T), SIMDLevel(NoSIMD) {
Dan Gohmanc2853072015-09-03 22:51:53 +00008229 NoAsmVariants = true;
8230 SuitableAlign = 128;
8231 LargeArrayMinWidth = 128;
8232 LargeArrayAlign = 128;
8233 SimdDefaultAlign = 128;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00008234 SigAtomicType = SignedLong;
Dan Gohman6db46402015-11-10 21:01:46 +00008235 LongDoubleWidth = LongDoubleAlign = 128;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00008236 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Derek Schuffacdc8e62016-09-01 22:38:37 +00008237 SizeType = UnsignedInt;
8238 PtrDiffType = SignedInt;
8239 IntPtrType = SignedInt;
Dan Gohmanc2853072015-09-03 22:51:53 +00008240 }
8241
8242protected:
8243 void getTargetDefines(const LangOptions &Opts,
8244 MacroBuilder &Builder) const override {
8245 defineCPUMacros(Builder, "wasm", /*Tuning=*/false);
8246 if (SIMDLevel >= SIMD128)
8247 Builder.defineMacro("__wasm_simd128__");
8248 }
8249
8250private:
Eric Christopher8c47b422015-10-09 18:39:55 +00008251 bool
8252 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
8253 StringRef CPU,
8254 const std::vector<std::string> &FeaturesVec) const override {
Dan Gohmanc2853072015-09-03 22:51:53 +00008255 if (CPU == "bleeding-edge")
8256 Features["simd128"] = true;
8257 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
8258 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00008259 bool hasFeature(StringRef Feature) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00008260 return llvm::StringSwitch<bool>(Feature)
8261 .Case("simd128", SIMDLevel >= SIMD128)
8262 .Default(false);
8263 }
8264 bool handleTargetFeatures(std::vector<std::string> &Features,
Hans Wennborg7eb54642015-09-10 17:07:54 +00008265 DiagnosticsEngine &Diags) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00008266 for (const auto &Feature : Features) {
8267 if (Feature == "+simd128") {
8268 SIMDLevel = std::max(SIMDLevel, SIMD128);
8269 continue;
8270 }
8271 if (Feature == "-simd128") {
8272 SIMDLevel = std::min(SIMDLevel, SIMDEnum(SIMD128 - 1));
8273 continue;
8274 }
8275
8276 Diags.Report(diag::err_opt_not_valid_with_opt) << Feature
8277 << "-target-feature";
8278 return false;
8279 }
8280 return true;
8281 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00008282 bool setCPU(const std::string &Name) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00008283 return llvm::StringSwitch<bool>(Name)
8284 .Case("mvp", true)
8285 .Case("bleeding-edge", true)
8286 .Case("generic", true)
8287 .Default(false);
8288 }
Craig Topper6c03a542015-10-19 04:51:35 +00008289 ArrayRef<Builtin::Info> getTargetBuiltins() const final {
8290 return llvm::makeArrayRef(BuiltinInfo,
8291 clang::WebAssembly::LastTSBuiltin - Builtin::FirstTSBuiltin);
Dan Gohmanc2853072015-09-03 22:51:53 +00008292 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00008293 BuiltinVaListKind getBuiltinVaListKind() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00008294 return VoidPtrBuiltinVaList;
8295 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008296 ArrayRef<const char *> getGCCRegNames() const final {
8297 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00008298 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008299 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const final {
8300 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00008301 }
8302 bool
8303 validateAsmConstraint(const char *&Name,
Hans Wennborg7eb54642015-09-10 17:07:54 +00008304 TargetInfo::ConstraintInfo &Info) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00008305 return false;
8306 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00008307 const char *getClobbers() const final { return ""; }
8308 bool isCLZForZeroUndef() const final { return false; }
8309 bool hasInt128Type() const final { return true; }
Dan Gohmanab0e31f2015-09-14 21:49:41 +00008310 IntType getIntTypeByWidth(unsigned BitWidth,
8311 bool IsSigned) const final {
8312 // WebAssembly prefers long long for explicitly 64-bit integers.
8313 return BitWidth == 64 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
8314 : TargetInfo::getIntTypeByWidth(BitWidth, IsSigned);
8315 }
8316 IntType getLeastIntTypeByWidth(unsigned BitWidth,
8317 bool IsSigned) const final {
8318 // WebAssembly uses long long for int_least64_t and int_fast64_t.
8319 return BitWidth == 64
8320 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
8321 : TargetInfo::getLeastIntTypeByWidth(BitWidth, IsSigned);
8322 }
Dan Gohmanc2853072015-09-03 22:51:53 +00008323};
8324
8325const Builtin::Info WebAssemblyTargetInfo::BuiltinInfo[] = {
8326#define BUILTIN(ID, TYPE, ATTRS) \
8327 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
8328#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
8329 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
8330#include "clang/Basic/BuiltinsWebAssembly.def"
8331};
8332
8333class WebAssembly32TargetInfo : public WebAssemblyTargetInfo {
8334public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008335 explicit WebAssembly32TargetInfo(const llvm::Triple &T,
8336 const TargetOptions &Opts)
8337 : WebAssemblyTargetInfo(T, Opts) {
Dan Gohmanf1c34e62015-09-14 21:56:37 +00008338 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
James Y Knightb214cbc2016-03-04 19:00:41 +00008339 resetDataLayout("e-m:e-p:32:32-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00008340 }
8341
8342protected:
8343 void getTargetDefines(const LangOptions &Opts,
8344 MacroBuilder &Builder) const override {
8345 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
8346 defineCPUMacros(Builder, "wasm32", /*Tuning=*/false);
8347 }
8348};
8349
8350class WebAssembly64TargetInfo : public WebAssemblyTargetInfo {
8351public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008352 explicit WebAssembly64TargetInfo(const llvm::Triple &T,
8353 const TargetOptions &Opts)
8354 : WebAssemblyTargetInfo(T, Opts) {
Dan Gohmanc2853072015-09-03 22:51:53 +00008355 LongAlign = LongWidth = 64;
8356 PointerAlign = PointerWidth = 64;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00008357 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Derek Schuffacdc8e62016-09-01 22:38:37 +00008358 SizeType = UnsignedLong;
8359 PtrDiffType = SignedLong;
8360 IntPtrType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00008361 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00008362 }
8363
8364protected:
8365 void getTargetDefines(const LangOptions &Opts,
8366 MacroBuilder &Builder) const override {
8367 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
8368 defineCPUMacros(Builder, "wasm64", /*Tuning=*/false);
8369 }
8370};
8371
JF Bastien643817d2014-09-12 17:52:47 +00008372const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
8373#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00008374 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
JF Bastien643817d2014-09-12 17:52:47 +00008375#include "clang/Basic/BuiltinsLe64.def"
8376};
8377
Eric Christopherc48497a2015-09-18 21:26:24 +00008378static const unsigned SPIRAddrSpaceMap[] = {
8379 1, // opencl_global
8380 3, // opencl_local
8381 2, // opencl_constant
8382 4, // opencl_generic
8383 0, // cuda_device
8384 0, // cuda_constant
8385 0 // cuda_shared
8386};
8387class SPIRTargetInfo : public TargetInfo {
8388public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008389 SPIRTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
8390 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00008391 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
8392 "SPIR target must use unknown OS");
8393 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
8394 "SPIR target must use unknown environment type");
Eric Christopherc48497a2015-09-18 21:26:24 +00008395 TLSSupported = false;
8396 LongWidth = LongAlign = 64;
8397 AddrSpaceMap = &SPIRAddrSpaceMap;
8398 UseAddrSpaceMapMangling = true;
8399 // Define available target features
8400 // These must be defined in sorted order!
8401 NoAsmVariants = true;
8402 }
8403 void getTargetDefines(const LangOptions &Opts,
8404 MacroBuilder &Builder) const override {
8405 DefineStd(Builder, "SPIR", Opts);
8406 }
8407 bool hasFeature(StringRef Feature) const override {
8408 return Feature == "spir";
8409 }
Craig Topper3164f332014-03-11 03:39:26 +00008410
Craig Topper6c03a542015-10-19 04:51:35 +00008411 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00008412 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00008413 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00008414 bool validateAsmConstraint(const char *&Name,
8415 TargetInfo::ConstraintInfo &info) const override {
8416 return true;
8417 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008418 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8419 return None;
8420 }
Eric Christopherc48497a2015-09-18 21:26:24 +00008421 BuiltinVaListKind getBuiltinVaListKind() const override {
8422 return TargetInfo::VoidPtrBuiltinVaList;
8423 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00008424
Eric Christopherc48497a2015-09-18 21:26:24 +00008425 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Nikolay Haustov8c6538b2016-06-30 09:06:33 +00008426 return (CC == CC_SpirFunction || CC == CC_OpenCLKernel) ? CCCR_OK
8427 : CCCR_Warning;
Eric Christopherc48497a2015-09-18 21:26:24 +00008428 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00008429
Eric Christopherc48497a2015-09-18 21:26:24 +00008430 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
8431 return CC_SpirFunction;
8432 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00008433
8434 void setSupportedOpenCLOpts() override {
8435 // Assume all OpenCL extensions and optional core features are supported
8436 // for SPIR since it is a generic target.
Yaxun Liu5b746652016-12-18 05:18:55 +00008437 getSupportedOpenCLOpts().supportAll();
Yaxun Liu39cf40f2016-05-16 17:06:34 +00008438 }
Eric Christopherc48497a2015-09-18 21:26:24 +00008439};
Guy Benyeib798fc92012-12-11 21:38:14 +00008440
Eric Christopherc48497a2015-09-18 21:26:24 +00008441class SPIR32TargetInfo : public SPIRTargetInfo {
8442public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008443 SPIR32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8444 : SPIRTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00008445 PointerWidth = PointerAlign = 32;
8446 SizeType = TargetInfo::UnsignedInt;
8447 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +00008448 resetDataLayout("e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
8449 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00008450 }
8451 void getTargetDefines(const LangOptions &Opts,
8452 MacroBuilder &Builder) const override {
8453 DefineStd(Builder, "SPIR32", Opts);
8454 }
8455};
Guy Benyeib798fc92012-12-11 21:38:14 +00008456
Eric Christopherc48497a2015-09-18 21:26:24 +00008457class SPIR64TargetInfo : public SPIRTargetInfo {
8458public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008459 SPIR64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8460 : SPIRTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00008461 PointerWidth = PointerAlign = 64;
8462 SizeType = TargetInfo::UnsignedLong;
8463 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00008464 resetDataLayout("e-i64:64-v16:16-v24:32-v32:32-v48:64-"
8465 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00008466 }
8467 void getTargetDefines(const LangOptions &Opts,
8468 MacroBuilder &Builder) const override {
8469 DefineStd(Builder, "SPIR64", Opts);
8470 }
8471};
Guy Benyeib798fc92012-12-11 21:38:14 +00008472
Robert Lytton0e076492013-08-13 09:43:10 +00008473class XCoreTargetInfo : public TargetInfo {
8474 static const Builtin::Info BuiltinInfo[];
8475public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008476 XCoreTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
8477 : TargetInfo(Triple) {
Robert Lytton0e076492013-08-13 09:43:10 +00008478 NoAsmVariants = true;
8479 LongLongAlign = 32;
8480 SuitableAlign = 32;
8481 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00008482 SizeType = UnsignedInt;
8483 PtrDiffType = SignedInt;
8484 IntPtrType = SignedInt;
8485 WCharType = UnsignedChar;
8486 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00008487 UseZeroLengthBitfieldAlignment = true;
James Y Knightb214cbc2016-03-04 19:00:41 +00008488 resetDataLayout("e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32"
8489 "-f64:32-a:0:32-n32");
Robert Lytton0e076492013-08-13 09:43:10 +00008490 }
Craig Topper3164f332014-03-11 03:39:26 +00008491 void getTargetDefines(const LangOptions &Opts,
8492 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008493 Builder.defineMacro("__XS1B__");
8494 }
Craig Topper6c03a542015-10-19 04:51:35 +00008495 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
8496 return llvm::makeArrayRef(BuiltinInfo,
8497 clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin);
Robert Lytton0e076492013-08-13 09:43:10 +00008498 }
Craig Topper3164f332014-03-11 03:39:26 +00008499 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008500 return TargetInfo::VoidPtrBuiltinVaList;
8501 }
Craig Topper3164f332014-03-11 03:39:26 +00008502 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008503 return "";
8504 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008505 ArrayRef<const char *> getGCCRegNames() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008506 static const char * const GCCRegNames[] = {
8507 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
8508 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
8509 };
Craig Topperf054e3a2015-10-19 03:52:27 +00008510 return llvm::makeArrayRef(GCCRegNames);
Robert Lytton0e076492013-08-13 09:43:10 +00008511 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008512 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8513 return None;
Robert Lytton0e076492013-08-13 09:43:10 +00008514 }
Craig Topper3164f332014-03-11 03:39:26 +00008515 bool validateAsmConstraint(const char *&Name,
8516 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008517 return false;
8518 }
Craig Topper3164f332014-03-11 03:39:26 +00008519 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00008520 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
8521 return (RegNo < 2)? RegNo : -1;
8522 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00008523 bool allowsLargerPreferedTypeAlignment() const override {
8524 return false;
8525 }
Robert Lytton0e076492013-08-13 09:43:10 +00008526};
8527
8528const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00008529#define BUILTIN(ID, TYPE, ATTRS) \
8530 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
8531#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
8532 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Robert Lytton0e076492013-08-13 09:43:10 +00008533#include "clang/Basic/BuiltinsXCore.def"
8534};
Robert Lytton0e076492013-08-13 09:43:10 +00008535
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008536// x86_32 Android target
8537class AndroidX86_32TargetInfo : public LinuxTargetInfo<X86_32TargetInfo> {
8538public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008539 AndroidX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8540 : LinuxTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008541 SuitableAlign = 32;
8542 LongDoubleWidth = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00008543 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008544 }
8545};
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008546
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008547// x86_64 Android target
8548class AndroidX86_64TargetInfo : public LinuxTargetInfo<X86_64TargetInfo> {
8549public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008550 AndroidX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8551 : LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Stephan Bergmann17c7f702016-12-14 11:57:17 +00008552 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008553 }
Chih-Hung Hsieh0b0eeaa2015-07-24 18:12:54 +00008554
8555 bool useFloat128ManglingForLongDouble() const override {
8556 return true;
8557 }
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008558};
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008559
8560// 32-bit RenderScript is armv7 with width and align of 'long' set to 8-bytes
8561class RenderScript32TargetInfo : public ARMleTargetInfo {
8562public:
8563 RenderScript32TargetInfo(const llvm::Triple &Triple,
8564 const TargetOptions &Opts)
8565 : ARMleTargetInfo(llvm::Triple("armv7", Triple.getVendorName(),
8566 Triple.getOSName(),
8567 Triple.getEnvironmentName()),
8568 Opts) {
Pirama Arumuga Nainarbb846a32016-07-27 19:01:51 +00008569 IsRenderScriptTarget = true;
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008570 LongWidth = LongAlign = 64;
8571 }
8572 void getTargetDefines(const LangOptions &Opts,
8573 MacroBuilder &Builder) const override {
8574 Builder.defineMacro("__RENDERSCRIPT__");
8575 ARMleTargetInfo::getTargetDefines(Opts, Builder);
8576 }
8577};
8578
8579// 64-bit RenderScript is aarch64
8580class RenderScript64TargetInfo : public AArch64leTargetInfo {
8581public:
8582 RenderScript64TargetInfo(const llvm::Triple &Triple,
8583 const TargetOptions &Opts)
8584 : AArch64leTargetInfo(llvm::Triple("aarch64", Triple.getVendorName(),
8585 Triple.getOSName(),
8586 Triple.getEnvironmentName()),
Pirama Arumuga Nainarbb846a32016-07-27 19:01:51 +00008587 Opts) {
8588 IsRenderScriptTarget = true;
8589 }
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008590
8591 void getTargetDefines(const LangOptions &Opts,
8592 MacroBuilder &Builder) const override {
8593 Builder.defineMacro("__RENDERSCRIPT__");
8594 AArch64leTargetInfo::getTargetDefines(Opts, Builder);
8595 }
8596};
8597
Dylan McKayecb6e7b2017-02-07 06:04:18 +00008598/// Information about a specific microcontroller.
8599struct MCUInfo {
8600 const char *Name;
8601 const char *DefineName;
8602};
8603
8604// This list should be kept up-to-date with AVRDevices.td in LLVM.
8605static ArrayRef<MCUInfo> AVRMcus = {
8606 { "at90s1200", "__AVR_AT90S1200__" },
Dylan McKay315edb02017-02-11 21:06:07 +00008607 { "attiny11", "__AVR_ATtiny11__" },
8608 { "attiny12", "__AVR_ATtiny12__" },
8609 { "attiny15", "__AVR_ATtiny15__" },
8610 { "attiny28", "__AVR_ATtiny28__" },
8611 { "at90s2313", "__AVR_AT90S2313__" },
8612 { "at90s2323", "__AVR_AT90S2323__" },
8613 { "at90s2333", "__AVR_AT90S2333__" },
8614 { "at90s2343", "__AVR_AT90S2343__" },
8615 { "attiny22", "__AVR_ATtiny22__" },
8616 { "attiny26", "__AVR_ATtiny26__" },
8617 { "at86rf401", "__AVR_AT86RF401__" },
8618 { "at90s4414", "__AVR_AT90S4414__" },
8619 { "at90s4433", "__AVR_AT90S4433__" },
8620 { "at90s4434", "__AVR_AT90S4434__" },
8621 { "at90s8515", "__AVR_AT90S8515__" },
8622 { "at90c8534", "__AVR_AT90c8534__" },
8623 { "at90s8535", "__AVR_AT90S8535__" },
8624 { "ata5272", "__AVR_ATA5272__" },
8625 { "attiny13", "__AVR_ATtiny13__" },
8626 { "attiny13a", "__AVR_ATtiny13A__" },
8627 { "attiny2313", "__AVR_ATtiny2313__" },
8628 { "attiny2313a", "__AVR_ATtiny2313A__" },
8629 { "attiny24", "__AVR_ATtiny24__" },
8630 { "attiny24a", "__AVR_ATtiny24A__" },
8631 { "attiny4313", "__AVR_ATtiny4313__" },
8632 { "attiny44", "__AVR_ATtiny44__" },
8633 { "attiny44a", "__AVR_ATtiny44A__" },
8634 { "attiny84", "__AVR_ATtiny84__" },
8635 { "attiny84a", "__AVR_ATtiny84A__" },
8636 { "attiny25", "__AVR_ATtiny25__" },
8637 { "attiny45", "__AVR_ATtiny45__" },
8638 { "attiny85", "__AVR_ATtiny85__" },
8639 { "attiny261", "__AVR_ATtiny261__" },
8640 { "attiny261a", "__AVR_ATtiny261A__" },
8641 { "attiny461", "__AVR_ATtiny461__" },
8642 { "attiny461a", "__AVR_ATtiny461A__" },
8643 { "attiny861", "__AVR_ATtiny861__" },
8644 { "attiny861a", "__AVR_ATtiny861A__" },
8645 { "attiny87", "__AVR_ATtiny87__" },
8646 { "attiny43u", "__AVR_ATtiny43U__" },
8647 { "attiny48", "__AVR_ATtiny48__" },
8648 { "attiny88", "__AVR_ATtiny88__" },
8649 { "attiny828", "__AVR_ATtiny828__" },
8650 { "at43usb355", "__AVR_AT43USB355__" },
8651 { "at76c711", "__AVR_AT76C711__" },
8652 { "atmega103", "__AVR_ATmega103__" },
8653 { "at43usb320", "__AVR_AT43USB320__" },
8654 { "attiny167", "__AVR_ATtiny167__" },
8655 { "at90usb82", "__AVR_AT90USB82__" },
8656 { "at90usb162", "__AVR_AT90USB162__" },
8657 { "ata5505", "__AVR_ATA5505__" },
8658 { "atmega8u2", "__AVR_ATmega8U2__" },
8659 { "atmega16u2", "__AVR_ATmega16U2__" },
8660 { "atmega32u2", "__AVR_ATmega32U2__" },
8661 { "attiny1634", "__AVR_ATtiny1634__" },
8662 { "atmega8", "__AVR_ATmega8__" },
8663 { "ata6289", "__AVR_ATA6289__" },
8664 { "atmega8a", "__AVR_ATmega8A__" },
8665 { "ata6285", "__AVR_ATA6285__" },
8666 { "ata6286", "__AVR_ATA6286__" },
8667 { "atmega48", "__AVR_ATmega48__" },
8668 { "atmega48a", "__AVR_ATmega48A__" },
8669 { "atmega48pa", "__AVR_ATmega48PA__" },
8670 { "atmega48p", "__AVR_ATmega48P__" },
8671 { "atmega88", "__AVR_ATmega88__" },
8672 { "atmega88a", "__AVR_ATmega88A__" },
8673 { "atmega88p", "__AVR_ATmega88P__" },
8674 { "atmega88pa", "__AVR_ATmega88PA__" },
8675 { "atmega8515", "__AVR_ATmega8515__" },
8676 { "atmega8535", "__AVR_ATmega8535__" },
8677 { "atmega8hva", "__AVR_ATmega8HVA__" },
8678 { "at90pwm1", "__AVR_AT90PWM1__" },
8679 { "at90pwm2", "__AVR_AT90PWM2__" },
8680 { "at90pwm2b", "__AVR_AT90PWM2B__" },
8681 { "at90pwm3", "__AVR_AT90PWM3__" },
8682 { "at90pwm3b", "__AVR_AT90PWM3B__" },
8683 { "at90pwm81", "__AVR_AT90PWM81__" },
8684 { "ata5790", "__AVR_ATA5790__" },
8685 { "ata5795", "__AVR_ATA5795__" },
8686 { "atmega16", "__AVR_ATmega16__" },
8687 { "atmega16a", "__AVR_ATmega16A__" },
8688 { "atmega161", "__AVR_ATmega161__" },
8689 { "atmega162", "__AVR_ATmega162__" },
8690 { "atmega163", "__AVR_ATmega163__" },
8691 { "atmega164a", "__AVR_ATmega164A__" },
8692 { "atmega164p", "__AVR_ATmega164P__" },
8693 { "atmega164pa", "__AVR_ATmega164PA__" },
8694 { "atmega165", "__AVR_ATmega165__" },
8695 { "atmega165a", "__AVR_ATmega165A__" },
8696 { "atmega165p", "__AVR_ATmega165P__" },
8697 { "atmega165pa", "__AVR_ATmega165PA__" },
8698 { "atmega168", "__AVR_ATmega168__" },
8699 { "atmega168a", "__AVR_ATmega168A__" },
8700 { "atmega168p", "__AVR_ATmega168P__" },
8701 { "atmega168pa", "__AVR_ATmega168PA__" },
8702 { "atmega169", "__AVR_ATmega169__" },
8703 { "atmega169a", "__AVR_ATmega169A__" },
8704 { "atmega169p", "__AVR_ATmega169P__" },
8705 { "atmega169pa", "__AVR_ATmega169PA__" },
8706 { "atmega32", "__AVR_ATmega32__" },
8707 { "atmega32a", "__AVR_ATmega32A__" },
8708 { "atmega323", "__AVR_ATmega323__" },
8709 { "atmega324a", "__AVR_ATmega324A__" },
8710 { "atmega324p", "__AVR_ATmega324P__" },
8711 { "atmega324pa", "__AVR_ATmega324PA__" },
8712 { "atmega325", "__AVR_ATmega325__" },
8713 { "atmega325a", "__AVR_ATmega325A__" },
8714 { "atmega325p", "__AVR_ATmega325P__" },
8715 { "atmega325pa", "__AVR_ATmega325PA__" },
8716 { "atmega3250", "__AVR_ATmega3250__" },
8717 { "atmega3250a", "__AVR_ATmega3250A__" },
8718 { "atmega3250p", "__AVR_ATmega3250P__" },
8719 { "atmega3250pa", "__AVR_ATmega3250PA__" },
8720 { "atmega328", "__AVR_ATmega328__" },
8721 { "atmega328p", "__AVR_ATmega328P__" },
8722 { "atmega329", "__AVR_ATmega329__" },
8723 { "atmega329a", "__AVR_ATmega329A__" },
8724 { "atmega329p", "__AVR_ATmega329P__" },
8725 { "atmega329pa", "__AVR_ATmega329PA__" },
8726 { "atmega3290", "__AVR_ATmega3290__" },
8727 { "atmega3290a", "__AVR_ATmega3290A__" },
8728 { "atmega3290p", "__AVR_ATmega3290P__" },
8729 { "atmega3290pa", "__AVR_ATmega3290PA__" },
8730 { "atmega406", "__AVR_ATmega406__" },
8731 { "atmega64", "__AVR_ATmega64__" },
8732 { "atmega64a", "__AVR_ATmega64A__" },
8733 { "atmega640", "__AVR_ATmega640__" },
8734 { "atmega644", "__AVR_ATmega644__" },
8735 { "atmega644a", "__AVR_ATmega644A__" },
8736 { "atmega644p", "__AVR_ATmega644P__" },
8737 { "atmega644pa", "__AVR_ATmega644PA__" },
8738 { "atmega645", "__AVR_ATmega645__" },
8739 { "atmega645a", "__AVR_ATmega645A__" },
8740 { "atmega645p", "__AVR_ATmega645P__" },
8741 { "atmega649", "__AVR_ATmega649__" },
8742 { "atmega649a", "__AVR_ATmega649A__" },
8743 { "atmega649p", "__AVR_ATmega649P__" },
8744 { "atmega6450", "__AVR_ATmega6450__" },
8745 { "atmega6450a", "__AVR_ATmega6450A__" },
8746 { "atmega6450p", "__AVR_ATmega6450P__" },
8747 { "atmega6490", "__AVR_ATmega6490__" },
8748 { "atmega6490a", "__AVR_ATmega6490A__" },
8749 { "atmega6490p", "__AVR_ATmega6490P__" },
8750 { "atmega64rfr2", "__AVR_ATmega64RFR2__" },
8751 { "atmega644rfr2", "__AVR_ATmega644RFR2__" },
8752 { "atmega16hva", "__AVR_ATmega16HVA__" },
8753 { "atmega16hva2", "__AVR_ATmega16HVA2__" },
8754 { "atmega16hvb", "__AVR_ATmega16HVB__" },
8755 { "atmega16hvbrevb", "__AVR_ATmega16HVBREVB__" },
8756 { "atmega32hvb", "__AVR_ATmega32HVB__" },
8757 { "atmega32hvbrevb", "__AVR_ATmega32HVBREVB__" },
8758 { "atmega64hve", "__AVR_ATmega64HVE__" },
8759 { "at90can32", "__AVR_AT90CAN32__" },
8760 { "at90can64", "__AVR_AT90CAN64__" },
8761 { "at90pwm161", "__AVR_AT90PWM161__" },
8762 { "at90pwm216", "__AVR_AT90PWM216__" },
8763 { "at90pwm316", "__AVR_AT90PWM316__" },
8764 { "atmega32c1", "__AVR_ATmega32C1__" },
8765 { "atmega64c1", "__AVR_ATmega64C1__" },
8766 { "atmega16m1", "__AVR_ATmega16M1__" },
8767 { "atmega32m1", "__AVR_ATmega32M1__" },
8768 { "atmega64m1", "__AVR_ATmega64M1__" },
8769 { "atmega16u4", "__AVR_ATmega16U4__" },
8770 { "atmega32u4", "__AVR_ATmega32U4__" },
8771 { "atmega32u6", "__AVR_ATmega32U6__" },
8772 { "at90usb646", "__AVR_AT90USB646__" },
8773 { "at90usb647", "__AVR_AT90USB647__" },
8774 { "at90scr100", "__AVR_AT90SCR100__" },
8775 { "at94k", "__AVR_AT94K__" },
8776 { "m3000", "__AVR_AT000__" },
8777 { "atmega128", "__AVR_ATmega128__" },
8778 { "atmega128a", "__AVR_ATmega128A__" },
8779 { "atmega1280", "__AVR_ATmega1280__" },
8780 { "atmega1281", "__AVR_ATmega1281__" },
8781 { "atmega1284", "__AVR_ATmega1284__" },
8782 { "atmega1284p", "__AVR_ATmega1284P__" },
8783 { "atmega128rfa1", "__AVR_ATmega128RFA1__" },
8784 { "atmega128rfr2", "__AVR_ATmega128RFR2__" },
8785 { "atmega1284rfr2", "__AVR_ATmega1284RFR2__" },
8786 { "at90can128", "__AVR_AT90CAN128__" },
8787 { "at90usb1286", "__AVR_AT90USB1286__" },
8788 { "at90usb1287", "__AVR_AT90USB1287__" },
8789 { "atmega2560", "__AVR_ATmega2560__" },
8790 { "atmega2561", "__AVR_ATmega2561__" },
8791 { "atmega256rfr2", "__AVR_ATmega256RFR2__" },
8792 { "atmega2564rfr2", "__AVR_ATmega2564RFR2__" },
8793 { "atxmega16a4", "__AVR_ATxmega16A4__" },
8794 { "atxmega16a4u", "__AVR_ATxmega16a4U__" },
8795 { "atxmega16c4", "__AVR_ATxmega16C4__" },
8796 { "atxmega16d4", "__AVR_ATxmega16D4__" },
8797 { "atxmega32a4", "__AVR_ATxmega32A4__" },
8798 { "atxmega32a4u", "__AVR_ATxmega32A4U__" },
8799 { "atxmega32c4", "__AVR_ATxmega32C4__" },
8800 { "atxmega32d4", "__AVR_ATxmega32D4__" },
8801 { "atxmega32e5", "__AVR_ATxmega32E5__" },
8802 { "atxmega16e5", "__AVR_ATxmega16E5__" },
8803 { "atxmega8e5", "__AVR_ATxmega8E5__" },
8804 { "atxmega32x1", "__AVR_ATxmega32X1__" },
8805 { "atxmega64a3", "__AVR_ATxmega64A3__" },
8806 { "atxmega64a3u", "__AVR_ATxmega64A3U__" },
8807 { "atxmega64a4u", "__AVR_ATxmega64A4U__" },
8808 { "atxmega64b1", "__AVR_ATxmega64B1__" },
8809 { "atxmega64b3", "__AVR_ATxmega64B3__" },
8810 { "atxmega64c3", "__AVR_ATxmega64C3__" },
8811 { "atxmega64d3", "__AVR_ATxmega64D3__" },
8812 { "atxmega64d4", "__AVR_ATxmega64D4__" },
8813 { "atxmega64a1", "__AVR_ATxmega64A1__" },
8814 { "atxmega64a1u", "__AVR_ATxmega64A1U__" },
8815 { "atxmega128a3", "__AVR_ATxmega128A3__" },
8816 { "atxmega128a3u", "__AVR_ATxmega128A3U__" },
8817 { "atxmega128b1", "__AVR_ATxmega128B1__" },
8818 { "atxmega128b3", "__AVR_ATxmega128B3__" },
8819 { "atxmega128c3", "__AVR_ATxmega128C3__" },
8820 { "atxmega128d3", "__AVR_ATxmega128D3__" },
8821 { "atxmega128d4", "__AVR_ATxmega128D4__" },
8822 { "atxmega192a3", "__AVR_ATxmega192A3__" },
8823 { "atxmega192a3u", "__AVR_ATxmega192A3U__" },
8824 { "atxmega192c3", "__AVR_ATxmega192C3__" },
8825 { "atxmega192d3", "__AVR_ATxmega192D3__" },
8826 { "atxmega256a3", "__AVR_ATxmega256A3__" },
8827 { "atxmega256a3u", "__AVR_ATxmega256A3U__" },
8828 { "atxmega256a3b", "__AVR_ATxmega256A3B__" },
8829 { "atxmega256a3bu", "__AVR_ATxmega256A3BU__" },
8830 { "atxmega256c3", "__AVR_ATxmega256C3__" },
8831 { "atxmega256d3", "__AVR_ATxmega256D3__" },
8832 { "atxmega384c3", "__AVR_ATxmega384C3__" },
8833 { "atxmega384d3", "__AVR_ATxmega384D3__" },
8834 { "atxmega128a1", "__AVR_ATxmega128A1__" },
8835 { "atxmega128a1u", "__AVR_ATxmega128A1U__" },
8836 { "atxmega128a4u", "__AVR_ATxmega128a4U__" },
8837 { "attiny4", "__AVR_ATtiny4__" },
8838 { "attiny5", "__AVR_ATtiny5__" },
8839 { "attiny9", "__AVR_ATtiny9__" },
8840 { "attiny10", "__AVR_ATtiny10__" },
8841 { "attiny20", "__AVR_ATtiny20__" },
8842 { "attiny40", "__AVR_ATtiny40__" },
8843 { "attiny102", "__AVR_ATtiny102__" },
8844 { "attiny104", "__AVR_ATtiny104__" },
Dylan McKayecb6e7b2017-02-07 06:04:18 +00008845};
Dylan McKay924fa3a2017-01-05 05:20:27 +00008846
8847// AVR Target
8848class AVRTargetInfo : public TargetInfo {
8849public:
8850 AVRTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
8851 : TargetInfo(Triple) {
8852 TLSSupported = false;
8853 PointerWidth = 16;
8854 PointerAlign = 8;
8855 IntWidth = 16;
8856 IntAlign = 8;
8857 LongWidth = 32;
8858 LongAlign = 8;
8859 LongLongWidth = 64;
8860 LongLongAlign = 8;
8861 SuitableAlign = 8;
8862 DefaultAlignForAttributeAligned = 8;
8863 HalfWidth = 16;
8864 HalfAlign = 8;
8865 FloatWidth = 32;
8866 FloatAlign = 8;
8867 DoubleWidth = 32;
8868 DoubleAlign = 8;
8869 DoubleFormat = &llvm::APFloat::IEEEsingle();
8870 LongDoubleWidth = 32;
8871 LongDoubleAlign = 8;
8872 LongDoubleFormat = &llvm::APFloat::IEEEsingle();
8873 SizeType = UnsignedInt;
8874 PtrDiffType = SignedInt;
8875 IntPtrType = SignedInt;
8876 Char16Type = UnsignedInt;
8877 WCharType = SignedInt;
8878 WIntType = SignedInt;
8879 Char32Type = UnsignedLong;
8880 SigAtomicType = SignedChar;
8881 resetDataLayout("e-p:16:16:16-i8:8:8-i16:16:16-i32:32:32-i64:64:64"
8882 "-f32:32:32-f64:64:64-n8");
8883 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008884
Dylan McKay924fa3a2017-01-05 05:20:27 +00008885 void getTargetDefines(const LangOptions &Opts,
8886 MacroBuilder &Builder) const override {
Dylan McKayecb6e7b2017-02-07 06:04:18 +00008887 Builder.defineMacro("AVR");
8888 Builder.defineMacro("__AVR");
Dylan McKay924fa3a2017-01-05 05:20:27 +00008889 Builder.defineMacro("__AVR__");
Dylan McKayecb6e7b2017-02-07 06:04:18 +00008890
8891 if (!this->CPU.empty()) {
8892 auto It = std::find_if(AVRMcus.begin(), AVRMcus.end(),
8893 [&](const MCUInfo &Info) { return Info.Name == this->CPU; });
8894
8895 if (It != AVRMcus.end())
8896 Builder.defineMacro(It->DefineName);
8897 }
Dylan McKay924fa3a2017-01-05 05:20:27 +00008898 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008899
Dylan McKay924fa3a2017-01-05 05:20:27 +00008900 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
8901 return None;
8902 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008903
Dylan McKay924fa3a2017-01-05 05:20:27 +00008904 BuiltinVaListKind getBuiltinVaListKind() const override {
8905 return TargetInfo::VoidPtrBuiltinVaList;
8906 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008907
Dylan McKay924fa3a2017-01-05 05:20:27 +00008908 const char *getClobbers() const override {
8909 return "";
8910 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008911
Dylan McKay924fa3a2017-01-05 05:20:27 +00008912 ArrayRef<const char *> getGCCRegNames() const override {
8913 static const char * const GCCRegNames[] = {
8914 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
8915 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
8916 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
Dylan McKay95aa2652017-01-05 07:17:46 +00008917 "r24", "r25", "X", "Y", "Z", "SP"
Dylan McKay924fa3a2017-01-05 05:20:27 +00008918 };
8919 return llvm::makeArrayRef(GCCRegNames);
8920 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008921
Dylan McKay924fa3a2017-01-05 05:20:27 +00008922 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8923 return None;
8924 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008925
Dylan McKay924fa3a2017-01-05 05:20:27 +00008926 ArrayRef<TargetInfo::AddlRegName> getGCCAddlRegNames() const override {
8927 static const TargetInfo::AddlRegName AddlRegNames[] = {
8928 { { "r26", "r27"}, 26 },
8929 { { "r28", "r29"}, 27 },
8930 { { "r30", "r31"}, 28 },
8931 { { "SPL", "SPH"}, 29 },
8932 };
8933 return llvm::makeArrayRef(AddlRegNames);
8934 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008935
Dylan McKay924fa3a2017-01-05 05:20:27 +00008936 bool validateAsmConstraint(const char *&Name,
8937 TargetInfo::ConstraintInfo &Info) const override {
Dylan McKayd31534c2017-02-06 09:01:59 +00008938 // There aren't any multi-character AVR specific constraints.
8939 if (StringRef(Name).size() > 1) return false;
8940
8941 switch (*Name) {
8942 default: return false;
8943 case 'a': // Simple upper registers
8944 case 'b': // Base pointer registers pairs
8945 case 'd': // Upper register
8946 case 'l': // Lower registers
8947 case 'e': // Pointer register pairs
8948 case 'q': // Stack pointer register
8949 case 'r': // Any register
8950 case 'w': // Special upper register pairs
8951 case 't': // Temporary register
8952 case 'x': case 'X': // Pointer register pair X
8953 case 'y': case 'Y': // Pointer register pair Y
8954 case 'z': case 'Z': // Pointer register pair Z
8955 Info.setAllowsRegister();
8956 return true;
8957 case 'I': // 6-bit positive integer constant
8958 Info.setRequiresImmediate(0, 63);
8959 return true;
8960 case 'J': // 6-bit negative integer constant
8961 Info.setRequiresImmediate(-63, 0);
8962 return true;
8963 case 'K': // Integer constant (Range: 2)
8964 Info.setRequiresImmediate(2);
8965 return true;
8966 case 'L': // Integer constant (Range: 0)
8967 Info.setRequiresImmediate(0);
8968 return true;
8969 case 'M': // 8-bit integer constant
8970 Info.setRequiresImmediate(0, 0xff);
8971 return true;
8972 case 'N': // Integer constant (Range: -1)
8973 Info.setRequiresImmediate(-1);
8974 return true;
8975 case 'O': // Integer constant (Range: 8, 16, 24)
8976 Info.setRequiresImmediate({8, 16, 24});
8977 return true;
8978 case 'P': // Integer constant (Range: 1)
8979 Info.setRequiresImmediate(1);
8980 return true;
8981 case 'R': // Integer constant (Range: -6 to 5)
8982 Info.setRequiresImmediate(-6, 5);
8983 return true;
8984 case 'G': // Floating point constant
8985 case 'Q': // A memory address based on Y or Z pointer with displacement.
8986 return true;
8987 }
8988
Dylan McKay924fa3a2017-01-05 05:20:27 +00008989 return false;
8990 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008991
Dylan McKay924fa3a2017-01-05 05:20:27 +00008992 IntType getIntTypeByWidth(unsigned BitWidth,
8993 bool IsSigned) const final {
8994 // AVR prefers int for 16-bit integers.
8995 return BitWidth == 16 ? (IsSigned ? SignedInt : UnsignedInt)
8996 : TargetInfo::getIntTypeByWidth(BitWidth, IsSigned);
8997 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008998
Dylan McKay924fa3a2017-01-05 05:20:27 +00008999 IntType getLeastIntTypeByWidth(unsigned BitWidth,
9000 bool IsSigned) const final {
9001 // AVR uses int for int_least16_t and int_fast16_t.
9002 return BitWidth == 16
9003 ? (IsSigned ? SignedInt : UnsignedInt)
9004 : TargetInfo::getLeastIntTypeByWidth(BitWidth, IsSigned);
9005 }
Dylan McKayecb6e7b2017-02-07 06:04:18 +00009006
9007 bool setCPU(const std::string &Name) override {
9008 bool IsFamily = llvm::StringSwitch<bool>(Name)
9009 .Case("avr1", true)
9010 .Case("avr2", true)
9011 .Case("avr25", true)
9012 .Case("avr3", true)
9013 .Case("avr31", true)
9014 .Case("avr35", true)
9015 .Case("avr4", true)
9016 .Case("avr5", true)
9017 .Case("avr51", true)
9018 .Case("avr6", true)
9019 .Case("avrxmega1", true)
9020 .Case("avrxmega2", true)
9021 .Case("avrxmega3", true)
9022 .Case("avrxmega4", true)
9023 .Case("avrxmega5", true)
9024 .Case("avrxmega6", true)
9025 .Case("avrxmega7", true)
9026 .Case("avrtiny", true)
9027 .Default(false);
9028
9029 if (IsFamily) this->CPU = Name;
9030
9031 bool IsMCU = std::find_if(AVRMcus.begin(), AVRMcus.end(),
9032 [&](const MCUInfo &Info) { return Info.Name == Name; }) != AVRMcus.end();
9033
9034 if (IsMCU) this->CPU = Name;
9035
9036 return IsFamily || IsMCU;
9037 }
9038
9039protected:
9040 std::string CPU;
Dylan McKay924fa3a2017-01-05 05:20:27 +00009041};
9042
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009043} // end anonymous namespace
9044
Chris Lattner5ba61f02006-10-14 07:39:34 +00009045//===----------------------------------------------------------------------===//
9046// Driver code
9047//===----------------------------------------------------------------------===//
9048
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009049static TargetInfo *AllocateTarget(const llvm::Triple &Triple,
9050 const TargetOptions &Opts) {
Daniel Dunbar52322032009-08-18 05:47:58 +00009051 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00009052
Daniel Dunbar52322032009-08-18 05:47:58 +00009053 switch (Triple.getArch()) {
9054 default:
Craig Topperf1186c52014-05-08 06:41:40 +00009055 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00009056
Tim Northover2a0783d2014-05-30 14:14:07 +00009057 case llvm::Triple::xcore:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009058 return new XCoreTargetInfo(Triple, Opts);
Tim Northover2a0783d2014-05-30 14:14:07 +00009059
9060 case llvm::Triple::hexagon:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009061 return new HexagonTargetInfo(Triple, Opts);
Tim Northover2a0783d2014-05-30 14:14:07 +00009062
Jacques Pienaard964cc22016-03-28 21:02:54 +00009063 case llvm::Triple::lanai:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009064 return new LanaiTargetInfo(Triple, Opts);
Jacques Pienaard964cc22016-03-28 21:02:54 +00009065
Tim Northover2a0783d2014-05-30 14:14:07 +00009066 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00009067 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009068 return new DarwinAArch64TargetInfo(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00009069
9070 switch (os) {
Ed Schoutenea9448e2015-10-15 15:07:07 +00009071 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009072 return new CloudABITargetInfo<AArch64leTargetInfo>(Triple, Opts);
Ed Maste6a9eda52014-11-13 16:55:42 +00009073 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009074 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Petr Hosek9834fcd2016-10-24 22:55:57 +00009075 case llvm::Triple::Fuchsia:
9076 return new FuchsiaTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00009077 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009078 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple, Opts);
James Molloy5e73df52014-04-16 15:06:20 +00009079 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009080 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Brad Smith9aa2bf22017-02-21 23:13:09 +00009081 case llvm::Triple::OpenBSD:
9082 return new OpenBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00009083 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009084 return new AArch64leTargetInfo(Triple, Opts);
James Molloy5e73df52014-04-16 15:06:20 +00009085 }
9086
Christian Pirker9b019ae2014-02-25 13:51:00 +00009087 case llvm::Triple::aarch64_be:
9088 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00009089 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009090 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Petr Hosek9834fcd2016-10-24 22:55:57 +00009091 case llvm::Triple::Fuchsia:
9092 return new FuchsiaTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00009093 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009094 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00009095 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009096 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00009097 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009098 return new AArch64beTargetInfo(Triple, Opts);
Tim Northover9bb857a2013-01-31 12:13:10 +00009099 }
9100
Daniel Dunbar52322032009-08-18 05:47:58 +00009101 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00009102 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00009103 if (Triple.isOSBinFormatMachO())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009104 return new DarwinARMTargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00009105
Daniel Dunbar52322032009-08-18 05:47:58 +00009106 switch (os) {
Ed Schoutenc6d1a732016-09-05 18:38:34 +00009107 case llvm::Triple::CloudABI:
9108 return new CloudABITargetInfo<ARMleTargetInfo>(Triple, Opts);
Rafael Espindolaad8fed52010-06-10 00:46:51 +00009109 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009110 return new LinuxTargetInfo<ARMleTargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009111 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009112 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009113 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009114 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00009115 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009116 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00009117 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009118 return new BitrigTargetInfo<ARMleTargetInfo>(Triple, Opts);
Douglas Gregor9fabd852011-07-01 22:41:14 +00009119 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009120 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00009121 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009122 return new NaClTargetInfo<ARMleTargetInfo>(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00009123 case llvm::Triple::Win32:
9124 switch (Triple.getEnvironment()) {
Yaron Keren321249c2015-07-15 13:32:23 +00009125 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009126 return new CygwinARMTargetInfo(Triple, Opts);
Yaron Keren321249c2015-07-15 13:32:23 +00009127 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009128 return new MinGWARMTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00009129 case llvm::Triple::Itanium:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009130 return new ItaniumWindowsARMleTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00009131 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00009132 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009133 return new MicrosoftARMleTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00009134 }
Daniel Dunbar52322032009-08-18 05:47:58 +00009135 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009136 return new ARMleTargetInfo(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009137 }
9138
9139 case llvm::Triple::armeb:
9140 case llvm::Triple::thumbeb:
9141 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009142 return new DarwinARMTargetInfo(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009143
9144 switch (os) {
9145 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009146 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009147 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009148 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009149 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009150 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009151 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009152 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009153 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009154 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009155 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009156 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009157 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009158 return new NaClTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009159 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009160 return new ARMbeTargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009161 }
Eli Friedmanb5366062008-05-20 14:21:01 +00009162
Dylan McKay924fa3a2017-01-05 05:20:27 +00009163 case llvm::Triple::avr:
9164 return new AVRTargetInfo(Triple, Opts);
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00009165 case llvm::Triple::bpfeb:
9166 case llvm::Triple::bpfel:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009167 return new BPFTargetInfo(Triple, Opts);
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00009168
Daniel Dunbar52322032009-08-18 05:47:58 +00009169 case llvm::Triple::msp430:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009170 return new MSP430TargetInfo(Triple, Opts);
Eli Friedmanb5366062008-05-20 14:21:01 +00009171
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00009172 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009173 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009174 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00009175 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009176 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00009177 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009178 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009179 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009180 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009181 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009182 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00009183 return new MipsTargetInfo(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009184 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00009185
9186 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009187 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009188 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00009189 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009190 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00009191 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009192 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009193 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009194 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009195 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00009196 case llvm::Triple::NaCl:
Daniel Sanders4672af62016-05-27 11:51:02 +00009197 return new NaClTargetInfo<NaClMips32TargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009198 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00009199 return new MipsTargetInfo(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009200 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00009201
Akira Hatanakabef17452011-09-20 19:21:49 +00009202 case llvm::Triple::mips64:
9203 switch (os) {
9204 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00009205 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009206 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00009207 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009208 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009209 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009210 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009211 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00009212 case llvm::Triple::OpenBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009213 return new OpenBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009214 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00009215 return new MipsTargetInfo(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009216 }
9217
9218 case llvm::Triple::mips64el:
9219 switch (os) {
9220 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00009221 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009222 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00009223 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009224 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009225 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009226 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009227 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00009228 case llvm::Triple::OpenBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009229 return new OpenBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009230 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00009231 return new MipsTargetInfo(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009232 }
9233
Ivan Krasindd7403e2011-08-24 20:22:22 +00009234 case llvm::Triple::le32:
9235 switch (os) {
Douglas Katzman78d7c542015-05-12 21:18:10 +00009236 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009237 return new NaClTargetInfo<PNaClTargetInfo>(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00009238 default:
9239 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00009240 }
9241
JF Bastien643817d2014-09-12 17:52:47 +00009242 case llvm::Triple::le64:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009243 return new Le64TargetInfo(Triple, Opts);
JF Bastien643817d2014-09-12 17:52:47 +00009244
Daniel Dunbar52322032009-08-18 05:47:58 +00009245 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00009246 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009247 return new DarwinPPC32TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009248 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00009249 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009250 return new LinuxTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009251 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009252 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009253 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009254 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00009255 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009256 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009257 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009258 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009259 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009260 return new PPC32TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009261 }
Daniel Dunbar52322032009-08-18 05:47:58 +00009262
9263 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00009264 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009265 return new DarwinPPC64TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009266 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00009267 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009268 return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009269 case llvm::Triple::Lv2:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009270 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009271 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009272 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009273 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009274 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009275 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009276 return new PPC64TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009277 }
Daniel Dunbar52322032009-08-18 05:47:58 +00009278
Bill Schmidt778d3872013-07-26 01:36:11 +00009279 case llvm::Triple::ppc64le:
9280 switch (os) {
9281 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009282 return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger22a2d992015-04-10 20:53:48 +00009283 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009284 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Bill Schmidt778d3872013-07-26 01:36:11 +00009285 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009286 return new PPC64TargetInfo(Triple, Opts);
Bill Schmidt778d3872013-07-26 01:36:11 +00009287 }
9288
Peter Collingbournec947aae2012-05-20 23:28:41 +00009289 case llvm::Triple::nvptx:
Justin Lebarb6626592017-01-05 16:53:21 +00009290 return new NVPTXTargetInfo(Triple, Opts, /*TargetPointerWidth=*/32);
Peter Collingbournec947aae2012-05-20 23:28:41 +00009291 case llvm::Triple::nvptx64:
Justin Lebarb6626592017-01-05 16:53:21 +00009292 return new NVPTXTargetInfo(Triple, Opts, /*TargetPointerWidth=*/64);
Peter Collingbournec947aae2012-05-20 23:28:41 +00009293
Tom Stellardd8e38a32015-01-06 20:34:47 +00009294 case llvm::Triple::amdgcn:
Eli Friedmand13b41e2012-10-12 23:32:00 +00009295 case llvm::Triple::r600:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009296 return new AMDGPUTargetInfo(Triple, Opts);
Eli Friedmand13b41e2012-10-12 23:32:00 +00009297
Daniel Dunbar52322032009-08-18 05:47:58 +00009298 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009299 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00009300 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009301 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009302 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009303 return new SolarisTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009304 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009305 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00009306 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009307 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009308 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009309 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009310 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009311 return new SparcV8TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009312 }
Daniel Dunbar52322032009-08-18 05:47:58 +00009313
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009314 // The 'sparcel' architecture copies all the above cases except for Solaris.
9315 case llvm::Triple::sparcel:
9316 switch (os) {
9317 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009318 return new LinuxTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009319 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009320 return new NetBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009321 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009322 return new OpenBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009323 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009324 return new RTEMSTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009325 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009326 return new SparcV8elTargetInfo(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009327 }
9328
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009329 case llvm::Triple::sparcv9:
9330 switch (os) {
9331 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009332 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009333 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009334 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009335 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009336 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009337 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009338 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009339 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009340 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009341 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009342 return new SparcV9TargetInfo(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009343 }
9344
Ulrich Weigand47445072013-05-06 16:26:41 +00009345 case llvm::Triple::systemz:
9346 switch (os) {
9347 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009348 return new LinuxTargetInfo<SystemZTargetInfo>(Triple, Opts);
Ulrich Weigand47445072013-05-06 16:26:41 +00009349 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009350 return new SystemZTargetInfo(Triple, Opts);
Ulrich Weigand47445072013-05-06 16:26:41 +00009351 }
9352
Eli Friedmana9c3d712009-08-19 20:47:07 +00009353 case llvm::Triple::tce:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009354 return new TCETargetInfo(Triple, Opts);
Eli Friedmana9c3d712009-08-19 20:47:07 +00009355
Pekka Jaaskelainen67354482016-11-16 15:22:31 +00009356 case llvm::Triple::tcele:
9357 return new TCELETargetInfo(Triple, Opts);
9358
Daniel Dunbar52322032009-08-18 05:47:58 +00009359 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00009360 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009361 return new DarwinI386TargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00009362
Daniel Dunbar52322032009-08-18 05:47:58 +00009363 switch (os) {
Ed Schouten7893e682015-06-13 21:33:49 +00009364 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009365 return new CloudABITargetInfo<X86_32TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009366 case llvm::Triple::Linux: {
9367 switch (Triple.getEnvironment()) {
9368 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009369 return new LinuxTargetInfo<X86_32TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009370 case llvm::Triple::Android:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009371 return new AndroidX86_32TargetInfo(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009372 }
9373 }
Daniel Dunbar52322032009-08-18 05:47:58 +00009374 case llvm::Triple::DragonFly:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009375 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009376 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009377 return new NetBSDI386TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009378 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009379 return new OpenBSDI386TargetInfo(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00009380 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009381 return new BitrigI386TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009382 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009383 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00009384 case llvm::Triple::KFreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009385 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009386 case llvm::Triple::Minix:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009387 return new MinixTargetInfo<X86_32TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009388 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009389 return new SolarisTargetInfo<X86_32TargetInfo>(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009390 case llvm::Triple::Win32: {
9391 switch (Triple.getEnvironment()) {
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009392 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009393 return new CygwinX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009394 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009395 return new MinGWX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00009396 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009397 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00009398 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009399 return new MicrosoftX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009400 }
9401 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00009402 case llvm::Triple::Haiku:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009403 return new HaikuX86_32TargetInfo(Triple, Opts);
Douglas Gregor9fabd852011-07-01 22:41:14 +00009404 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009405 return new RTEMSX86_32TargetInfo(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00009406 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009407 return new NaClTargetInfo<X86_32TargetInfo>(Triple, Opts);
Alexey Bataevc99b0492015-11-25 09:24:26 +00009408 case llvm::Triple::ELFIAMCU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009409 return new MCUX86_32TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009410 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009411 return new X86_32TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009412 }
9413
9414 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009415 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009416 return new DarwinX86_64TargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00009417
Daniel Dunbar52322032009-08-18 05:47:58 +00009418 switch (os) {
Ed Schoutenf33c6072015-03-11 08:42:46 +00009419 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009420 return new CloudABITargetInfo<X86_64TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009421 case llvm::Triple::Linux: {
9422 switch (Triple.getEnvironment()) {
9423 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009424 return new LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009425 case llvm::Triple::Android:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009426 return new AndroidX86_64TargetInfo(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009427 }
9428 }
Chris Lattner002ba6b2010-01-09 05:41:14 +00009429 case llvm::Triple::DragonFly:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009430 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009431 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009432 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009433 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009434 return new OpenBSDX86_64TargetInfo(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00009435 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009436 return new BitrigX86_64TargetInfo(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<X86_64TargetInfo>(Triple, Opts);
Petr Hosek9834fcd2016-10-24 22:55:57 +00009439 case llvm::Triple::Fuchsia:
9440 return new FuchsiaTargetInfo<X86_64TargetInfo>(Triple, Opts);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00009441 case llvm::Triple::KFreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009442 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009443 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009444 return new SolarisTargetInfo<X86_64TargetInfo>(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009445 case llvm::Triple::Win32: {
9446 switch (Triple.getEnvironment()) {
Yaron Kerend030d112015-07-22 17:38:19 +00009447 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009448 return new CygwinX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009449 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009450 return new MinGWX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009451 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00009452 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009453 return new MicrosoftX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009454 }
9455 }
Reid Kleckner330fb172016-05-11 16:19:05 +00009456 case llvm::Triple::Haiku:
9457 return new HaikuTargetInfo<X86_64TargetInfo>(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00009458 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009459 return new NaClTargetInfo<X86_64TargetInfo>(Triple, Opts);
Alex Rosenberg12207fa2015-01-27 14:47:44 +00009460 case llvm::Triple::PS4:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009461 return new PS4OSTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009462 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009463 return new X86_64TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009464 }
Guy Benyeib798fc92012-12-11 21:38:14 +00009465
Douglas Katzman78d7c542015-05-12 21:18:10 +00009466 case llvm::Triple::spir: {
9467 if (Triple.getOS() != llvm::Triple::UnknownOS ||
9468 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
9469 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009470 return new SPIR32TargetInfo(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00009471 }
9472 case llvm::Triple::spir64: {
9473 if (Triple.getOS() != llvm::Triple::UnknownOS ||
9474 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
9475 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009476 return new SPIR64TargetInfo(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00009477 }
Dan Gohmanc2853072015-09-03 22:51:53 +00009478 case llvm::Triple::wasm32:
Dan Gohman839f2152017-01-17 21:46:38 +00009479 if (Triple.getSubArch() != llvm::Triple::NoSubArch ||
9480 Triple.getVendor() != llvm::Triple::UnknownVendor ||
9481 Triple.getOS() != llvm::Triple::UnknownOS ||
9482 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment ||
9483 !(Triple.isOSBinFormatELF() || Triple.isOSBinFormatWasm()))
Dan Gohmanc2853072015-09-03 22:51:53 +00009484 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009485 return new WebAssemblyOSTargetInfo<WebAssembly32TargetInfo>(Triple, Opts);
Dan Gohmanc2853072015-09-03 22:51:53 +00009486 case llvm::Triple::wasm64:
Dan Gohman839f2152017-01-17 21:46:38 +00009487 if (Triple.getSubArch() != llvm::Triple::NoSubArch ||
9488 Triple.getVendor() != llvm::Triple::UnknownVendor ||
9489 Triple.getOS() != llvm::Triple::UnknownOS ||
9490 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment ||
9491 !(Triple.isOSBinFormatELF() || Triple.isOSBinFormatWasm()))
Dan Gohmanc2853072015-09-03 22:51:53 +00009492 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009493 return new WebAssemblyOSTargetInfo<WebAssembly64TargetInfo>(Triple, Opts);
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00009494
9495 case llvm::Triple::renderscript32:
9496 return new LinuxTargetInfo<RenderScript32TargetInfo>(Triple, Opts);
9497 case llvm::Triple::renderscript64:
9498 return new LinuxTargetInfo<RenderScript64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009499 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00009500}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009501
9502/// CreateTargetInfo - Return the target info object for the specified target
Eric Christophere4f73b32015-08-07 19:07:08 +00009503/// options.
Alp Toker80758082014-07-06 05:26:44 +00009504TargetInfo *
9505TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
Saleem Abdulrasool10a49722016-04-08 16:52:00 +00009506 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00009507 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009508
9509 // Construct the target
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009510 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple, *Opts));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009511 if (!Target) {
9512 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00009513 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009514 }
Alp Toker80758082014-07-06 05:26:44 +00009515 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009516
Daniel Dunbaracde99e2009-12-18 18:42:37 +00009517 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00009518 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
9519 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00009520 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00009521 }
9522
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009523 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00009524 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
9525 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00009526 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009527 }
9528
Rafael Espindolaeb265472013-08-21 21:59:03 +00009529 // Set the fp math unit.
9530 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
9531 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00009532 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00009533 }
9534
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009535 // Compute the default target features, we need the target to handle this
9536 // because features may have dependencies on one another.
9537 llvm::StringMap<bool> Features;
Eric Christopher007b0a02015-08-28 22:32:01 +00009538 if (!Target->initFeatureMap(Features, Diags, Opts->CPU,
9539 Opts->FeaturesAsWritten))
Eric Christopher6b454372015-08-25 13:45:24 +00009540 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009541
9542 // Add the features to the compile options.
Douglas Gregorf8715de2012-11-16 04:24:59 +00009543 Opts->Features.clear();
Aaron Ballmanb226d3d2015-08-12 13:38:59 +00009544 for (const auto &F : Features)
9545 Opts->Features.push_back((F.getValue() ? "+" : "-") + F.getKey().str());
9546
Eric Christopher3ff21b32013-10-16 21:26:26 +00009547 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00009548 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009549
Yaxun Liu39cf40f2016-05-16 17:06:34 +00009550 Target->setSupportedOpenCLOpts();
Alexey Bader0ea07532016-11-01 15:50:52 +00009551 Target->setOpenCLExtensionOpts();
Yaxun Liu39cf40f2016-05-16 17:06:34 +00009552
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00009553 if (!Target->validateTarget(Diags))
9554 return nullptr;
9555
Ahmed Charles9a16beb2014-03-07 19:33:25 +00009556 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009557}