blob: e2db335cb3ac2e24488fdc17fa8c7031904ef5b9 [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.
Roman Divacky13b586f2013-07-03 19:45:54 +00001251 if (LongDoubleWidth == 128)
1252 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001253
Eric Christopher32ac5e42017-02-15 07:50:11 +00001254 // Define this for elfv2 (64-bit only) or 64-bit darwin.
1255 if (ABI == "elfv2" ||
1256 (getTriple().getOS() == llvm::Triple::Darwin && PointerWidth == 64))
1257 Builder.defineMacro("__STRUCT_PARM_ALIGN__", "16");
1258
Hal Finkel8eb59282012-06-11 22:35:19 +00001259 // CPU identification.
Eric Christopherb70819e2017-03-25 02:29:18 +00001260 ArchDefineTypes defs =
1261 (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
1262 .Case("440", ArchDefineName)
1263 .Case("450", ArchDefineName | ArchDefine440)
1264 .Case("601", ArchDefineName)
1265 .Case("602", ArchDefineName | ArchDefinePpcgr)
1266 .Case("603", ArchDefineName | ArchDefinePpcgr)
1267 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1268 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1269 .Case("604", ArchDefineName | ArchDefinePpcgr)
1270 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
1271 .Case("620", ArchDefineName | ArchDefinePpcgr)
1272 .Case("630", ArchDefineName | ArchDefinePpcgr)
1273 .Case("7400", ArchDefineName | ArchDefinePpcgr)
1274 .Case("7450", ArchDefineName | ArchDefinePpcgr)
1275 .Case("750", ArchDefineName | ArchDefinePpcgr)
1276 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr |
1277 ArchDefinePpcsq)
1278 .Case("a2", ArchDefineA2)
1279 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
1280 .Case("pwr3", ArchDefinePpcgr)
1281 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
1282 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr |
1283 ArchDefinePpcsq)
1284 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4 |
1285 ArchDefinePpcgr | ArchDefinePpcsq)
1286 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5 |
1287 ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1288 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x |
1289 ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr |
1290 ArchDefinePpcsq)
1291 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6 |
1292 ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4 |
1293 ArchDefinePpcgr | ArchDefinePpcsq)
1294 .Case("pwr8", ArchDefineName | ArchDefinePwr7 | ArchDefinePwr6x |
1295 ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5 |
1296 ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1297 .Case("pwr9", ArchDefineName | ArchDefinePwr8 | ArchDefinePwr7 |
1298 ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x |
1299 ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr |
1300 ArchDefinePpcsq)
1301 .Case("power3", ArchDefinePpcgr)
1302 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1303 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr |
1304 ArchDefinePpcsq)
1305 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4 |
1306 ArchDefinePpcgr | ArchDefinePpcsq)
1307 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5 |
1308 ArchDefinePwr4 | ArchDefinePpcgr |
1309 ArchDefinePpcsq)
1310 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x |
1311 ArchDefinePwr5 | ArchDefinePwr4 |
1312 ArchDefinePpcgr | ArchDefinePpcsq)
1313 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6 |
1314 ArchDefinePwr5x | ArchDefinePwr5 |
1315 ArchDefinePwr4 | ArchDefinePpcgr |
1316 ArchDefinePpcsq)
1317 .Case("power8", ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr6x |
1318 ArchDefinePwr6 | ArchDefinePwr5x |
1319 ArchDefinePwr5 | ArchDefinePwr4 |
1320 ArchDefinePpcgr | ArchDefinePpcsq)
1321 .Case("power9", ArchDefinePwr9 | ArchDefinePwr8 | ArchDefinePwr7 |
1322 ArchDefinePwr6x | ArchDefinePwr6 |
1323 ArchDefinePwr5x | ArchDefinePwr5 |
1324 ArchDefinePwr4 | ArchDefinePpcgr |
1325 ArchDefinePpcsq)
1326 // powerpc64le automatically defaults to at least power8.
1327 .Case("ppc64le", ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr6x |
1328 ArchDefinePwr6 | ArchDefinePwr5x |
1329 ArchDefinePwr5 | ArchDefinePwr4 |
1330 ArchDefinePpcgr | ArchDefinePpcsq)
1331 .Default(ArchDefineNone);
Hal Finkel6b984f02012-07-03 16:51:04 +00001332
1333 if (defs & ArchDefineName)
1334 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
1335 if (defs & ArchDefinePpcgr)
1336 Builder.defineMacro("_ARCH_PPCGR");
1337 if (defs & ArchDefinePpcsq)
1338 Builder.defineMacro("_ARCH_PPCSQ");
1339 if (defs & ArchDefine440)
Hal Finkel8eb59282012-06-11 22:35:19 +00001340 Builder.defineMacro("_ARCH_440");
Hal Finkel6b984f02012-07-03 16:51:04 +00001341 if (defs & ArchDefine603)
1342 Builder.defineMacro("_ARCH_603");
1343 if (defs & ArchDefine604)
1344 Builder.defineMacro("_ARCH_604");
Bill Schmidt38378a02013-02-01 20:23:10 +00001345 if (defs & ArchDefinePwr4)
Hal Finkel6b984f02012-07-03 16:51:04 +00001346 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt38378a02013-02-01 20:23:10 +00001347 if (defs & ArchDefinePwr5)
Hal Finkel6b984f02012-07-03 16:51:04 +00001348 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt38378a02013-02-01 20:23:10 +00001349 if (defs & ArchDefinePwr5x)
1350 Builder.defineMacro("_ARCH_PWR5X");
1351 if (defs & ArchDefinePwr6)
Hal Finkel8eb59282012-06-11 22:35:19 +00001352 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt38378a02013-02-01 20:23:10 +00001353 if (defs & ArchDefinePwr6x)
1354 Builder.defineMacro("_ARCH_PWR6X");
1355 if (defs & ArchDefinePwr7)
1356 Builder.defineMacro("_ARCH_PWR7");
Will Schmidtf0487512014-06-26 13:34:10 +00001357 if (defs & ArchDefinePwr8)
1358 Builder.defineMacro("_ARCH_PWR8");
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001359 if (defs & ArchDefinePwr9)
1360 Builder.defineMacro("_ARCH_PWR9");
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001361 if (defs & ArchDefineA2)
1362 Builder.defineMacro("_ARCH_A2");
1363 if (defs & ArchDefineA2q) {
1364 Builder.defineMacro("_ARCH_A2Q");
1365 Builder.defineMacro("_ARCH_QP");
1366 }
1367
1368 if (getTriple().getVendor() == llvm::Triple::BGQ) {
1369 Builder.defineMacro("__bg__");
1370 Builder.defineMacro("__THW_BLUEGENE__");
1371 Builder.defineMacro("__bgq__");
1372 Builder.defineMacro("__TOS_BGQ__");
1373 }
Bill Schmidt38378a02013-02-01 20:23:10 +00001374
Eric Christopher758aad72017-03-21 22:06:18 +00001375 if (HasAltivec) {
1376 Builder.defineMacro("__VEC__", "10206");
1377 Builder.defineMacro("__ALTIVEC__");
1378 }
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001379 if (HasVSX)
1380 Builder.defineMacro("__VSX__");
Bill Schmidt8c184e32014-10-10 17:21:23 +00001381 if (HasP8Vector)
Bill Schmidt59eb7672014-10-10 15:09:43 +00001382 Builder.defineMacro("__POWER8_VECTOR__");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001383 if (HasP8Crypto)
1384 Builder.defineMacro("__CRYPTO__");
Kit Barton8246f282015-03-25 19:41:41 +00001385 if (HasHTM)
1386 Builder.defineMacro("__HTM__");
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001387 if (HasFloat128)
1388 Builder.defineMacro("__FLOAT128__");
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001389 if (HasP9Vector)
1390 Builder.defineMacro("__POWER9_VECTOR__");
Hal Finkela57b8902015-10-01 13:39:49 +00001391
1392 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
1393 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
1394 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
1395 if (PointerWidth == 64)
1396 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001397
Eric Christopher0d361162017-03-25 05:40:13 +00001398 // We have support for the bswap intrinsics so we can define this.
1399 Builder.defineMacro("__HAVE_BSWAP__", "1");
1400
Bill Schmidt38378a02013-02-01 20:23:10 +00001401 // FIXME: The following are not yet generated here by Clang, but are
1402 // generated by GCC:
1403 //
1404 // _SOFT_FLOAT_
1405 // __RECIP_PRECISION__
1406 // __APPLE_ALTIVEC__
Bill Schmidt38378a02013-02-01 20:23:10 +00001407 // __RECIP__
1408 // __RECIPF__
1409 // __RSQRTE__
1410 // __RSQRTEF__
1411 // _SOFT_DOUBLE_
1412 // __NO_LWSYNC__
Bill Schmidt38378a02013-02-01 20:23:10 +00001413 // __LONGDOUBLE128
1414 // __CMODEL_MEDIUM__
1415 // __CMODEL_LARGE__
1416 // _CALL_SYSV
1417 // _CALL_DARWIN
1418 // __NO_FPRS__
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001419}
1420
Eric Christophera8a14c32015-08-31 18:39:16 +00001421// Handle explicit options being passed to the compiler here: if we've
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001422// explicitly turned off vsx and turned on any of:
1423// - power8-vector
1424// - direct-move
1425// - float128
1426// - power9-vector
1427// then go ahead and error since the customer has expressed an incompatible
Eric Christophera8a14c32015-08-31 18:39:16 +00001428// set of options.
1429static bool ppcUserFeaturesCheck(DiagnosticsEngine &Diags,
Eric Christopher8c47b422015-10-09 18:39:55 +00001430 const std::vector<std::string> &FeaturesVec) {
Eric Christophera8a14c32015-08-31 18:39:16 +00001431
1432 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "-vsx") !=
1433 FeaturesVec.end()) {
1434 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+power8-vector") !=
1435 FeaturesVec.end()) {
1436 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mpower8-vector"
1437 << "-mno-vsx";
1438 return false;
1439 }
1440
1441 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+direct-move") !=
1442 FeaturesVec.end()) {
1443 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mdirect-move"
1444 << "-mno-vsx";
1445 return false;
1446 }
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001447
1448 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+float128") !=
1449 FeaturesVec.end()) {
1450 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mfloat128"
1451 << "-mno-vsx";
1452 return false;
1453 }
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001454
1455 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+power9-vector") !=
1456 FeaturesVec.end()) {
1457 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mpower9-vector"
1458 << "-mno-vsx";
1459 return false;
1460 }
Eric Christophera8a14c32015-08-31 18:39:16 +00001461 }
1462
1463 return true;
1464}
1465
Eric Christopher8c47b422015-10-09 18:39:55 +00001466bool PPCTargetInfo::initFeatureMap(
1467 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
1468 const std::vector<std::string> &FeaturesVec) const {
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001469 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1470 .Case("7400", true)
1471 .Case("g4", true)
1472 .Case("7450", true)
1473 .Case("g4+", true)
1474 .Case("970", true)
1475 .Case("g5", true)
1476 .Case("pwr6", true)
1477 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +00001478 .Case("pwr8", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001479 .Case("pwr9", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001480 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +00001481 .Case("ppc64le", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001482 .Default(false);
Hal Finkelb58ce852013-02-01 18:44:19 +00001483
1484 Features["qpx"] = (CPU == "a2q");
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001485 Features["power9-vector"] = (CPU == "pwr9");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001486 Features["crypto"] = llvm::StringSwitch<bool>(CPU)
1487 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001488 .Case("pwr9", true)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001489 .Case("pwr8", true)
1490 .Default(false);
1491 Features["power8-vector"] = llvm::StringSwitch<bool>(CPU)
1492 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001493 .Case("pwr9", true)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001494 .Case("pwr8", true)
1495 .Default(false);
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001496 Features["bpermd"] = llvm::StringSwitch<bool>(CPU)
1497 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001498 .Case("pwr9", true)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001499 .Case("pwr8", true)
1500 .Case("pwr7", true)
1501 .Default(false);
1502 Features["extdiv"] = llvm::StringSwitch<bool>(CPU)
1503 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001504 .Case("pwr9", true)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001505 .Case("pwr8", true)
1506 .Case("pwr7", true)
1507 .Default(false);
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001508 Features["direct-move"] = llvm::StringSwitch<bool>(CPU)
1509 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001510 .Case("pwr9", true)
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001511 .Case("pwr8", true)
1512 .Default(false);
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001513 Features["vsx"] = llvm::StringSwitch<bool>(CPU)
1514 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001515 .Case("pwr9", true)
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001516 .Case("pwr8", true)
1517 .Case("pwr7", true)
1518 .Default(false);
Eric Christopher74fa24f2017-03-20 21:12:53 +00001519 Features["htm"] = llvm::StringSwitch<bool>(CPU)
1520 .Case("ppc64le", true)
1521 .Case("pwr9", true)
1522 .Case("pwr8", true)
1523 .Default(false);
Eric Christopheref1e2952015-08-28 02:13:58 +00001524
Eric Christophera8a14c32015-08-31 18:39:16 +00001525 if (!ppcUserFeaturesCheck(Diags, FeaturesVec))
1526 return false;
Eric Christopher007b0a02015-08-28 22:32:01 +00001527
Eric Christopher007b0a02015-08-28 22:32:01 +00001528 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001529}
1530
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001531bool PPCTargetInfo::hasFeature(StringRef Feature) const {
Bill Schmidte6e9d152014-11-02 14:56:41 +00001532 return llvm::StringSwitch<bool>(Feature)
Eric Christopher758aad72017-03-21 22:06:18 +00001533 .Case("powerpc", true)
1534 .Case("altivec", HasAltivec)
1535 .Case("vsx", HasVSX)
1536 .Case("power8-vector", HasP8Vector)
1537 .Case("crypto", HasP8Crypto)
1538 .Case("direct-move", HasDirectMove)
1539 .Case("qpx", HasQPX)
1540 .Case("htm", HasHTM)
1541 .Case("bpermd", HasBPERMD)
1542 .Case("extdiv", HasExtDiv)
1543 .Case("float128", HasFloat128)
1544 .Case("power9-vector", HasP9Vector)
1545 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001546}
Chris Lattner17df24e2008-04-21 18:56:49 +00001547
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001548void PPCTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
1549 StringRef Name, bool Enabled) const {
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001550 // If we're enabling direct-move or power8-vector go ahead and enable vsx
1551 // as well. Do the inverse if we're disabling vsx. We'll diagnose any user
1552 // incompatible options.
1553 if (Enabled) {
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001554 if (Name == "direct-move" ||
1555 Name == "power8-vector" ||
1556 Name == "float128" ||
1557 Name == "power9-vector") {
1558 // power9-vector is really a superset of power8-vector so encode that.
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001559 Features[Name] = Features["vsx"] = true;
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001560 if (Name == "power9-vector")
1561 Features["power8-vector"] = true;
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001562 } else {
1563 Features[Name] = true;
1564 }
1565 } else {
1566 if (Name == "vsx") {
1567 Features[Name] = Features["direct-move"] = Features["power8-vector"] =
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001568 Features["float128"] = Features["power9-vector"] = false;
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001569 } else {
1570 Features[Name] = false;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001571 }
1572 }
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001573}
1574
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001575const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001576 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1577 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1578 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1579 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1580 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1581 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1582 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1583 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001584 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001585 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001586 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001587 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1588 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1589 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1590 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001591 "vrsave", "vscr",
1592 "spe_acc", "spefscr",
1593 "sfp"
1594};
Chris Lattner10a5b382007-01-29 05:24:35 +00001595
Craig Topperf054e3a2015-10-19 03:52:27 +00001596ArrayRef<const char*> PPCTargetInfo::getGCCRegNames() const {
1597 return llvm::makeArrayRef(GCCRegNames);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001598}
Chris Lattner5ba61f02006-10-14 07:39:34 +00001599
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001600const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1601 // While some of these aliases do map to different registers
1602 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001603 { { "0" }, "r0" },
1604 { { "1"}, "r1" },
1605 { { "2" }, "r2" },
1606 { { "3" }, "r3" },
1607 { { "4" }, "r4" },
1608 { { "5" }, "r5" },
1609 { { "6" }, "r6" },
1610 { { "7" }, "r7" },
1611 { { "8" }, "r8" },
1612 { { "9" }, "r9" },
1613 { { "10" }, "r10" },
1614 { { "11" }, "r11" },
1615 { { "12" }, "r12" },
1616 { { "13" }, "r13" },
1617 { { "14" }, "r14" },
1618 { { "15" }, "r15" },
1619 { { "16" }, "r16" },
1620 { { "17" }, "r17" },
1621 { { "18" }, "r18" },
1622 { { "19" }, "r19" },
1623 { { "20" }, "r20" },
1624 { { "21" }, "r21" },
1625 { { "22" }, "r22" },
1626 { { "23" }, "r23" },
1627 { { "24" }, "r24" },
1628 { { "25" }, "r25" },
1629 { { "26" }, "r26" },
1630 { { "27" }, "r27" },
1631 { { "28" }, "r28" },
1632 { { "29" }, "r29" },
1633 { { "30" }, "r30" },
1634 { { "31" }, "r31" },
1635 { { "fr0" }, "f0" },
1636 { { "fr1" }, "f1" },
1637 { { "fr2" }, "f2" },
1638 { { "fr3" }, "f3" },
1639 { { "fr4" }, "f4" },
1640 { { "fr5" }, "f5" },
1641 { { "fr6" }, "f6" },
1642 { { "fr7" }, "f7" },
1643 { { "fr8" }, "f8" },
1644 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +00001645 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001646 { { "fr11" }, "f11" },
1647 { { "fr12" }, "f12" },
1648 { { "fr13" }, "f13" },
1649 { { "fr14" }, "f14" },
1650 { { "fr15" }, "f15" },
1651 { { "fr16" }, "f16" },
1652 { { "fr17" }, "f17" },
1653 { { "fr18" }, "f18" },
1654 { { "fr19" }, "f19" },
1655 { { "fr20" }, "f20" },
1656 { { "fr21" }, "f21" },
1657 { { "fr22" }, "f22" },
1658 { { "fr23" }, "f23" },
1659 { { "fr24" }, "f24" },
1660 { { "fr25" }, "f25" },
1661 { { "fr26" }, "f26" },
1662 { { "fr27" }, "f27" },
1663 { { "fr28" }, "f28" },
1664 { { "fr29" }, "f29" },
1665 { { "fr30" }, "f30" },
1666 { { "fr31" }, "f31" },
1667 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001668};
1669
Craig Topperf054e3a2015-10-19 03:52:27 +00001670ArrayRef<TargetInfo::GCCRegAlias> PPCTargetInfo::getGCCRegAliases() const {
1671 return llvm::makeArrayRef(GCCRegAliases);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001672}
Chris Lattner02dffbd2006-10-14 07:50:21 +00001673
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001674class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001675public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001676 PPC32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1677 : PPCTargetInfo(Triple, Opts) {
James Y Knightb214cbc2016-03-04 19:00:41 +00001678 resetDataLayout("E-m:e-p:32:32-i64:64-n32");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001679
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001680 switch (getTriple().getOS()) {
Nico Weber3435ede2012-01-31 02:07:33 +00001681 case llvm::Triple::Linux:
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001682 case llvm::Triple::FreeBSD:
1683 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001684 SizeType = UnsignedInt;
Hal Finkel26908382012-03-02 20:54:36 +00001685 PtrDiffType = SignedInt;
1686 IntPtrType = SignedInt;
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001687 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +00001688 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001689 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001690 }
Roman Divacky816dcd12012-03-13 16:53:54 +00001691
Roman Divacky3ffe7462012-03-13 19:20:17 +00001692 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1693 LongDoubleWidth = LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00001694 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Roman Divacky3ffe7462012-03-13 19:20:17 +00001695 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001696
1697 // PPC32 supports atomics up to 4 bytes.
1698 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divacky965b0b72011-01-06 08:27:10 +00001699 }
1700
Craig Topper3164f332014-03-11 03:39:26 +00001701 BuiltinVaListKind getBuiltinVaListKind() const override {
Roman Divacky965b0b72011-01-06 08:27:10 +00001702 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Inge5d3fb222012-06-16 03:34:49 +00001703 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman873f65a2008-08-21 00:13:15 +00001704 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001705};
Chris Lattner5ba61f02006-10-14 07:39:34 +00001706
Bill Schmidt778d3872013-07-26 01:36:11 +00001707// Note: ABI differences may eventually require us to have a separate
1708// TargetInfo for little endian.
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001709class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001710public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001711 PPC64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1712 : PPCTargetInfo(Triple, Opts) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001713 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001714 IntMaxType = SignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001715 Int64Type = SignedLong;
Roman Divacky816dcd12012-03-13 16:53:54 +00001716
Eric Christopherf6ee1f32017-02-10 04:35:21 +00001717 if ((Triple.getArch() == llvm::Triple::ppc64le)) {
1718 resetDataLayout("e-m:e-i64:64-n32:64");
Eric Christopher4855ba82017-02-10 03:32:34 +00001719 ABI = "elfv2";
Eric Christopherf6ee1f32017-02-10 04:35:21 +00001720 } else {
1721 resetDataLayout("E-m:e-i64:64-n32:64");
Eric Christopher4855ba82017-02-10 03:32:34 +00001722 ABI = "elfv1";
Eric Christopherf6ee1f32017-02-10 04:35:21 +00001723 }
Eric Christopher4855ba82017-02-10 03:32:34 +00001724
Eric Christopherf6ee1f32017-02-10 04:35:21 +00001725 switch (getTriple().getOS()) {
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001726 case llvm::Triple::FreeBSD:
Roman Divacky3ffe7462012-03-13 19:20:17 +00001727 LongDoubleWidth = LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00001728 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001729 break;
Joerg Sonnenbergeraac82c42014-10-15 19:52:03 +00001730 case llvm::Triple::NetBSD:
1731 IntMaxType = SignedLongLong;
1732 Int64Type = SignedLongLong;
1733 break;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001734 default:
1735 break;
Ulrich Weigand8afad612014-07-28 13:17:52 +00001736 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001737
1738 // PPC64 supports atomics up to 8 bytes.
1739 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001740 }
Craig Topper3164f332014-03-11 03:39:26 +00001741 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001742 return TargetInfo::CharPtrBuiltinVaList;
Roman Divacky965b0b72011-01-06 08:27:10 +00001743 }
Eric Christophere6b7cf42015-07-10 18:25:52 +00001744 // PPC64 Linux-specific ABI options.
Ulrich Weigand8afad612014-07-28 13:17:52 +00001745 bool setABI(const std::string &Name) override {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001746 if (Name == "elfv1" || Name == "elfv1-qpx" || Name == "elfv2") {
Ulrich Weigand8afad612014-07-28 13:17:52 +00001747 ABI = Name;
1748 return true;
1749 }
1750 return false;
1751 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001752};
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001753
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001754class DarwinPPC32TargetInfo : public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001755public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001756 DarwinPPC32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1757 : DarwinTargetInfo<PPC32TargetInfo>(Triple, Opts) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001758 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +00001759 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Eric Christopher917e9522014-11-18 22:36:15 +00001760 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev68d773c2012-01-17 22:40:00 +00001761 LongLongAlign = 32;
James Y Knightb214cbc2016-03-04 19:00:41 +00001762 resetDataLayout("E-m:o-p:32:32-f64:32:64-n32");
Roman Divacky965b0b72011-01-06 08:27:10 +00001763 }
Craig Topper3164f332014-03-11 03:39:26 +00001764 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001765 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001766 }
1767};
1768
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001769class DarwinPPC64TargetInfo : public DarwinTargetInfo<PPC64TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001770public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001771 DarwinPPC64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1772 : DarwinTargetInfo<PPC64TargetInfo>(Triple, Opts) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001773 HasAlignMac68kSupport = true;
James Y Knightb214cbc2016-03-04 19:00:41 +00001774 resetDataLayout("E-m:o-i64:64-n32:64");
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001775 }
1776};
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001777
Eric Christopherc48497a2015-09-18 21:26:24 +00001778static const unsigned NVPTXAddrSpaceMap[] = {
1779 1, // opencl_global
1780 3, // opencl_local
1781 4, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00001782 // FIXME: generic has to be added to the target
Eric Christopherc48497a2015-09-18 21:26:24 +00001783 0, // opencl_generic
1784 1, // cuda_device
1785 4, // cuda_constant
1786 3, // cuda_shared
1787};
1788
1789class NVPTXTargetInfo : public TargetInfo {
1790 static const char *const GCCRegNames[];
1791 static const Builtin::Info BuiltinInfo[];
Justin Lebar62907612016-07-06 21:21:39 +00001792 CudaArch GPU;
Justin Lebarb6626592017-01-05 16:53:21 +00001793 std::unique_ptr<TargetInfo> HostTarget;
Reid Klecknerbbc01782014-12-03 21:53:36 +00001794
Eric Christopherc48497a2015-09-18 21:26:24 +00001795public:
Justin Lebarb6626592017-01-05 16:53:21 +00001796 NVPTXTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts,
1797 unsigned TargetPointerWidth)
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001798 : TargetInfo(Triple) {
Justin Lebarb6626592017-01-05 16:53:21 +00001799 assert((TargetPointerWidth == 32 || TargetPointerWidth == 64) &&
1800 "NVPTX only supports 32- and 64-bit modes.");
1801
Eric Christopherc48497a2015-09-18 21:26:24 +00001802 TLSSupported = false;
Eric Christopherc48497a2015-09-18 21:26:24 +00001803 AddrSpaceMap = &NVPTXAddrSpaceMap;
1804 UseAddrSpaceMapMangling = true;
Justin Lebarb6626592017-01-05 16:53:21 +00001805
Eric Christopherc48497a2015-09-18 21:26:24 +00001806 // Define available target features
1807 // These must be defined in sorted order!
1808 NoAsmVariants = true;
Justin Lebar62907612016-07-06 21:21:39 +00001809 GPU = CudaArch::SM_20;
Justin Lebar76945b22016-04-29 23:05:19 +00001810
Justin Lebarb6626592017-01-05 16:53:21 +00001811 if (TargetPointerWidth == 32)
1812 resetDataLayout("e-p:32:32-i64:64-v16:16-v32:32-n16:32:64");
1813 else
1814 resetDataLayout("e-i64:64-v16:16-v32:32-n16:32:64");
1815
Justin Lebar76945b22016-04-29 23:05:19 +00001816 // If possible, get a TargetInfo for our host triple, so we can match its
1817 // types.
1818 llvm::Triple HostTriple(Opts.HostTriple);
Justin Lebarb6626592017-01-05 16:53:21 +00001819 if (!HostTriple.isNVPTX())
1820 HostTarget.reset(AllocateTarget(llvm::Triple(Opts.HostTriple), Opts));
1821
1822 // If no host target, make some guesses about the data layout and return.
Justin Lebar76945b22016-04-29 23:05:19 +00001823 if (!HostTarget) {
Justin Lebarb6626592017-01-05 16:53:21 +00001824 LongWidth = LongAlign = TargetPointerWidth;
1825 PointerWidth = PointerAlign = TargetPointerWidth;
1826 switch (TargetPointerWidth) {
1827 case 32:
1828 SizeType = TargetInfo::UnsignedInt;
1829 PtrDiffType = TargetInfo::SignedInt;
1830 IntPtrType = TargetInfo::SignedInt;
1831 break;
1832 case 64:
1833 SizeType = TargetInfo::UnsignedLong;
1834 PtrDiffType = TargetInfo::SignedLong;
1835 IntPtrType = TargetInfo::SignedLong;
1836 break;
1837 default:
1838 llvm_unreachable("TargetPointerWidth must be 32 or 64");
1839 }
Justin Lebar76945b22016-04-29 23:05:19 +00001840 return;
1841 }
1842
Justin Lebarb6626592017-01-05 16:53:21 +00001843 // Copy properties from host target.
Justin Lebar76945b22016-04-29 23:05:19 +00001844 PointerWidth = HostTarget->getPointerWidth(/* AddrSpace = */ 0);
1845 PointerAlign = HostTarget->getPointerAlign(/* AddrSpace = */ 0);
1846 BoolWidth = HostTarget->getBoolWidth();
1847 BoolAlign = HostTarget->getBoolAlign();
1848 IntWidth = HostTarget->getIntWidth();
1849 IntAlign = HostTarget->getIntAlign();
1850 HalfWidth = HostTarget->getHalfWidth();
1851 HalfAlign = HostTarget->getHalfAlign();
1852 FloatWidth = HostTarget->getFloatWidth();
1853 FloatAlign = HostTarget->getFloatAlign();
1854 DoubleWidth = HostTarget->getDoubleWidth();
1855 DoubleAlign = HostTarget->getDoubleAlign();
1856 LongWidth = HostTarget->getLongWidth();
1857 LongAlign = HostTarget->getLongAlign();
1858 LongLongWidth = HostTarget->getLongLongWidth();
1859 LongLongAlign = HostTarget->getLongLongAlign();
1860 MinGlobalAlign = HostTarget->getMinGlobalAlign();
Richard Smith59139022016-09-30 22:41:36 +00001861 NewAlign = HostTarget->getNewAlign();
Justin Lebar76945b22016-04-29 23:05:19 +00001862 DefaultAlignForAttributeAligned =
1863 HostTarget->getDefaultAlignForAttributeAligned();
1864 SizeType = HostTarget->getSizeType();
1865 IntMaxType = HostTarget->getIntMaxType();
1866 PtrDiffType = HostTarget->getPtrDiffType(/* AddrSpace = */ 0);
1867 IntPtrType = HostTarget->getIntPtrType();
1868 WCharType = HostTarget->getWCharType();
1869 WIntType = HostTarget->getWIntType();
1870 Char16Type = HostTarget->getChar16Type();
1871 Char32Type = HostTarget->getChar32Type();
1872 Int64Type = HostTarget->getInt64Type();
1873 SigAtomicType = HostTarget->getSigAtomicType();
1874 ProcessIDType = HostTarget->getProcessIDType();
1875
1876 UseBitFieldTypeAlignment = HostTarget->useBitFieldTypeAlignment();
1877 UseZeroLengthBitfieldAlignment =
1878 HostTarget->useZeroLengthBitfieldAlignment();
1879 UseExplicitBitFieldAlignment = HostTarget->useExplicitBitFieldAlignment();
1880 ZeroLengthBitfieldBoundary = HostTarget->getZeroLengthBitfieldBoundary();
1881
Justin Lebar5057f172016-09-09 20:35:43 +00001882 // This is a bit of a lie, but it controls __GCC_ATOMIC_XXX_LOCK_FREE, and
1883 // we need those macros to be identical on host and device, because (among
1884 // other things) they affect which standard library classes are defined, and
1885 // we need all classes to be defined on both the host and device.
1886 MaxAtomicInlineWidth = HostTarget->getMaxAtomicInlineWidth();
1887
Justin Lebar76945b22016-04-29 23:05:19 +00001888 // Properties intentionally not copied from host:
1889 // - LargeArrayMinWidth, LargeArrayAlign: Not visible across the
1890 // host/device boundary.
1891 // - SuitableAlign: Not visible across the host/device boundary, and may
1892 // correctly be different on host/device, e.g. if host has wider vector
1893 // types than device.
1894 // - LongDoubleWidth, LongDoubleAlign: nvptx's long double type is the same
1895 // as its double type, but that's not necessarily true on the host.
1896 // TODO: nvcc emits a warning when using long double on device; we should
1897 // do the same.
Eric Christopherc48497a2015-09-18 21:26:24 +00001898 }
1899 void getTargetDefines(const LangOptions &Opts,
1900 MacroBuilder &Builder) const override {
1901 Builder.defineMacro("__PTX__");
1902 Builder.defineMacro("__NVPTX__");
1903 if (Opts.CUDAIsDevice) {
1904 // Set __CUDA_ARCH__ for the GPU specified.
Justin Lebaref1aaac2016-07-06 21:21:14 +00001905 std::string CUDAArchCode = [this] {
1906 switch (GPU) {
Simon Pilgrim13dff572016-07-07 22:32:26 +00001907 case CudaArch::UNKNOWN:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001908 assert(false && "No GPU arch when compiling CUDA device code.");
1909 return "";
Justin Lebar62907612016-07-06 21:21:39 +00001910 case CudaArch::SM_20:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001911 return "200";
Justin Lebar62907612016-07-06 21:21:39 +00001912 case CudaArch::SM_21:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001913 return "210";
Justin Lebar62907612016-07-06 21:21:39 +00001914 case CudaArch::SM_30:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001915 return "300";
Justin Lebar62907612016-07-06 21:21:39 +00001916 case CudaArch::SM_32:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001917 return "320";
Justin Lebar62907612016-07-06 21:21:39 +00001918 case CudaArch::SM_35:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001919 return "350";
Justin Lebar62907612016-07-06 21:21:39 +00001920 case CudaArch::SM_37:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001921 return "370";
Justin Lebar62907612016-07-06 21:21:39 +00001922 case CudaArch::SM_50:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001923 return "500";
Justin Lebar62907612016-07-06 21:21:39 +00001924 case CudaArch::SM_52:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001925 return "520";
Justin Lebar62907612016-07-06 21:21:39 +00001926 case CudaArch::SM_53:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001927 return "530";
Justin Lebar62907612016-07-06 21:21:39 +00001928 case CudaArch::SM_60:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001929 return "600";
Justin Lebar62907612016-07-06 21:21:39 +00001930 case CudaArch::SM_61:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001931 return "610";
Justin Lebar62907612016-07-06 21:21:39 +00001932 case CudaArch::SM_62:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001933 return "620";
1934 }
Simon Pilgrim13dff572016-07-07 22:32:26 +00001935 llvm_unreachable("unhandled CudaArch");
Justin Lebaref1aaac2016-07-06 21:21:14 +00001936 }();
Eric Christopherc48497a2015-09-18 21:26:24 +00001937 Builder.defineMacro("__CUDA_ARCH__", CUDAArchCode);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001938 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001939 }
Craig Topper6c03a542015-10-19 04:51:35 +00001940 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
1941 return llvm::makeArrayRef(BuiltinInfo,
1942 clang::NVPTX::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eric Christopherc48497a2015-09-18 21:26:24 +00001943 }
Artem Belevichfda99052016-09-28 17:47:35 +00001944 bool
1945 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
1946 StringRef CPU,
1947 const std::vector<std::string> &FeaturesVec) const override {
1948 Features["satom"] = GPU >= CudaArch::SM_60;
1949 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
1950 }
1951
Eric Christopherc48497a2015-09-18 21:26:24 +00001952 bool hasFeature(StringRef Feature) const override {
Artem Belevichfda99052016-09-28 17:47:35 +00001953 return llvm::StringSwitch<bool>(Feature)
1954 .Cases("ptx", "nvptx", true)
1955 .Case("satom", GPU >= CudaArch::SM_60) // Atomics w/ scope.
1956 .Default(false);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001957 }
1958
Craig Topperf054e3a2015-10-19 03:52:27 +00001959 ArrayRef<const char *> getGCCRegNames() const override;
1960 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00001961 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00001962 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00001963 }
1964 bool validateAsmConstraint(const char *&Name,
1965 TargetInfo::ConstraintInfo &Info) const override {
1966 switch (*Name) {
1967 default:
1968 return false;
1969 case 'c':
1970 case 'h':
1971 case 'r':
1972 case 'l':
1973 case 'f':
1974 case 'd':
1975 Info.setAllowsRegister();
1976 return true;
Eli Bendersky13467172015-04-01 20:29:18 +00001977 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001978 }
1979 const char *getClobbers() const override {
1980 // FIXME: Is this really right?
1981 return "";
1982 }
1983 BuiltinVaListKind getBuiltinVaListKind() const override {
1984 // FIXME: implement
1985 return TargetInfo::CharPtrBuiltinVaList;
1986 }
1987 bool setCPU(const std::string &Name) override {
Justin Lebar62907612016-07-06 21:21:39 +00001988 GPU = StringToCudaArch(Name);
1989 return GPU != CudaArch::UNKNOWN;
Eric Christopherc48497a2015-09-18 21:26:24 +00001990 }
Jan Vesely9674bd42016-06-17 19:02:14 +00001991 void setSupportedOpenCLOpts() override {
1992 auto &Opts = getSupportedOpenCLOpts();
Yaxun Liu5b746652016-12-18 05:18:55 +00001993 Opts.support("cl_clang_storage_class_specifiers");
1994 Opts.support("cl_khr_gl_sharing");
1995 Opts.support("cl_khr_icd");
Jan Vesely9674bd42016-06-17 19:02:14 +00001996
Yaxun Liu5b746652016-12-18 05:18:55 +00001997 Opts.support("cl_khr_fp64");
1998 Opts.support("cl_khr_byte_addressable_store");
1999 Opts.support("cl_khr_global_int32_base_atomics");
2000 Opts.support("cl_khr_global_int32_extended_atomics");
2001 Opts.support("cl_khr_local_int32_base_atomics");
2002 Opts.support("cl_khr_local_int32_extended_atomics");
Jan Vesely9674bd42016-06-17 19:02:14 +00002003 }
Justin Lebar86c4e632017-01-05 16:53:38 +00002004
2005 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
2006 // CUDA compilations support all of the host's calling conventions.
2007 //
2008 // TODO: We should warn if you apply a non-default CC to anything other than
2009 // a host function.
2010 if (HostTarget)
2011 return HostTarget->checkCallingConvention(CC);
2012 return CCCR_Warning;
2013 }
Eric Christopherc48497a2015-09-18 21:26:24 +00002014};
2015
2016const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
2017#define BUILTIN(ID, TYPE, ATTRS) \
2018 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
2019#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
2020 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Artem Belevichfda99052016-09-28 17:47:35 +00002021#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
2022 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Eric Christopherc48497a2015-09-18 21:26:24 +00002023#include "clang/Basic/BuiltinsNVPTX.def"
2024};
2025
2026const char *const NVPTXTargetInfo::GCCRegNames[] = {"r0"};
2027
Craig Topperf054e3a2015-10-19 03:52:27 +00002028ArrayRef<const char *> NVPTXTargetInfo::getGCCRegNames() const {
2029 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00002030}
2031
Yaxun Liu3464f922017-03-25 03:46:25 +00002032static const LangAS::Map AMDGPUPrivateIsZeroMap = {
2033 1, // opencl_global
2034 3, // opencl_local
2035 2, // opencl_constant
2036 4, // opencl_generic
2037 1, // cuda_device
2038 2, // cuda_constant
2039 3 // cuda_shared
2040};
2041static const LangAS::Map AMDGPUGenericIsZeroMap = {
2042 1, // opencl_global
2043 3, // opencl_local
2044 4, // opencl_constant
2045 0, // opencl_generic
2046 1, // cuda_device
2047 4, // cuda_constant
2048 3 // cuda_shared
Eli Friedmand13b41e2012-10-12 23:32:00 +00002049};
2050
Tom Stellarda96344b2014-08-21 13:58:40 +00002051// If you edit the description strings, make sure you update
2052// getPointerWidthV().
2053
Craig Topper273dbc62015-10-18 05:29:26 +00002054static const char *const DataLayoutStringR600 =
Rafael Espindola29db13a2014-01-03 18:13:17 +00002055 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
2056 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00002057
Yaxun Liu3464f922017-03-25 03:46:25 +00002058static const char *const DataLayoutStringSIPrivateIsZero =
Matt Arsenault6dc455f2016-05-31 16:58:18 +00002059 "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 +00002060 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
2061 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00002062
Yaxun Liu3464f922017-03-25 03:46:25 +00002063static const char *const DataLayoutStringSIGenericIsZero =
2064 "e-p:64:64-p1:64:64-p2:64:64-p3:32:32-p4:64:64-p5:32:32"
2065 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
2066 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
2067
Matt Arsenault250024f2016-06-08 01:56:42 +00002068class AMDGPUTargetInfo final : public TargetInfo {
Matt Arsenault56f008d2014-06-24 20:45:01 +00002069 static const Builtin::Info BuiltinInfo[];
Tom Stellard7b1059b2015-04-14 14:36:56 +00002070 static const char * const GCCRegNames[];
Matt Arsenault56f008d2014-06-24 20:45:01 +00002071
Yaxun Liu3464f922017-03-25 03:46:25 +00002072 struct AddrSpace {
2073 unsigned Generic, Global, Local, Constant, Private;
2074 AddrSpace(bool IsGenericZero_ = false){
2075 if (IsGenericZero_) {
2076 Generic = 0;
2077 Global = 1;
2078 Local = 3;
2079 Constant = 4;
2080 Private = 5;
2081 } else {
2082 Generic = 4;
2083 Global = 1;
2084 Local = 3;
2085 Constant = 2;
2086 Private = 0;
2087 }
2088 }
2089 };
2090
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002091 /// \brief The GPU profiles supported by the AMDGPU target.
Tom Stellardc74b1e02013-03-04 17:40:53 +00002092 enum GPUKind {
2093 GK_NONE,
2094 GK_R600,
2095 GK_R600_DOUBLE_OPS,
2096 GK_R700,
2097 GK_R700_DOUBLE_OPS,
2098 GK_EVERGREEN,
2099 GK_EVERGREEN_DOUBLE_OPS,
2100 GK_NORTHERN_ISLANDS,
2101 GK_CAYMAN,
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002102 GK_GFX6,
2103 GK_GFX7,
Matt Arsenaulteb952fd2017-02-18 19:02:41 +00002104 GK_GFX8,
2105 GK_GFX9
Tom Stellardc74b1e02013-03-04 17:40:53 +00002106 } GPU;
2107
Jan Veselyeebeaea2015-05-04 19:53:36 +00002108 bool hasFP64:1;
2109 bool hasFMAF:1;
2110 bool hasLDEXPF:1;
Yaxun Liud3e85b92016-09-13 17:37:09 +00002111 bool hasFullSpeedFP32Denorms:1;
Jan Veselya3abd6d2015-05-01 17:38:13 +00002112
Matt Arsenault250024f2016-06-08 01:56:42 +00002113 static bool isAMDGCN(const llvm::Triple &TT) {
2114 return TT.getArch() == llvm::Triple::amdgcn;
2115 }
2116
Yaxun Liu3464f922017-03-25 03:46:25 +00002117 static bool isGenericZero(const llvm::Triple &TT) {
2118 return TT.getEnvironmentName() == "amdgiz" ||
2119 TT.getEnvironmentName() == "amdgizcl";
2120 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00002121public:
Yaxun Liu2c17e822016-08-09 19:43:38 +00002122 AMDGPUTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Matt Arsenault250024f2016-06-08 01:56:42 +00002123 : TargetInfo(Triple) ,
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002124 GPU(isAMDGCN(Triple) ? GK_GFX6 : GK_R600),
Matt Arsenault250024f2016-06-08 01:56:42 +00002125 hasFP64(false),
2126 hasFMAF(false),
Yaxun Liu2c17e822016-08-09 19:43:38 +00002127 hasLDEXPF(false),
Yaxun Liu3464f922017-03-25 03:46:25 +00002128 hasFullSpeedFP32Denorms(false),
2129 AS(isGenericZero(Triple)){
Matt Arsenault250024f2016-06-08 01:56:42 +00002130 if (getTriple().getArch() == llvm::Triple::amdgcn) {
Jan Veselya3abd6d2015-05-01 17:38:13 +00002131 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00002132 hasFMAF = true;
2133 hasLDEXPF = true;
Tom Stellardd99fb952015-01-28 15:38:44 +00002134 }
Yaxun Liu3464f922017-03-25 03:46:25 +00002135 auto IsGenericZero = isGenericZero(Triple);
Matt Arsenault250024f2016-06-08 01:56:42 +00002136 resetDataLayout(getTriple().getArch() == llvm::Triple::amdgcn ?
Yaxun Liu3464f922017-03-25 03:46:25 +00002137 (IsGenericZero ? DataLayoutStringSIGenericIsZero :
2138 DataLayoutStringSIPrivateIsZero)
2139 : DataLayoutStringR600);
Matt Arsenault250024f2016-06-08 01:56:42 +00002140
Yaxun Liu3464f922017-03-25 03:46:25 +00002141 AddrSpaceMap = IsGenericZero ? &AMDGPUGenericIsZeroMap :
2142 &AMDGPUPrivateIsZeroMap;
David Tweed31d09b02013-09-13 12:04:22 +00002143 UseAddrSpaceMapMangling = true;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002144 }
2145
Tom Stellarda96344b2014-08-21 13:58:40 +00002146 uint64_t getPointerWidthV(unsigned AddrSpace) const override {
2147 if (GPU <= GK_CAYMAN)
2148 return 32;
2149
Yaxun Liu3464f922017-03-25 03:46:25 +00002150 if (AddrSpace == AS.Private || AddrSpace == AS.Local) {
2151 return 32;
Tom Stellarda96344b2014-08-21 13:58:40 +00002152 }
Yaxun Liu3464f922017-03-25 03:46:25 +00002153 return 64;
Tom Stellarda96344b2014-08-21 13:58:40 +00002154 }
2155
Yaxun Liu26f75662016-08-19 05:17:25 +00002156 uint64_t getMaxPointerWidth() const override {
2157 return getTriple().getArch() == llvm::Triple::amdgcn ? 64 : 32;
2158 }
2159
Craig Topper3164f332014-03-11 03:39:26 +00002160 const char * getClobbers() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00002161 return "";
2162 }
2163
Craig Topperf054e3a2015-10-19 03:52:27 +00002164 ArrayRef<const char *> getGCCRegNames() const override;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002165
Craig Topperf054e3a2015-10-19 03:52:27 +00002166 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
2167 return None;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002168 }
2169
Craig Topper3164f332014-03-11 03:39:26 +00002170 bool validateAsmConstraint(const char *&Name,
Tom Stellardd097e942015-11-19 22:11:58 +00002171 TargetInfo::ConstraintInfo &Info) const override {
2172 switch (*Name) {
2173 default: break;
2174 case 'v': // vgpr
2175 case 's': // sgpr
2176 Info.setAllowsRegister();
2177 return true;
2178 }
2179 return false;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002180 }
2181
Matt Arsenault250024f2016-06-08 01:56:42 +00002182 bool initFeatureMap(llvm::StringMap<bool> &Features,
2183 DiagnosticsEngine &Diags, StringRef CPU,
2184 const std::vector<std::string> &FeatureVec) const override;
2185
Yaxun Liu2c17e822016-08-09 19:43:38 +00002186 void adjustTargetOptions(const CodeGenOptions &CGOpts,
2187 TargetOptions &TargetOpts) const override {
Yaxun Liu2c17e822016-08-09 19:43:38 +00002188 bool hasFP32Denormals = false;
2189 bool hasFP64Denormals = false;
2190 for (auto &I : TargetOpts.FeaturesAsWritten) {
2191 if (I == "+fp32-denormals" || I == "-fp32-denormals")
2192 hasFP32Denormals = true;
Matt Arsenault09cca092017-01-23 22:31:14 +00002193 if (I == "+fp64-fp16-denormals" || I == "-fp64-fp16-denormals")
Yaxun Liu2c17e822016-08-09 19:43:38 +00002194 hasFP64Denormals = true;
2195 }
2196 if (!hasFP32Denormals)
Yaxun Liud3e85b92016-09-13 17:37:09 +00002197 TargetOpts.Features.push_back((Twine(hasFullSpeedFP32Denorms &&
2198 !CGOpts.FlushDenorm ? '+' : '-') + Twine("fp32-denormals")).str());
Matt Arsenault09cca092017-01-23 22:31:14 +00002199 // Always do not flush fp64 or fp16 denorms.
Yaxun Liu2c17e822016-08-09 19:43:38 +00002200 if (!hasFP64Denormals && hasFP64)
Matt Arsenault09cca092017-01-23 22:31:14 +00002201 TargetOpts.Features.push_back("+fp64-fp16-denormals");
Yaxun Liu2c17e822016-08-09 19:43:38 +00002202 }
2203
Craig Topper6c03a542015-10-19 04:51:35 +00002204 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
2205 return llvm::makeArrayRef(BuiltinInfo,
2206 clang::AMDGPU::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eli Friedmand13b41e2012-10-12 23:32:00 +00002207 }
2208
Craig Topper3164f332014-03-11 03:39:26 +00002209 void getTargetDefines(const LangOptions &Opts,
2210 MacroBuilder &Builder) const override {
Matt Arsenault5e020b22016-02-27 09:06:26 +00002211 if (getTriple().getArch() == llvm::Triple::amdgcn)
2212 Builder.defineMacro("__AMDGCN__");
2213 else
2214 Builder.defineMacro("__R600__");
2215
Jan Veselyeebeaea2015-05-04 19:53:36 +00002216 if (hasFMAF)
2217 Builder.defineMacro("__HAS_FMAF__");
2218 if (hasLDEXPF)
2219 Builder.defineMacro("__HAS_LDEXPF__");
Jan Vesely211ba782016-06-17 02:25:03 +00002220 if (hasFP64)
2221 Builder.defineMacro("__HAS_FP64__");
Eli Friedmand13b41e2012-10-12 23:32:00 +00002222 }
2223
Craig Topper3164f332014-03-11 03:39:26 +00002224 BuiltinVaListKind getBuiltinVaListKind() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00002225 return TargetInfo::CharPtrBuiltinVaList;
2226 }
2227
Matt Arsenault250024f2016-06-08 01:56:42 +00002228 static GPUKind parseR600Name(StringRef Name) {
2229 return llvm::StringSwitch<GPUKind>(Name)
Tom Stellardc74b1e02013-03-04 17:40:53 +00002230 .Case("r600" , GK_R600)
2231 .Case("rv610", GK_R600)
2232 .Case("rv620", GK_R600)
2233 .Case("rv630", GK_R600)
2234 .Case("rv635", GK_R600)
2235 .Case("rs780", GK_R600)
2236 .Case("rs880", GK_R600)
2237 .Case("rv670", GK_R600_DOUBLE_OPS)
2238 .Case("rv710", GK_R700)
2239 .Case("rv730", GK_R700)
2240 .Case("rv740", GK_R700_DOUBLE_OPS)
2241 .Case("rv770", GK_R700_DOUBLE_OPS)
2242 .Case("palm", GK_EVERGREEN)
2243 .Case("cedar", GK_EVERGREEN)
2244 .Case("sumo", GK_EVERGREEN)
2245 .Case("sumo2", GK_EVERGREEN)
2246 .Case("redwood", GK_EVERGREEN)
2247 .Case("juniper", GK_EVERGREEN)
2248 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
2249 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
2250 .Case("barts", GK_NORTHERN_ISLANDS)
2251 .Case("turks", GK_NORTHERN_ISLANDS)
2252 .Case("caicos", GK_NORTHERN_ISLANDS)
2253 .Case("cayman", GK_CAYMAN)
2254 .Case("aruba", GK_CAYMAN)
Matt Arsenault250024f2016-06-08 01:56:42 +00002255 .Default(GK_NONE);
2256 }
2257
2258 static GPUKind parseAMDGCNName(StringRef Name) {
2259 return llvm::StringSwitch<GPUKind>(Name)
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002260 .Case("tahiti", GK_GFX6)
2261 .Case("pitcairn", GK_GFX6)
2262 .Case("verde", GK_GFX6)
2263 .Case("oland", GK_GFX6)
2264 .Case("hainan", GK_GFX6)
2265 .Case("bonaire", GK_GFX7)
2266 .Case("kabini", GK_GFX7)
2267 .Case("kaveri", GK_GFX7)
2268 .Case("hawaii", GK_GFX7)
2269 .Case("mullins", GK_GFX7)
Yaxun Liue59a0bc2016-10-26 16:40:21 +00002270 .Case("gfx700", GK_GFX7)
2271 .Case("gfx701", GK_GFX7)
2272 .Case("gfx702", GK_GFX7)
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002273 .Case("tonga", GK_GFX8)
2274 .Case("iceland", GK_GFX8)
2275 .Case("carrizo", GK_GFX8)
2276 .Case("fiji", GK_GFX8)
2277 .Case("stoney", GK_GFX8)
2278 .Case("polaris10", GK_GFX8)
2279 .Case("polaris11", GK_GFX8)
Yaxun Liue59a0bc2016-10-26 16:40:21 +00002280 .Case("gfx800", GK_GFX8)
2281 .Case("gfx801", GK_GFX8)
2282 .Case("gfx802", GK_GFX8)
2283 .Case("gfx803", GK_GFX8)
2284 .Case("gfx804", GK_GFX8)
2285 .Case("gfx810", GK_GFX8)
Matt Arsenaulteb952fd2017-02-18 19:02:41 +00002286 .Case("gfx900", GK_GFX9)
2287 .Case("gfx901", GK_GFX9)
Tom Stellardc74b1e02013-03-04 17:40:53 +00002288 .Default(GK_NONE);
Matt Arsenault250024f2016-06-08 01:56:42 +00002289 }
Tom Stellardc74b1e02013-03-04 17:40:53 +00002290
Matt Arsenault250024f2016-06-08 01:56:42 +00002291 bool setCPU(const std::string &Name) override {
2292 if (getTriple().getArch() == llvm::Triple::amdgcn)
2293 GPU = parseAMDGCNName(Name);
2294 else
2295 GPU = parseR600Name(Name);
Tom Stellardc74b1e02013-03-04 17:40:53 +00002296
Matt Arsenault250024f2016-06-08 01:56:42 +00002297 return GPU != GK_NONE;
Tom Stellardc74b1e02013-03-04 17:40:53 +00002298 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002299
Jan Vesely211ba782016-06-17 02:25:03 +00002300 void setSupportedOpenCLOpts() override {
2301 auto &Opts = getSupportedOpenCLOpts();
Yaxun Liu5b746652016-12-18 05:18:55 +00002302 Opts.support("cl_clang_storage_class_specifiers");
2303 Opts.support("cl_khr_icd");
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002304
Jan Vesely211ba782016-06-17 02:25:03 +00002305 if (hasFP64)
Yaxun Liu5b746652016-12-18 05:18:55 +00002306 Opts.support("cl_khr_fp64");
Jan Vesely211ba782016-06-17 02:25:03 +00002307 if (GPU >= GK_EVERGREEN) {
Yaxun Liu5b746652016-12-18 05:18:55 +00002308 Opts.support("cl_khr_byte_addressable_store");
2309 Opts.support("cl_khr_global_int32_base_atomics");
2310 Opts.support("cl_khr_global_int32_extended_atomics");
2311 Opts.support("cl_khr_local_int32_base_atomics");
2312 Opts.support("cl_khr_local_int32_extended_atomics");
Jan Vesely211ba782016-06-17 02:25:03 +00002313 }
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002314 if (GPU >= GK_GFX6) {
Yaxun Liu5b746652016-12-18 05:18:55 +00002315 Opts.support("cl_khr_fp16");
2316 Opts.support("cl_khr_int64_base_atomics");
2317 Opts.support("cl_khr_int64_extended_atomics");
2318 Opts.support("cl_khr_mipmap_image");
2319 Opts.support("cl_khr_subgroups");
2320 Opts.support("cl_khr_3d_image_writes");
2321 Opts.support("cl_amd_media_ops");
2322 Opts.support("cl_amd_media_ops2");
Jan Vesely211ba782016-06-17 02:25:03 +00002323 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002324 }
Nikolay Haustov8c6538b2016-06-30 09:06:33 +00002325
Yaxun Liu99444cb2016-08-03 20:38:06 +00002326 LangAS::ID getOpenCLImageAddrSpace() const override {
2327 return LangAS::opencl_constant;
2328 }
2329
Konstantin Zhuravlyovd1ba16e2017-03-08 23:56:48 +00002330 /// \returns Target specific vtbl ptr address space.
2331 unsigned getVtblPtrAddressSpace() const override {
2332 // \todo: We currently have address spaces defined in AMDGPU Backend. It
2333 // would be nice if we could use it here instead of using bare numbers (same
2334 // applies to getDWARFAddressSpace).
2335 return 2; // constant.
2336 }
2337
2338 /// \returns If a target requires an address within a target specific address
2339 /// space \p AddressSpace to be converted in order to be used, then return the
2340 /// corresponding target specific DWARF address space.
2341 ///
2342 /// \returns Otherwise return None and no conversion will be emitted in the
2343 /// DWARF.
2344 Optional<unsigned> getDWARFAddressSpace(
2345 unsigned AddressSpace) const override {
Yaxun Liu3464f922017-03-25 03:46:25 +00002346 const unsigned DWARF_Private = 1;
2347 const unsigned DWARF_Local = 2;
2348 if (AddressSpace == AS.Private) {
2349 return DWARF_Private;
2350 } else if (AddressSpace == AS.Local) {
2351 return DWARF_Local;
2352 } else {
Konstantin Zhuravlyovd1ba16e2017-03-08 23:56:48 +00002353 return None;
2354 }
2355 }
2356
Nikolay Haustov8c6538b2016-06-30 09:06:33 +00002357 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
2358 switch (CC) {
2359 default:
2360 return CCCR_Warning;
2361 case CC_C:
2362 case CC_OpenCLKernel:
2363 return CCCR_OK;
2364 }
2365 }
Yaxun Liu402804b2016-12-15 08:09:08 +00002366
2367 // In amdgcn target the null pointer in global, constant, and generic
2368 // address space has value 0 but in private and local address space has
2369 // value ~0.
2370 uint64_t getNullPointerValue(unsigned AS) const override {
Matt Arsenaultbf5e3e42017-03-13 19:47:53 +00002371 return AS == LangAS::opencl_local ? ~0 : 0;
Yaxun Liu402804b2016-12-15 08:09:08 +00002372 }
Yaxun Liu3464f922017-03-25 03:46:25 +00002373
2374 const AddrSpace AS;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002375};
2376
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002377const Builtin::Info AMDGPUTargetInfo::BuiltinInfo[] = {
Matt Arsenault56f008d2014-06-24 20:45:01 +00002378#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00002379 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Matt Arsenault250024f2016-06-08 01:56:42 +00002380#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
2381 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002382#include "clang/Basic/BuiltinsAMDGPU.def"
Matt Arsenault56f008d2014-06-24 20:45:01 +00002383};
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002384const char * const AMDGPUTargetInfo::GCCRegNames[] = {
Tom Stellard7b1059b2015-04-14 14:36:56 +00002385 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
2386 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
2387 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
2388 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
2389 "v32", "v33", "v34", "v35", "v36", "v37", "v38", "v39",
2390 "v40", "v41", "v42", "v43", "v44", "v45", "v46", "v47",
2391 "v48", "v49", "v50", "v51", "v52", "v53", "v54", "v55",
2392 "v56", "v57", "v58", "v59", "v60", "v61", "v62", "v63",
2393 "v64", "v65", "v66", "v67", "v68", "v69", "v70", "v71",
2394 "v72", "v73", "v74", "v75", "v76", "v77", "v78", "v79",
2395 "v80", "v81", "v82", "v83", "v84", "v85", "v86", "v87",
2396 "v88", "v89", "v90", "v91", "v92", "v93", "v94", "v95",
2397 "v96", "v97", "v98", "v99", "v100", "v101", "v102", "v103",
2398 "v104", "v105", "v106", "v107", "v108", "v109", "v110", "v111",
2399 "v112", "v113", "v114", "v115", "v116", "v117", "v118", "v119",
2400 "v120", "v121", "v122", "v123", "v124", "v125", "v126", "v127",
2401 "v128", "v129", "v130", "v131", "v132", "v133", "v134", "v135",
2402 "v136", "v137", "v138", "v139", "v140", "v141", "v142", "v143",
2403 "v144", "v145", "v146", "v147", "v148", "v149", "v150", "v151",
2404 "v152", "v153", "v154", "v155", "v156", "v157", "v158", "v159",
2405 "v160", "v161", "v162", "v163", "v164", "v165", "v166", "v167",
2406 "v168", "v169", "v170", "v171", "v172", "v173", "v174", "v175",
2407 "v176", "v177", "v178", "v179", "v180", "v181", "v182", "v183",
2408 "v184", "v185", "v186", "v187", "v188", "v189", "v190", "v191",
2409 "v192", "v193", "v194", "v195", "v196", "v197", "v198", "v199",
2410 "v200", "v201", "v202", "v203", "v204", "v205", "v206", "v207",
2411 "v208", "v209", "v210", "v211", "v212", "v213", "v214", "v215",
2412 "v216", "v217", "v218", "v219", "v220", "v221", "v222", "v223",
2413 "v224", "v225", "v226", "v227", "v228", "v229", "v230", "v231",
2414 "v232", "v233", "v234", "v235", "v236", "v237", "v238", "v239",
2415 "v240", "v241", "v242", "v243", "v244", "v245", "v246", "v247",
2416 "v248", "v249", "v250", "v251", "v252", "v253", "v254", "v255",
2417 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
2418 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
2419 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
2420 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
2421 "s32", "s33", "s34", "s35", "s36", "s37", "s38", "s39",
2422 "s40", "s41", "s42", "s43", "s44", "s45", "s46", "s47",
2423 "s48", "s49", "s50", "s51", "s52", "s53", "s54", "s55",
2424 "s56", "s57", "s58", "s59", "s60", "s61", "s62", "s63",
2425 "s64", "s65", "s66", "s67", "s68", "s69", "s70", "s71",
2426 "s72", "s73", "s74", "s75", "s76", "s77", "s78", "s79",
2427 "s80", "s81", "s82", "s83", "s84", "s85", "s86", "s87",
2428 "s88", "s89", "s90", "s91", "s92", "s93", "s94", "s95",
2429 "s96", "s97", "s98", "s99", "s100", "s101", "s102", "s103",
2430 "s104", "s105", "s106", "s107", "s108", "s109", "s110", "s111",
2431 "s112", "s113", "s114", "s115", "s116", "s117", "s118", "s119",
Etienne Bergerone8ae26f2016-03-24 18:29:24 +00002432 "s120", "s121", "s122", "s123", "s124", "s125", "s126", "s127",
Matt Arsenaultb015d622016-02-27 09:06:22 +00002433 "exec", "vcc", "scc", "m0", "flat_scratch", "exec_lo", "exec_hi",
2434 "vcc_lo", "vcc_hi", "flat_scratch_lo", "flat_scratch_hi"
Tom Stellard7b1059b2015-04-14 14:36:56 +00002435};
2436
Craig Topperf054e3a2015-10-19 03:52:27 +00002437ArrayRef<const char *> AMDGPUTargetInfo::getGCCRegNames() const {
2438 return llvm::makeArrayRef(GCCRegNames);
Tom Stellard7b1059b2015-04-14 14:36:56 +00002439}
Matt Arsenault56f008d2014-06-24 20:45:01 +00002440
Matt Arsenault250024f2016-06-08 01:56:42 +00002441bool AMDGPUTargetInfo::initFeatureMap(
2442 llvm::StringMap<bool> &Features,
2443 DiagnosticsEngine &Diags, StringRef CPU,
2444 const std::vector<std::string> &FeatureVec) const {
2445
2446 // XXX - What does the member GPU mean if device name string passed here?
2447 if (getTriple().getArch() == llvm::Triple::amdgcn) {
2448 if (CPU.empty())
2449 CPU = "tahiti";
2450
2451 switch (parseAMDGCNName(CPU)) {
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002452 case GK_GFX6:
2453 case GK_GFX7:
Matt Arsenault250024f2016-06-08 01:56:42 +00002454 break;
2455
Matt Arsenaulta0c6dca2017-02-22 20:55:59 +00002456 case GK_GFX9:
2457 Features["gfx9-insts"] = true;
2458 LLVM_FALLTHROUGH;
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002459 case GK_GFX8:
Matt Arsenault250024f2016-06-08 01:56:42 +00002460 Features["s-memrealtime"] = true;
2461 Features["16-bit-insts"] = true;
Yaxun Liu4d867992017-03-10 01:30:46 +00002462 Features["dpp"] = true;
Matt Arsenault250024f2016-06-08 01:56:42 +00002463 break;
2464
2465 case GK_NONE:
2466 return false;
2467 default:
2468 llvm_unreachable("unhandled subtarget");
2469 }
2470 } else {
2471 if (CPU.empty())
2472 CPU = "r600";
2473
2474 switch (parseR600Name(CPU)) {
2475 case GK_R600:
2476 case GK_R700:
2477 case GK_EVERGREEN:
2478 case GK_NORTHERN_ISLANDS:
2479 break;
2480 case GK_R600_DOUBLE_OPS:
2481 case GK_R700_DOUBLE_OPS:
2482 case GK_EVERGREEN_DOUBLE_OPS:
2483 case GK_CAYMAN:
2484 Features["fp64"] = true;
2485 break;
2486 case GK_NONE:
2487 return false;
2488 default:
2489 llvm_unreachable("unhandled subtarget");
2490 }
2491 }
2492
2493 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeatureVec);
2494}
2495
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00002496const Builtin::Info BuiltinInfoX86[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00002497#define BUILTIN(ID, TYPE, ATTRS) \
2498 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002499#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
Craig Topper07d3b622015-08-07 05:14:44 +00002500 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Albert Gutowski727ab8a2016-09-14 21:19:43 +00002501#define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANGS, FEATURE) \
2502 { #ID, TYPE, ATTRS, HEADER, LANGS, FEATURE },
Chris Lattner5abdec72009-06-14 01:05:48 +00002503#include "clang/Basic/BuiltinsX86.def"
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00002504
2505#define BUILTIN(ID, TYPE, ATTRS) \
2506 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Albert Gutowski0fd6e962016-10-12 17:28:44 +00002507#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
2508 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00002509#define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANGS, FEATURE) \
2510 { #ID, TYPE, ATTRS, HEADER, LANGS, FEATURE },
2511#include "clang/Basic/BuiltinsX86_64.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00002512};
Eli Friedmanb5366062008-05-20 14:21:01 +00002513
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00002514
Nuno Lopescfca1f02009-12-23 17:49:57 +00002515static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002516 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
2517 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00002518 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002519 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
2520 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
2521 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00002522 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00002523 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
2524 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Marina Yatsina41c45fa2016-02-03 11:32:08 +00002525 "xmm16", "xmm17", "xmm18", "xmm19", "xmm20", "xmm21", "xmm22", "xmm23",
2526 "xmm24", "xmm25", "xmm26", "xmm27", "xmm28", "xmm29", "xmm30", "xmm31",
2527 "ymm16", "ymm17", "ymm18", "ymm19", "ymm20", "ymm21", "ymm22", "ymm23",
2528 "ymm24", "ymm25", "ymm26", "ymm27", "ymm28", "ymm29", "ymm30", "ymm31",
2529 "zmm0", "zmm1", "zmm2", "zmm3", "zmm4", "zmm5", "zmm6", "zmm7",
2530 "zmm8", "zmm9", "zmm10", "zmm11", "zmm12", "zmm13", "zmm14", "zmm15",
2531 "zmm16", "zmm17", "zmm18", "zmm19", "zmm20", "zmm21", "zmm22", "zmm23",
2532 "zmm24", "zmm25", "zmm26", "zmm27", "zmm28", "zmm29", "zmm30", "zmm31",
Michael Zuckerman15604b92016-10-31 14:16:57 +00002533 "k0", "k1", "k2", "k3", "k4", "k5", "k6", "k7",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002534};
2535
Eric Christophercdd36352011-06-21 00:05:20 +00002536const TargetInfo::AddlRegName AddlRegNames[] = {
2537 { { "al", "ah", "eax", "rax" }, 0 },
2538 { { "bl", "bh", "ebx", "rbx" }, 3 },
2539 { { "cl", "ch", "ecx", "rcx" }, 2 },
2540 { { "dl", "dh", "edx", "rdx" }, 1 },
2541 { { "esi", "rsi" }, 4 },
2542 { { "edi", "rdi" }, 5 },
2543 { { "esp", "rsp" }, 7 },
2544 { { "ebp", "rbp" }, 6 },
Alexey Bataeva7ab1b42015-09-04 03:42:23 +00002545 { { "r8d", "r8w", "r8b" }, 38 },
2546 { { "r9d", "r9w", "r9b" }, 39 },
2547 { { "r10d", "r10w", "r10b" }, 40 },
2548 { { "r11d", "r11w", "r11b" }, 41 },
2549 { { "r12d", "r12w", "r12b" }, 42 },
2550 { { "r13d", "r13w", "r13b" }, 43 },
2551 { { "r14d", "r14w", "r14b" }, 44 },
2552 { { "r15d", "r15w", "r15b" }, 45 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00002553};
2554
2555// X86 target abstract base class; x86-32 and x86-64 are very close, so
2556// most of the implementation can be shared.
2557class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00002558 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002559 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Craig Topper543f3bd2015-10-14 23:47:57 +00002560 } SSELevel = NoSSE;
Eli Friedman33465822011-07-08 23:31:17 +00002561 enum MMX3DNowEnum {
2562 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
Craig Topper543f3bd2015-10-14 23:47:57 +00002563 } MMX3DNowLevel = NoMMX3DNow;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002564 enum XOPEnum {
2565 NoXOP,
2566 SSE4A,
2567 FMA4,
2568 XOP
Craig Topper543f3bd2015-10-14 23:47:57 +00002569 } XOPLevel = NoXOP;
Anders Carlssone437c682010-01-27 03:47:49 +00002570
Craig Topper543f3bd2015-10-14 23:47:57 +00002571 bool HasAES = false;
2572 bool HasPCLMUL = false;
2573 bool HasLZCNT = false;
2574 bool HasRDRND = false;
2575 bool HasFSGSBASE = false;
2576 bool HasBMI = false;
2577 bool HasBMI2 = false;
2578 bool HasPOPCNT = false;
2579 bool HasRTM = false;
2580 bool HasPRFCHW = false;
2581 bool HasRDSEED = false;
2582 bool HasADX = false;
2583 bool HasTBM = false;
2584 bool HasFMA = false;
2585 bool HasF16C = false;
2586 bool HasAVX512CD = false;
2587 bool HasAVX512ER = false;
2588 bool HasAVX512PF = false;
2589 bool HasAVX512DQ = false;
2590 bool HasAVX512BW = false;
2591 bool HasAVX512VL = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002592 bool HasAVX512VBMI = false;
2593 bool HasAVX512IFMA = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002594 bool HasSHA = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002595 bool HasMPX = false;
2596 bool HasSGX = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002597 bool HasCX16 = false;
Craig Toppere33f51f2015-10-16 06:22:36 +00002598 bool HasFXSR = false;
Craig Topperda9fe562015-10-15 05:23:38 +00002599 bool HasXSAVE = false;
2600 bool HasXSAVEOPT = false;
2601 bool HasXSAVEC = false;
2602 bool HasXSAVES = false;
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00002603 bool HasMWAITX = false;
Craig Topper45742262017-02-09 06:10:14 +00002604 bool HasCLZERO = false;
Asaf Badouha9d1e182015-12-31 14:14:07 +00002605 bool HasPKU = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002606 bool HasCLFLUSHOPT = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002607 bool HasCLWB = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002608 bool HasMOVBE = false;
2609 bool HasPREFETCHWT1 = false;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00002610
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002611 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
2612 ///
2613 /// Each enumeration represents a particular CPU supported by Clang. These
2614 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
2615 enum CPUKind {
2616 CK_Generic,
2617
2618 /// \name i386
2619 /// i386-generation processors.
2620 //@{
2621 CK_i386,
2622 //@}
2623
2624 /// \name i486
2625 /// i486-generation processors.
2626 //@{
2627 CK_i486,
2628 CK_WinChipC6,
2629 CK_WinChip2,
2630 CK_C3,
2631 //@}
2632
2633 /// \name i586
2634 /// i586-generation processors, P5 microarchitecture based.
2635 //@{
2636 CK_i586,
2637 CK_Pentium,
2638 CK_PentiumMMX,
2639 //@}
2640
2641 /// \name i686
2642 /// i686-generation processors, P6 / Pentium M microarchitecture based.
2643 //@{
2644 CK_i686,
2645 CK_PentiumPro,
2646 CK_Pentium2,
2647 CK_Pentium3,
2648 CK_Pentium3M,
2649 CK_PentiumM,
2650 CK_C3_2,
2651
2652 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
2653 /// Clang however has some logic to suport this.
2654 // FIXME: Warn, deprecate, and potentially remove this.
2655 CK_Yonah,
2656 //@}
2657
2658 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00002659 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002660 //@{
2661 CK_Pentium4,
2662 CK_Pentium4M,
2663 CK_Prescott,
2664 CK_Nocona,
2665 //@}
2666
2667 /// \name Core
2668 /// Core microarchitecture based processors.
2669 //@{
2670 CK_Core2,
2671
2672 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
2673 /// codename which GCC no longer accepts as an option to -march, but Clang
2674 /// has some logic for recognizing it.
2675 // FIXME: Warn, deprecate, and potentially remove this.
2676 CK_Penryn,
2677 //@}
2678
2679 /// \name Atom
2680 /// Atom processors
2681 //@{
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002682 CK_Bonnell,
Preston Gurda3c58c02013-09-13 19:27:17 +00002683 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002684 //@}
2685
2686 /// \name Nehalem
2687 /// Nehalem microarchitecture based processors.
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002688 CK_Nehalem,
2689
2690 /// \name Westmere
2691 /// Westmere microarchitecture based processors.
2692 CK_Westmere,
2693
2694 /// \name Sandy Bridge
2695 /// Sandy Bridge microarchitecture based processors.
2696 CK_SandyBridge,
2697
2698 /// \name Ivy Bridge
2699 /// Ivy Bridge microarchitecture based processors.
2700 CK_IvyBridge,
2701
2702 /// \name Haswell
2703 /// Haswell microarchitecture based processors.
2704 CK_Haswell,
2705
2706 /// \name Broadwell
2707 /// Broadwell microarchitecture based processors.
Robert Khasanov50e6f582014-09-19 09:53:48 +00002708 CK_Broadwell,
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002709
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002710 /// \name Skylake Client
2711 /// Skylake client microarchitecture based processors.
2712 CK_SkylakeClient,
2713
2714 /// \name Skylake Server
2715 /// Skylake server microarchitecture based processors.
2716 CK_SkylakeServer,
2717
2718 /// \name Cannonlake Client
2719 /// Cannonlake client microarchitecture based processors.
2720 CK_Cannonlake,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002721
Craig Topper449314e2013-08-20 07:09:39 +00002722 /// \name Knights Landing
2723 /// Knights Landing processor.
2724 CK_KNL,
2725
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002726 /// \name Lakemont
2727 /// Lakemont microarchitecture based processors.
2728 CK_Lakemont,
2729
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002730 /// \name K6
2731 /// K6 architecture processors.
2732 //@{
2733 CK_K6,
2734 CK_K6_2,
2735 CK_K6_3,
2736 //@}
2737
2738 /// \name K7
2739 /// K7 architecture processors.
2740 //@{
2741 CK_Athlon,
2742 CK_AthlonThunderbird,
2743 CK_Athlon4,
2744 CK_AthlonXP,
2745 CK_AthlonMP,
2746 //@}
2747
2748 /// \name K8
2749 /// K8 architecture processors.
2750 //@{
2751 CK_Athlon64,
2752 CK_Athlon64SSE3,
2753 CK_AthlonFX,
2754 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00002755 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002756 CK_Opteron,
2757 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00002758 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002759 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002760
Benjamin Kramer569f2152012-01-10 11:50:18 +00002761 /// \name Bobcat
2762 /// Bobcat architecture processors.
2763 //@{
2764 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002765 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002766 //@}
2767
2768 /// \name Bulldozer
2769 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002770 //@{
2771 CK_BDVER1,
2772 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002773 CK_BDVER3,
Benjamin Kramer56c58222014-05-02 15:47:51 +00002774 CK_BDVER4,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002775 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002776
Craig Topperc45744a2017-01-10 06:02:12 +00002777 /// \name zen
2778 /// Zen architecture processors.
2779 //@{
2780 CK_ZNVER1,
2781 //@}
2782
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002783 /// This specification is deprecated and will be removed in the future.
2784 /// Users should prefer \see CK_K8.
2785 // FIXME: Warn on this when the CPU is set to it.
Saleem Abdulrasoolcb29c1a2014-11-17 18:40:15 +00002786 //@{
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002787 CK_x86_64,
2788 //@}
2789
2790 /// \name Geode
2791 /// Geode processors.
2792 //@{
2793 CK_Geode
2794 //@}
Craig Topper543f3bd2015-10-14 23:47:57 +00002795 } CPU = CK_Generic;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002796
Eric Christopherc50738f2015-08-27 00:05:50 +00002797 CPUKind getCPUKind(StringRef CPU) const {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002798 return llvm::StringSwitch<CPUKind>(CPU)
2799 .Case("i386", CK_i386)
2800 .Case("i486", CK_i486)
2801 .Case("winchip-c6", CK_WinChipC6)
2802 .Case("winchip2", CK_WinChip2)
2803 .Case("c3", CK_C3)
2804 .Case("i586", CK_i586)
2805 .Case("pentium", CK_Pentium)
2806 .Case("pentium-mmx", CK_PentiumMMX)
2807 .Case("i686", CK_i686)
2808 .Case("pentiumpro", CK_PentiumPro)
2809 .Case("pentium2", CK_Pentium2)
2810 .Case("pentium3", CK_Pentium3)
2811 .Case("pentium3m", CK_Pentium3M)
2812 .Case("pentium-m", CK_PentiumM)
2813 .Case("c3-2", CK_C3_2)
2814 .Case("yonah", CK_Yonah)
2815 .Case("pentium4", CK_Pentium4)
2816 .Case("pentium4m", CK_Pentium4M)
2817 .Case("prescott", CK_Prescott)
2818 .Case("nocona", CK_Nocona)
2819 .Case("core2", CK_Core2)
2820 .Case("penryn", CK_Penryn)
2821 .Case("bonnell", CK_Bonnell)
2822 .Case("atom", CK_Bonnell) // Legacy name.
2823 .Case("silvermont", CK_Silvermont)
2824 .Case("slm", CK_Silvermont) // Legacy name.
2825 .Case("nehalem", CK_Nehalem)
2826 .Case("corei7", CK_Nehalem) // Legacy name.
2827 .Case("westmere", CK_Westmere)
2828 .Case("sandybridge", CK_SandyBridge)
2829 .Case("corei7-avx", CK_SandyBridge) // Legacy name.
2830 .Case("ivybridge", CK_IvyBridge)
2831 .Case("core-avx-i", CK_IvyBridge) // Legacy name.
2832 .Case("haswell", CK_Haswell)
2833 .Case("core-avx2", CK_Haswell) // Legacy name.
2834 .Case("broadwell", CK_Broadwell)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002835 .Case("skylake", CK_SkylakeClient)
2836 .Case("skylake-avx512", CK_SkylakeServer)
2837 .Case("skx", CK_SkylakeServer) // Legacy name.
2838 .Case("cannonlake", CK_Cannonlake)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002839 .Case("knl", CK_KNL)
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002840 .Case("lakemont", CK_Lakemont)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002841 .Case("k6", CK_K6)
2842 .Case("k6-2", CK_K6_2)
2843 .Case("k6-3", CK_K6_3)
2844 .Case("athlon", CK_Athlon)
2845 .Case("athlon-tbird", CK_AthlonThunderbird)
2846 .Case("athlon-4", CK_Athlon4)
2847 .Case("athlon-xp", CK_AthlonXP)
2848 .Case("athlon-mp", CK_AthlonMP)
2849 .Case("athlon64", CK_Athlon64)
2850 .Case("athlon64-sse3", CK_Athlon64SSE3)
2851 .Case("athlon-fx", CK_AthlonFX)
2852 .Case("k8", CK_K8)
2853 .Case("k8-sse3", CK_K8SSE3)
2854 .Case("opteron", CK_Opteron)
2855 .Case("opteron-sse3", CK_OpteronSSE3)
2856 .Case("barcelona", CK_AMDFAM10)
2857 .Case("amdfam10", CK_AMDFAM10)
2858 .Case("btver1", CK_BTVER1)
2859 .Case("btver2", CK_BTVER2)
2860 .Case("bdver1", CK_BDVER1)
2861 .Case("bdver2", CK_BDVER2)
2862 .Case("bdver3", CK_BDVER3)
2863 .Case("bdver4", CK_BDVER4)
Craig Topperc45744a2017-01-10 06:02:12 +00002864 .Case("znver1", CK_ZNVER1)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002865 .Case("x86-64", CK_x86_64)
2866 .Case("geode", CK_Geode)
2867 .Default(CK_Generic);
2868 }
2869
Rafael Espindolaeb265472013-08-21 21:59:03 +00002870 enum FPMathKind {
2871 FP_Default,
2872 FP_SSE,
2873 FP_387
Craig Topper543f3bd2015-10-14 23:47:57 +00002874 } FPMath = FP_Default;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002875
Eli Friedman3fd920a2008-08-20 02:34:37 +00002876public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00002877 X86TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
2878 : TargetInfo(Triple) {
Stephan Bergmann17c7f702016-12-14 11:57:17 +00002879 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended();
Chris Lattner1f5ad112006-10-14 18:32:12 +00002880 }
Craig Topper3164f332014-03-11 03:39:26 +00002881 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00002882 // X87 evaluates with 80 bits "long double" precision.
2883 return SSELevel == NoSSE ? 2 : 0;
2884 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002885 ArrayRef<const char *> getGCCRegNames() const override {
2886 return llvm::makeArrayRef(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00002887 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002888 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
2889 return None;
Eric Christophercdd36352011-06-21 00:05:20 +00002890 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002891 ArrayRef<TargetInfo::AddlRegName> getGCCAddlRegNames() const override {
2892 return llvm::makeArrayRef(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00002893 }
Eric Christopherd9832702015-06-29 21:00:05 +00002894 bool validateCpuSupports(StringRef Name) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002895 bool validateAsmConstraint(const char *&Name,
Eric Christopher917e9522014-11-18 22:36:15 +00002896 TargetInfo::ConstraintInfo &info) const override;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002897
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00002898 bool validateGlobalRegisterVariable(StringRef RegName,
2899 unsigned RegSize,
2900 bool &HasSizeMismatch) const override {
2901 // esp and ebp are the only 32-bit registers the x86 backend can currently
2902 // handle.
2903 if (RegName.equals("esp") || RegName.equals("ebp")) {
2904 // Check that the register size is 32-bit.
2905 HasSizeMismatch = RegSize != 32;
2906 return true;
2907 }
2908
2909 return false;
2910 }
2911
Akira Hatanaka974131e2014-09-18 18:17:18 +00002912 bool validateOutputSize(StringRef Constraint, unsigned Size) const override;
2913
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002914 bool validateInputSize(StringRef Constraint, unsigned Size) const override;
2915
Akira Hatanaka974131e2014-09-18 18:17:18 +00002916 virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const;
2917
Craig Topper3164f332014-03-11 03:39:26 +00002918 std::string convertConstraint(const char *&Constraint) const override;
2919 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002920 return "~{dirflag},~{fpsr},~{flags}";
2921 }
Marina Yatsinac42fd032016-12-26 12:23:42 +00002922
2923 StringRef getConstraintRegister(const StringRef &Constraint,
2924 const StringRef &Expression) const override {
2925 StringRef::iterator I, E;
2926 for (I = Constraint.begin(), E = Constraint.end(); I != E; ++I) {
2927 if (isalpha(*I))
2928 break;
2929 }
2930 if (I == E)
2931 return "";
2932 switch (*I) {
2933 // For the register constraints, return the matching register name
2934 case 'a':
2935 return "ax";
2936 case 'b':
2937 return "bx";
2938 case 'c':
2939 return "cx";
2940 case 'd':
2941 return "dx";
2942 case 'S':
2943 return "si";
2944 case 'D':
2945 return "di";
2946 // In case the constraint is 'r' we need to return Expression
2947 case 'r':
2948 return Expression;
2949 default:
2950 // Default value if there is no constraint for the register
2951 return "";
2952 }
2953 return "";
2954 }
2955
Craig Topper3164f332014-03-11 03:39:26 +00002956 void getTargetDefines(const LangOptions &Opts,
2957 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00002958 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
2959 bool Enabled);
2960 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
2961 bool Enabled);
2962 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
2963 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002964 void setFeatureEnabled(llvm::StringMap<bool> &Features,
2965 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00002966 setFeatureEnabledImpl(Features, Name, Enabled);
2967 }
2968 // This exists purely to cut down on the number of virtual calls in
Eric Christopheref1e2952015-08-28 02:13:58 +00002969 // initFeatureMap which calls this repeatedly.
Craig Topper86d79ef2013-09-17 04:51:29 +00002970 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2971 StringRef Name, bool Enabled);
Eric Christopher8c47b422015-10-09 18:39:55 +00002972 bool
2973 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
2974 StringRef CPU,
2975 const std::vector<std::string> &FeaturesVec) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002976 bool hasFeature(StringRef Feature) const override;
2977 bool handleTargetFeatures(std::vector<std::string> &Features,
2978 DiagnosticsEngine &Diags) override;
Alp Toker4925ba72014-06-07 23:30:42 +00002979 StringRef getABI() const override {
Ahmed Bougacha0b938282015-06-22 21:31:43 +00002980 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX512F)
2981 return "avx512";
Craig Topperd945d502015-10-20 00:00:17 +00002982 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002983 return "avx";
Craig Topperd945d502015-10-20 00:00:17 +00002984 if (getTriple().getArch() == llvm::Triple::x86 &&
Derek Schuffc7dd7222012-10-11 15:52:22 +00002985 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002986 return "no-mmx";
2987 return "";
Eli Friedman33465822011-07-08 23:31:17 +00002988 }
Craig Topper3164f332014-03-11 03:39:26 +00002989 bool setCPU(const std::string &Name) override {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002990 CPU = getCPUKind(Name);
Chandler Carruth212334f2011-09-28 08:55:37 +00002991
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002992 // Perform any per-CPU checks necessary to determine if this CPU is
2993 // acceptable.
2994 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
2995 // invalid without explaining *why*.
2996 switch (CPU) {
2997 case CK_Generic:
2998 // No processor selected!
2999 return false;
3000
3001 case CK_i386:
3002 case CK_i486:
3003 case CK_WinChipC6:
3004 case CK_WinChip2:
3005 case CK_C3:
3006 case CK_i586:
3007 case CK_Pentium:
3008 case CK_PentiumMMX:
3009 case CK_i686:
3010 case CK_PentiumPro:
3011 case CK_Pentium2:
3012 case CK_Pentium3:
3013 case CK_Pentium3M:
3014 case CK_PentiumM:
3015 case CK_Yonah:
3016 case CK_C3_2:
3017 case CK_Pentium4:
3018 case CK_Pentium4M:
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003019 case CK_Lakemont:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00003020 case CK_Prescott:
3021 case CK_K6:
3022 case CK_K6_2:
3023 case CK_K6_3:
3024 case CK_Athlon:
3025 case CK_AthlonThunderbird:
3026 case CK_Athlon4:
3027 case CK_AthlonXP:
3028 case CK_AthlonMP:
3029 case CK_Geode:
3030 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00003031 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00003032 return false;
3033
3034 // Fallthrough
3035 case CK_Nocona:
3036 case CK_Core2:
3037 case CK_Penryn:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003038 case CK_Bonnell:
Preston Gurda3c58c02013-09-13 19:27:17 +00003039 case CK_Silvermont:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003040 case CK_Nehalem:
3041 case CK_Westmere:
3042 case CK_SandyBridge:
3043 case CK_IvyBridge:
3044 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00003045 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003046 case CK_SkylakeClient:
3047 case CK_SkylakeServer:
3048 case CK_Cannonlake:
Craig Topper449314e2013-08-20 07:09:39 +00003049 case CK_KNL:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00003050 case CK_Athlon64:
3051 case CK_Athlon64SSE3:
3052 case CK_AthlonFX:
3053 case CK_K8:
3054 case CK_K8SSE3:
3055 case CK_Opteron:
3056 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00003057 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00003058 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003059 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003060 case CK_BDVER1:
3061 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003062 case CK_BDVER3:
Benjamin Kramer56c58222014-05-02 15:47:51 +00003063 case CK_BDVER4:
Craig Topperc45744a2017-01-10 06:02:12 +00003064 case CK_ZNVER1:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00003065 case CK_x86_64:
3066 return true;
3067 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00003068 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003069 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003070
Craig Topper3164f332014-03-11 03:39:26 +00003071 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00003072
Craig Topper3164f332014-03-11 03:39:26 +00003073 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00003074 // Most of the non-ARM calling conventions are i386 conventions.
3075 switch (CC) {
3076 case CC_X86ThisCall:
3077 case CC_X86FastCall:
3078 case CC_X86StdCall:
3079 case CC_X86VectorCall:
Erich Keane757d3172016-11-02 18:29:35 +00003080 case CC_X86RegCall:
John McCall477f2bb2016-03-03 06:39:32 +00003081 case CC_C:
3082 case CC_Swift:
3083 case CC_X86Pascal:
3084 case CC_IntelOclBicc:
3085 return CCCR_OK;
3086 default:
3087 return CCCR_Warning;
3088 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003089 }
3090
Craig Topper3164f332014-03-11 03:39:26 +00003091 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00003092 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003093 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00003094
3095 bool hasSjLjLowering() const override {
3096 return true;
3097 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00003098
3099 void setSupportedOpenCLOpts() override {
Yaxun Liu5b746652016-12-18 05:18:55 +00003100 getSupportedOpenCLOpts().supportAll();
Yaxun Liu39cf40f2016-05-16 17:06:34 +00003101 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00003102};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00003103
Rafael Espindolaeb265472013-08-21 21:59:03 +00003104bool X86TargetInfo::setFPMath(StringRef Name) {
3105 if (Name == "387") {
3106 FPMath = FP_387;
3107 return true;
3108 }
3109 if (Name == "sse") {
3110 FPMath = FP_SSE;
3111 return true;
3112 }
3113 return false;
3114}
3115
Eric Christopher007b0a02015-08-28 22:32:01 +00003116bool X86TargetInfo::initFeatureMap(
3117 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
Eric Christopher8c47b422015-10-09 18:39:55 +00003118 const std::vector<std::string> &FeaturesVec) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003119 // FIXME: This *really* should not be here.
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003120 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00003121 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00003122 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003123
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003124 const CPUKind Kind = getCPUKind(CPU);
Andrey Turetskiy5f1cf5f2016-03-23 11:15:10 +00003125
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003126 // Enable X87 for all X86 processors but Lakemont.
3127 if (Kind != CK_Lakemont)
3128 setFeatureEnabledImpl(Features, "x87", true);
3129
3130 switch (Kind) {
Chandler Carruth212334f2011-09-28 08:55:37 +00003131 case CK_Generic:
3132 case CK_i386:
3133 case CK_i486:
3134 case CK_i586:
3135 case CK_Pentium:
3136 case CK_i686:
3137 case CK_PentiumPro:
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003138 case CK_Lakemont:
Chandler Carruth212334f2011-09-28 08:55:37 +00003139 break;
3140 case CK_PentiumMMX:
3141 case CK_Pentium2:
Craig Topperdb4dc082014-11-06 05:52:19 +00003142 case CK_K6:
3143 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00003144 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003145 break;
3146 case CK_Pentium3:
3147 case CK_Pentium3M:
Craig Topperdb4dc082014-11-06 05:52:19 +00003148 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00003149 setFeatureEnabledImpl(Features, "sse", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003150 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003151 break;
3152 case CK_PentiumM:
3153 case CK_Pentium4:
3154 case CK_Pentium4M:
3155 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00003156 setFeatureEnabledImpl(Features, "sse2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003157 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003158 break;
3159 case CK_Yonah:
3160 case CK_Prescott:
3161 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00003162 setFeatureEnabledImpl(Features, "sse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003163 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003164 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003165 break;
3166 case CK_Core2:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003167 case CK_Bonnell:
Craig Topper86d79ef2013-09-17 04:51:29 +00003168 setFeatureEnabledImpl(Features, "ssse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003169 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003170 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003171 break;
3172 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00003173 setFeatureEnabledImpl(Features, "sse4.1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003174 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003175 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003176 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003177 case CK_Cannonlake:
3178 setFeatureEnabledImpl(Features, "avx512ifma", true);
3179 setFeatureEnabledImpl(Features, "avx512vbmi", true);
3180 setFeatureEnabledImpl(Features, "sha", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003181 LLVM_FALLTHROUGH;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003182 case CK_SkylakeServer:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003183 setFeatureEnabledImpl(Features, "avx512f", true);
3184 setFeatureEnabledImpl(Features, "avx512cd", true);
3185 setFeatureEnabledImpl(Features, "avx512dq", true);
3186 setFeatureEnabledImpl(Features, "avx512bw", true);
3187 setFeatureEnabledImpl(Features, "avx512vl", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003188 setFeatureEnabledImpl(Features, "pku", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003189 setFeatureEnabledImpl(Features, "clwb", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003190 LLVM_FALLTHROUGH;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003191 case CK_SkylakeClient:
Craig Topperda9fe562015-10-15 05:23:38 +00003192 setFeatureEnabledImpl(Features, "xsavec", true);
3193 setFeatureEnabledImpl(Features, "xsaves", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003194 setFeatureEnabledImpl(Features, "mpx", true);
3195 setFeatureEnabledImpl(Features, "sgx", true);
3196 setFeatureEnabledImpl(Features, "clflushopt", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003197 LLVM_FALLTHROUGH;
Craig Topperdb4dc082014-11-06 05:52:19 +00003198 case CK_Broadwell:
3199 setFeatureEnabledImpl(Features, "rdseed", true);
3200 setFeatureEnabledImpl(Features, "adx", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003201 LLVM_FALLTHROUGH;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003202 case CK_Haswell:
Craig Topperdb4dc082014-11-06 05:52:19 +00003203 setFeatureEnabledImpl(Features, "avx2", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003204 setFeatureEnabledImpl(Features, "lzcnt", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003205 setFeatureEnabledImpl(Features, "bmi", true);
3206 setFeatureEnabledImpl(Features, "bmi2", true);
3207 setFeatureEnabledImpl(Features, "rtm", true);
3208 setFeatureEnabledImpl(Features, "fma", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003209 setFeatureEnabledImpl(Features, "movbe", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003210 LLVM_FALLTHROUGH;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003211 case CK_IvyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00003212 setFeatureEnabledImpl(Features, "rdrnd", true);
3213 setFeatureEnabledImpl(Features, "f16c", true);
3214 setFeatureEnabledImpl(Features, "fsgsbase", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003215 LLVM_FALLTHROUGH;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003216 case CK_SandyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00003217 setFeatureEnabledImpl(Features, "avx", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003218 setFeatureEnabledImpl(Features, "xsave", true);
3219 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003220 LLVM_FALLTHROUGH;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003221 case CK_Westmere:
Craig Topperdb4dc082014-11-06 05:52:19 +00003222 case CK_Silvermont:
3223 setFeatureEnabledImpl(Features, "aes", true);
3224 setFeatureEnabledImpl(Features, "pclmul", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003225 LLVM_FALLTHROUGH;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003226 case CK_Nehalem:
Craig Topperdb4dc082014-11-06 05:52:19 +00003227 setFeatureEnabledImpl(Features, "sse4.2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003228 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00003229 setFeatureEnabledImpl(Features, "cx16", true);
3230 break;
3231 case CK_KNL:
3232 setFeatureEnabledImpl(Features, "avx512f", true);
3233 setFeatureEnabledImpl(Features, "avx512cd", true);
3234 setFeatureEnabledImpl(Features, "avx512er", true);
3235 setFeatureEnabledImpl(Features, "avx512pf", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003236 setFeatureEnabledImpl(Features, "prefetchwt1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003237 setFeatureEnabledImpl(Features, "fxsr", true);
Robert Khasanov50e6f582014-09-19 09:53:48 +00003238 setFeatureEnabledImpl(Features, "rdseed", true);
3239 setFeatureEnabledImpl(Features, "adx", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00003240 setFeatureEnabledImpl(Features, "lzcnt", true);
3241 setFeatureEnabledImpl(Features, "bmi", true);
3242 setFeatureEnabledImpl(Features, "bmi2", true);
3243 setFeatureEnabledImpl(Features, "rtm", true);
3244 setFeatureEnabledImpl(Features, "fma", true);
3245 setFeatureEnabledImpl(Features, "rdrnd", true);
3246 setFeatureEnabledImpl(Features, "f16c", true);
3247 setFeatureEnabledImpl(Features, "fsgsbase", true);
3248 setFeatureEnabledImpl(Features, "aes", true);
3249 setFeatureEnabledImpl(Features, "pclmul", true);
3250 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003251 setFeatureEnabledImpl(Features, "xsaveopt", true);
3252 setFeatureEnabledImpl(Features, "xsave", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003253 setFeatureEnabledImpl(Features, "movbe", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003254 break;
3255 case CK_K6_2:
3256 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00003257 case CK_WinChip2:
3258 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00003259 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003260 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00003261 case CK_Athlon:
3262 case CK_AthlonThunderbird:
3263 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00003264 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00003265 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003266 case CK_Athlon4:
3267 case CK_AthlonXP:
3268 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00003269 setFeatureEnabledImpl(Features, "sse", true);
3270 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003271 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003272 break;
3273 case CK_K8:
3274 case CK_Opteron:
3275 case CK_Athlon64:
3276 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00003277 setFeatureEnabledImpl(Features, "sse2", true);
3278 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003279 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003280 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00003281 case CK_AMDFAM10:
3282 setFeatureEnabledImpl(Features, "sse4a", true);
3283 setFeatureEnabledImpl(Features, "lzcnt", true);
3284 setFeatureEnabledImpl(Features, "popcnt", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003285 LLVM_FALLTHROUGH;
Chandler Carruth212334f2011-09-28 08:55:37 +00003286 case CK_K8SSE3:
3287 case CK_OpteronSSE3:
3288 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00003289 setFeatureEnabledImpl(Features, "sse3", true);
3290 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003291 setFeatureEnabledImpl(Features, "fxsr", true);
Roman Divackyce253d82011-10-30 13:47:56 +00003292 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00003293 case CK_BTVER2:
3294 setFeatureEnabledImpl(Features, "avx", true);
3295 setFeatureEnabledImpl(Features, "aes", true);
3296 setFeatureEnabledImpl(Features, "pclmul", true);
3297 setFeatureEnabledImpl(Features, "bmi", true);
3298 setFeatureEnabledImpl(Features, "f16c", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003299 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003300 LLVM_FALLTHROUGH;
Benjamin Kramer569f2152012-01-10 11:50:18 +00003301 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00003302 setFeatureEnabledImpl(Features, "ssse3", true);
3303 setFeatureEnabledImpl(Features, "sse4a", true);
3304 setFeatureEnabledImpl(Features, "lzcnt", true);
3305 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00003306 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003307 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003308 setFeatureEnabledImpl(Features, "fxsr", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003309 break;
Craig Topperc45744a2017-01-10 06:02:12 +00003310 case CK_ZNVER1:
3311 setFeatureEnabledImpl(Features, "adx", true);
3312 setFeatureEnabledImpl(Features, "aes", true);
3313 setFeatureEnabledImpl(Features, "avx2", true);
3314 setFeatureEnabledImpl(Features, "bmi", true);
3315 setFeatureEnabledImpl(Features, "bmi2", true);
3316 setFeatureEnabledImpl(Features, "clflushopt", true);
Craig Topper45742262017-02-09 06:10:14 +00003317 setFeatureEnabledImpl(Features, "clzero", true);
Craig Topperc45744a2017-01-10 06:02:12 +00003318 setFeatureEnabledImpl(Features, "cx16", true);
3319 setFeatureEnabledImpl(Features, "f16c", true);
3320 setFeatureEnabledImpl(Features, "fma", true);
3321 setFeatureEnabledImpl(Features, "fsgsbase", true);
3322 setFeatureEnabledImpl(Features, "fxsr", true);
3323 setFeatureEnabledImpl(Features, "lzcnt", true);
3324 setFeatureEnabledImpl(Features, "mwaitx", true);
3325 setFeatureEnabledImpl(Features, "movbe", true);
3326 setFeatureEnabledImpl(Features, "pclmul", true);
3327 setFeatureEnabledImpl(Features, "popcnt", true);
3328 setFeatureEnabledImpl(Features, "prfchw", true);
3329 setFeatureEnabledImpl(Features, "rdrnd", true);
3330 setFeatureEnabledImpl(Features, "rdseed", true);
3331 setFeatureEnabledImpl(Features, "sha", true);
3332 setFeatureEnabledImpl(Features, "sse4a", true);
3333 setFeatureEnabledImpl(Features, "xsave", true);
3334 setFeatureEnabledImpl(Features, "xsavec", true);
3335 setFeatureEnabledImpl(Features, "xsaveopt", true);
3336 setFeatureEnabledImpl(Features, "xsaves", true);
3337 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003338 case CK_BDVER4:
3339 setFeatureEnabledImpl(Features, "avx2", true);
3340 setFeatureEnabledImpl(Features, "bmi2", true);
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003341 setFeatureEnabledImpl(Features, "mwaitx", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003342 LLVM_FALLTHROUGH;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003343 case CK_BDVER3:
Craig Topper8c7f2512014-11-03 06:51:41 +00003344 setFeatureEnabledImpl(Features, "fsgsbase", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003345 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003346 LLVM_FALLTHROUGH;
Craig Topper8c7f2512014-11-03 06:51:41 +00003347 case CK_BDVER2:
Andrea Di Biagio9760a442014-11-06 12:08:57 +00003348 setFeatureEnabledImpl(Features, "bmi", true);
3349 setFeatureEnabledImpl(Features, "fma", true);
3350 setFeatureEnabledImpl(Features, "f16c", true);
3351 setFeatureEnabledImpl(Features, "tbm", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003352 LLVM_FALLTHROUGH;
Andrea Di Biagio9760a442014-11-06 12:08:57 +00003353 case CK_BDVER1:
3354 // xop implies avx, sse4a and fma4.
Craig Topper86d79ef2013-09-17 04:51:29 +00003355 setFeatureEnabledImpl(Features, "xop", true);
3356 setFeatureEnabledImpl(Features, "lzcnt", true);
3357 setFeatureEnabledImpl(Features, "aes", true);
3358 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00003359 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003360 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003361 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003362 setFeatureEnabledImpl(Features, "xsave", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003363 break;
Eli Friedman33465822011-07-08 23:31:17 +00003364 }
Eric Christopherbbd746d2015-10-08 20:10:14 +00003365 if (!TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec))
3366 return false;
3367
3368 // Can't do this earlier because we need to be able to explicitly enable
3369 // or disable these features and the things that they depend upon.
3370
3371 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
3372 auto I = Features.find("sse4.2");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003373 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00003374 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-popcnt") ==
3375 FeaturesVec.end())
3376 Features["popcnt"] = true;
3377
3378 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
3379 I = Features.find("3dnow");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003380 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00003381 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-prfchw") ==
3382 FeaturesVec.end())
3383 Features["prfchw"] = true;
3384
Eric Christophera7260af2015-10-08 20:10:18 +00003385 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
3386 // then enable MMX.
3387 I = Features.find("sse");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003388 if (I != Features.end() && I->getValue() &&
Eric Christophera7260af2015-10-08 20:10:18 +00003389 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-mmx") ==
3390 FeaturesVec.end())
3391 Features["mmx"] = true;
3392
Eric Christopherbbd746d2015-10-08 20:10:14 +00003393 return true;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003394}
3395
Rafael Espindolae62e2792013-08-20 13:44:29 +00003396void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00003397 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003398 if (Enabled) {
3399 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003400 case AVX512F:
3401 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003402 case AVX2:
3403 Features["avx2"] = true;
3404 case AVX:
3405 Features["avx"] = true;
Craig Topperda9fe562015-10-15 05:23:38 +00003406 Features["xsave"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003407 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00003408 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003409 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00003410 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003411 case SSSE3:
3412 Features["ssse3"] = true;
3413 case SSE3:
3414 Features["sse3"] = true;
3415 case SSE2:
3416 Features["sse2"] = true;
3417 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00003418 Features["sse"] = true;
3419 case NoSSE:
3420 break;
3421 }
3422 return;
3423 }
3424
3425 switch (Level) {
3426 case NoSSE:
3427 case SSE1:
3428 Features["sse"] = false;
3429 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00003430 Features["sse2"] = Features["pclmul"] = Features["aes"] =
3431 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003432 case SSE3:
3433 Features["sse3"] = false;
3434 setXOPLevel(Features, NoXOP, false);
3435 case SSSE3:
3436 Features["ssse3"] = false;
3437 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00003438 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003439 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00003440 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003441 case AVX:
Craig Topperda9fe562015-10-15 05:23:38 +00003442 Features["fma"] = Features["avx"] = Features["f16c"] = Features["xsave"] =
3443 Features["xsaveopt"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00003444 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003445 case AVX2:
3446 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00003447 case AVX512F:
Eric Christopher917e9522014-11-18 22:36:15 +00003448 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
Craig Toppera31a5da2014-12-27 06:59:37 +00003449 Features["avx512pf"] = Features["avx512dq"] = Features["avx512bw"] =
Craig Topperb4f83a02016-02-29 06:51:38 +00003450 Features["avx512vl"] = Features["avx512vbmi"] =
3451 Features["avx512ifma"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003452 }
3453}
3454
3455void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00003456 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003457 if (Enabled) {
3458 switch (Level) {
3459 case AMD3DNowAthlon:
3460 Features["3dnowa"] = true;
3461 case AMD3DNow:
3462 Features["3dnow"] = true;
3463 case MMX:
3464 Features["mmx"] = true;
3465 case NoMMX3DNow:
3466 break;
3467 }
3468 return;
3469 }
3470
3471 switch (Level) {
3472 case NoMMX3DNow:
3473 case MMX:
3474 Features["mmx"] = false;
3475 case AMD3DNow:
3476 Features["3dnow"] = false;
3477 case AMD3DNowAthlon:
3478 Features["3dnowa"] = false;
3479 }
3480}
3481
3482void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00003483 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003484 if (Enabled) {
3485 switch (Level) {
3486 case XOP:
3487 Features["xop"] = true;
3488 case FMA4:
3489 Features["fma4"] = true;
3490 setSSELevel(Features, AVX, true);
3491 case SSE4A:
3492 Features["sse4a"] = true;
3493 setSSELevel(Features, SSE3, true);
3494 case NoXOP:
3495 break;
3496 }
3497 return;
3498 }
3499
3500 switch (Level) {
3501 case NoXOP:
3502 case SSE4A:
3503 Features["sse4a"] = false;
3504 case FMA4:
3505 Features["fma4"] = false;
3506 case XOP:
3507 Features["xop"] = false;
3508 }
3509}
3510
Craig Topper86d79ef2013-09-17 04:51:29 +00003511void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
3512 StringRef Name, bool Enabled) {
Eric Christopher298ac302015-07-01 00:08:32 +00003513 // This is a bit of a hack to deal with the sse4 target feature when used
3514 // as part of the target attribute. We handle sse4 correctly everywhere
3515 // else. See below for more information on how we handle the sse4 options.
3516 if (Name != "sse4")
3517 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00003518
Craig Topper29561122013-09-19 01:13:07 +00003519 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003520 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003521 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003522 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003523 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003524 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003525 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003526 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003527 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003528 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003529 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003530 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003531 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003532 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003533 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003534 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003535 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003536 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003537 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003538 if (Enabled)
3539 setSSELevel(Features, SSE2, Enabled);
3540 } else if (Name == "pclmul") {
3541 if (Enabled)
3542 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003543 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003544 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003545 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003546 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003547 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003548 setSSELevel(Features, AVX512F, Enabled);
Craig Topperb4f83a02016-02-29 06:51:38 +00003549 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf" ||
3550 Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl" ||
3551 Name == "avx512vbmi" || Name == "avx512ifma") {
Craig Topper679b53a2013-08-21 05:29:10 +00003552 if (Enabled)
3553 setSSELevel(Features, AVX512F, Enabled);
Craig Topper6c7ecc52016-11-09 04:51:03 +00003554 // Enable BWI instruction if VBMI is being enabled.
3555 if (Name == "avx512vbmi" && Enabled)
3556 Features["avx512bw"] = true;
3557 // Also disable VBMI if BWI is being disabled.
3558 if (Name == "avx512bw" && !Enabled)
3559 Features["avx512vbmi"] = false;
Craig Topper679b53a2013-08-21 05:29:10 +00003560 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003561 if (Enabled)
3562 setSSELevel(Features, AVX, Enabled);
3563 } else if (Name == "fma4") {
3564 setXOPLevel(Features, FMA4, Enabled);
3565 } else if (Name == "xop") {
3566 setXOPLevel(Features, XOP, Enabled);
3567 } else if (Name == "sse4a") {
3568 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00003569 } else if (Name == "f16c") {
3570 if (Enabled)
3571 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00003572 } else if (Name == "sha") {
3573 if (Enabled)
3574 setSSELevel(Features, SSE2, Enabled);
Eric Christopher298ac302015-07-01 00:08:32 +00003575 } else if (Name == "sse4") {
3576 // We can get here via the __target__ attribute since that's not controlled
3577 // via the -msse4/-mno-sse4 command line alias. Handle this the same way
3578 // here - turn on the sse4.2 if enabled, turn off the sse4.1 level if
3579 // disabled.
3580 if (Enabled)
3581 setSSELevel(Features, SSE42, Enabled);
3582 else
3583 setSSELevel(Features, SSE41, Enabled);
Craig Topperda9fe562015-10-15 05:23:38 +00003584 } else if (Name == "xsave") {
Craig Topper840927e2016-02-29 06:51:34 +00003585 if (!Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003586 Features["xsaveopt"] = false;
3587 } else if (Name == "xsaveopt" || Name == "xsavec" || Name == "xsaves") {
Craig Topper840927e2016-02-29 06:51:34 +00003588 if (Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003589 Features["xsave"] = true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003590 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003591}
3592
Eric Christopher3ff21b32013-10-16 21:26:26 +00003593/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003594/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00003595bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00003596 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00003597 for (const auto &Feature : Features) {
3598 if (Feature[0] != '+')
Daniel Dunbar979586e2009-11-11 09:38:56 +00003599 continue;
3600
Eric Christopher610fe112015-08-26 08:21:55 +00003601 if (Feature == "+aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00003602 HasAES = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003603 } else if (Feature == "+pclmul") {
Craig Topper3f122a72012-05-31 05:18:48 +00003604 HasPCLMUL = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003605 } else if (Feature == "+lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00003606 HasLZCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003607 } else if (Feature == "+rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00003608 HasRDRND = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003609 } else if (Feature == "+fsgsbase") {
Craig Topper8c7f2512014-11-03 06:51:41 +00003610 HasFSGSBASE = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003611 } else if (Feature == "+bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00003612 HasBMI = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003613 } else if (Feature == "+bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00003614 HasBMI2 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003615 } else if (Feature == "+popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00003616 HasPOPCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003617 } else if (Feature == "+rtm") {
Michael Liao625a8752012-11-10 05:17:46 +00003618 HasRTM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003619 } else if (Feature == "+prfchw") {
Michael Liao74f4eaf2013-03-26 17:52:08 +00003620 HasPRFCHW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003621 } else if (Feature == "+rdseed") {
Michael Liaoffaae352013-03-29 05:17:55 +00003622 HasRDSEED = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003623 } else if (Feature == "+adx") {
Robert Khasanov50e6f582014-09-19 09:53:48 +00003624 HasADX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003625 } else if (Feature == "+tbm") {
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003626 HasTBM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003627 } else if (Feature == "+fma") {
Craig Topperbba778b2012-06-03 21:46:30 +00003628 HasFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003629 } else if (Feature == "+f16c") {
Manman Rena45358c2012-10-11 00:59:55 +00003630 HasF16C = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003631 } else if (Feature == "+avx512cd") {
Craig Topper679b53a2013-08-21 05:29:10 +00003632 HasAVX512CD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003633 } else if (Feature == "+avx512er") {
Craig Topper679b53a2013-08-21 05:29:10 +00003634 HasAVX512ER = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003635 } else if (Feature == "+avx512pf") {
Craig Topper679b53a2013-08-21 05:29:10 +00003636 HasAVX512PF = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003637 } else if (Feature == "+avx512dq") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003638 HasAVX512DQ = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003639 } else if (Feature == "+avx512bw") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003640 HasAVX512BW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003641 } else if (Feature == "+avx512vl") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003642 HasAVX512VL = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003643 } else if (Feature == "+avx512vbmi") {
3644 HasAVX512VBMI = true;
3645 } else if (Feature == "+avx512ifma") {
3646 HasAVX512IFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003647 } else if (Feature == "+sha") {
Ben Langmuir58078d02013-09-19 13:22:04 +00003648 HasSHA = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003649 } else if (Feature == "+mpx") {
3650 HasMPX = true;
3651 } else if (Feature == "+movbe") {
3652 HasMOVBE = true;
3653 } else if (Feature == "+sgx") {
3654 HasSGX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003655 } else if (Feature == "+cx16") {
Nick Lewycky50e8f482013-10-05 20:14:27 +00003656 HasCX16 = true;
Craig Toppere33f51f2015-10-16 06:22:36 +00003657 } else if (Feature == "+fxsr") {
3658 HasFXSR = true;
Craig Topperda9fe562015-10-15 05:23:38 +00003659 } else if (Feature == "+xsave") {
3660 HasXSAVE = true;
3661 } else if (Feature == "+xsaveopt") {
3662 HasXSAVEOPT = true;
3663 } else if (Feature == "+xsavec") {
3664 HasXSAVEC = true;
3665 } else if (Feature == "+xsaves") {
3666 HasXSAVES = true;
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003667 } else if (Feature == "+mwaitx") {
3668 HasMWAITX = true;
Asaf Badouha9d1e182015-12-31 14:14:07 +00003669 } else if (Feature == "+pku") {
3670 HasPKU = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003671 } else if (Feature == "+clflushopt") {
3672 HasCLFLUSHOPT = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003673 } else if (Feature == "+clwb") {
3674 HasCLWB = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003675 } else if (Feature == "+prefetchwt1") {
3676 HasPREFETCHWT1 = true;
Craig Topper45742262017-02-09 06:10:14 +00003677 } else if (Feature == "+clzero") {
3678 HasCLZERO = true;
Nick Lewycky50e8f482013-10-05 20:14:27 +00003679 }
3680
Benjamin Kramer27402c62012-03-05 15:10:44 +00003681 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003682 .Case("+avx512f", AVX512F)
3683 .Case("+avx2", AVX2)
3684 .Case("+avx", AVX)
3685 .Case("+sse4.2", SSE42)
3686 .Case("+sse4.1", SSE41)
3687 .Case("+ssse3", SSSE3)
3688 .Case("+sse3", SSE3)
3689 .Case("+sse2", SSE2)
3690 .Case("+sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00003691 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003692 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003693
Eli Friedman33465822011-07-08 23:31:17 +00003694 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00003695 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003696 .Case("+3dnowa", AMD3DNowAthlon)
3697 .Case("+3dnow", AMD3DNow)
3698 .Case("+mmx", MMX)
Eli Friedman33465822011-07-08 23:31:17 +00003699 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00003700 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003701
3702 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003703 .Case("+xop", XOP)
3704 .Case("+fma4", FMA4)
3705 .Case("+sse4a", SSE4A)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003706 .Default(NoXOP);
3707 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003708 }
Eli Friedman33465822011-07-08 23:31:17 +00003709
Rafael Espindolaeb265472013-08-21 21:59:03 +00003710 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
3711 // matches the selected sse level.
Craig Topperd945d502015-10-20 00:00:17 +00003712 if ((FPMath == FP_SSE && SSELevel < SSE1) ||
3713 (FPMath == FP_387 && SSELevel >= SSE1)) {
3714 Diags.Report(diag::err_target_unsupported_fpmath) <<
3715 (FPMath == FP_SSE ? "sse" : "387");
Rafael Espindolaeb265472013-08-21 21:59:03 +00003716 return false;
3717 }
3718
Alexey Bataev00396512015-07-02 03:40:19 +00003719 SimdDefaultAlign =
Ahmed Bougacha68bf64e2015-08-27 22:24:56 +00003720 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Rafael Espindolaeb265472013-08-21 21:59:03 +00003721 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00003722}
Chris Lattnerecd49032009-03-02 22:27:17 +00003723
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003724/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
3725/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00003726void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003727 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00003728 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00003729 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003730 Builder.defineMacro("__amd64__");
3731 Builder.defineMacro("__amd64");
3732 Builder.defineMacro("__x86_64");
3733 Builder.defineMacro("__x86_64__");
Bob Wilsona2acb1e2014-08-08 23:46:28 +00003734 if (getTriple().getArchName() == "x86_64h") {
3735 Builder.defineMacro("__x86_64h");
3736 Builder.defineMacro("__x86_64h__");
3737 }
Chris Lattnerecd49032009-03-02 22:27:17 +00003738 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003739 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00003740 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003741
Chris Lattnerecd49032009-03-02 22:27:17 +00003742 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003743 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
3744 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00003745 switch (CPU) {
3746 case CK_Generic:
3747 break;
3748 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003749 // The rest are coming from the i386 define above.
3750 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003751 break;
3752 case CK_i486:
3753 case CK_WinChipC6:
3754 case CK_WinChip2:
3755 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003756 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00003757 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003758 case CK_PentiumMMX:
3759 Builder.defineMacro("__pentium_mmx__");
3760 Builder.defineMacro("__tune_pentium_mmx__");
3761 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003762 case CK_i586:
3763 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003764 defineCPUMacros(Builder, "i586");
3765 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00003766 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003767 case CK_Pentium3:
3768 case CK_Pentium3M:
3769 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003770 Builder.defineMacro("__tune_pentium3__");
3771 // Fallthrough
3772 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00003773 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003774 Builder.defineMacro("__tune_pentium2__");
3775 // Fallthrough
3776 case CK_PentiumPro:
3777 Builder.defineMacro("__tune_i686__");
3778 Builder.defineMacro("__tune_pentiumpro__");
3779 // Fallthrough
3780 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003781 Builder.defineMacro("__i686");
3782 Builder.defineMacro("__i686__");
3783 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
3784 Builder.defineMacro("__pentiumpro");
3785 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003786 break;
3787 case CK_Pentium4:
3788 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003789 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00003790 break;
3791 case CK_Yonah:
3792 case CK_Prescott:
3793 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003794 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00003795 break;
3796 case CK_Core2:
3797 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003798 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00003799 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003800 case CK_Bonnell:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003801 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00003802 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00003803 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00003804 defineCPUMacros(Builder, "slm");
3805 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003806 case CK_Nehalem:
3807 case CK_Westmere:
3808 case CK_SandyBridge:
3809 case CK_IvyBridge:
3810 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00003811 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003812 case CK_SkylakeClient:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003813 // FIXME: Historically, we defined this legacy name, it would be nice to
3814 // remove it at some point. We've never exposed fine-grained names for
3815 // recent primary x86 CPUs, and we should keep it that way.
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003816 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00003817 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003818 case CK_SkylakeServer:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003819 defineCPUMacros(Builder, "skx");
3820 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003821 case CK_Cannonlake:
3822 break;
Craig Topper449314e2013-08-20 07:09:39 +00003823 case CK_KNL:
3824 defineCPUMacros(Builder, "knl");
3825 break;
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003826 case CK_Lakemont:
3827 Builder.defineMacro("__tune_lakemont__");
3828 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003829 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003830 Builder.defineMacro("__k6_2__");
3831 Builder.defineMacro("__tune_k6_2__");
3832 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003833 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003834 if (CPU != CK_K6_2) { // In case of fallthrough
3835 // FIXME: GCC may be enabling these in cases where some other k6
3836 // architecture is specified but -m3dnow is explicitly provided. The
3837 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003838 Builder.defineMacro("__k6_3__");
3839 Builder.defineMacro("__tune_k6_3__");
3840 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003841 // Fallthrough
3842 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003843 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00003844 break;
3845 case CK_Athlon:
3846 case CK_AthlonThunderbird:
3847 case CK_Athlon4:
3848 case CK_AthlonXP:
3849 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003850 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003851 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003852 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003853 Builder.defineMacro("__tune_athlon_sse__");
3854 }
Chandler Carruth212334f2011-09-28 08:55:37 +00003855 break;
3856 case CK_K8:
3857 case CK_K8SSE3:
3858 case CK_x86_64:
3859 case CK_Opteron:
3860 case CK_OpteronSSE3:
3861 case CK_Athlon64:
3862 case CK_Athlon64SSE3:
3863 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003864 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00003865 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00003866 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003867 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00003868 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00003869 case CK_BTVER1:
3870 defineCPUMacros(Builder, "btver1");
3871 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003872 case CK_BTVER2:
3873 defineCPUMacros(Builder, "btver2");
3874 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003875 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003876 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003877 break;
3878 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003879 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003880 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003881 case CK_BDVER3:
3882 defineCPUMacros(Builder, "bdver3");
3883 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003884 case CK_BDVER4:
3885 defineCPUMacros(Builder, "bdver4");
3886 break;
Craig Topperc45744a2017-01-10 06:02:12 +00003887 case CK_ZNVER1:
3888 defineCPUMacros(Builder, "znver1");
3889 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003890 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003891 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00003892 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003893 }
Chris Lattner96e43572009-03-02 22:40:39 +00003894
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003895 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003896 Builder.defineMacro("__REGISTER_PREFIX__", "");
3897
Chris Lattner6df41af2009-04-19 17:32:33 +00003898 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
3899 // functions in glibc header files that use FP Stack inline asm which the
3900 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003901 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003902
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003903 if (HasAES)
3904 Builder.defineMacro("__AES__");
3905
Craig Topper3f122a72012-05-31 05:18:48 +00003906 if (HasPCLMUL)
3907 Builder.defineMacro("__PCLMUL__");
3908
Craig Topper22967d42011-12-25 05:06:45 +00003909 if (HasLZCNT)
3910 Builder.defineMacro("__LZCNT__");
3911
Benjamin Kramer1e250392012-07-07 09:39:18 +00003912 if (HasRDRND)
3913 Builder.defineMacro("__RDRND__");
3914
Craig Topper8c7f2512014-11-03 06:51:41 +00003915 if (HasFSGSBASE)
3916 Builder.defineMacro("__FSGSBASE__");
3917
Craig Topper22967d42011-12-25 05:06:45 +00003918 if (HasBMI)
3919 Builder.defineMacro("__BMI__");
3920
3921 if (HasBMI2)
3922 Builder.defineMacro("__BMI2__");
3923
Craig Topper1de83482011-12-29 16:10:46 +00003924 if (HasPOPCNT)
3925 Builder.defineMacro("__POPCNT__");
3926
Michael Liao625a8752012-11-10 05:17:46 +00003927 if (HasRTM)
3928 Builder.defineMacro("__RTM__");
3929
Michael Liao74f4eaf2013-03-26 17:52:08 +00003930 if (HasPRFCHW)
3931 Builder.defineMacro("__PRFCHW__");
3932
Michael Liaoffaae352013-03-29 05:17:55 +00003933 if (HasRDSEED)
3934 Builder.defineMacro("__RDSEED__");
3935
Robert Khasanov50e6f582014-09-19 09:53:48 +00003936 if (HasADX)
3937 Builder.defineMacro("__ADX__");
3938
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003939 if (HasTBM)
3940 Builder.defineMacro("__TBM__");
3941
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003942 if (HasMWAITX)
3943 Builder.defineMacro("__MWAITX__");
3944
Rafael Espindolae62e2792013-08-20 13:44:29 +00003945 switch (XOPLevel) {
3946 case XOP:
3947 Builder.defineMacro("__XOP__");
3948 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00003949 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00003950 case SSE4A:
3951 Builder.defineMacro("__SSE4A__");
3952 case NoXOP:
3953 break;
3954 }
Craig Topperffdb46c2011-12-30 07:33:42 +00003955
Craig Topperbba778b2012-06-03 21:46:30 +00003956 if (HasFMA)
3957 Builder.defineMacro("__FMA__");
3958
Manman Rena45358c2012-10-11 00:59:55 +00003959 if (HasF16C)
3960 Builder.defineMacro("__F16C__");
3961
Craig Topper679b53a2013-08-21 05:29:10 +00003962 if (HasAVX512CD)
3963 Builder.defineMacro("__AVX512CD__");
3964 if (HasAVX512ER)
3965 Builder.defineMacro("__AVX512ER__");
3966 if (HasAVX512PF)
3967 Builder.defineMacro("__AVX512PF__");
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003968 if (HasAVX512DQ)
3969 Builder.defineMacro("__AVX512DQ__");
3970 if (HasAVX512BW)
3971 Builder.defineMacro("__AVX512BW__");
3972 if (HasAVX512VL)
3973 Builder.defineMacro("__AVX512VL__");
Craig Topperb4f83a02016-02-29 06:51:38 +00003974 if (HasAVX512VBMI)
3975 Builder.defineMacro("__AVX512VBMI__");
3976 if (HasAVX512IFMA)
3977 Builder.defineMacro("__AVX512IFMA__");
Craig Topper679b53a2013-08-21 05:29:10 +00003978
Ben Langmuir58078d02013-09-19 13:22:04 +00003979 if (HasSHA)
3980 Builder.defineMacro("__SHA__");
3981
Craig Toppere33f51f2015-10-16 06:22:36 +00003982 if (HasFXSR)
3983 Builder.defineMacro("__FXSR__");
Craig Topperda9fe562015-10-15 05:23:38 +00003984 if (HasXSAVE)
3985 Builder.defineMacro("__XSAVE__");
3986 if (HasXSAVEOPT)
3987 Builder.defineMacro("__XSAVEOPT__");
3988 if (HasXSAVEC)
3989 Builder.defineMacro("__XSAVEC__");
3990 if (HasXSAVES)
3991 Builder.defineMacro("__XSAVES__");
Asaf Badouha9d1e182015-12-31 14:14:07 +00003992 if (HasPKU)
3993 Builder.defineMacro("__PKU__");
Nick Lewycky50e8f482013-10-05 20:14:27 +00003994 if (HasCX16)
3995 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
Craig Topper78b47872017-02-08 06:48:58 +00003996 if (HasCLFLUSHOPT)
3997 Builder.defineMacro("__CLFLUSHOPT__");
Craig Topper8c708cf2017-02-08 07:36:58 +00003998 if (HasCLWB)
3999 Builder.defineMacro("__CLWB__");
Craig Topperb16cb822017-02-08 07:56:42 +00004000 if (HasMPX)
4001 Builder.defineMacro("__MPX__");
Craig Topper204ecff2017-02-08 08:23:17 +00004002 if (HasSGX)
4003 Builder.defineMacro("__SGX__");
Craig Topperd2bf7b02017-02-08 08:23:40 +00004004 if (HasPREFETCHWT1)
4005 Builder.defineMacro("__PREFETCHWT1__");
Craig Topper45742262017-02-09 06:10:14 +00004006 if (HasCLZERO)
4007 Builder.defineMacro("__CLZERO__");
Nick Lewycky50e8f482013-10-05 20:14:27 +00004008
Chris Lattner96e43572009-03-02 22:40:39 +00004009 // Each case falls through to the previous one here.
4010 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00004011 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00004012 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00004013 case AVX2:
4014 Builder.defineMacro("__AVX2__");
4015 case AVX:
4016 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00004017 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004018 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00004019 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004020 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00004021 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004022 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00004023 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004024 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00004025 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004026 Builder.defineMacro("__SSE2__");
4027 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00004028 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004029 Builder.defineMacro("__SSE__");
4030 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00004031 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00004032 break;
4033 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004034
Derek Schuffc7dd7222012-10-11 15:52:22 +00004035 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004036 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00004037 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00004038 case AVX2:
4039 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004040 case SSE42:
4041 case SSE41:
4042 case SSSE3:
4043 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004044 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004045 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004046 break;
4047 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004048 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004049 break;
4050 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004051 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004052 }
4053 }
4054
Anders Carlssone437c682010-01-27 03:47:49 +00004055 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00004056 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00004057 case AMD3DNowAthlon:
4058 Builder.defineMacro("__3dNOW_A__");
4059 case AMD3DNow:
4060 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00004061 case MMX:
4062 Builder.defineMacro("__MMX__");
4063 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00004064 break;
4065 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00004066
4067 if (CPU >= CK_i486) {
4068 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
4069 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
4070 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
4071 }
4072 if (CPU >= CK_i586)
4073 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00004074}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004075
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004076bool X86TargetInfo::hasFeature(StringRef Feature) const {
4077 return llvm::StringSwitch<bool>(Feature)
4078 .Case("aes", HasAES)
4079 .Case("avx", SSELevel >= AVX)
4080 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00004081 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00004082 .Case("avx512cd", HasAVX512CD)
4083 .Case("avx512er", HasAVX512ER)
4084 .Case("avx512pf", HasAVX512PF)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00004085 .Case("avx512dq", HasAVX512DQ)
4086 .Case("avx512bw", HasAVX512BW)
4087 .Case("avx512vl", HasAVX512VL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00004088 .Case("avx512vbmi", HasAVX512VBMI)
4089 .Case("avx512ifma", HasAVX512IFMA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004090 .Case("bmi", HasBMI)
4091 .Case("bmi2", HasBMI2)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00004092 .Case("clflushopt", HasCLFLUSHOPT)
4093 .Case("clwb", HasCLWB)
Craig Topper45742262017-02-09 06:10:14 +00004094 .Case("clzero", HasCLZERO)
Nick Lewycky50e8f482013-10-05 20:14:27 +00004095 .Case("cx16", HasCX16)
4096 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00004097 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00004098 .Case("fma4", XOPLevel >= FMA4)
Craig Topper8c7f2512014-11-03 06:51:41 +00004099 .Case("fsgsbase", HasFSGSBASE)
Craig Toppere33f51f2015-10-16 06:22:36 +00004100 .Case("fxsr", HasFXSR)
Craig Topper8dbc5842014-11-03 07:05:26 +00004101 .Case("lzcnt", HasLZCNT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004102 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
4103 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
4104 .Case("mmx", MMX3DNowLevel >= MMX)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00004105 .Case("movbe", HasMOVBE)
4106 .Case("mpx", HasMPX)
Craig Topper3f122a72012-05-31 05:18:48 +00004107 .Case("pclmul", HasPCLMUL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00004108 .Case("pku", HasPKU)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004109 .Case("popcnt", HasPOPCNT)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00004110 .Case("prefetchwt1", HasPREFETCHWT1)
Michael Liao74f4eaf2013-03-26 17:52:08 +00004111 .Case("prfchw", HasPRFCHW)
Craig Topper8dbc5842014-11-03 07:05:26 +00004112 .Case("rdrnd", HasRDRND)
Michael Liaoffaae352013-03-29 05:17:55 +00004113 .Case("rdseed", HasRDSEED)
Craig Topper8dbc5842014-11-03 07:05:26 +00004114 .Case("rtm", HasRTM)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00004115 .Case("sgx", HasSGX)
Ben Langmuir58078d02013-09-19 13:22:04 +00004116 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004117 .Case("sse", SSELevel >= SSE1)
4118 .Case("sse2", SSELevel >= SSE2)
4119 .Case("sse3", SSELevel >= SSE3)
4120 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00004121 .Case("sse4.1", SSELevel >= SSE41)
4122 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00004123 .Case("sse4a", XOPLevel >= SSE4A)
Craig Topper8dbc5842014-11-03 07:05:26 +00004124 .Case("tbm", HasTBM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004125 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00004126 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
4127 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00004128 .Case("xop", XOPLevel >= XOP)
Craig Topperda9fe562015-10-15 05:23:38 +00004129 .Case("xsave", HasXSAVE)
4130 .Case("xsavec", HasXSAVEC)
4131 .Case("xsaves", HasXSAVES)
4132 .Case("xsaveopt", HasXSAVEOPT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004133 .Default(false);
4134}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004135
Eric Christopherd9832702015-06-29 21:00:05 +00004136// We can't use a generic validation scheme for the features accepted here
4137// versus subtarget features accepted in the target attribute because the
4138// bitfield structure that's initialized in the runtime only supports the
4139// below currently rather than the full range of subtarget features. (See
4140// X86TargetInfo::hasFeature for a somewhat comprehensive list).
4141bool X86TargetInfo::validateCpuSupports(StringRef FeatureStr) const {
4142 return llvm::StringSwitch<bool>(FeatureStr)
4143 .Case("cmov", true)
4144 .Case("mmx", true)
4145 .Case("popcnt", true)
4146 .Case("sse", true)
4147 .Case("sse2", true)
4148 .Case("sse3", true)
Benjamin Kramerf4c520d2016-05-20 15:21:08 +00004149 .Case("ssse3", true)
Eric Christopherd9832702015-06-29 21:00:05 +00004150 .Case("sse4.1", true)
4151 .Case("sse4.2", true)
4152 .Case("avx", true)
4153 .Case("avx2", true)
4154 .Case("sse4a", true)
4155 .Case("fma4", true)
4156 .Case("xop", true)
4157 .Case("fma", true)
4158 .Case("avx512f", true)
4159 .Case("bmi", true)
4160 .Case("bmi2", true)
Benjamin Kramerf4c520d2016-05-20 15:21:08 +00004161 .Case("aes", true)
4162 .Case("pclmul", true)
4163 .Case("avx512vl", true)
4164 .Case("avx512bw", true)
4165 .Case("avx512dq", true)
4166 .Case("avx512cd", true)
4167 .Case("avx512er", true)
4168 .Case("avx512pf", true)
4169 .Case("avx512vbmi", true)
4170 .Case("avx512ifma", true)
Eric Christopherd9832702015-06-29 21:00:05 +00004171 .Default(false);
4172}
4173
Eli Friedman3fd920a2008-08-20 02:34:37 +00004174bool
Anders Carlsson58436352009-02-28 17:11:49 +00004175X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00004176 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00004177 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004178 default: return false;
Alexey Bataev91e58602015-07-20 12:08:00 +00004179 // Constant constraints.
4180 case 'e': // 32-bit signed integer constant for use with sign-extending x86_64
4181 // instructions.
4182 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
4183 // x86_64 instructions.
4184 case 's':
4185 Info.setRequiresImmediate();
4186 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00004187 case 'I':
4188 Info.setRequiresImmediate(0, 31);
4189 return true;
4190 case 'J':
4191 Info.setRequiresImmediate(0, 63);
4192 return true;
4193 case 'K':
4194 Info.setRequiresImmediate(-128, 127);
4195 return true;
4196 case 'L':
Alexey Bataev91e58602015-07-20 12:08:00 +00004197 Info.setRequiresImmediate({ int(0xff), int(0xffff), int(0xffffffff) });
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00004198 return true;
4199 case 'M':
4200 Info.setRequiresImmediate(0, 3);
4201 return true;
4202 case 'N':
4203 Info.setRequiresImmediate(0, 255);
4204 return true;
4205 case 'O':
4206 Info.setRequiresImmediate(0, 127);
4207 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00004208 // Register constraints.
4209 case 'Y': // 'Y' is the first character for several 2-character constraints.
4210 // Shift the pointer to the second character of the constraint.
4211 Name++;
4212 switch (*Name) {
4213 default:
4214 return false;
4215 case '0': // First SSE register.
4216 case 't': // Any SSE register, when SSE2 is enabled.
4217 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
4218 case 'm': // Any MMX register, when inter-unit moves enabled.
Michael Zuckerman849a6a52016-10-31 17:23:52 +00004219 case 'k': // AVX512 arch mask registers: k1-k7.
Alexey Bataev91e58602015-07-20 12:08:00 +00004220 Info.setAllowsRegister();
4221 return true;
4222 }
4223 case 'f': // Any x87 floating point stack register.
Akira Hatanaka88ef7282014-07-18 23:30:30 +00004224 // Constraint 'f' cannot be used for output operands.
4225 if (Info.ConstraintStr[0] == '=')
4226 return false;
Akira Hatanaka88ef7282014-07-18 23:30:30 +00004227 Info.setAllowsRegister();
4228 return true;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004229 case 'a': // eax.
4230 case 'b': // ebx.
4231 case 'c': // ecx.
4232 case 'd': // edx.
4233 case 'S': // esi.
4234 case 'D': // edi.
4235 case 'A': // edx:eax.
Alexey Bataev91e58602015-07-20 12:08:00 +00004236 case 't': // Top of floating point stack.
4237 case 'u': // Second from top of floating point stack.
Eli Friedman3fd920a2008-08-20 02:34:37 +00004238 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00004239 case 'y': // Any MMX register.
Michael Zuckerman62f516f2016-11-01 13:16:44 +00004240 case 'v': // Any {X,Y,Z}MM register (Arch & context dependent)
Anders Carlsson5f7ee682008-10-06 19:17:39 +00004241 case 'x': // Any SSE register.
Michael Zuckerman849a6a52016-10-31 17:23:52 +00004242 case 'k': // Any AVX512 mask register (same as Yk, additionaly allows k0
4243 // for intermideate k reg operations).
Eli Friedman3fd920a2008-08-20 02:34:37 +00004244 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00004245 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
4246 case 'l': // "Index" registers: any general register that can be used as an
4247 // index in a base+index memory access.
4248 Info.setAllowsRegister();
4249 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00004250 // Floating point constant constraints.
Dale Johannesen46742a42010-08-24 22:33:12 +00004251 case 'C': // SSE floating point constant.
4252 case 'G': // x87 floating point constant.
Eli Friedman3fd920a2008-08-20 02:34:37 +00004253 return true;
4254 }
4255}
4256
Akira Hatanaka974131e2014-09-18 18:17:18 +00004257bool X86TargetInfo::validateOutputSize(StringRef Constraint,
4258 unsigned Size) const {
4259 // Strip off constraint modifiers.
4260 while (Constraint[0] == '=' ||
4261 Constraint[0] == '+' ||
4262 Constraint[0] == '&')
4263 Constraint = Constraint.substr(1);
4264
4265 return validateOperandSize(Constraint, Size);
4266}
4267
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004268bool X86TargetInfo::validateInputSize(StringRef Constraint,
4269 unsigned Size) const {
Akira Hatanaka974131e2014-09-18 18:17:18 +00004270 return validateOperandSize(Constraint, Size);
4271}
4272
4273bool X86TargetInfo::validateOperandSize(StringRef Constraint,
4274 unsigned Size) const {
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004275 switch (Constraint[0]) {
4276 default: break;
Michael Zuckerman849a6a52016-10-31 17:23:52 +00004277 case 'k':
4278 // Registers k0-k7 (AVX512) size limit is 64 bit.
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004279 case 'y':
4280 return Size <= 64;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004281 case 'f':
4282 case 't':
4283 case 'u':
4284 return Size <= 128;
Michael Zuckerman62f516f2016-11-01 13:16:44 +00004285 case 'v':
Hans Wennborg3c619a42014-09-18 20:24:04 +00004286 case 'x':
Alexey Bataev91e58602015-07-20 12:08:00 +00004287 if (SSELevel >= AVX512F)
4288 // 512-bit zmm registers can be used if target supports AVX512F.
4289 return Size <= 512U;
4290 else if (SSELevel >= AVX)
4291 // 256-bit ymm registers can be used if target supports AVX.
4292 return Size <= 256U;
4293 return Size <= 128U;
4294 case 'Y':
4295 // 'Y' is the first character for several 2-character constraints.
4296 switch (Constraint[1]) {
4297 default: break;
4298 case 'm':
4299 // 'Ym' is synonymous with 'y'.
Michael Zuckerman849a6a52016-10-31 17:23:52 +00004300 case 'k':
Alexey Bataev91e58602015-07-20 12:08:00 +00004301 return Size <= 64;
4302 case 'i':
4303 case 't':
4304 // 'Yi' and 'Yt' are synonymous with 'x' when SSE2 is enabled.
4305 if (SSELevel >= AVX512F)
4306 return Size <= 512U;
4307 else if (SSELevel >= AVX)
4308 return Size <= 256U;
4309 return SSELevel >= SSE2 && Size <= 128U;
4310 }
4311
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004312 }
4313
4314 return true;
4315}
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00004316
Eli Friedman3fd920a2008-08-20 02:34:37 +00004317std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004318X86TargetInfo::convertConstraint(const char *&Constraint) const {
4319 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004320 case 'a': return std::string("{ax}");
4321 case 'b': return std::string("{bx}");
4322 case 'c': return std::string("{cx}");
4323 case 'd': return std::string("{dx}");
4324 case 'S': return std::string("{si}");
4325 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00004326 case 'p': // address
4327 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00004328 case 't': // top of floating point stack.
4329 return std::string("{st}");
4330 case 'u': // second from top of floating point stack.
4331 return std::string("{st(1)}"); // second from top of floating point stack.
Michael Zuckerman849a6a52016-10-31 17:23:52 +00004332 case 'Y':
4333 switch (Constraint[1]) {
4334 default:
4335 // Break from inner switch and fall through (copy single char),
4336 // continue parsing after copying the current constraint into
4337 // the return string.
4338 break;
4339 case 'k':
4340 // "^" hints llvm that this is a 2 letter constraint.
4341 // "Constraint++" is used to promote the string iterator
4342 // to the next constraint.
4343 return std::string("^") + std::string(Constraint++, 2);
4344 }
4345 LLVM_FALLTHROUGH;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004346 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004347 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00004348 }
4349}
Chris Lattner5ba61f02006-10-14 07:39:34 +00004350
Eli Friedman3fd920a2008-08-20 02:34:37 +00004351// X86-32 generic target
4352class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00004353public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004354 X86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4355 : X86TargetInfo(Triple, Opts) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004356 DoubleAlign = LongLongAlign = 32;
4357 LongDoubleWidth = 96;
4358 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00004359 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00004360 resetDataLayout("e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128");
Eli Friedman32ca82a2009-03-29 20:31:09 +00004361 SizeType = UnsignedInt;
4362 PtrDiffType = SignedInt;
4363 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00004364 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00004365
4366 // Use fpret for all types.
4367 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
4368 (1 << TargetInfo::Double) |
4369 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004370
4371 // x86-32 has atomics up to 8 bytes
4372 // FIXME: Check that we actually have cmpxchg8b before setting
4373 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
4374 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004375 }
Craig Topper3164f332014-03-11 03:39:26 +00004376 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004377 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004378 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004379
Craig Topper3164f332014-03-11 03:39:26 +00004380 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00004381 if (RegNo == 0) return 0;
4382 if (RegNo == 1) return 2;
4383 return -1;
4384 }
Akira Hatanaka974131e2014-09-18 18:17:18 +00004385 bool validateOperandSize(StringRef Constraint,
4386 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00004387 switch (Constraint[0]) {
4388 default: break;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004389 case 'R':
4390 case 'q':
4391 case 'Q':
Bill Wendling887b4852012-11-12 06:42:51 +00004392 case 'a':
4393 case 'b':
4394 case 'c':
4395 case 'd':
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004396 case 'S':
4397 case 'D':
Bill Wendling3c7fed82012-11-12 18:52:32 +00004398 return Size <= 32;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004399 case 'A':
4400 return Size <= 64;
Bill Wendling887b4852012-11-12 06:42:51 +00004401 }
4402
Akira Hatanaka974131e2014-09-18 18:17:18 +00004403 return X86TargetInfo::validateOperandSize(Constraint, Size);
Bill Wendling887b4852012-11-12 06:42:51 +00004404 }
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00004405 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
4406 return llvm::makeArrayRef(BuiltinInfoX86, clang::X86::LastX86CommonBuiltin -
4407 Builtin::FirstTSBuiltin + 1);
4408 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004409};
Eli Friedman3fd920a2008-08-20 02:34:37 +00004410
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004411class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
4412public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004413 NetBSDI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4414 : NetBSDTargetInfo<X86_32TargetInfo>(Triple, Opts) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004415
Craig Topper3164f332014-03-11 03:39:26 +00004416 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00004417 unsigned Major, Minor, Micro;
4418 getTriple().getOSVersion(Major, Minor, Micro);
4419 // New NetBSD uses the default rounding mode.
4420 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
4421 return X86_32TargetInfo::getFloatEvalMethod();
4422 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004423 return 1;
4424 }
4425};
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004426
Eli Friedmane3aa4542009-07-05 18:47:56 +00004427class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
4428public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004429 OpenBSDI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4430 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00004431 SizeType = UnsignedLong;
4432 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004433 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00004434 }
4435};
Eli Friedmane3aa4542009-07-05 18:47:56 +00004436
Eli Friedman9fa28852012-08-08 23:57:20 +00004437class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
4438public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004439 BitrigI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4440 : BitrigTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman9fa28852012-08-08 23:57:20 +00004441 SizeType = UnsignedLong;
4442 IntPtrType = SignedLong;
4443 PtrDiffType = SignedLong;
4444 }
4445};
Eli Friedman9fa28852012-08-08 23:57:20 +00004446
Torok Edwinb2b37c62009-06-30 17:10:35 +00004447class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004448public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004449 DarwinI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4450 : DarwinTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004451 LongDoubleWidth = 128;
4452 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004453 SuitableAlign = 128;
Tim Northover5627d392015-10-30 16:30:45 +00004454 MaxVectorAlign = 256;
4455 // The watchOS simulator uses the builtin bool type for Objective-C.
4456 llvm::Triple T = llvm::Triple(Triple);
4457 if (T.isWatchOS())
4458 UseSignedCharForObjCBool = false;
Eli Friedman32ca82a2009-03-29 20:31:09 +00004459 SizeType = UnsignedLong;
4460 IntPtrType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00004461 resetDataLayout("e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128");
Daniel Dunbarbd606522010-05-27 00:35:16 +00004462 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00004463 }
4464
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004465 bool handleTargetFeatures(std::vector<std::string> &Features,
4466 DiagnosticsEngine &Diags) override {
4467 if (!DarwinTargetInfo<X86_32TargetInfo>::handleTargetFeatures(Features,
4468 Diags))
4469 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004470 // We now know the features we have: we can decide how to align vectors.
4471 MaxVectorAlign =
4472 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004473 return true;
4474 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004475};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004476
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004477// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004478class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004479public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004480 WindowsX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4481 : WindowsTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Chris Lattner46be2e12009-06-24 17:12:15 +00004482 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00004483 DoubleAlign = LongLongAlign = 64;
Reid Kleckner7510c092015-04-01 16:45:06 +00004484 bool IsWinCOFF =
4485 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
James Y Knightb214cbc2016-03-04 19:00:41 +00004486 resetDataLayout(IsWinCOFF
4487 ? "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
4488 : "e-m:e-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32");
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004489 }
Craig Topper3164f332014-03-11 03:39:26 +00004490 void getTargetDefines(const LangOptions &Opts,
4491 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004492 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
4493 }
4494};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004495
4496// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004497class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004498public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004499 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple,
4500 const TargetOptions &Opts)
4501 : WindowsX86_32TargetInfo(Triple, Opts) {
Eli Friedman015d6282011-03-22 21:25:11 +00004502 LongDoubleWidth = LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00004503 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004504 }
Craig Topper3164f332014-03-11 03:39:26 +00004505 void getTargetDefines(const LangOptions &Opts,
4506 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004507 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
4508 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
4509 // The value of the following reflects processor type.
4510 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
4511 // We lost the original triple, so we use the default.
4512 Builder.defineMacro("_M_IX86", "600");
4513 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004514};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004515
David Majnemerae1ed0e2015-05-28 04:36:18 +00004516static void addCygMingDefines(const LangOptions &Opts, MacroBuilder &Builder) {
Eric Christopherb093d692015-10-09 18:39:59 +00004517 // Mingw and cygwin define __declspec(a) to __attribute__((a)). Clang
4518 // supports __declspec natively under -fms-extensions, but we define a no-op
4519 // __declspec macro anyway for pre-processor compatibility.
Reid Kleckner47606832014-04-21 20:58:00 +00004520 if (Opts.MicrosoftExt)
4521 Builder.defineMacro("__declspec", "__declspec");
4522 else
4523 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
4524
4525 if (!Opts.MicrosoftExt) {
4526 // Provide macros for all the calling convention keywords. Provide both
4527 // single and double underscore prefixed variants. These are available on
4528 // x64 as well as x86, even though they have no effect.
4529 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
4530 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00004531 std::string GCCSpelling = "__attribute__((__";
4532 GCCSpelling += CC;
4533 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00004534 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
4535 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
4536 }
4537 }
4538}
4539
David Majnemerae1ed0e2015-05-28 04:36:18 +00004540static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
4541 Builder.defineMacro("__MSVCRT__");
4542 Builder.defineMacro("__MINGW32__");
4543 addCygMingDefines(Opts, Builder);
4544}
4545
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004546// x86-32 MinGW target
4547class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
4548public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004549 MinGWX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4550 : WindowsX86_32TargetInfo(Triple, Opts) {}
Craig Topper3164f332014-03-11 03:39:26 +00004551 void getTargetDefines(const LangOptions &Opts,
4552 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004553 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004554 DefineStd(Builder, "WIN32", Opts);
4555 DefineStd(Builder, "WINNT", Opts);
4556 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00004557 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004558 }
4559};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004560
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004561// x86-32 Cygwin target
4562class CygwinX86_32TargetInfo : public X86_32TargetInfo {
4563public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004564 CygwinX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4565 : X86_32TargetInfo(Triple, Opts) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004566 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004567 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00004568 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 +00004569 }
Craig Topper3164f332014-03-11 03:39:26 +00004570 void getTargetDefines(const LangOptions &Opts,
4571 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004572 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00004573 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004574 Builder.defineMacro("__CYGWIN__");
4575 Builder.defineMacro("__CYGWIN32__");
David Majnemerae1ed0e2015-05-28 04:36:18 +00004576 addCygMingDefines(Opts, Builder);
Saleem Abdulrasool56027092017-02-07 19:00:06 +00004577 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00004578 if (Opts.CPlusPlus)
4579 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00004580 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004581};
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004582
Chris Lattnerb986aba2010-04-11 19:29:39 +00004583// x86-32 Haiku target
Reid Kleckner330fb172016-05-11 16:19:05 +00004584class HaikuX86_32TargetInfo : public HaikuTargetInfo<X86_32TargetInfo> {
Chris Lattnerb986aba2010-04-11 19:29:39 +00004585public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004586 HaikuX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Reid Kleckner330fb172016-05-11 16:19:05 +00004587 : HaikuTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman04831922010-08-22 01:00:03 +00004588 }
Craig Topper3164f332014-03-11 03:39:26 +00004589 void getTargetDefines(const LangOptions &Opts,
4590 MacroBuilder &Builder) const override {
Reid Kleckner330fb172016-05-11 16:19:05 +00004591 HaikuTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
Chris Lattnerb986aba2010-04-11 19:29:39 +00004592 Builder.defineMacro("__INTEL__");
Chris Lattnerb986aba2010-04-11 19:29:39 +00004593 }
4594};
Chris Lattnerb986aba2010-04-11 19:29:39 +00004595
Alexey Bataevc99b0492015-11-25 09:24:26 +00004596// X86-32 MCU target
4597class MCUX86_32TargetInfo : public X86_32TargetInfo {
4598public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004599 MCUX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4600 : X86_32TargetInfo(Triple, Opts) {
Alexey Bataevc99b0492015-11-25 09:24:26 +00004601 LongDoubleWidth = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00004602 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
James Y Knightb214cbc2016-03-04 19:00:41 +00004603 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 +00004604 WIntType = UnsignedInt;
Alexey Bataevc99b0492015-11-25 09:24:26 +00004605 }
4606
4607 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
4608 // On MCU we support only C calling convention.
4609 return CC == CC_C ? CCCR_OK : CCCR_Warning;
4610 }
4611
4612 void getTargetDefines(const LangOptions &Opts,
4613 MacroBuilder &Builder) const override {
4614 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4615 Builder.defineMacro("__iamcu");
4616 Builder.defineMacro("__iamcu__");
4617 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00004618
4619 bool allowsLargerPreferedTypeAlignment() const override {
4620 return false;
4621 }
Alexey Bataevc99b0492015-11-25 09:24:26 +00004622};
4623
Douglas Gregor9fabd852011-07-01 22:41:14 +00004624// RTEMS Target
4625template<typename Target>
4626class RTEMSTargetInfo : public OSTargetInfo<Target> {
4627protected:
Craig Topper3164f332014-03-11 03:39:26 +00004628 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4629 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004630 // RTEMS defines; list based off of gcc output
4631
Douglas Gregor9fabd852011-07-01 22:41:14 +00004632 Builder.defineMacro("__rtems__");
4633 Builder.defineMacro("__ELF__");
4634 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004635
Douglas Gregor9fabd852011-07-01 22:41:14 +00004636public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004637 RTEMSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4638 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004639 switch (Triple.getArch()) {
4640 default:
4641 case llvm::Triple::x86:
4642 // this->MCountName = ".mcount";
4643 break;
4644 case llvm::Triple::mips:
4645 case llvm::Triple::mipsel:
4646 case llvm::Triple::ppc:
4647 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00004648 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004649 // this->MCountName = "_mcount";
4650 break;
4651 case llvm::Triple::arm:
4652 // this->MCountName = "__mcount";
4653 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004654 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004655 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00004656};
4657
Douglas Gregor9fabd852011-07-01 22:41:14 +00004658// x86-32 RTEMS target
4659class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
4660public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004661 RTEMSX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4662 : X86_32TargetInfo(Triple, Opts) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004663 SizeType = UnsignedLong;
4664 IntPtrType = SignedLong;
4665 PtrDiffType = SignedLong;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004666 }
Craig Topper3164f332014-03-11 03:39:26 +00004667 void getTargetDefines(const LangOptions &Opts,
4668 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004669 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4670 Builder.defineMacro("__INTEL__");
4671 Builder.defineMacro("__rtems__");
4672 }
4673};
Douglas Gregor9fabd852011-07-01 22:41:14 +00004674
Eli Friedman3fd920a2008-08-20 02:34:37 +00004675// x86-64 generic target
4676class X86_64TargetInfo : public X86TargetInfo {
4677public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004678 X86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4679 : X86TargetInfo(Triple, Opts) {
David Blaikie40f842d2014-07-10 18:46:15 +00004680 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
David Majnemer8fa8c382015-03-17 23:55:00 +00004681 bool IsWinCOFF =
4682 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Zinovy Nis1db95732014-07-10 15:27:19 +00004683 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00004684 LongDoubleWidth = 128;
4685 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00004686 LargeArrayMinWidth = 128;
4687 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004688 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00004689 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
4690 PtrDiffType = IsX32 ? SignedInt : SignedLong;
4691 IntPtrType = IsX32 ? SignedInt : SignedLong;
4692 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00004693 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00004694 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00004695
Eric Christopher917e9522014-11-18 22:36:15 +00004696 // Pointers are 32-bit in x32.
Eric Christopherf6ee1f32017-02-10 04:35:21 +00004697 resetDataLayout(IsX32
4698 ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128"
4699 : IsWinCOFF ? "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
4700 : "e-m:e-i64:64-f80:128-n8:16:32:64-S128");
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00004701
4702 // Use fpret only for long double.
4703 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004704
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00004705 // Use fp2ret for _Complex long double.
4706 ComplexLongDoubleUsesFP2Ret = true;
4707
Charles Davisc7d5c942015-09-17 20:55:33 +00004708 // Make __builtin_ms_va_list available.
4709 HasBuiltinMSVaList = true;
4710
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004711 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004712 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00004713 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00004714 }
Craig Topper3164f332014-03-11 03:39:26 +00004715 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004716 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00004717 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004718
Craig Topper3164f332014-03-11 03:39:26 +00004719 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00004720 if (RegNo == 0) return 0;
4721 if (RegNo == 1) return 1;
4722 return -1;
4723 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004724
Craig Topper3164f332014-03-11 03:39:26 +00004725 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00004726 switch (CC) {
4727 case CC_C:
4728 case CC_Swift:
4729 case CC_X86VectorCall:
4730 case CC_IntelOclBicc:
4731 case CC_X86_64Win64:
Roman Levenstein35aa5ce2016-03-16 18:00:46 +00004732 case CC_PreserveMost:
4733 case CC_PreserveAll:
Erich Keane757d3172016-11-02 18:29:35 +00004734 case CC_X86RegCall:
John McCall477f2bb2016-03-03 06:39:32 +00004735 return CCCR_OK;
4736 default:
4737 return CCCR_Warning;
4738 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004739 }
4740
Craig Topper3164f332014-03-11 03:39:26 +00004741 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00004742 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004743 }
4744
Pavel Chupinfd223e12014-08-04 12:39:43 +00004745 // for x32 we need it here explicitly
4746 bool hasInt128Type() const override { return true; }
Reid Klecknerf27e7522016-02-01 18:58:24 +00004747 unsigned getUnwindWordWidth() const override { return 64; }
4748 unsigned getRegisterWidth() const override { return 64; }
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00004749
4750 bool validateGlobalRegisterVariable(StringRef RegName,
4751 unsigned RegSize,
4752 bool &HasSizeMismatch) const override {
4753 // rsp and rbp are the only 64-bit registers the x86 backend can currently
4754 // handle.
4755 if (RegName.equals("rsp") || RegName.equals("rbp")) {
4756 // Check that the register size is 64-bit.
4757 HasSizeMismatch = RegSize != 64;
4758 return true;
4759 }
4760
4761 // Check if the register is a 32-bit register the backend can handle.
4762 return X86TargetInfo::validateGlobalRegisterVariable(RegName, RegSize,
4763 HasSizeMismatch);
4764 }
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00004765 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
4766 return llvm::makeArrayRef(BuiltinInfoX86,
4767 X86::LastTSBuiltin - Builtin::FirstTSBuiltin);
4768 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004769};
Eli Friedman3fd920a2008-08-20 02:34:37 +00004770
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004771// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004772class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004773public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004774 WindowsX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4775 : WindowsTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004776 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00004777 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004778 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004779 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004780 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00004781 SizeType = UnsignedLongLong;
4782 PtrDiffType = SignedLongLong;
4783 IntPtrType = SignedLongLong;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004784 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004785
Craig Topper3164f332014-03-11 03:39:26 +00004786 void getTargetDefines(const LangOptions &Opts,
4787 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004788 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004789 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004790 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004791
Craig Topper3164f332014-03-11 03:39:26 +00004792 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004793 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00004794 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004795
Craig Topper3164f332014-03-11 03:39:26 +00004796 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004797 switch (CC) {
4798 case CC_X86StdCall:
4799 case CC_X86ThisCall:
4800 case CC_X86FastCall:
4801 return CCCR_Ignore;
4802 case CC_C:
4803 case CC_X86VectorCall:
4804 case CC_IntelOclBicc:
4805 case CC_X86_64SysV:
Arnold Schwaighofer4fc955e2016-10-12 18:59:24 +00004806 case CC_Swift:
Erich Keane757d3172016-11-02 18:29:35 +00004807 case CC_X86RegCall:
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004808 return CCCR_OK;
4809 default:
4810 return CCCR_Warning;
4811 }
Charles Davisb5a214e2013-08-30 04:39:01 +00004812 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004813};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004814
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004815// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004816class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004817public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004818 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple,
4819 const TargetOptions &Opts)
4820 : WindowsX86_64TargetInfo(Triple, Opts) {
Eli Friedman015d6282011-03-22 21:25:11 +00004821 LongDoubleWidth = LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00004822 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004823 }
Craig Topper3164f332014-03-11 03:39:26 +00004824 void getTargetDefines(const LangOptions &Opts,
4825 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004826 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
4827 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
David Majnemerb856e8f2015-07-26 23:17:29 +00004828 Builder.defineMacro("_M_X64", "100");
4829 Builder.defineMacro("_M_AMD64", "100");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004830 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004831};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004832
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004833// x86-64 MinGW target
4834class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
4835public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004836 MinGWX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4837 : WindowsX86_64TargetInfo(Triple, Opts) {
Reid Kleckner11a17192015-10-28 22:29:52 +00004838 // Mingw64 rounds long double size and alignment up to 16 bytes, but sticks
4839 // with x86 FP ops. Weird.
4840 LongDoubleWidth = LongDoubleAlign = 128;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00004841 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended();
Reid Kleckner11a17192015-10-28 22:29:52 +00004842 }
4843
Craig Topper3164f332014-03-11 03:39:26 +00004844 void getTargetDefines(const LangOptions &Opts,
4845 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004846 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004847 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004848 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00004849 addMinGWDefines(Opts, Builder);
Reid Klecknere070b992014-11-14 02:01:10 +00004850
4851 // GCC defines this macro when it is using __gxx_personality_seh0.
4852 if (!Opts.SjLjExceptions)
4853 Builder.defineMacro("__SEH__");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004854 }
4855};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004856
Yaron Kerend030d112015-07-22 17:38:19 +00004857// x86-64 Cygwin target
4858class CygwinX86_64TargetInfo : public X86_64TargetInfo {
4859public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004860 CygwinX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4861 : X86_64TargetInfo(Triple, Opts) {
Yaron Kerend030d112015-07-22 17:38:19 +00004862 TLSSupported = false;
4863 WCharType = UnsignedShort;
4864 }
4865 void getTargetDefines(const LangOptions &Opts,
4866 MacroBuilder &Builder) const override {
4867 X86_64TargetInfo::getTargetDefines(Opts, Builder);
4868 Builder.defineMacro("__x86_64__");
4869 Builder.defineMacro("__CYGWIN__");
4870 Builder.defineMacro("__CYGWIN64__");
4871 addCygMingDefines(Opts, Builder);
Saleem Abdulrasool56027092017-02-07 19:00:06 +00004872 DefineStd(Builder, "unix", Opts);
Yaron Kerend030d112015-07-22 17:38:19 +00004873 if (Opts.CPlusPlus)
4874 Builder.defineMacro("_GNU_SOURCE");
4875
4876 // GCC defines this macro when it is using __gxx_personality_seh0.
4877 if (!Opts.SjLjExceptions)
4878 Builder.defineMacro("__SEH__");
4879 }
4880};
4881
Eli Friedman2857ccb2009-07-01 03:36:11 +00004882class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
4883public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004884 DarwinX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4885 : DarwinTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00004886 Int64Type = SignedLongLong;
Tim Northovera2ee4332014-03-29 15:09:45 +00004887 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
4888 llvm::Triple T = llvm::Triple(Triple);
Bob Wilson946c04c2014-10-19 02:19:27 +00004889 if (T.isiOS())
Tim Northovera2ee4332014-03-29 15:09:45 +00004890 UseSignedCharForObjCBool = false;
James Y Knightb214cbc2016-03-04 19:00:41 +00004891 resetDataLayout("e-m:o-i64:64-f80:128-n8:16:32:64-S128");
Eli Friedman2857ccb2009-07-01 03:36:11 +00004892 }
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004893
4894 bool handleTargetFeatures(std::vector<std::string> &Features,
4895 DiagnosticsEngine &Diags) override {
4896 if (!DarwinTargetInfo<X86_64TargetInfo>::handleTargetFeatures(Features,
4897 Diags))
4898 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004899 // We now know the features we have: we can decide how to align vectors.
4900 MaxVectorAlign =
4901 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004902 return true;
4903 }
Eli Friedman2857ccb2009-07-01 03:36:11 +00004904};
Eli Friedman2857ccb2009-07-01 03:36:11 +00004905
Eli Friedman245f2292009-07-05 22:31:18 +00004906class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
4907public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004908 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4909 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Eli Friedman245f2292009-07-05 22:31:18 +00004910 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004911 Int64Type = SignedLongLong;
4912 }
4913};
Eli Friedman245f2292009-07-05 22:31:18 +00004914
Eli Friedman9fa28852012-08-08 23:57:20 +00004915class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
4916public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004917 BitrigX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4918 : BitrigTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004919 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004920 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00004921 }
4922};
Tim Northover9bb857a2013-01-31 12:13:10 +00004923
Eli Friedmanf05b7722008-08-20 07:44:10 +00004924class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004925 // Possible FPU choices.
4926 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004927 VFP2FPU = (1 << 0),
4928 VFP3FPU = (1 << 1),
4929 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00004930 NeonFPU = (1 << 3),
4931 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004932 };
4933
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004934 // Possible HWDiv features.
4935 enum HWDivMode {
4936 HWDivThumb = (1 << 0),
4937 HWDivARM = (1 << 1)
4938 };
4939
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004940 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004941 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004942 }
4943
4944 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4945 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004946
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004947 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004948
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004949 StringRef CPUProfile;
4950 StringRef CPUAttr;
4951
Rafael Espindolaeb265472013-08-21 21:59:03 +00004952 enum {
4953 FP_Default,
4954 FP_VFP,
4955 FP_Neon
4956 } FPMath;
4957
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004958 unsigned ArchISA;
Renato Goline84b0002015-10-08 16:43:26 +00004959 unsigned ArchKind = llvm::ARM::AK_ARMV4T;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004960 unsigned ArchProfile;
4961 unsigned ArchVersion;
4962
Bernard Ogdenda13af32013-10-24 18:32:51 +00004963 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004964
Logan Chien57086ce2012-10-10 06:56:20 +00004965 unsigned IsAAPCS : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004966 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004967
4968 // Initialized via features.
4969 unsigned SoftFloat : 1;
4970 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004971
Bernard Ogden18b57012013-10-29 09:47:51 +00004972 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00004973 unsigned Crypto : 1;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004974 unsigned DSP : 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004975 unsigned Unaligned : 1;
4976
4977 enum {
4978 LDREX_B = (1 << 0), /// byte (8-bit)
4979 LDREX_H = (1 << 1), /// half (16-bit)
4980 LDREX_W = (1 << 2), /// word (32-bit)
4981 LDREX_D = (1 << 3), /// double (64-bit)
4982 };
4983
4984 uint32_t LDREX;
Bernard Ogden18b57012013-10-29 09:47:51 +00004985
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004986 // ACLE 6.5.1 Hardware floating point
4987 enum {
4988 HW_FP_HP = (1 << 1), /// half (16-bit)
4989 HW_FP_SP = (1 << 2), /// single (32-bit)
4990 HW_FP_DP = (1 << 3), /// double (64-bit)
4991 };
4992 uint32_t HW_FP;
4993
Chris Lattner5cc15e02010-03-03 19:03:45 +00004994 static const Builtin::Info BuiltinInfo[];
4995
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004996 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004997 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004998
4999 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00005000 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00005001
Renato Golin0201a9e2016-09-22 19:28:20 +00005002 // size_t is unsigned long on MachO-derived environments, NetBSD,
5003 // OpenBSD and Bitrig.
Renato Golin9ba39232015-02-27 16:35:48 +00005004 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD ||
Renato Golin0201a9e2016-09-22 19:28:20 +00005005 T.getOS() == llvm::Triple::OpenBSD ||
Renato Golin9ba39232015-02-27 16:35:48 +00005006 T.getOS() == llvm::Triple::Bitrig)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00005007 SizeType = UnsignedLong;
5008 else
5009 SizeType = UnsignedInt;
5010
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00005011 switch (T.getOS()) {
5012 case llvm::Triple::NetBSD:
Renato Golin0201a9e2016-09-22 19:28:20 +00005013 case llvm::Triple::OpenBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00005014 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00005015 break;
5016 case llvm::Triple::Win32:
5017 WCharType = UnsignedShort;
5018 break;
5019 case llvm::Triple::Linux:
5020 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00005021 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
5022 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00005023 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00005024 }
5025
5026 UseBitFieldTypeAlignment = true;
5027
5028 ZeroLengthBitfieldBoundary = 0;
5029
Tim Northover147cd2f2014-10-14 22:12:21 +00005030 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
5031 // so set preferred for small types to 32.
5032 if (T.isOSBinFormatMachO()) {
James Y Knightb214cbc2016-03-04 19:00:41 +00005033 resetDataLayout(BigEndian
5034 ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
5035 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Tim Northover147cd2f2014-10-14 22:12:21 +00005036 } else if (T.isOSWindows()) {
Tim Northover147cd2f2014-10-14 22:12:21 +00005037 assert(!BigEndian && "Windows on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00005038 resetDataLayout("e"
5039 "-m:w"
5040 "-p:32:32"
5041 "-i64:64"
5042 "-v128:64:128"
5043 "-a:0:32"
5044 "-n32"
5045 "-S64");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00005046 } else if (T.isOSNaCl()) {
5047 assert(!BigEndian && "NaCl on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00005048 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00005049 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00005050 resetDataLayout(BigEndian
5051 ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
5052 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00005053 }
5054
5055 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00005056 }
5057
Tim Northover5627d392015-10-30 16:30:45 +00005058 void setABIAPCS(bool IsAAPCS16) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00005059 const llvm::Triple &T = getTriple();
5060
Rafael Espindolaafa854c2013-12-18 20:24:51 +00005061 IsAAPCS = false;
5062
Tim Northover5627d392015-10-30 16:30:45 +00005063 if (IsAAPCS16)
5064 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
5065 else
5066 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00005067
Rafael Espindolad6c2b722013-12-18 19:47:32 +00005068 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00005069 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00005070 SizeType = UnsignedInt;
5071 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00005072 SizeType = UnsignedLong;
5073
5074 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
5075 WCharType = SignedInt;
5076
5077 // Do not respect the alignment of bit-field types when laying out
5078 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
5079 UseBitFieldTypeAlignment = false;
5080
5081 /// gcc forces the alignment to 4 bytes, regardless of the type of the
5082 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
5083 /// gcc.
5084 ZeroLengthBitfieldBoundary = 32;
5085
Tim Northover5627d392015-10-30 16:30:45 +00005086 if (T.isOSBinFormatMachO() && IsAAPCS16) {
5087 assert(!BigEndian && "AAPCS16 does not support big-endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00005088 resetDataLayout("e-m:o-p:32:32-i64:64-a:0:32-n32-S128");
Tim Northover5627d392015-10-30 16:30:45 +00005089 } else if (T.isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00005090 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00005091 BigEndian
5092 ? "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 +00005093 : "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 +00005094 else
James Y Knightb214cbc2016-03-04 19:00:41 +00005095 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00005096 BigEndian
5097 ? "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 +00005098 : "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 +00005099
5100 // FIXME: Override "preferred align" for double and long long.
5101 }
5102
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005103 void setArchInfo() {
5104 StringRef ArchName = getTriple().getArchName();
5105
Renato Goline84b0002015-10-08 16:43:26 +00005106 ArchISA = llvm::ARM::parseArchISA(ArchName);
5107 CPU = llvm::ARM::getDefaultCPU(ArchName);
5108 unsigned AK = llvm::ARM::parseArch(ArchName);
5109 if (AK != llvm::ARM::AK_INVALID)
5110 ArchKind = AK;
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005111 setArchInfo(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005112 }
5113
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005114 void setArchInfo(unsigned Kind) {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005115 StringRef SubArch;
5116
5117 // cache TargetParser info
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005118 ArchKind = Kind;
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00005119 SubArch = llvm::ARM::getSubArch(ArchKind);
5120 ArchProfile = llvm::ARM::parseArchProfile(SubArch);
5121 ArchVersion = llvm::ARM::parseArchVersion(SubArch);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005122
5123 // cache CPU related strings
5124 CPUAttr = getCPUAttr();
5125 CPUProfile = getCPUProfile();
5126 }
5127
5128 void setAtomic() {
Eric Christopherb093d692015-10-09 18:39:59 +00005129 // when triple does not specify a sub arch,
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005130 // then we are not using inline atomics
Renato Goline84b0002015-10-08 16:43:26 +00005131 bool ShouldUseInlineAtomic =
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005132 (ArchISA == llvm::ARM::IK_ARM && ArchVersion >= 6) ||
5133 (ArchISA == llvm::ARM::IK_THUMB && ArchVersion >= 7);
Eric Christopherb093d692015-10-09 18:39:59 +00005134 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005135 if (ArchProfile == llvm::ARM::PK_M) {
5136 MaxAtomicPromoteWidth = 32;
5137 if (ShouldUseInlineAtomic)
5138 MaxAtomicInlineWidth = 32;
5139 }
5140 else {
5141 MaxAtomicPromoteWidth = 64;
5142 if (ShouldUseInlineAtomic)
5143 MaxAtomicInlineWidth = 64;
Eric Christopherb093d692015-10-09 18:39:59 +00005144 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005145 }
5146
5147 bool isThumb() const {
5148 return (ArchISA == llvm::ARM::IK_THUMB);
5149 }
5150
5151 bool supportsThumb() const {
5152 return CPUAttr.count('T') || ArchVersion >= 6;
5153 }
5154
5155 bool supportsThumb2() const {
Bradley Smithf4affc12016-03-03 13:52:22 +00005156 return CPUAttr.equals("6T2") ||
5157 (ArchVersion >= 7 && !CPUAttr.equals("8M_BASE"));
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005158 }
5159
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005160 StringRef getCPUAttr() const {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005161 // For most sub-arches, the build attribute CPU name is enough.
5162 // For Cortex variants, it's slightly different.
5163 switch(ArchKind) {
5164 default:
Chandler Carruthd96f37a2015-08-30 07:51:18 +00005165 return llvm::ARM::getCPUAttr(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005166 case llvm::ARM::AK_ARMV6M:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005167 return "6M";
Tim Northover525c73c2015-07-21 21:47:33 +00005168 case llvm::ARM::AK_ARMV7S:
5169 return "7S";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005170 case llvm::ARM::AK_ARMV7A:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005171 return "7A";
5172 case llvm::ARM::AK_ARMV7R:
5173 return "7R";
5174 case llvm::ARM::AK_ARMV7M:
5175 return "7M";
5176 case llvm::ARM::AK_ARMV7EM:
5177 return "7EM";
George Burgess IVfc970562017-02-09 23:30:10 +00005178 case llvm::ARM::AK_ARMV7VE:
5179 return "7VE";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005180 case llvm::ARM::AK_ARMV8A:
5181 return "8A";
5182 case llvm::ARM::AK_ARMV8_1A:
5183 return "8_1A";
Oliver Stannard3086c042016-02-11 16:05:52 +00005184 case llvm::ARM::AK_ARMV8_2A:
5185 return "8_2A";
Bradley Smithf4affc12016-03-03 13:52:22 +00005186 case llvm::ARM::AK_ARMV8MBaseline:
5187 return "8M_BASE";
5188 case llvm::ARM::AK_ARMV8MMainline:
5189 return "8M_MAIN";
Javed Absar00b74442016-10-07 12:08:41 +00005190 case llvm::ARM::AK_ARMV8R:
5191 return "8R";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005192 }
5193 }
5194
5195 StringRef getCPUProfile() const {
5196 switch(ArchProfile) {
5197 case llvm::ARM::PK_A:
5198 return "A";
5199 case llvm::ARM::PK_R:
5200 return "R";
5201 case llvm::ARM::PK_M:
5202 return "M";
5203 default:
5204 return "";
5205 }
5206 }
5207
Chris Lattner17df24e2008-04-21 18:56:49 +00005208public:
Matt Arsenaultf333de32016-09-07 07:08:02 +00005209 ARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005210 : TargetInfo(Triple), FPMath(FP_Default), IsAAPCS(true), LDREX(0),
5211 HW_FP(0) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005212
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00005213 switch (getTriple().getOS()) {
5214 case llvm::Triple::NetBSD:
Renato Golin0201a9e2016-09-22 19:28:20 +00005215 case llvm::Triple::OpenBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00005216 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00005217 break;
5218 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00005219 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00005220 break;
5221 }
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00005222
Renato Goline84b0002015-10-08 16:43:26 +00005223 // Cache arch related info.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005224 setArchInfo();
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00005225
Chris Lattner1a8f3942010-04-23 16:29:58 +00005226 // {} in inline assembly are neon specifiers, not assembly variant
5227 // specifiers.
5228 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005229
Eric Christopher0e261882014-12-05 01:06:59 +00005230 // FIXME: This duplicates code from the driver that sets the -target-abi
5231 // option - this code is used if -target-abi isn't passed and should
5232 // be unified in some way.
5233 if (Triple.isOSBinFormatMachO()) {
5234 // The backend is hardwired to assume AAPCS for M-class processors, ensure
5235 // the frontend matches that.
5236 if (Triple.getEnvironment() == llvm::Triple::EABI ||
5237 Triple.getOS() == llvm::Triple::UnknownOS ||
Zijiao Ma56a83722016-08-17 02:13:33 +00005238 ArchProfile == llvm::ARM::PK_M) {
Eric Christopher0e261882014-12-05 01:06:59 +00005239 setABI("aapcs");
Tim Northoverd88ecb32016-01-27 19:32:40 +00005240 } else if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00005241 setABI("aapcs16");
Eric Christopher0e261882014-12-05 01:06:59 +00005242 } else {
5243 setABI("apcs-gnu");
5244 }
5245 } else if (Triple.isOSWindows()) {
5246 // FIXME: this is invalid for WindowsCE
5247 setABI("aapcs");
5248 } else {
5249 // Select the default based on the platform.
5250 switch (Triple.getEnvironment()) {
5251 case llvm::Triple::Android:
5252 case llvm::Triple::GNUEABI:
5253 case llvm::Triple::GNUEABIHF:
Rafael Espindola0fa66802016-06-24 21:35:06 +00005254 case llvm::Triple::MuslEABI:
5255 case llvm::Triple::MuslEABIHF:
Eric Christopher0e261882014-12-05 01:06:59 +00005256 setABI("aapcs-linux");
5257 break;
5258 case llvm::Triple::EABIHF:
5259 case llvm::Triple::EABI:
5260 setABI("aapcs");
5261 break;
Eric Christopher560cc4f2014-12-18 02:08:55 +00005262 case llvm::Triple::GNU:
Renato Goline84b0002015-10-08 16:43:26 +00005263 setABI("apcs-gnu");
5264 break;
Eric Christopher0e261882014-12-05 01:06:59 +00005265 default:
5266 if (Triple.getOS() == llvm::Triple::NetBSD)
5267 setABI("apcs-gnu");
Brad Smith3d648b32017-02-28 03:20:26 +00005268 else if (Triple.getOS() == llvm::Triple::OpenBSD)
5269 setABI("aapcs-linux");
Eric Christopher0e261882014-12-05 01:06:59 +00005270 else
5271 setABI("aapcs");
5272 break;
5273 }
5274 }
John McCall86353412010-08-21 22:46:04 +00005275
5276 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00005277 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005278
Renato Golin15b86152015-07-03 16:41:13 +00005279 // ARM has atomics up to 8 bytes
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005280 setAtomic();
Rafael Espindola5ab8e2e2015-07-02 15:14:10 +00005281
James Molloya7139222012-03-12 09:14:10 +00005282 // Do force alignment of members that follow zero length bitfields. If
Eric Christopher917e9522014-11-18 22:36:15 +00005283 // the alignment of the zero-length bitfield is greater than the member
5284 // that follows it, `bar', `bar' will be aligned as the type of the
James Molloya7139222012-03-12 09:14:10 +00005285 // zero length bitfield.
5286 UseZeroLengthBitfieldAlignment = true;
Saleem Abdulrasool9b5ba542016-04-10 03:19:47 +00005287
5288 if (Triple.getOS() == llvm::Triple::Linux ||
5289 Triple.getOS() == llvm::Triple::UnknownOS)
5290 this->MCountName =
5291 Opts.EABIVersion == "gnu" ? "\01__gnu_mcount_nc" : "\01mcount";
Eli Friedmanb5366062008-05-20 14:21:01 +00005292 }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00005293
Alp Toker4925ba72014-06-07 23:30:42 +00005294 StringRef getABI() const override { return ABI; }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00005295
Craig Topper3164f332014-03-11 03:39:26 +00005296 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00005297 ABI = Name;
5298
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00005299 // The defaults (above) are for AAPCS, check if we need to change them.
5300 //
5301 // FIXME: We need support for -meabi... we could just mangle it into the
5302 // name.
Tim Northover756447a2015-10-30 16:30:36 +00005303 if (Name == "apcs-gnu" || Name == "aapcs16") {
Tim Northover5627d392015-10-30 16:30:45 +00005304 setABIAPCS(Name == "aapcs16");
Rafael Espindolad6c2b722013-12-18 19:47:32 +00005305 return true;
5306 }
5307 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
5308 setABIAAPCS();
5309 return true;
5310 }
5311 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00005312 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00005313
Renato Golinf5c4dec2015-05-27 13:33:00 +00005314 // FIXME: This should be based on Arch attributes, not CPU names.
Eric Christopher8c47b422015-10-09 18:39:55 +00005315 bool
5316 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
5317 StringRef CPU,
5318 const std::vector<std::string> &FeaturesVec) const override {
5319
Mehdi Aminia0016ec2016-10-07 08:37:29 +00005320 std::vector<StringRef> TargetFeatures;
Bradley Smithb3501962015-11-16 11:16:36 +00005321 unsigned Arch = llvm::ARM::parseArch(getTriple().getArchName());
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005322
5323 // get default FPU features
Bradley Smithb3501962015-11-16 11:16:36 +00005324 unsigned FPUKind = llvm::ARM::getDefaultFPU(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005325 llvm::ARM::getFPUFeatures(FPUKind, TargetFeatures);
5326
5327 // get default Extension features
Bradley Smithb3501962015-11-16 11:16:36 +00005328 unsigned Extensions = llvm::ARM::getDefaultExtensions(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005329 llvm::ARM::getExtensionFeatures(Extensions, TargetFeatures);
5330
Mehdi Aminia0016ec2016-10-07 08:37:29 +00005331 for (auto Feature : TargetFeatures)
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005332 if (Feature[0] == '+')
Mehdi Aminia0016ec2016-10-07 08:37:29 +00005333 Features[Feature.drop_front(1)] = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005334
Eric Christopher007b0a02015-08-28 22:32:01 +00005335 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005336 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005337
Craig Topper3164f332014-03-11 03:39:26 +00005338 bool handleTargetFeatures(std::vector<std::string> &Features,
5339 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005340 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00005341 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00005342 Crypto = 0;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005343 DSP = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005344 Unaligned = 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005345 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005346 HWDiv = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005347
Ranjeet Singhac08e532015-06-24 23:39:25 +00005348 // This does not diagnose illegal cases like having both
5349 // "+vfpv2" and "+vfpv3" or having "+neon" and "+fp-only-sp".
5350 uint32_t HW_FP_remove = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005351 for (const auto &Feature : Features) {
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005352 if (Feature == "+soft-float") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00005353 SoftFloat = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005354 } else if (Feature == "+soft-float-abi") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00005355 SoftFloatABI = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005356 } else if (Feature == "+vfp2") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005357 FPU |= VFP2FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005358 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005359 } else if (Feature == "+vfp3") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005360 FPU |= VFP3FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005361 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005362 } else if (Feature == "+vfp4") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005363 FPU |= VFP4FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005364 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005365 } else if (Feature == "+fp-armv8") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00005366 FPU |= FPARMV8;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005367 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005368 } else if (Feature == "+neon") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005369 FPU |= NeonFPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005370 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005371 } else if (Feature == "+hwdiv") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005372 HWDiv |= HWDivThumb;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005373 } else if (Feature == "+hwdiv-arm") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005374 HWDiv |= HWDivARM;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005375 } else if (Feature == "+crc") {
Bernard Ogden18b57012013-10-29 09:47:51 +00005376 CRC = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005377 } else if (Feature == "+crypto") {
Tim Northover02e38602014-02-03 17:28:04 +00005378 Crypto = 1;
Artyom Skrobov05d85ae2015-10-23 17:19:02 +00005379 } else if (Feature == "+dsp") {
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005380 DSP = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005381 } else if (Feature == "+fp-only-sp") {
Matt Arsenault250024f2016-06-08 01:56:42 +00005382 HW_FP_remove |= HW_FP_DP;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005383 } else if (Feature == "+strict-align") {
5384 Unaligned = 0;
5385 } else if (Feature == "+fp16") {
5386 HW_FP |= HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005387 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00005388 }
Ranjeet Singhac08e532015-06-24 23:39:25 +00005389 HW_FP &= ~HW_FP_remove;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005390
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005391 switch (ArchVersion) {
5392 case 6:
5393 if (ArchProfile == llvm::ARM::PK_M)
5394 LDREX = 0;
5395 else if (ArchKind == llvm::ARM::AK_ARMV6K)
5396 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5397 else
5398 LDREX = LDREX_W;
5399 break;
5400 case 7:
5401 if (ArchProfile == llvm::ARM::PK_M)
5402 LDREX = LDREX_W | LDREX_H | LDREX_B ;
5403 else
5404 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5405 break;
5406 case 8:
5407 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5408 }
5409
Rafael Espindolaeb265472013-08-21 21:59:03 +00005410 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
5411 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
5412 return false;
5413 }
5414
5415 if (FPMath == FP_Neon)
5416 Features.push_back("+neonfp");
5417 else if (FPMath == FP_VFP)
5418 Features.push_back("-neonfp");
5419
Daniel Dunbar893d4752009-12-19 04:15:38 +00005420 // Remove front-end specific options which the backend handles differently.
Eric Christopher9e172d22015-05-12 01:26:21 +00005421 auto Feature =
5422 std::find(Features.begin(), Features.end(), "+soft-float-abi");
5423 if (Feature != Features.end())
5424 Features.erase(Feature);
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005425
Rafael Espindolaeb265472013-08-21 21:59:03 +00005426 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005427 }
5428
Craig Topper3164f332014-03-11 03:39:26 +00005429 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005430 return llvm::StringSwitch<bool>(Feature)
5431 .Case("arm", true)
Ben Langmuir587aeaf2015-08-07 01:59:56 +00005432 .Case("aarch32", true)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005433 .Case("softfloat", SoftFloat)
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005434 .Case("thumb", isThumb())
Amara Emerson8c3de542013-09-16 18:07:35 +00005435 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005436 .Case("hwdiv", HWDiv & HWDivThumb)
5437 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005438 .Default(false);
5439 }
Renato Golin15b86152015-07-03 16:41:13 +00005440
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005441 bool setCPU(const std::string &Name) override {
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005442 if (Name != "generic")
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00005443 setArchInfo(llvm::ARM::parseCPUArch(Name));
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005444
Renato Golin15b86152015-07-03 16:41:13 +00005445 if (ArchKind == llvm::ARM::AK_INVALID)
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005446 return false;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005447 setAtomic();
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005448 CPU = Name;
5449 return true;
5450 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005451
Craig Topper3164f332014-03-11 03:39:26 +00005452 bool setFPMath(StringRef Name) override;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005453
Craig Topper3164f332014-03-11 03:39:26 +00005454 void getTargetDefines(const LangOptions &Opts,
5455 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00005456 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005457 Builder.defineMacro("__arm");
5458 Builder.defineMacro("__arm__");
Weiming Zhaob0613132016-04-18 16:25:46 +00005459 // For bare-metal none-eabi.
5460 if (getTriple().getOS() == llvm::Triple::UnknownOS &&
5461 getTriple().getEnvironment() == llvm::Triple::EABI)
5462 Builder.defineMacro("__ELF__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00005463
Chris Lattnerecd49032009-03-02 22:27:17 +00005464 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005465 Builder.defineMacro("__REGISTER_PREFIX__", "");
Tim Northover5627d392015-10-30 16:30:45 +00005466
5467 // Unfortunately, __ARM_ARCH_7K__ is now more of an ABI descriptor. The CPU
5468 // happens to be Cortex-A7 though, so it should still get __ARM_ARCH_7A__.
Tim Northoverd88ecb32016-01-27 19:32:40 +00005469 if (getTriple().isWatchABI())
Tim Northover5627d392015-10-30 16:30:45 +00005470 Builder.defineMacro("__ARM_ARCH_7K__", "2");
5471
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005472 if (!CPUAttr.empty())
5473 Builder.defineMacro("__ARM_ARCH_" + CPUAttr + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005474
5475 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005476 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
Benjamin Kramerb42d9a52015-12-24 10:07:37 +00005477 Builder.defineMacro("__ARM_ARCH", Twine(ArchVersion));
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005478
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005479 if (ArchVersion >= 8) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005480 // ACLE 6.5.7 Crypto Extension
5481 if (Crypto)
5482 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
5483 // ACLE 6.5.8 CRC32 Extension
5484 if (CRC)
5485 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
5486 // ACLE 6.5.10 Numeric Maximum and Minimum
5487 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
5488 // ACLE 6.5.9 Directed Rounding
5489 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
James Molloy0ffb0932014-09-15 11:25:38 +00005490 }
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005491
5492 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
5493 // is not defined for the M-profile.
Bradley Smithf4affc12016-03-03 13:52:22 +00005494 // NOTE that the default profile is assumed to be 'A'
5495 if (CPUProfile.empty() || ArchProfile != llvm::ARM::PK_M)
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005496 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
5497
Bradley Smithf4affc12016-03-03 13:52:22 +00005498 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supports the original
5499 // Thumb ISA (including v6-M and v8-M Baseline). It is set to 2 if the
5500 // core supports the Thumb-2 ISA as found in the v6T2 architecture and all
5501 // v7 and v8 architectures excluding v8-M Baseline.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005502 if (supportsThumb2())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005503 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005504 else if (supportsThumb())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005505 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
5506
5507 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
5508 // instruction set such as ARM or Thumb.
5509 Builder.defineMacro("__ARM_32BIT_STATE", "1");
5510
5511 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
5512
5513 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005514 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005515 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00005516
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005517 // ACLE 6.4.3 Unaligned access supported in hardware
Eric Christopherb093d692015-10-09 18:39:59 +00005518 if (Unaligned)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005519 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Eric Christopherb093d692015-10-09 18:39:59 +00005520
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005521 // ACLE 6.4.4 LDREX/STREX
5522 if (LDREX)
5523 Builder.defineMacro("__ARM_FEATURE_LDREX", "0x" + llvm::utohexstr(LDREX));
5524
5525 // ACLE 6.4.5 CLZ
Eric Christopherb093d692015-10-09 18:39:59 +00005526 if (ArchVersion == 5 ||
5527 (ArchVersion == 6 && CPUProfile != "M") ||
5528 ArchVersion > 6)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005529 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
5530
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005531 // ACLE 6.5.1 Hardware Floating Point
5532 if (HW_FP)
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +00005533 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005534
Yi Konga44c4d72014-06-27 21:25:42 +00005535 // ACLE predefines.
5536 Builder.defineMacro("__ARM_ACLE", "200");
5537
Oliver Stannarddc2854c2015-09-03 12:40:58 +00005538 // FP16 support (we currently only support IEEE format).
5539 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
5540 Builder.defineMacro("__ARM_FP16_ARGS", "1");
5541
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005542 // ACLE 6.5.3 Fused multiply-accumulate (FMA)
Silviu Baranga632fdc52016-04-28 11:29:08 +00005543 if (ArchVersion >= 7 && (FPU & VFP4FPU))
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005544 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
5545
Mike Stump9d54bd72009-04-08 02:07:04 +00005546 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005547
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005548 // FIXME: It's more complicated than this and we don't really support
5549 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005550 // Windows on ARM does not "support" interworking
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005551 if (5 <= ArchVersion && ArchVersion <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005552 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005553
David Tweed8f676532012-10-25 13:33:01 +00005554 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00005555 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005556 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
Tim Northover862eaf82016-05-13 21:26:45 +00005557 if (!getTriple().isOSBinFormatMachO() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00005558 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005559 Builder.defineMacro("__ARM_PCS", "1");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005560 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005561
Tim Northover28fc0e12016-04-28 13:59:55 +00005562 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp" ||
5563 ABI == "aapcs16")
5564 Builder.defineMacro("__ARM_PCS_VFP", "1");
5565
Daniel Dunbar893d4752009-12-19 04:15:38 +00005566 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005567 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005568
Zijiao Ma56a83722016-08-17 02:13:33 +00005569 if (ArchKind == llvm::ARM::AK_XSCALE)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005570 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005571
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005572 if (isThumb()) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005573 Builder.defineMacro("__THUMBEL__");
5574 Builder.defineMacro("__thumb__");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005575 if (supportsThumb2())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005576 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005577 }
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005578
5579 // ACLE 6.4.9 32-bit SIMD instructions
5580 if (ArchVersion >= 6 && (CPUProfile != "M" || CPUAttr == "7EM"))
5581 Builder.defineMacro("__ARM_FEATURE_SIMD32", "1");
5582
5583 // ACLE 6.4.10 Hardware Integer Divide
Eric Christopherb093d692015-10-09 18:39:59 +00005584 if (((HWDiv & HWDivThumb) && isThumb()) ||
5585 ((HWDiv & HWDivARM) && !isThumb())) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005586 Builder.defineMacro("__ARM_FEATURE_IDIV", "1");
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005587 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005588 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005589
5590 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005591 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005592
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005593 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005594 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005595 if (FPU & VFP2FPU)
5596 Builder.defineMacro("__ARM_VFPV2__");
5597 if (FPU & VFP3FPU)
5598 Builder.defineMacro("__ARM_VFPV3__");
5599 if (FPU & VFP4FPU)
5600 Builder.defineMacro("__ARM_VFPV4__");
Tim Northoverc67803f2016-12-21 20:49:43 +00005601 if (FPU & FPARMV8)
5602 Builder.defineMacro("__ARM_FPV5__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005603 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00005604
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005605 // This only gets set when Neon instructions are actually available, unlike
5606 // the VFP define, hence the soft float and arch check. This is subtly
5607 // different from gcc, we follow the intent which was that it should be set
5608 // when Neon instructions are actually available.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005609 if ((FPU & NeonFPU) && !SoftFloat && ArchVersion >= 7) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005610 Builder.defineMacro("__ARM_NEON", "1");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005611 Builder.defineMacro("__ARM_NEON__");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005612 // current AArch32 NEON implementations do not support double-precision
5613 // floating-point even when it is present in VFP.
Eric Christopherb093d692015-10-09 18:39:59 +00005614 Builder.defineMacro("__ARM_NEON_FP",
5615 "0x" + llvm::utohexstr(HW_FP & ~HW_FP_DP));
Tim Northover5bb34ca2013-11-21 12:36:34 +00005616 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00005617
Bradley Smith0f28f0c2014-01-20 10:52:00 +00005618 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
5619 Opts.ShortWChar ? "2" : "4");
5620
5621 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5622 Opts.ShortEnums ? "1" : "4");
5623
Bradley Smithf4affc12016-03-03 13:52:22 +00005624 if (ArchVersion >= 6 && CPUAttr != "6M" && CPUAttr != "8M_BASE") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00005625 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5626 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5627 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5628 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
5629 }
Sergey Dmitrouk745f5302014-11-25 08:57:36 +00005630
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005631 // ACLE 6.4.7 DSP instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005632 if (DSP) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005633 Builder.defineMacro("__ARM_FEATURE_DSP", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005634 }
5635
5636 // ACLE 6.4.8 Saturation instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005637 bool SAT = false;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005638 if ((ArchVersion == 6 && CPUProfile != "M") || ArchVersion > 6 ) {
5639 Builder.defineMacro("__ARM_FEATURE_SAT", "1");
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005640 SAT = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005641 }
5642
5643 // ACLE 6.4.6 Q (saturation) flag
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005644 if (DSP || SAT)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005645 Builder.defineMacro("__ARM_FEATURE_QBIT", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005646
5647 if (Opts.UnsafeFPMath)
5648 Builder.defineMacro("__ARM_FP_FAST", "1");
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005649
5650 if (ArchKind == llvm::ARM::AK_ARMV8_1A)
5651 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
Chris Lattner17df24e2008-04-21 18:56:49 +00005652 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005653
Craig Topper6c03a542015-10-19 04:51:35 +00005654 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5655 return llvm::makeArrayRef(BuiltinInfo,
5656 clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner17df24e2008-04-21 18:56:49 +00005657 }
Craig Topper3164f332014-03-11 03:39:26 +00005658 bool isCLZForZeroUndef() const override { return false; }
5659 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northover5627d392015-10-30 16:30:45 +00005660 return IsAAPCS
5661 ? AAPCSABIBuiltinVaList
Tim Northoverd88ecb32016-01-27 19:32:40 +00005662 : (getTriple().isWatchABI() ? TargetInfo::CharPtrBuiltinVaList
5663 : TargetInfo::VoidPtrBuiltinVaList);
Chris Lattner17df24e2008-04-21 18:56:49 +00005664 }
Craig Topperf054e3a2015-10-19 03:52:27 +00005665 ArrayRef<const char *> getGCCRegNames() const override;
5666 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00005667 bool validateAsmConstraint(const char *&Name,
5668 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00005669 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00005670 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00005671 case 'l': // r0-r7
5672 case 'h': // r8-r15
JF Bastien750caef2016-02-19 06:54:45 +00005673 case 't': // VFP Floating point register single precision
5674 case 'w': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00005675 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00005676 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005677 case 'I':
5678 case 'J':
5679 case 'K':
5680 case 'L':
5681 case 'M':
5682 // FIXME
5683 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00005684 case 'Q': // A memory address that is a single base register.
5685 Info.setAllowsMemory();
5686 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005687 case 'U': // a memory reference...
5688 switch (Name[1]) {
5689 case 'q': // ...ARMV4 ldrsb
5690 case 'v': // ...VFP load/store (reg+constant offset)
5691 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00005692 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00005693 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00005694 case 'n': // valid address for Neon doubleword vector load/store
5695 case 'm': // valid address for Neon element and structure load/store
5696 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00005697 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005698 Info.setAllowsMemory();
5699 Name++;
5700 return true;
5701 }
Nate Begeman2908fa02008-04-22 05:03:19 +00005702 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005703 return false;
5704 }
Craig Topper3164f332014-03-11 03:39:26 +00005705 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005706 std::string R;
5707 switch (*Constraint) {
5708 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00005709 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005710 Constraint++;
5711 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00005712 case 'p': // 'p' should be translated to 'r' by default.
5713 R = std::string("r");
5714 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005715 default:
5716 return std::string(1, *Constraint);
5717 }
5718 return R;
5719 }
Akira Hatanaka987f1862014-08-22 06:05:21 +00005720 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005721 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005722 std::string &SuggestedModifier) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00005723 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00005724 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00005725
Bill Wendling9d1ee112012-10-25 23:28:48 +00005726 // Strip off constraint modifiers.
5727 while (Constraint[0] == '=' ||
5728 Constraint[0] == '+' ||
5729 Constraint[0] == '&')
5730 Constraint = Constraint.substr(1);
5731
5732 switch (Constraint[0]) {
5733 default: break;
5734 case 'r': {
5735 switch (Modifier) {
5736 default:
Tim Northover8f24b172013-12-08 15:24:55 +00005737 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00005738 case 'q':
5739 // A register of size 32 cannot fit a vector type.
5740 return false;
5741 }
5742 }
5743 }
5744
5745 return true;
5746 }
Craig Topper3164f332014-03-11 03:39:26 +00005747 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00005748 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00005749 return "";
5750 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005751
Craig Topper3164f332014-03-11 03:39:26 +00005752 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00005753 switch (CC) {
5754 case CC_AAPCS:
5755 case CC_AAPCS_VFP:
5756 case CC_Swift:
5757 return CCCR_OK;
5758 default:
5759 return CCCR_Warning;
5760 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005761 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00005762
Craig Topper3164f332014-03-11 03:39:26 +00005763 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00005764 if (RegNo == 0) return 0;
5765 if (RegNo == 1) return 1;
5766 return -1;
5767 }
Matthias Braund1e2fad2015-07-17 00:15:22 +00005768
5769 bool hasSjLjLowering() const override {
5770 return true;
5771 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005772};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005773
Rafael Espindolaeb265472013-08-21 21:59:03 +00005774bool ARMTargetInfo::setFPMath(StringRef Name) {
5775 if (Name == "neon") {
5776 FPMath = FP_Neon;
5777 return true;
5778 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
5779 Name == "vfp4") {
5780 FPMath = FP_VFP;
5781 return true;
5782 }
5783 return false;
5784}
5785
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005786const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005787 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005788 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005789 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
5790
5791 // Float registers
5792 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
5793 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
5794 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005795 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005796
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005797 // Double registers
5798 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
5799 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005800 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
5801 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005802
5803 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005804 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
5805 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005806};
5807
Craig Topperf054e3a2015-10-19 03:52:27 +00005808ArrayRef<const char *> ARMTargetInfo::getGCCRegNames() const {
5809 return llvm::makeArrayRef(GCCRegNames);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005810}
5811
5812const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005813 { { "a1" }, "r0" },
5814 { { "a2" }, "r1" },
5815 { { "a3" }, "r2" },
5816 { { "a4" }, "r3" },
5817 { { "v1" }, "r4" },
5818 { { "v2" }, "r5" },
5819 { { "v3" }, "r6" },
5820 { { "v4" }, "r7" },
5821 { { "v5" }, "r8" },
5822 { { "v6", "rfp" }, "r9" },
5823 { { "sl" }, "r10" },
5824 { { "fp" }, "r11" },
5825 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00005826 { { "r13" }, "sp" },
5827 { { "r14" }, "lr" },
5828 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005829 // The S, D and Q registers overlap, but aren't really aliases; we
5830 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005831};
5832
Craig Topperf054e3a2015-10-19 03:52:27 +00005833ArrayRef<TargetInfo::GCCRegAlias> ARMTargetInfo::getGCCRegAliases() const {
5834 return llvm::makeArrayRef(GCCRegAliases);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005835}
Chris Lattner5cc15e02010-03-03 19:03:45 +00005836
5837const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00005838#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005839 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005840#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5841 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00005842#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00005843
Craig Topper07d3b622015-08-07 05:14:44 +00005844#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005845 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005846#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005847 { #ID, TYPE, ATTRS, nullptr, LANG, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005848#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5849 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Albert Gutowski2a0621e2016-10-12 22:01:05 +00005850#define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANGS, FEATURE) \
5851 { #ID, TYPE, ATTRS, HEADER, LANGS, FEATURE },
Chris Lattner5cc15e02010-03-03 19:03:45 +00005852#include "clang/Basic/BuiltinsARM.def"
5853};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005854
5855class ARMleTargetInfo : public ARMTargetInfo {
5856public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005857 ARMleTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Matt Arsenaultf333de32016-09-07 07:08:02 +00005858 : ARMTargetInfo(Triple, Opts) {}
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005859 void getTargetDefines(const LangOptions &Opts,
5860 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005861 Builder.defineMacro("__ARMEL__");
5862 ARMTargetInfo::getTargetDefines(Opts, Builder);
5863 }
5864};
5865
5866class ARMbeTargetInfo : public ARMTargetInfo {
5867public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005868 ARMbeTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Matt Arsenaultf333de32016-09-07 07:08:02 +00005869 : ARMTargetInfo(Triple, Opts) {}
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005870 void getTargetDefines(const LangOptions &Opts,
5871 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005872 Builder.defineMacro("__ARMEB__");
5873 Builder.defineMacro("__ARM_BIG_ENDIAN");
5874 ARMTargetInfo::getTargetDefines(Opts, Builder);
5875 }
5876};
Chris Lattner17df24e2008-04-21 18:56:49 +00005877
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005878class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
5879 const llvm::Triple Triple;
5880public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005881 WindowsARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5882 : WindowsTargetInfo<ARMleTargetInfo>(Triple, Opts), Triple(Triple) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005883 WCharType = UnsignedShort;
5884 SizeType = UnsignedInt;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005885 }
5886 void getVisualStudioDefines(const LangOptions &Opts,
5887 MacroBuilder &Builder) const {
5888 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
5889
5890 // FIXME: this is invalid for WindowsCE
5891 Builder.defineMacro("_M_ARM_NT", "1");
5892 Builder.defineMacro("_M_ARMT", "_M_ARM");
5893 Builder.defineMacro("_M_THUMB", "_M_ARM");
5894
5895 assert((Triple.getArch() == llvm::Triple::arm ||
5896 Triple.getArch() == llvm::Triple::thumb) &&
5897 "invalid architecture for Windows ARM target info");
5898 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
5899 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
5900
5901 // TODO map the complete set of values
5902 // 31: VFPv3 40: VFPv4
5903 Builder.defineMacro("_M_ARM_FP", "31");
5904 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00005905 BuiltinVaListKind getBuiltinVaListKind() const override {
5906 return TargetInfo::CharPtrBuiltinVaList;
5907 }
Martell Malone7ccda3c2015-08-14 18:00:09 +00005908 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5909 switch (CC) {
5910 case CC_X86StdCall:
5911 case CC_X86ThisCall:
5912 case CC_X86FastCall:
5913 case CC_X86VectorCall:
5914 return CCCR_Ignore;
5915 case CC_C:
5916 return CCCR_OK;
5917 default:
5918 return CCCR_Warning;
5919 }
5920 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005921};
5922
5923// Windows ARM + Itanium C++ ABI Target
5924class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
5925public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005926 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple,
5927 const TargetOptions &Opts)
5928 : WindowsARMTargetInfo(Triple, Opts) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005929 TheCXXABI.set(TargetCXXABI::GenericARM);
5930 }
5931
5932 void getTargetDefines(const LangOptions &Opts,
5933 MacroBuilder &Builder) const override {
5934 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5935
5936 if (Opts.MSVCCompat)
5937 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5938 }
5939};
5940
5941// Windows ARM, MS (C++) ABI
5942class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
5943public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005944 MicrosoftARMleTargetInfo(const llvm::Triple &Triple,
5945 const TargetOptions &Opts)
5946 : WindowsARMTargetInfo(Triple, Opts) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005947 TheCXXABI.set(TargetCXXABI::Microsoft);
5948 }
5949
5950 void getTargetDefines(const LangOptions &Opts,
5951 MacroBuilder &Builder) const override {
5952 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5953 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5954 }
5955};
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005956
Yaron Keren321249c2015-07-15 13:32:23 +00005957// ARM MinGW target
5958class MinGWARMTargetInfo : public WindowsARMTargetInfo {
5959public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005960 MinGWARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5961 : WindowsARMTargetInfo(Triple, Opts) {
Yaron Keren321249c2015-07-15 13:32:23 +00005962 TheCXXABI.set(TargetCXXABI::GenericARM);
5963 }
5964
5965 void getTargetDefines(const LangOptions &Opts,
5966 MacroBuilder &Builder) const override {
5967 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5968 DefineStd(Builder, "WIN32", Opts);
5969 DefineStd(Builder, "WINNT", Opts);
5970 Builder.defineMacro("_ARM_");
5971 addMinGWDefines(Opts, Builder);
5972 }
5973};
5974
5975// ARM Cygwin target
5976class CygwinARMTargetInfo : public ARMleTargetInfo {
5977public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005978 CygwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5979 : ARMleTargetInfo(Triple, Opts) {
Yaron Keren321249c2015-07-15 13:32:23 +00005980 TLSSupported = false;
5981 WCharType = UnsignedShort;
5982 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00005983 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Yaron Keren321249c2015-07-15 13:32:23 +00005984 }
5985 void getTargetDefines(const LangOptions &Opts,
5986 MacroBuilder &Builder) const override {
5987 ARMleTargetInfo::getTargetDefines(Opts, Builder);
5988 Builder.defineMacro("_ARM_");
5989 Builder.defineMacro("__CYGWIN__");
5990 Builder.defineMacro("__CYGWIN32__");
Saleem Abdulrasool56027092017-02-07 19:00:06 +00005991 DefineStd(Builder, "unix", Opts);
Yaron Keren321249c2015-07-15 13:32:23 +00005992 if (Opts.CPlusPlus)
5993 Builder.defineMacro("_GNU_SOURCE");
5994 }
5995};
5996
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005997class DarwinARMTargetInfo : public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00005998protected:
Craig Topper3164f332014-03-11 03:39:26 +00005999 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
6000 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00006001 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00006002 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00006003
Torok Edwinb2b37c62009-06-30 17:10:35 +00006004public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006005 DarwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6006 : DarwinTargetInfo<ARMleTargetInfo>(Triple, Opts) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00006007 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00006008 // iOS always has 64-bit atomic instructions.
Eric Christopher917e9522014-11-18 22:36:15 +00006009 // FIXME: This should be based off of the target features in
6010 // ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00006011 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00006012
Tim Northoverd88ecb32016-01-27 19:32:40 +00006013 if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00006014 // Darwin on iOS uses a variant of the ARM C++ ABI.
6015 TheCXXABI.set(TargetCXXABI::WatchOS);
6016
6017 // The 32-bit ABI is silent on what ptrdiff_t should be, but given that
6018 // size_t is long, it's a bit weird for it to be int.
6019 PtrDiffType = SignedLong;
6020
6021 // BOOL should be a real boolean on the new ABI
6022 UseSignedCharForObjCBool = false;
6023 } else
6024 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00006025 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00006026};
Eli Friedmanf05b7722008-08-20 07:44:10 +00006027
Tim Northover573cbee2014-05-24 12:52:07 +00006028class AArch64TargetInfo : public TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00006029 virtual void setDataLayout() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00006030 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6031 static const char *const GCCRegNames[];
6032
James Molloy75f5f9e2014-04-16 15:33:48 +00006033 enum FPUModeEnum {
6034 FPUMode,
6035 NeonMode
6036 };
6037
6038 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00006039 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00006040 unsigned Crypto;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006041 unsigned Unaligned;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00006042 unsigned V8_1A;
James Molloy75f5f9e2014-04-16 15:33:48 +00006043
Tim Northovera2ee4332014-03-29 15:09:45 +00006044 static const Builtin::Info BuiltinInfo[];
6045
6046 std::string ABI;
6047
6048public:
Saleem Abdulrasool9b5ba542016-04-10 03:19:47 +00006049 AArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Tim Northovera2ee4332014-03-29 15:09:45 +00006050 : TargetInfo(Triple), ABI("aapcs") {
Brad Smith9aa2bf22017-02-21 23:13:09 +00006051 if (getTriple().getOS() == llvm::Triple::NetBSD ||
6052 getTriple().getOS() == llvm::Triple::OpenBSD) {
Tim Northover25e8a672014-05-24 12:51:25 +00006053 WCharType = SignedInt;
6054
6055 // NetBSD apparently prefers consistency across ARM targets to consistency
6056 // across 64-bit targets.
6057 Int64Type = SignedLongLong;
6058 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00006059 } else {
6060 WCharType = UnsignedInt;
6061 Int64Type = SignedLong;
6062 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00006063 }
6064
Tim Northovera2ee4332014-03-29 15:09:45 +00006065 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00006066 MaxVectorAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00006067 MaxAtomicInlineWidth = 128;
6068 MaxAtomicPromoteWidth = 128;
6069
Tim Northovera6a19f12015-02-06 01:25:07 +00006070 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 128;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00006071 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Tim Northovera2ee4332014-03-29 15:09:45 +00006072
Tim Northovera2ee4332014-03-29 15:09:45 +00006073 // {} in inline assembly are neon specifiers, not assembly variant
6074 // specifiers.
6075 NoAsmVariants = true;
6076
Tim Northover7ad87af2015-01-16 18:44:04 +00006077 // AAPCS gives rules for bitfields. 7.1.7 says: "The container type
6078 // contributes to the alignment of the containing aggregate in the same way
6079 // a plain (non bit-field) member of that type would, without exception for
6080 // zero-sized or anonymous bit-fields."
Tim Northover5627d392015-10-30 16:30:45 +00006081 assert(UseBitFieldTypeAlignment && "bitfields affect type alignment");
Tim Northover7ad87af2015-01-16 18:44:04 +00006082 UseZeroLengthBitfieldAlignment = true;
6083
Tim Northover573cbee2014-05-24 12:52:07 +00006084 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00006085 TheCXXABI.set(TargetCXXABI::GenericAArch64);
Saleem Abdulrasoolc066d9c2016-04-12 03:05:03 +00006086
Eric Christopherfb834a82017-02-28 17:22:05 +00006087 if (Triple.getOS() == llvm::Triple::Linux)
6088 this->MCountName = "\01_mcount";
6089 else if (Triple.getOS() == llvm::Triple::UnknownOS)
Saleem Abdulrasoolc066d9c2016-04-12 03:05:03 +00006090 this->MCountName = Opts.EABIVersion == "gnu" ? "\01_mcount" : "mcount";
Tim Northovera2ee4332014-03-29 15:09:45 +00006091 }
6092
Alp Toker4925ba72014-06-07 23:30:42 +00006093 StringRef getABI() const override { return ABI; }
David Blaikie1cbb9712014-11-14 19:09:44 +00006094 bool setABI(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006095 if (Name != "aapcs" && Name != "darwinpcs")
6096 return false;
6097
6098 ABI = Name;
6099 return true;
6100 }
6101
David Blaikie1cbb9712014-11-14 19:09:44 +00006102 bool setCPU(const std::string &Name) override {
Zijiao Ma33e95212016-07-28 06:24:48 +00006103 return Name == "generic" ||
6104 llvm::AArch64::parseCPUArch(Name) !=
6105 static_cast<unsigned>(llvm::AArch64::ArchKind::AK_INVALID);
Tim Northovera2ee4332014-03-29 15:09:45 +00006106 }
6107
Alexander Kornienko34eb2072015-04-11 02:00:23 +00006108 void getTargetDefines(const LangOptions &Opts,
6109 MacroBuilder &Builder) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006110 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00006111 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00006112
6113 // Target properties.
6114 Builder.defineMacro("_LP64");
6115 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00006116
6117 // ACLE predefines. Many can only have one possible value on v8 AArch64.
6118 Builder.defineMacro("__ARM_ACLE", "200");
6119 Builder.defineMacro("__ARM_ARCH", "8");
6120 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
6121
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006122 Builder.defineMacro("__ARM_64BIT_STATE", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00006123 Builder.defineMacro("__ARM_PCS_AAPCS64", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006124 Builder.defineMacro("__ARM_ARCH_ISA_A64", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00006125
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006126 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
6127 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
6128 Builder.defineMacro("__ARM_FEATURE_LDREX", "0xF");
6129 Builder.defineMacro("__ARM_FEATURE_IDIV", "1"); // As specified in ACLE
James Molloy0ffb0932014-09-15 11:25:38 +00006130 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006131 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
6132 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00006133
6134 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
6135
6136 // 0xe implies support for half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006137 Builder.defineMacro("__ARM_FP", "0xE");
Tim Northovera2ee4332014-03-29 15:09:45 +00006138
6139 // PCS specifies this for SysV variants, which is all we support. Other ABIs
6140 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006141 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
6142 Builder.defineMacro("__ARM_FP16_ARGS", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00006143
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00006144 if (Opts.UnsafeFPMath)
6145 Builder.defineMacro("__ARM_FP_FAST", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00006146
6147 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
6148
6149 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
6150 Opts.ShortEnums ? "1" : "4");
6151
James Molloy75f5f9e2014-04-16 15:33:48 +00006152 if (FPU == NeonMode) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006153 Builder.defineMacro("__ARM_NEON", "1");
James Molloy75f5f9e2014-04-16 15:33:48 +00006154 // 64-bit NEON supports half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006155 Builder.defineMacro("__ARM_NEON_FP", "0xE");
James Molloy75f5f9e2014-04-16 15:33:48 +00006156 }
Tim Northovera2ee4332014-03-29 15:09:45 +00006157
Bradley Smith418c5932014-05-02 15:17:51 +00006158 if (CRC)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006159 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
Bradley Smith418c5932014-05-02 15:17:51 +00006160
James Molloy75f5f9e2014-04-16 15:33:48 +00006161 if (Crypto)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006162 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
6163
6164 if (Unaligned)
6165 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Reid Klecknerd167d422015-05-06 15:31:46 +00006166
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00006167 if (V8_1A)
6168 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
6169
Reid Klecknerd167d422015-05-06 15:31:46 +00006170 // All of the __sync_(bool|val)_compare_and_swap_(1|2|4|8) builtins work.
6171 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
6172 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
6173 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
6174 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Tim Northovera2ee4332014-03-29 15:09:45 +00006175 }
6176
Craig Topper6c03a542015-10-19 04:51:35 +00006177 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6178 return llvm::makeArrayRef(BuiltinInfo,
6179 clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin);
Tim Northovera2ee4332014-03-29 15:09:45 +00006180 }
6181
David Blaikie1cbb9712014-11-14 19:09:44 +00006182 bool hasFeature(StringRef Feature) const override {
James Molloy75f5f9e2014-04-16 15:33:48 +00006183 return Feature == "aarch64" ||
6184 Feature == "arm64" ||
Ben Langmuir587aeaf2015-08-07 01:59:56 +00006185 Feature == "arm" ||
James Molloy75f5f9e2014-04-16 15:33:48 +00006186 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00006187 }
6188
James Molloy5e73df52014-04-16 15:06:20 +00006189 bool handleTargetFeatures(std::vector<std::string> &Features,
6190 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00006191 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00006192 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00006193 Crypto = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006194 Unaligned = 1;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00006195 V8_1A = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006196
Eric Christopher610fe112015-08-26 08:21:55 +00006197 for (const auto &Feature : Features) {
6198 if (Feature == "+neon")
James Molloy75f5f9e2014-04-16 15:33:48 +00006199 FPU = NeonMode;
Eric Christopher610fe112015-08-26 08:21:55 +00006200 if (Feature == "+crc")
Bradley Smith418c5932014-05-02 15:17:51 +00006201 CRC = 1;
Eric Christopher610fe112015-08-26 08:21:55 +00006202 if (Feature == "+crypto")
James Molloy75f5f9e2014-04-16 15:33:48 +00006203 Crypto = 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006204 if (Feature == "+strict-align")
6205 Unaligned = 0;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00006206 if (Feature == "+v8.1a")
6207 V8_1A = 1;
James Molloy75f5f9e2014-04-16 15:33:48 +00006208 }
6209
James Y Knightb214cbc2016-03-04 19:00:41 +00006210 setDataLayout();
James Molloy5e73df52014-04-16 15:06:20 +00006211
6212 return true;
6213 }
6214
John McCall477f2bb2016-03-03 06:39:32 +00006215 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
6216 switch (CC) {
6217 case CC_C:
6218 case CC_Swift:
Roman Levenstein35aa5ce2016-03-16 18:00:46 +00006219 case CC_PreserveMost:
6220 case CC_PreserveAll:
John McCall477f2bb2016-03-03 06:39:32 +00006221 return CCCR_OK;
6222 default:
6223 return CCCR_Warning;
6224 }
6225 }
6226
David Blaikie1cbb9712014-11-14 19:09:44 +00006227 bool isCLZForZeroUndef() const override { return false; }
Tim Northovera2ee4332014-03-29 15:09:45 +00006228
David Blaikie1cbb9712014-11-14 19:09:44 +00006229 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006230 return TargetInfo::AArch64ABIBuiltinVaList;
6231 }
6232
Craig Topperf054e3a2015-10-19 03:52:27 +00006233 ArrayRef<const char *> getGCCRegNames() const override;
6234 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00006235
Alexander Kornienko34eb2072015-04-11 02:00:23 +00006236 bool validateAsmConstraint(const char *&Name,
6237 TargetInfo::ConstraintInfo &Info) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006238 switch (*Name) {
6239 default:
6240 return false;
6241 case 'w': // Floating point and SIMD registers (V0-V31)
6242 Info.setAllowsRegister();
6243 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00006244 case 'I': // Constant that can be used with an ADD instruction
6245 case 'J': // Constant that can be used with a SUB instruction
6246 case 'K': // Constant that can be used with a 32-bit logical instruction
6247 case 'L': // Constant that can be used with a 64-bit logical instruction
6248 case 'M': // Constant that can be used as a 32-bit MOV immediate
6249 case 'N': // Constant that can be used as a 64-bit MOV immediate
6250 case 'Y': // Floating point constant zero
6251 case 'Z': // Integer constant zero
6252 return true;
6253 case 'Q': // A memory reference with base register and no offset
6254 Info.setAllowsMemory();
6255 return true;
6256 case 'S': // A symbolic address
6257 Info.setAllowsRegister();
6258 return true;
6259 case 'U':
Eric Christopher917e9522014-11-18 22:36:15 +00006260 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
6261 // Utf: A memory address suitable for ldp/stp in TF mode.
6262 // Usa: An absolute symbolic address.
6263 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
6264 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
Tim Northovera2ee4332014-03-29 15:09:45 +00006265 case 'z': // Zero register, wzr or xzr
6266 Info.setAllowsRegister();
6267 return true;
6268 case 'x': // Floating point and SIMD registers (V0-V15)
6269 Info.setAllowsRegister();
6270 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00006271 }
6272 return false;
6273 }
6274
Akira Hatanaka987f1862014-08-22 06:05:21 +00006275 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00006276 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00006277 std::string &SuggestedModifier) const override {
James Molloy8a157bf2014-07-25 10:19:47 +00006278 // Strip off constraint modifiers.
6279 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
6280 Constraint = Constraint.substr(1);
6281
6282 switch (Constraint[0]) {
6283 default:
6284 return true;
6285 case 'z':
6286 case 'r': {
6287 switch (Modifier) {
6288 case 'x':
6289 case 'w':
6290 // For now assume that the person knows what they're
6291 // doing with the modifier.
6292 return true;
6293 default:
6294 // By default an 'r' constraint will be in the 'x'
6295 // registers.
Akira Hatanaka987f1862014-08-22 06:05:21 +00006296 if (Size == 64)
6297 return true;
6298
6299 SuggestedModifier = "w";
6300 return false;
James Molloy8a157bf2014-07-25 10:19:47 +00006301 }
6302 }
6303 }
6304 }
6305
David Blaikie1cbb9712014-11-14 19:09:44 +00006306 const char *getClobbers() const override { return ""; }
Tim Northovera2ee4332014-03-29 15:09:45 +00006307
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00006308 int getEHDataRegisterNumber(unsigned RegNo) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006309 if (RegNo == 0)
6310 return 0;
6311 if (RegNo == 1)
6312 return 1;
6313 return -1;
6314 }
6315};
6316
Tim Northover573cbee2014-05-24 12:52:07 +00006317const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00006318 // 32-bit Integer registers
6319 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
6320 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
6321 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
6322
6323 // 64-bit Integer registers
6324 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
6325 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
6326 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
6327
6328 // 32-bit floating point regsisters
6329 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
6330 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
6331 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
6332
6333 // 64-bit floating point regsisters
6334 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
6335 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
6336 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
6337
6338 // Vector registers
6339 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
6340 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
6341 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
6342};
6343
Craig Topperf054e3a2015-10-19 03:52:27 +00006344ArrayRef<const char *> AArch64TargetInfo::getGCCRegNames() const {
6345 return llvm::makeArrayRef(GCCRegNames);
Tim Northovera2ee4332014-03-29 15:09:45 +00006346}
6347
Tim Northover573cbee2014-05-24 12:52:07 +00006348const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00006349 { { "w31" }, "wsp" },
6350 { { "x29" }, "fp" },
6351 { { "x30" }, "lr" },
6352 { { "x31" }, "sp" },
6353 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
6354 // don't want to substitute one of these for a different-sized one.
6355};
6356
Craig Topperf054e3a2015-10-19 03:52:27 +00006357ArrayRef<TargetInfo::GCCRegAlias> AArch64TargetInfo::getGCCRegAliases() const {
6358 return llvm::makeArrayRef(GCCRegAliases);
Tim Northovera2ee4332014-03-29 15:09:45 +00006359}
6360
Tim Northover573cbee2014-05-24 12:52:07 +00006361const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00006362#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006363 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00006364#include "clang/Basic/BuiltinsNEON.def"
6365
6366#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006367 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northover573cbee2014-05-24 12:52:07 +00006368#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00006369};
James Molloy5e73df52014-04-16 15:06:20 +00006370
Tim Northover573cbee2014-05-24 12:52:07 +00006371class AArch64leTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00006372 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00006373 if (getTriple().isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00006374 resetDataLayout("e-m:o-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006375 else
Chad Rosier4c077aa2016-07-07 20:02:25 +00006376 resetDataLayout("e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006377 }
6378
6379public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006380 AArch64leTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6381 : AArch64TargetInfo(Triple, Opts) {
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006382 }
James Molloy5e73df52014-04-16 15:06:20 +00006383 void getTargetDefines(const LangOptions &Opts,
6384 MacroBuilder &Builder) const override {
6385 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00006386 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00006387 }
6388};
6389
Tim Northover573cbee2014-05-24 12:52:07 +00006390class AArch64beTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00006391 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00006392 assert(!getTriple().isOSBinFormatMachO());
Chad Rosier4c077aa2016-07-07 20:02:25 +00006393 resetDataLayout("E-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006394 }
6395
6396public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006397 AArch64beTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6398 : AArch64TargetInfo(Triple, Opts) {}
James Molloy5e73df52014-04-16 15:06:20 +00006399 void getTargetDefines(const LangOptions &Opts,
6400 MacroBuilder &Builder) const override {
6401 Builder.defineMacro("__AARCH64EB__");
6402 Builder.defineMacro("__AARCH_BIG_ENDIAN");
6403 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00006404 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00006405 }
6406};
Tim Northovera2ee4332014-03-29 15:09:45 +00006407
Tim Northover573cbee2014-05-24 12:52:07 +00006408class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00006409protected:
6410 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
6411 MacroBuilder &Builder) const override {
6412 Builder.defineMacro("__AARCH64_SIMD__");
6413 Builder.defineMacro("__ARM64_ARCH_8__");
6414 Builder.defineMacro("__ARM_NEON__");
6415 Builder.defineMacro("__LITTLE_ENDIAN__");
6416 Builder.defineMacro("__REGISTER_PREFIX__", "");
6417 Builder.defineMacro("__arm64", "1");
6418 Builder.defineMacro("__arm64__", "1");
6419
6420 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
6421 }
6422
Tim Northovera2ee4332014-03-29 15:09:45 +00006423public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006424 DarwinAArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6425 : DarwinTargetInfo<AArch64leTargetInfo>(Triple, Opts) {
Tim Northovera2ee4332014-03-29 15:09:45 +00006426 Int64Type = SignedLongLong;
6427 WCharType = SignedInt;
6428 UseSignedCharForObjCBool = false;
6429
Tim Northovera6a19f12015-02-06 01:25:07 +00006430 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00006431 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Tim Northovera2ee4332014-03-29 15:09:45 +00006432
6433 TheCXXABI.set(TargetCXXABI::iOS64);
6434 }
6435
David Blaikie1cbb9712014-11-14 19:09:44 +00006436 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006437 return TargetInfo::CharPtrBuiltinVaList;
6438 }
6439};
Tim Northovera2ee4332014-03-29 15:09:45 +00006440
Tony Linthicum76329bf2011-12-12 21:14:55 +00006441// Hexagon abstract base class
6442class HexagonTargetInfo : public TargetInfo {
6443 static const Builtin::Info BuiltinInfo[];
6444 static const char * const GCCRegNames[];
6445 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6446 std::string CPU;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006447 bool HasHVX, HasHVXDouble;
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006448 bool UseLongCalls;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006449
Tony Linthicum76329bf2011-12-12 21:14:55 +00006450public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006451 HexagonTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6452 : TargetInfo(Triple) {
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00006453 // Specify the vector alignment explicitly. For v512x1, the calculated
6454 // alignment would be 512*alignment(i1), which is 512 bytes, instead of
6455 // the required minimum of 64 bytes.
James Y Knightb214cbc2016-03-04 19:00:41 +00006456 resetDataLayout("e-m:e-p:32:32:32-a:0-n16:32-"
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00006457 "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 +00006458 "v32:32:32-v64:64:64-v512:512:512-v1024:1024:1024-v2048:2048:2048");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006459 SizeType = UnsignedInt;
6460 PtrDiffType = SignedInt;
6461 IntPtrType = SignedInt;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006462
6463 // {} in inline assembly are packet specifiers, not assembly variant
6464 // specifiers.
6465 NoAsmVariants = true;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006466
6467 LargeArrayMinWidth = 64;
6468 LargeArrayAlign = 64;
6469 UseBitFieldTypeAlignment = true;
6470 ZeroLengthBitfieldBoundary = 32;
6471 HasHVX = HasHVXDouble = false;
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006472 UseLongCalls = false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006473 }
6474
Craig Topper6c03a542015-10-19 04:51:35 +00006475 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6476 return llvm::makeArrayRef(BuiltinInfo,
6477 clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006478 }
6479
Craig Topper3164f332014-03-11 03:39:26 +00006480 bool validateAsmConstraint(const char *&Name,
6481 TargetInfo::ConstraintInfo &Info) const override {
Krzysztof Parzyszeke0026e42016-05-18 14:56:14 +00006482 switch (*Name) {
6483 case 'v':
6484 case 'q':
6485 if (HasHVX) {
6486 Info.setAllowsRegister();
6487 return true;
6488 }
6489 break;
Krzysztof Parzyszek89fb4412016-05-20 13:50:32 +00006490 case 's':
6491 // Relocatable constant.
6492 return true;
Krzysztof Parzyszeke0026e42016-05-18 14:56:14 +00006493 }
6494 return false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006495 }
6496
Craig Topper3164f332014-03-11 03:39:26 +00006497 void getTargetDefines(const LangOptions &Opts,
6498 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006499
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006500 bool isCLZForZeroUndef() const override { return false; }
6501
Craig Topper3164f332014-03-11 03:39:26 +00006502 bool hasFeature(StringRef Feature) const override {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006503 return llvm::StringSwitch<bool>(Feature)
6504 .Case("hexagon", true)
6505 .Case("hvx", HasHVX)
6506 .Case("hvx-double", HasHVXDouble)
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006507 .Case("long-calls", UseLongCalls)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006508 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006509 }
Craig Topper3164f332014-03-11 03:39:26 +00006510
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006511 bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6512 StringRef CPU, const std::vector<std::string> &FeaturesVec)
6513 const override;
6514
6515 bool handleTargetFeatures(std::vector<std::string> &Features,
6516 DiagnosticsEngine &Diags) override;
6517
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006518 void setFeatureEnabled(llvm::StringMap<bool> &Features, StringRef Name,
6519 bool Enabled) const override;
6520
Craig Topper3164f332014-03-11 03:39:26 +00006521 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006522 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006523 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006524 ArrayRef<const char *> getGCCRegNames() const override;
6525 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00006526 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006527 return "";
6528 }
Sebastian Pop86500282012-01-13 20:37:10 +00006529
6530 static const char *getHexagonCPUSuffix(StringRef Name) {
6531 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00006532 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006533 .Case("hexagonv5", "5")
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006534 .Case("hexagonv55", "55")
6535 .Case("hexagonv60", "60")
Krzysztof Parzyszekff7f6672017-03-14 20:29:23 +00006536 .Case("hexagonv62", "62")
Craig Topperf1186c52014-05-08 06:41:40 +00006537 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00006538 }
6539
Craig Topper3164f332014-03-11 03:39:26 +00006540 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00006541 if (!getHexagonCPUSuffix(Name))
6542 return false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006543 CPU = Name;
6544 return true;
6545 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006546
6547 int getEHDataRegisterNumber(unsigned RegNo) const override {
6548 return RegNo < 2 ? RegNo : -1;
6549 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006550};
6551
6552void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006553 MacroBuilder &Builder) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006554 Builder.defineMacro("__qdsp6__", "1");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006555 Builder.defineMacro("__hexagon__", "1");
6556
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006557 if (CPU == "hexagonv4") {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006558 Builder.defineMacro("__HEXAGON_V4__");
6559 Builder.defineMacro("__HEXAGON_ARCH__", "4");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006560 if (Opts.HexagonQdsp6Compat) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006561 Builder.defineMacro("__QDSP6_V4__");
6562 Builder.defineMacro("__QDSP6_ARCH__", "4");
6563 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006564 } else if (CPU == "hexagonv5") {
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006565 Builder.defineMacro("__HEXAGON_V5__");
6566 Builder.defineMacro("__HEXAGON_ARCH__", "5");
6567 if(Opts.HexagonQdsp6Compat) {
6568 Builder.defineMacro("__QDSP6_V5__");
6569 Builder.defineMacro("__QDSP6_ARCH__", "5");
6570 }
Krzysztof Parzyszeka58ff512016-04-21 14:30:04 +00006571 } else if (CPU == "hexagonv55") {
6572 Builder.defineMacro("__HEXAGON_V55__");
6573 Builder.defineMacro("__HEXAGON_ARCH__", "55");
6574 Builder.defineMacro("__QDSP6_V55__");
6575 Builder.defineMacro("__QDSP6_ARCH__", "55");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006576 } else if (CPU == "hexagonv60") {
6577 Builder.defineMacro("__HEXAGON_V60__");
6578 Builder.defineMacro("__HEXAGON_ARCH__", "60");
6579 Builder.defineMacro("__QDSP6_V60__");
6580 Builder.defineMacro("__QDSP6_ARCH__", "60");
Krzysztof Parzyszekff7f6672017-03-14 20:29:23 +00006581 } else if (CPU == "hexagonv62") {
6582 Builder.defineMacro("__HEXAGON_V62__");
6583 Builder.defineMacro("__HEXAGON_ARCH__", "62");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006584 }
Krzysztof Parzyszek7f0756c2016-04-18 18:38:11 +00006585
6586 if (hasFeature("hvx")) {
6587 Builder.defineMacro("__HVX__");
6588 if (hasFeature("hvx-double"))
6589 Builder.defineMacro("__HVXDBL__");
6590 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006591}
6592
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006593bool HexagonTargetInfo::initFeatureMap(llvm::StringMap<bool> &Features,
6594 DiagnosticsEngine &Diags, StringRef CPU,
6595 const std::vector<std::string> &FeaturesVec) const {
6596 // Default for v60: -hvx, -hvx-double.
6597 Features["hvx"] = false;
6598 Features["hvx-double"] = false;
6599 Features["long-calls"] = false;
6600
6601 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
6602}
6603
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006604bool HexagonTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
6605 DiagnosticsEngine &Diags) {
6606 for (auto &F : Features) {
6607 if (F == "+hvx")
6608 HasHVX = true;
6609 else if (F == "-hvx")
6610 HasHVX = HasHVXDouble = false;
6611 else if (F == "+hvx-double")
6612 HasHVX = HasHVXDouble = true;
6613 else if (F == "-hvx-double")
6614 HasHVXDouble = false;
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006615
6616 if (F == "+long-calls")
6617 UseLongCalls = true;
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006618 else if (F == "-long-calls")
6619 UseLongCalls = false;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006620 }
6621 return true;
6622}
6623
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006624void HexagonTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
6625 StringRef Name, bool Enabled) const {
6626 if (Enabled) {
6627 if (Name == "hvx-double")
6628 Features["hvx"] = true;
6629 } else {
6630 if (Name == "hvx")
6631 Features["hvx-double"] = false;
6632 }
6633 Features[Name] = Enabled;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006634}
6635
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006636const char *const HexagonTargetInfo::GCCRegNames[] = {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006637 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6638 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6639 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6640 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
6641 "p0", "p1", "p2", "p3",
6642 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
6643};
6644
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006645ArrayRef<const char*> HexagonTargetInfo::getGCCRegNames() const {
Craig Topperf054e3a2015-10-19 03:52:27 +00006646 return llvm::makeArrayRef(GCCRegNames);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006647}
6648
Tony Linthicum76329bf2011-12-12 21:14:55 +00006649const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
6650 { { "sp" }, "r29" },
6651 { { "fp" }, "r30" },
6652 { { "lr" }, "r31" },
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006653};
Tony Linthicum76329bf2011-12-12 21:14:55 +00006654
Craig Topperf054e3a2015-10-19 03:52:27 +00006655ArrayRef<TargetInfo::GCCRegAlias> HexagonTargetInfo::getGCCRegAliases() const {
6656 return llvm::makeArrayRef(GCCRegAliases);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006657}
6658
6659
6660const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00006661#define BUILTIN(ID, TYPE, ATTRS) \
6662 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
6663#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
6664 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tony Linthicum76329bf2011-12-12 21:14:55 +00006665#include "clang/Basic/BuiltinsHexagon.def"
6666};
Tony Linthicum76329bf2011-12-12 21:14:55 +00006667
Jacques Pienaard964cc22016-03-28 21:02:54 +00006668class LanaiTargetInfo : public TargetInfo {
6669 // Class for Lanai (32-bit).
6670 // The CPU profiles supported by the Lanai backend
6671 enum CPUKind {
6672 CK_NONE,
6673 CK_V11,
6674 } CPU;
6675
6676 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6677 static const char *const GCCRegNames[];
6678
6679public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006680 LanaiTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6681 : TargetInfo(Triple) {
Jacques Pienaard964cc22016-03-28 21:02:54 +00006682 // Description string has to be kept in sync with backend.
6683 resetDataLayout("E" // Big endian
6684 "-m:e" // ELF name manging
6685 "-p:32:32" // 32 bit pointers, 32 bit aligned
6686 "-i64:64" // 64 bit integers, 64 bit aligned
6687 "-a:0:32" // 32 bit alignment of objects of aggregate type
6688 "-n32" // 32 bit native integer width
6689 "-S64" // 64 bit natural stack alignment
6690 );
6691
6692 // Setting RegParmMax equal to what mregparm was set to in the old
6693 // toolchain
6694 RegParmMax = 4;
6695
6696 // Set the default CPU to V11
6697 CPU = CK_V11;
6698
6699 // Temporary approach to make everything at least word-aligned and allow for
6700 // safely casting between pointers with different alignment requirements.
6701 // TODO: Remove this when there are no more cast align warnings on the
6702 // firmware.
6703 MinGlobalAlign = 32;
6704 }
6705
6706 void getTargetDefines(const LangOptions &Opts,
6707 MacroBuilder &Builder) const override {
6708 // Define __lanai__ when building for target lanai.
6709 Builder.defineMacro("__lanai__");
6710
6711 // Set define for the CPU specified.
6712 switch (CPU) {
6713 case CK_V11:
6714 Builder.defineMacro("__LANAI_V11__");
6715 break;
6716 case CK_NONE:
6717 llvm_unreachable("Unhandled target CPU");
6718 }
6719 }
6720
6721 bool setCPU(const std::string &Name) override {
6722 CPU = llvm::StringSwitch<CPUKind>(Name)
6723 .Case("v11", CK_V11)
6724 .Default(CK_NONE);
6725
6726 return CPU != CK_NONE;
6727 }
6728
6729 bool hasFeature(StringRef Feature) const override {
6730 return llvm::StringSwitch<bool>(Feature).Case("lanai", true).Default(false);
6731 }
6732
6733 ArrayRef<const char *> getGCCRegNames() const override;
6734
6735 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
6736
6737 BuiltinVaListKind getBuiltinVaListKind() const override {
6738 return TargetInfo::VoidPtrBuiltinVaList;
6739 }
6740
6741 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
6742
6743 bool validateAsmConstraint(const char *&Name,
6744 TargetInfo::ConstraintInfo &info) const override {
6745 return false;
6746 }
6747
6748 const char *getClobbers() const override { return ""; }
6749};
6750
6751const char *const LanaiTargetInfo::GCCRegNames[] = {
6752 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10",
6753 "r11", "r12", "r13", "r14", "r15", "r16", "r17", "r18", "r19", "r20", "r21",
6754 "r22", "r23", "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"};
6755
6756ArrayRef<const char *> LanaiTargetInfo::getGCCRegNames() const {
6757 return llvm::makeArrayRef(GCCRegNames);
6758}
6759
6760const TargetInfo::GCCRegAlias LanaiTargetInfo::GCCRegAliases[] = {
6761 {{"pc"}, "r2"},
6762 {{"sp"}, "r4"},
6763 {{"fp"}, "r5"},
6764 {{"rv"}, "r8"},
6765 {{"rr1"}, "r10"},
6766 {{"rr2"}, "r11"},
6767 {{"rca"}, "r15"},
6768};
6769
6770ArrayRef<TargetInfo::GCCRegAlias> LanaiTargetInfo::getGCCRegAliases() const {
6771 return llvm::makeArrayRef(GCCRegAliases);
6772}
6773
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006774// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
6775class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00006776 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6777 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006778 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00006779public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006780 SparcTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
James Y Knighta3518ad2016-01-27 01:04:51 +00006781 : TargetInfo(Triple), SoftFloat(false) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006782
Joerg Sonnenbergerd0be8dc2016-03-07 17:19:15 +00006783 int getEHDataRegisterNumber(unsigned RegNo) const override {
6784 if (RegNo == 0) return 24;
6785 if (RegNo == 1) return 25;
6786 return -1;
6787 }
6788
Craig Topper3164f332014-03-11 03:39:26 +00006789 bool handleTargetFeatures(std::vector<std::string> &Features,
6790 DiagnosticsEngine &Diags) override {
Jacob Baungard Hansen13a49372016-05-24 08:30:08 +00006791 // Check if software floating point is enabled
Eric Christopherfb481a42015-04-29 23:32:17 +00006792 auto Feature = std::find(Features.begin(), Features.end(), "+soft-float");
6793 if (Feature != Features.end()) {
6794 SoftFloat = true;
Eric Christopherfb481a42015-04-29 23:32:17 +00006795 }
Rafael Espindolaeb265472013-08-21 21:59:03 +00006796 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006797 }
Craig Topper3164f332014-03-11 03:39:26 +00006798 void getTargetDefines(const LangOptions &Opts,
6799 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006800 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006801 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006802
6803 if (SoftFloat)
6804 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00006805 }
Craig Topper3164f332014-03-11 03:39:26 +00006806
6807 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006808 return llvm::StringSwitch<bool>(Feature)
6809 .Case("softfloat", SoftFloat)
6810 .Case("sparc", true)
6811 .Default(false);
6812 }
Craig Topper3164f332014-03-11 03:39:26 +00006813
Chris Dewhurst0381cd72016-06-15 12:44:47 +00006814 bool hasSjLjLowering() const override {
6815 return true;
6816 }
6817
Craig Topper6c03a542015-10-19 04:51:35 +00006818 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006819 // FIXME: Implement!
Craig Topper6c03a542015-10-19 04:51:35 +00006820 return None;
Gabor Greif49991682008-02-21 16:29:08 +00006821 }
Craig Topper3164f332014-03-11 03:39:26 +00006822 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006823 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00006824 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006825 ArrayRef<const char *> getGCCRegNames() const override;
6826 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00006827 bool validateAsmConstraint(const char *&Name,
6828 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006829 // FIXME: Implement!
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00006830 switch (*Name) {
6831 case 'I': // Signed 13-bit constant
6832 case 'J': // Zero
6833 case 'K': // 32-bit constant with the low 12 bits clear
6834 case 'L': // A constant in the range supported by movcc (11-bit signed imm)
6835 case 'M': // A constant in the range supported by movrcc (19-bit signed imm)
6836 case 'N': // Same as 'K' but zext (required for SIMode)
6837 case 'O': // The constant 4096
6838 return true;
6839 }
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006840 return false;
Gabor Greif49991682008-02-21 16:29:08 +00006841 }
Craig Topper3164f332014-03-11 03:39:26 +00006842 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006843 // FIXME: Implement!
6844 return "";
Gabor Greif49991682008-02-21 16:29:08 +00006845 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006846
6847 // No Sparc V7 for now, the backend doesn't support it anyway.
6848 enum CPUKind {
6849 CK_GENERIC,
6850 CK_V8,
6851 CK_SUPERSPARC,
6852 CK_SPARCLITE,
6853 CK_F934,
6854 CK_HYPERSPARC,
6855 CK_SPARCLITE86X,
6856 CK_SPARCLET,
6857 CK_TSC701,
6858 CK_V9,
6859 CK_ULTRASPARC,
6860 CK_ULTRASPARC3,
6861 CK_NIAGARA,
6862 CK_NIAGARA2,
6863 CK_NIAGARA3,
Douglas Katzman6871afc2016-03-15 22:34:02 +00006864 CK_NIAGARA4,
Douglas Katzman87da5f42016-07-25 16:36:02 +00006865 CK_MYRIAD2100,
6866 CK_MYRIAD2150,
6867 CK_MYRIAD2450,
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006868 CK_LEON2,
6869 CK_LEON2_AT697E,
6870 CK_LEON2_AT697F,
6871 CK_LEON3,
6872 CK_LEON3_UT699,
6873 CK_LEON3_GR712RC,
6874 CK_LEON4,
6875 CK_LEON4_GR740
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006876 } CPU = CK_GENERIC;
6877
6878 enum CPUGeneration {
6879 CG_V8,
6880 CG_V9,
6881 };
6882
6883 CPUGeneration getCPUGeneration(CPUKind Kind) const {
6884 switch (Kind) {
6885 case CK_GENERIC:
6886 case CK_V8:
6887 case CK_SUPERSPARC:
6888 case CK_SPARCLITE:
6889 case CK_F934:
6890 case CK_HYPERSPARC:
6891 case CK_SPARCLITE86X:
6892 case CK_SPARCLET:
6893 case CK_TSC701:
Douglas Katzman87da5f42016-07-25 16:36:02 +00006894 case CK_MYRIAD2100:
6895 case CK_MYRIAD2150:
6896 case CK_MYRIAD2450:
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006897 case CK_LEON2:
6898 case CK_LEON2_AT697E:
6899 case CK_LEON2_AT697F:
6900 case CK_LEON3:
6901 case CK_LEON3_UT699:
6902 case CK_LEON3_GR712RC:
6903 case CK_LEON4:
6904 case CK_LEON4_GR740:
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006905 return CG_V8;
6906 case CK_V9:
6907 case CK_ULTRASPARC:
6908 case CK_ULTRASPARC3:
6909 case CK_NIAGARA:
6910 case CK_NIAGARA2:
6911 case CK_NIAGARA3:
6912 case CK_NIAGARA4:
6913 return CG_V9;
6914 }
Aaron Ballmana9a72852015-11-11 13:42:02 +00006915 llvm_unreachable("Unexpected CPU kind");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006916 }
6917
6918 CPUKind getCPUKind(StringRef Name) const {
6919 return llvm::StringSwitch<CPUKind>(Name)
6920 .Case("v8", CK_V8)
6921 .Case("supersparc", CK_SUPERSPARC)
6922 .Case("sparclite", CK_SPARCLITE)
6923 .Case("f934", CK_F934)
6924 .Case("hypersparc", CK_HYPERSPARC)
6925 .Case("sparclite86x", CK_SPARCLITE86X)
6926 .Case("sparclet", CK_SPARCLET)
6927 .Case("tsc701", CK_TSC701)
6928 .Case("v9", CK_V9)
6929 .Case("ultrasparc", CK_ULTRASPARC)
6930 .Case("ultrasparc3", CK_ULTRASPARC3)
6931 .Case("niagara", CK_NIAGARA)
6932 .Case("niagara2", CK_NIAGARA2)
6933 .Case("niagara3", CK_NIAGARA3)
6934 .Case("niagara4", CK_NIAGARA4)
Douglas Katzman87da5f42016-07-25 16:36:02 +00006935 .Case("ma2100", CK_MYRIAD2100)
6936 .Case("ma2150", CK_MYRIAD2150)
6937 .Case("ma2450", CK_MYRIAD2450)
6938 // FIXME: the myriad2[.n] spellings are obsolete,
6939 // but a grace period is needed to allow updating dependent builds.
6940 .Case("myriad2", CK_MYRIAD2100)
6941 .Case("myriad2.1", CK_MYRIAD2100)
6942 .Case("myriad2.2", CK_MYRIAD2150)
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006943 .Case("leon2", CK_LEON2)
6944 .Case("at697e", CK_LEON2_AT697E)
6945 .Case("at697f", CK_LEON2_AT697F)
6946 .Case("leon3", CK_LEON3)
6947 .Case("ut699", CK_LEON3_UT699)
6948 .Case("gr712rc", CK_LEON3_GR712RC)
6949 .Case("leon4", CK_LEON4)
6950 .Case("gr740", CK_LEON4_GR740)
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006951 .Default(CK_GENERIC);
6952 }
6953
6954 bool setCPU(const std::string &Name) override {
6955 CPU = getCPUKind(Name);
6956 return CPU != CK_GENERIC;
6957 }
Gabor Greif49991682008-02-21 16:29:08 +00006958};
6959
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006960const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00006961 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6962 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6963 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6964 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
6965};
6966
Craig Topperf054e3a2015-10-19 03:52:27 +00006967ArrayRef<const char *> SparcTargetInfo::getGCCRegNames() const {
6968 return llvm::makeArrayRef(GCCRegNames);
Chris Lattner9b415d62009-01-27 01:58:38 +00006969}
6970
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006971const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00006972 { { "g0" }, "r0" },
6973 { { "g1" }, "r1" },
6974 { { "g2" }, "r2" },
6975 { { "g3" }, "r3" },
6976 { { "g4" }, "r4" },
6977 { { "g5" }, "r5" },
6978 { { "g6" }, "r6" },
6979 { { "g7" }, "r7" },
6980 { { "o0" }, "r8" },
6981 { { "o1" }, "r9" },
6982 { { "o2" }, "r10" },
6983 { { "o3" }, "r11" },
6984 { { "o4" }, "r12" },
6985 { { "o5" }, "r13" },
6986 { { "o6", "sp" }, "r14" },
6987 { { "o7" }, "r15" },
6988 { { "l0" }, "r16" },
6989 { { "l1" }, "r17" },
6990 { { "l2" }, "r18" },
6991 { { "l3" }, "r19" },
6992 { { "l4" }, "r20" },
6993 { { "l5" }, "r21" },
6994 { { "l6" }, "r22" },
6995 { { "l7" }, "r23" },
6996 { { "i0" }, "r24" },
6997 { { "i1" }, "r25" },
6998 { { "i2" }, "r26" },
6999 { { "i3" }, "r27" },
7000 { { "i4" }, "r28" },
7001 { { "i5" }, "r29" },
7002 { { "i6", "fp" }, "r30" },
7003 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00007004};
7005
Craig Topperf054e3a2015-10-19 03:52:27 +00007006ArrayRef<TargetInfo::GCCRegAlias> SparcTargetInfo::getGCCRegAliases() const {
7007 return llvm::makeArrayRef(GCCRegAliases);
Chris Lattner9b415d62009-01-27 01:58:38 +00007008}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007009
7010// SPARC v8 is the 32-bit mode selected by Triple::sparc.
7011class SparcV8TargetInfo : public SparcTargetInfo {
7012public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007013 SparcV8TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7014 : SparcTargetInfo(Triple, Opts) {
James Y Knightb214cbc2016-03-04 19:00:41 +00007015 resetDataLayout("E-m:e-p:32:32-i64:64-f128:64-n32-S64");
Brad Smith73859112015-08-13 21:45:57 +00007016 // NetBSD / OpenBSD use long (same as llvm default); everyone else uses int.
7017 switch (getTriple().getOS()) {
7018 default:
James Y Knight4b4d19e2015-06-04 15:36:29 +00007019 SizeType = UnsignedInt;
7020 IntPtrType = SignedInt;
7021 PtrDiffType = SignedInt;
Brad Smith73859112015-08-13 21:45:57 +00007022 break;
7023 case llvm::Triple::NetBSD:
7024 case llvm::Triple::OpenBSD:
7025 SizeType = UnsignedLong;
7026 IntPtrType = SignedLong;
7027 PtrDiffType = SignedLong;
7028 break;
Brad Smith56495d52015-08-13 22:00:53 +00007029 }
Douglas Katzman13f4a912016-11-09 15:43:51 +00007030 // Up to 32 bits are lock-free atomic, but we're willing to do atomic ops
7031 // on up to 64 bits.
7032 MaxAtomicPromoteWidth = 64;
7033 MaxAtomicInlineWidth = 32;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007034 }
7035
Craig Topper3164f332014-03-11 03:39:26 +00007036 void getTargetDefines(const LangOptions &Opts,
7037 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007038 SparcTargetInfo::getTargetDefines(Opts, Builder);
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00007039 switch (getCPUGeneration(CPU)) {
7040 case CG_V8:
7041 Builder.defineMacro("__sparcv8");
7042 if (getTriple().getOS() != llvm::Triple::Solaris)
7043 Builder.defineMacro("__sparcv8__");
7044 break;
7045 case CG_V9:
7046 Builder.defineMacro("__sparcv9");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00007047 if (getTriple().getOS() != llvm::Triple::Solaris) {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00007048 Builder.defineMacro("__sparcv9__");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00007049 Builder.defineMacro("__sparc_v9__");
7050 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00007051 break;
7052 }
Douglas Katzman6871afc2016-03-15 22:34:02 +00007053 if (getTriple().getVendor() == llvm::Triple::Myriad) {
Douglas Katzman87da5f42016-07-25 16:36:02 +00007054 std::string MyriadArchValue, Myriad2Value;
7055 Builder.defineMacro("__sparc_v8__");
7056 Builder.defineMacro("__leon__");
Douglas Katzman6871afc2016-03-15 22:34:02 +00007057 switch (CPU) {
Douglas Katzman87da5f42016-07-25 16:36:02 +00007058 case CK_MYRIAD2150:
7059 MyriadArchValue = "__ma2150";
7060 Myriad2Value = "2";
Douglas Katzman6871afc2016-03-15 22:34:02 +00007061 break;
Douglas Katzman87da5f42016-07-25 16:36:02 +00007062 case CK_MYRIAD2450:
7063 MyriadArchValue = "__ma2450";
7064 Myriad2Value = "2";
Douglas Katzman6871afc2016-03-15 22:34:02 +00007065 break;
7066 default:
Douglas Katzman87da5f42016-07-25 16:36:02 +00007067 MyriadArchValue = "__ma2100";
7068 Myriad2Value = "1";
Douglas Katzman6871afc2016-03-15 22:34:02 +00007069 break;
7070 }
Douglas Katzman87da5f42016-07-25 16:36:02 +00007071 Builder.defineMacro(MyriadArchValue, "1");
7072 Builder.defineMacro(MyriadArchValue+"__", "1");
7073 Builder.defineMacro("__myriad2__", Myriad2Value);
7074 Builder.defineMacro("__myriad2", Myriad2Value);
Douglas Katzman6871afc2016-03-15 22:34:02 +00007075 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007076 }
Chris Dewhurst69fa1922016-05-04 09:33:30 +00007077
7078 bool hasSjLjLowering() const override {
7079 return true;
7080 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007081};
7082
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007083// SPARCV8el is the 32-bit little-endian mode selected by Triple::sparcel.
7084class SparcV8elTargetInfo : public SparcV8TargetInfo {
7085 public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007086 SparcV8elTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7087 : SparcV8TargetInfo(Triple, Opts) {
7088 resetDataLayout("e-m:e-p:32:32-i64:64-f128:64-n32-S64");
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007089 }
7090};
7091
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007092// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
7093class SparcV9TargetInfo : public SparcTargetInfo {
7094public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007095 SparcV9TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7096 : SparcTargetInfo(Triple, Opts) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007097 // FIXME: Support Sparc quad-precision long double?
James Y Knightb214cbc2016-03-04 19:00:41 +00007098 resetDataLayout("E-m:e-i64:64-n32:64-S128");
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00007099 // This is an LP64 platform.
7100 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00007101
7102 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00007103 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00007104 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00007105 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00007106 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00007107 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00007108
7109 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
7110 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
7111 LongDoubleWidth = 128;
7112 LongDoubleAlign = 128;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007113 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00007114 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007115 }
7116
Craig Topper3164f332014-03-11 03:39:26 +00007117 void getTargetDefines(const LangOptions &Opts,
7118 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007119 SparcTargetInfo::getTargetDefines(Opts, Builder);
7120 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00007121 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00007122 // Solaris doesn't need these variants, but the BSDs do.
7123 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00007124 Builder.defineMacro("__sparc64__");
7125 Builder.defineMacro("__sparc_v9__");
7126 Builder.defineMacro("__sparcv9__");
7127 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007128 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00007129
Craig Topper3164f332014-03-11 03:39:26 +00007130 bool setCPU(const std::string &Name) override {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00007131 if (!SparcTargetInfo::setCPU(Name))
7132 return false;
7133 return getCPUGeneration(CPU) == CG_V9;
Roman Divackyb1ae3d42014-02-25 18:35:30 +00007134 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007135};
7136
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007137class SystemZTargetInfo : public TargetInfo {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007138 static const Builtin::Info BuiltinInfo[];
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007139 static const char *const GCCRegNames[];
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007140 std::string CPU;
7141 bool HasTransactionalExecution;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007142 bool HasVector;
Ulrich Weigand47445072013-05-06 16:26:41 +00007143
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007144public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007145 SystemZTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Eric Christopherb093d692015-10-09 18:39:59 +00007146 : TargetInfo(Triple), CPU("z10"), HasTransactionalExecution(false),
7147 HasVector(false) {
Ulrich Weigand881497a2015-03-30 13:50:21 +00007148 IntMaxType = SignedLong;
7149 Int64Type = SignedLong;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007150 TLSSupported = true;
7151 IntWidth = IntAlign = 32;
7152 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
7153 PointerWidth = PointerAlign = 64;
7154 LongDoubleWidth = 128;
7155 LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007156 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Ulrich Weigandca3cb7f2015-04-21 17:29:35 +00007157 DefaultAlignForAttributeAligned = 64;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007158 MinGlobalAlign = 16;
James Y Knightb214cbc2016-03-04 19:00:41 +00007159 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 +00007160 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
7161 }
7162 void getTargetDefines(const LangOptions &Opts,
7163 MacroBuilder &Builder) const override {
7164 Builder.defineMacro("__s390__");
7165 Builder.defineMacro("__s390x__");
7166 Builder.defineMacro("__zarch__");
7167 Builder.defineMacro("__LONG_DOUBLE_128__");
Ulrich Weigandb038a522016-02-05 21:34:28 +00007168
Ulrich Weigand82a86cb2017-02-06 17:04:22 +00007169 const std::string ISARev = llvm::StringSwitch<std::string>(CPU)
7170 .Cases("arch8", "z10", "8")
7171 .Cases("arch9", "z196", "9")
7172 .Cases("arch10", "zEC12", "10")
7173 .Cases("arch11", "z13", "11")
7174 .Default("");
7175 if (!ISARev.empty())
7176 Builder.defineMacro("__ARCH__", ISARev);
7177
Ulrich Weigandb038a522016-02-05 21:34:28 +00007178 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
7179 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
7180 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
7181 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
7182
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007183 if (HasTransactionalExecution)
7184 Builder.defineMacro("__HTM__");
Ulrich Weigand82a86cb2017-02-06 17:04:22 +00007185 if (HasVector)
7186 Builder.defineMacro("__VX__");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00007187 if (Opts.ZVector)
7188 Builder.defineMacro("__VEC__", "10301");
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007189 }
Craig Topper6c03a542015-10-19 04:51:35 +00007190 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7191 return llvm::makeArrayRef(BuiltinInfo,
7192 clang::SystemZ::LastTSBuiltin-Builtin::FirstTSBuiltin);
Ulrich Weigand47445072013-05-06 16:26:41 +00007193 }
7194
Craig Topperf054e3a2015-10-19 03:52:27 +00007195 ArrayRef<const char *> getGCCRegNames() const override;
7196 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007197 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00007198 return None;
Ulrich Weigand47445072013-05-06 16:26:41 +00007199 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007200 bool validateAsmConstraint(const char *&Name,
7201 TargetInfo::ConstraintInfo &info) const override;
7202 const char *getClobbers() const override {
7203 // FIXME: Is this really right?
7204 return "";
7205 }
7206 BuiltinVaListKind getBuiltinVaListKind() const override {
7207 return TargetInfo::SystemZBuiltinVaList;
7208 }
7209 bool setCPU(const std::string &Name) override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007210 CPU = Name;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007211 bool CPUKnown = llvm::StringSwitch<bool>(Name)
7212 .Case("z10", true)
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007213 .Case("arch8", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007214 .Case("z196", true)
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007215 .Case("arch9", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007216 .Case("zEC12", true)
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007217 .Case("arch10", true)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007218 .Case("z13", true)
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007219 .Case("arch11", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007220 .Default(false);
7221
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007222 return CPUKnown;
7223 }
Eric Christopher8c47b422015-10-09 18:39:55 +00007224 bool
7225 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7226 StringRef CPU,
7227 const std::vector<std::string> &FeaturesVec) const override {
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007228 if (CPU == "zEC12" || CPU == "arch10")
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007229 Features["transactional-execution"] = true;
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007230 if (CPU == "z13" || CPU == "arch11") {
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007231 Features["transactional-execution"] = true;
7232 Features["vector"] = true;
7233 }
Eric Christopher007b0a02015-08-28 22:32:01 +00007234 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007235 }
7236
7237 bool handleTargetFeatures(std::vector<std::string> &Features,
7238 DiagnosticsEngine &Diags) override {
7239 HasTransactionalExecution = false;
Eric Christopher610fe112015-08-26 08:21:55 +00007240 for (const auto &Feature : Features) {
7241 if (Feature == "+transactional-execution")
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007242 HasTransactionalExecution = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007243 else if (Feature == "+vector")
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007244 HasVector = true;
7245 }
7246 // If we use the vector ABI, vector types are 64-bit aligned.
7247 if (HasVector) {
7248 MaxVectorAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00007249 resetDataLayout("E-m:e-i1:8:16-i8:8:16-i64:64-f128:64"
7250 "-v128:64-a:8:16-n32:64");
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007251 }
7252 return true;
7253 }
7254
7255 bool hasFeature(StringRef Feature) const override {
7256 return llvm::StringSwitch<bool>(Feature)
Ulrich Weigandcc673442015-04-01 14:15:35 +00007257 .Case("systemz", true)
7258 .Case("htm", HasTransactionalExecution)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007259 .Case("vx", HasVector)
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007260 .Default(false);
7261 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007262
Bryan Chane3f1ed52016-04-28 13:56:43 +00007263 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
7264 switch (CC) {
7265 case CC_C:
7266 case CC_Swift:
7267 return CCCR_OK;
7268 default:
7269 return CCCR_Warning;
7270 }
7271 }
7272
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007273 StringRef getABI() const override {
7274 if (HasVector)
7275 return "vector";
7276 return "";
7277 }
Ulrich Weigand47fd2532015-06-16 15:21:47 +00007278
7279 bool useFloat128ManglingForLongDouble() const override {
7280 return true;
7281 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007282};
7283
7284const Builtin::Info SystemZTargetInfo::BuiltinInfo[] = {
7285#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00007286 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Jonas Paulsson3ace74a2016-03-30 15:51:24 +00007287#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
7288 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007289#include "clang/Basic/BuiltinsSystemZ.def"
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007290};
7291
7292const char *const SystemZTargetInfo::GCCRegNames[] = {
7293 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
7294 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
7295 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
7296 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
7297};
7298
Craig Topperf054e3a2015-10-19 03:52:27 +00007299ArrayRef<const char *> SystemZTargetInfo::getGCCRegNames() const {
7300 return llvm::makeArrayRef(GCCRegNames);
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007301}
7302
7303bool SystemZTargetInfo::
7304validateAsmConstraint(const char *&Name,
7305 TargetInfo::ConstraintInfo &Info) const {
7306 switch (*Name) {
7307 default:
7308 return false;
7309
7310 case 'a': // Address register
7311 case 'd': // Data register (equivalent to 'r')
7312 case 'f': // Floating-point register
7313 Info.setAllowsRegister();
7314 return true;
7315
7316 case 'I': // Unsigned 8-bit constant
7317 case 'J': // Unsigned 12-bit constant
7318 case 'K': // Signed 16-bit constant
7319 case 'L': // Signed 20-bit displacement (on all targets we support)
7320 case 'M': // 0x7fffffff
7321 return true;
7322
7323 case 'Q': // Memory with base and unsigned 12-bit displacement
7324 case 'R': // Likewise, plus an index
7325 case 'S': // Memory with base and signed 20-bit displacement
7326 case 'T': // Likewise, plus an index
7327 Info.setAllowsMemory();
7328 return true;
7329 }
7330}
Ulrich Weigand47445072013-05-06 16:26:41 +00007331
Eric Christopherc48497a2015-09-18 21:26:24 +00007332class MSP430TargetInfo : public TargetInfo {
7333 static const char *const GCCRegNames[];
Anton Korobeynikova0f54372009-05-03 13:43:08 +00007334
Eric Christopherc48497a2015-09-18 21:26:24 +00007335public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007336 MSP430TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7337 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007338 TLSSupported = false;
7339 IntWidth = 16;
7340 IntAlign = 16;
7341 LongWidth = 32;
7342 LongLongWidth = 64;
7343 LongAlign = LongLongAlign = 16;
7344 PointerWidth = 16;
7345 PointerAlign = 16;
7346 SuitableAlign = 16;
7347 SizeType = UnsignedInt;
7348 IntMaxType = SignedLongLong;
7349 IntPtrType = SignedInt;
7350 PtrDiffType = SignedInt;
7351 SigAtomicType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00007352 resetDataLayout("e-m:e-p:16:16-i32:16:32-a:16-n8:16");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00007353 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007354 void getTargetDefines(const LangOptions &Opts,
7355 MacroBuilder &Builder) const override {
7356 Builder.defineMacro("MSP430");
7357 Builder.defineMacro("__MSP430__");
7358 // FIXME: defines for different 'flavours' of MCU
7359 }
Craig Topper6c03a542015-10-19 04:51:35 +00007360 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00007361 // FIXME: Implement.
Craig Topper6c03a542015-10-19 04:51:35 +00007362 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00007363 }
7364 bool hasFeature(StringRef Feature) const override {
7365 return Feature == "msp430";
7366 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007367 ArrayRef<const char *> getGCCRegNames() const override;
7368 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00007369 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00007370 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00007371 }
7372 bool validateAsmConstraint(const char *&Name,
7373 TargetInfo::ConstraintInfo &info) const override {
7374 // FIXME: implement
7375 switch (*Name) {
7376 case 'K': // the constant 1
7377 case 'L': // constant -1^20 .. 1^19
7378 case 'M': // constant 1-4:
Eli Friedmana9c3d712009-08-19 20:47:07 +00007379 return true;
7380 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007381 // No target constraints for now.
7382 return false;
7383 }
7384 const char *getClobbers() const override {
7385 // FIXME: Is this really right?
7386 return "";
7387 }
7388 BuiltinVaListKind getBuiltinVaListKind() const override {
7389 // FIXME: implement
7390 return TargetInfo::CharPtrBuiltinVaList;
7391 }
7392};
7393
7394const char *const MSP430TargetInfo::GCCRegNames[] = {
7395 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
7396 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"};
7397
Craig Topperf054e3a2015-10-19 03:52:27 +00007398ArrayRef<const char *> MSP430TargetInfo::getGCCRegNames() const {
7399 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00007400}
7401
7402// LLVM and Clang cannot be used directly to output native binaries for
7403// target, but is used to compile C code to llvm bitcode with correct
7404// type and alignment information.
7405//
7406// TCE uses the llvm bitcode as input and uses it for generating customized
7407// target processor and program binary. TCE co-design environment is
7408// publicly available in http://tce.cs.tut.fi
7409
7410static const unsigned TCEOpenCLAddrSpaceMap[] = {
7411 3, // opencl_global
7412 4, // opencl_local
7413 5, // opencl_constant
7414 // FIXME: generic has to be added to the target
7415 0, // opencl_generic
7416 0, // cuda_device
7417 0, // cuda_constant
7418 0 // cuda_shared
7419};
7420
7421class TCETargetInfo : public TargetInfo {
7422public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007423 TCETargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7424 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007425 TLSSupported = false;
7426 IntWidth = 32;
7427 LongWidth = LongLongWidth = 32;
7428 PointerWidth = 32;
7429 IntAlign = 32;
7430 LongAlign = LongLongAlign = 32;
7431 PointerAlign = 32;
7432 SuitableAlign = 32;
7433 SizeType = UnsignedInt;
7434 IntMaxType = SignedLong;
7435 IntPtrType = SignedInt;
7436 PtrDiffType = SignedInt;
7437 FloatWidth = 32;
7438 FloatAlign = 32;
7439 DoubleWidth = 32;
7440 DoubleAlign = 32;
7441 LongDoubleWidth = 32;
7442 LongDoubleAlign = 32;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007443 FloatFormat = &llvm::APFloat::IEEEsingle();
7444 DoubleFormat = &llvm::APFloat::IEEEsingle();
7445 LongDoubleFormat = &llvm::APFloat::IEEEsingle();
Pekka Jaaskelainen67354482016-11-16 15:22:31 +00007446 resetDataLayout("E-p:32:32:32-i1:8:8-i8:8:32-"
7447 "i16:16:32-i32:32:32-i64:32:32-"
7448 "f32:32:32-f64:32:32-v64:32:32-"
7449 "v128:32:32-v256:32:32-v512:32:32-"
7450 "v1024:32:32-a0:0:32-n32");
Eric Christopherc48497a2015-09-18 21:26:24 +00007451 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
7452 UseAddrSpaceMapMangling = true;
7453 }
7454
7455 void getTargetDefines(const LangOptions &Opts,
7456 MacroBuilder &Builder) const override {
7457 DefineStd(Builder, "tce", Opts);
7458 Builder.defineMacro("__TCE__");
7459 Builder.defineMacro("__TCE_V1__");
7460 }
7461 bool hasFeature(StringRef Feature) const override { return Feature == "tce"; }
7462
Craig Topper6c03a542015-10-19 04:51:35 +00007463 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007464 const char *getClobbers() const override { return ""; }
7465 BuiltinVaListKind getBuiltinVaListKind() const override {
7466 return TargetInfo::VoidPtrBuiltinVaList;
7467 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007468 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007469 bool validateAsmConstraint(const char *&Name,
7470 TargetInfo::ConstraintInfo &info) const override {
7471 return true;
7472 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007473 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7474 return None;
7475 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007476};
Eli Friedmana9c3d712009-08-19 20:47:07 +00007477
Pekka Jaaskelainen67354482016-11-16 15:22:31 +00007478class TCELETargetInfo : public TCETargetInfo {
7479public:
7480 TCELETargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7481 : TCETargetInfo(Triple, Opts) {
7482 BigEndian = false;
7483
7484 resetDataLayout("e-p:32:32:32-i1:8:8-i8:8:32-"
7485 "i16:16:32-i32:32:32-i64:32:32-"
7486 "f32:32:32-f64:32:32-v64:32:32-"
7487 "v128:32:32-v256:32:32-v512:32:32-"
7488 "v1024:32:32-a0:0:32-n32");
7489
7490 }
7491
7492 virtual void getTargetDefines(const LangOptions &Opts,
7493 MacroBuilder &Builder) const {
7494 DefineStd(Builder, "tcele", Opts);
7495 Builder.defineMacro("__TCE__");
7496 Builder.defineMacro("__TCE_V1__");
7497 Builder.defineMacro("__TCELE__");
7498 Builder.defineMacro("__TCELE_V1__");
7499 }
7500
7501};
7502
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007503class BPFTargetInfo : public TargetInfo {
7504public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007505 BPFTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7506 : TargetInfo(Triple) {
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007507 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
7508 SizeType = UnsignedLong;
7509 PtrDiffType = SignedLong;
7510 IntPtrType = SignedLong;
7511 IntMaxType = SignedLong;
7512 Int64Type = SignedLong;
7513 RegParmMax = 5;
7514 if (Triple.getArch() == llvm::Triple::bpfeb) {
James Y Knightb214cbc2016-03-04 19:00:41 +00007515 resetDataLayout("E-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007516 } else {
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 }
7519 MaxAtomicPromoteWidth = 64;
7520 MaxAtomicInlineWidth = 64;
7521 TLSSupported = false;
7522 }
7523 void getTargetDefines(const LangOptions &Opts,
7524 MacroBuilder &Builder) const override {
7525 DefineStd(Builder, "bpf", Opts);
7526 Builder.defineMacro("__BPF__");
7527 }
7528 bool hasFeature(StringRef Feature) const override {
7529 return Feature == "bpf";
7530 }
7531
Craig Topper6c03a542015-10-19 04:51:35 +00007532 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007533 const char *getClobbers() const override {
7534 return "";
7535 }
7536 BuiltinVaListKind getBuiltinVaListKind() const override {
7537 return TargetInfo::VoidPtrBuiltinVaList;
7538 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007539 ArrayRef<const char *> getGCCRegNames() const override {
7540 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007541 }
7542 bool validateAsmConstraint(const char *&Name,
7543 TargetInfo::ConstraintInfo &info) const override {
7544 return true;
7545 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007546 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7547 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007548 }
7549};
7550
Daniel Sanders4672af62016-05-27 11:51:02 +00007551class MipsTargetInfo : public TargetInfo {
7552 void setDataLayout() {
Daniel Sanders55e40692016-06-03 10:11:01 +00007553 StringRef Layout;
7554
7555 if (ABI == "o32")
7556 Layout = "m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
7557 else if (ABI == "n32")
Daniel Sanders6a738832016-07-19 10:49:03 +00007558 Layout = "m:e-p:32:32-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Daniel Sanders55e40692016-06-03 10:11:01 +00007559 else if (ABI == "n64")
Daniel Sanders6a738832016-07-19 10:49:03 +00007560 Layout = "m:e-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Daniel Sanders55e40692016-06-03 10:11:01 +00007561 else
7562 llvm_unreachable("Invalid ABI");
7563
7564 if (BigEndian)
7565 resetDataLayout(("E-" + Layout).str());
7566 else
7567 resetDataLayout(("e-" + Layout).str());
Daniel Sanders4672af62016-05-27 11:51:02 +00007568 }
7569
Akira Hatanaka9064e362013-10-29 18:30:33 +00007570
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00007571 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007572 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00007573 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00007574 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007575 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00007576 bool IsSingleFloat;
Simon Dardisdf827a72017-02-21 16:01:00 +00007577 bool IsNoABICalls;
7578 bool CanUseBSDABICalls;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007579 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00007580 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007581 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007582 enum DspRevEnum {
7583 NoDSP, DSP1, DSP2
7584 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00007585 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007586
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007587protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00007588 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007589 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007590
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007591public:
Daniel Sanders4672af62016-05-27 11:51:02 +00007592 MipsTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007593 : TargetInfo(Triple), IsMips16(false), IsMicromips(false),
Simon Dardisdf827a72017-02-21 16:01:00 +00007594 IsNan2008(false), IsSingleFloat(false), IsNoABICalls(false),
7595 CanUseBSDABICalls(false), FloatABI(HardFloat), DspRev(NoDSP),
7596 HasMSA(false), HasFP64(false) {
Zoran Jovanovic26a12162015-02-18 15:21:35 +00007597 TheCXXABI.set(TargetCXXABI::GenericMIPS);
Daniel Sanders4672af62016-05-27 11:51:02 +00007598
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007599 setABI((getTriple().getArch() == llvm::Triple::mips ||
7600 getTriple().getArch() == llvm::Triple::mipsel)
7601 ? "o32"
7602 : "n64");
7603
7604 CPU = ABI == "o32" ? "mips32r2" : "mips64r2";
Simon Dardisdf827a72017-02-21 16:01:00 +00007605
7606 CanUseBSDABICalls = Triple.getOS() == llvm::Triple::FreeBSD ||
7607 Triple.getOS() == llvm::Triple::OpenBSD;
Zoran Jovanovic26a12162015-02-18 15:21:35 +00007608 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007609
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007610 bool isNaN2008Default() const {
7611 return CPU == "mips32r6" || CPU == "mips64r6";
7612 }
7613
7614 bool isFP64Default() const {
7615 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
7616 }
7617
Petar Jovanovicd55ae6b2015-02-26 18:19:22 +00007618 bool isNan2008() const override {
7619 return IsNan2008;
7620 }
7621
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007622 bool processorSupportsGPR64() const {
7623 return llvm::StringSwitch<bool>(CPU)
7624 .Case("mips3", true)
7625 .Case("mips4", true)
7626 .Case("mips5", true)
7627 .Case("mips64", true)
7628 .Case("mips64r2", true)
7629 .Case("mips64r3", true)
7630 .Case("mips64r5", true)
7631 .Case("mips64r6", true)
7632 .Case("octeon", true)
7633 .Default(false);
7634 return false;
7635 }
7636
Alp Toker4925ba72014-06-07 23:30:42 +00007637 StringRef getABI() const override { return ABI; }
Daniel Sanders4672af62016-05-27 11:51:02 +00007638 bool setABI(const std::string &Name) override {
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007639 if (Name == "o32") {
7640 setO32ABITypes();
7641 ABI = Name;
7642 return true;
Daniel Sanders4672af62016-05-27 11:51:02 +00007643 }
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007644
7645 if (Name == "n32") {
7646 setN32ABITypes();
7647 ABI = Name;
7648 return true;
7649 }
7650 if (Name == "n64") {
7651 setN64ABITypes();
7652 ABI = Name;
7653 return true;
Daniel Sanders4672af62016-05-27 11:51:02 +00007654 }
7655 return false;
7656 }
7657
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007658 void setO32ABITypes() {
7659 Int64Type = SignedLongLong;
7660 IntMaxType = Int64Type;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007661 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007662 LongDoubleWidth = LongDoubleAlign = 64;
7663 LongWidth = LongAlign = 32;
7664 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
7665 PointerWidth = PointerAlign = 32;
7666 PtrDiffType = SignedInt;
7667 SizeType = UnsignedInt;
7668 SuitableAlign = 64;
7669 }
7670
7671 void setN32N64ABITypes() {
7672 LongDoubleWidth = LongDoubleAlign = 128;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007673 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007674 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
7675 LongDoubleWidth = LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007676 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007677 }
7678 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
7679 SuitableAlign = 128;
7680 }
7681
Daniel Sanders4672af62016-05-27 11:51:02 +00007682 void setN64ABITypes() {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007683 setN32N64ABITypes();
Brad Smith8e55bd52017-03-06 23:48:31 +00007684 if (getTriple().getOS() == llvm::Triple::OpenBSD) {
7685 Int64Type = SignedLongLong;
7686 } else {
7687 Int64Type = SignedLong;
7688 }
Daniel Sanders4672af62016-05-27 11:51:02 +00007689 IntMaxType = Int64Type;
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007690 LongWidth = LongAlign = 64;
7691 PointerWidth = PointerAlign = 64;
7692 PtrDiffType = SignedLong;
7693 SizeType = UnsignedLong;
Daniel Sanders4672af62016-05-27 11:51:02 +00007694 }
7695
7696 void setN32ABITypes() {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007697 setN32N64ABITypes();
Daniel Sanders4672af62016-05-27 11:51:02 +00007698 Int64Type = SignedLongLong;
7699 IntMaxType = Int64Type;
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007700 LongWidth = LongAlign = 32;
7701 PointerWidth = PointerAlign = 32;
7702 PtrDiffType = SignedInt;
7703 SizeType = UnsignedInt;
Daniel Sanders4672af62016-05-27 11:51:02 +00007704 }
7705
Craig Topper3164f332014-03-11 03:39:26 +00007706 bool setCPU(const std::string &Name) override {
Eric Christopher0b26a612010-03-02 02:41:08 +00007707 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007708 return llvm::StringSwitch<bool>(Name)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007709 .Case("mips1", true)
7710 .Case("mips2", true)
Simon Atanasyan26610c52014-07-04 12:36:56 +00007711 .Case("mips3", true)
7712 .Case("mips4", true)
7713 .Case("mips5", true)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007714 .Case("mips32", true)
7715 .Case("mips32r2", true)
7716 .Case("mips32r3", true)
7717 .Case("mips32r5", true)
7718 .Case("mips32r6", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007719 .Case("mips64", true)
7720 .Case("mips64r2", true)
Simon Atanasyan162feb52015-02-20 23:37:40 +00007721 .Case("mips64r3", true)
7722 .Case("mips64r5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007723 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00007724 .Case("octeon", true)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007725 .Case("p5600", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007726 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00007727 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00007728 const std::string& getCPU() const { return CPU; }
Eric Christopher8c47b422015-10-09 18:39:55 +00007729 bool
7730 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7731 StringRef CPU,
7732 const std::vector<std::string> &FeaturesVec) const override {
Bhushan D. Attardebacb988732016-03-04 06:56:29 +00007733 if (CPU.empty())
7734 CPU = getCPU();
Simon Atanasyan4e16a422014-07-04 12:37:04 +00007735 if (CPU == "octeon")
7736 Features["mips64r2"] = Features["cnmips"] = true;
7737 else
7738 Features[CPU] = true;
Eric Christopher007b0a02015-08-28 22:32:01 +00007739 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Eric Christopher0b26a612010-03-02 02:41:08 +00007740 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007741
Craig Topper3164f332014-03-11 03:39:26 +00007742 void getTargetDefines(const LangOptions &Opts,
7743 MacroBuilder &Builder) const override {
Daniel Sanders4672af62016-05-27 11:51:02 +00007744 if (BigEndian) {
7745 DefineStd(Builder, "MIPSEB", Opts);
7746 Builder.defineMacro("_MIPSEB");
7747 } else {
7748 DefineStd(Builder, "MIPSEL", Opts);
7749 Builder.defineMacro("_MIPSEL");
7750 }
7751
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007752 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00007753 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007754 if (Opts.GNUMode)
7755 Builder.defineMacro("mips");
7756
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007757 if (ABI == "o32") {
Daniel Sanders4672af62016-05-27 11:51:02 +00007758 Builder.defineMacro("__mips", "32");
7759 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
7760 } else {
7761 Builder.defineMacro("__mips", "64");
7762 Builder.defineMacro("__mips64");
7763 Builder.defineMacro("__mips64__");
7764 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
7765 }
7766
7767 const std::string ISARev = llvm::StringSwitch<std::string>(getCPU())
7768 .Cases("mips32", "mips64", "1")
7769 .Cases("mips32r2", "mips64r2", "2")
7770 .Cases("mips32r3", "mips64r3", "3")
7771 .Cases("mips32r5", "mips64r5", "5")
7772 .Cases("mips32r6", "mips64r6", "6")
7773 .Default("");
7774 if (!ISARev.empty())
7775 Builder.defineMacro("__mips_isa_rev", ISARev);
7776
7777 if (ABI == "o32") {
7778 Builder.defineMacro("__mips_o32");
7779 Builder.defineMacro("_ABIO32", "1");
7780 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
Daniel Sanders07c86542016-05-27 14:30:23 +00007781 } else if (ABI == "n32") {
Daniel Sanders4672af62016-05-27 11:51:02 +00007782 Builder.defineMacro("__mips_n32");
7783 Builder.defineMacro("_ABIN32", "2");
7784 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
7785 } else if (ABI == "n64") {
7786 Builder.defineMacro("__mips_n64");
7787 Builder.defineMacro("_ABI64", "3");
7788 Builder.defineMacro("_MIPS_SIM", "_ABI64");
7789 } else
7790 llvm_unreachable("Invalid ABI.");
7791
Simon Dardisdf827a72017-02-21 16:01:00 +00007792 if (!IsNoABICalls) {
7793 Builder.defineMacro("__mips_abicalls");
7794 if (CanUseBSDABICalls)
7795 Builder.defineMacro("__ABICALLS__");
7796 }
7797
Simon Atanasyan683535b2012-08-29 19:14:58 +00007798 Builder.defineMacro("__REGISTER_PREFIX__", "");
7799
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007800 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007801 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00007802 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007803 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007804 case SoftFloat:
7805 Builder.defineMacro("__mips_soft_float", Twine(1));
7806 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00007807 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00007808
Simon Atanasyan16071912013-04-14 14:07:30 +00007809 if (IsSingleFloat)
7810 Builder.defineMacro("__mips_single_float", Twine(1));
7811
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007812 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
7813 Builder.defineMacro("_MIPS_FPSET",
7814 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
7815
Simon Atanasyan72244b62012-07-05 16:06:06 +00007816 if (IsMips16)
7817 Builder.defineMacro("__mips16", Twine(1));
7818
Simon Atanasyan60777612013-04-14 14:07:51 +00007819 if (IsMicromips)
7820 Builder.defineMacro("__mips_micromips", Twine(1));
7821
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007822 if (IsNan2008)
7823 Builder.defineMacro("__mips_nan2008", Twine(1));
7824
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007825 switch (DspRev) {
7826 default:
7827 break;
7828 case DSP1:
7829 Builder.defineMacro("__mips_dsp_rev", Twine(1));
7830 Builder.defineMacro("__mips_dsp", Twine(1));
7831 break;
7832 case DSP2:
7833 Builder.defineMacro("__mips_dsp_rev", Twine(2));
7834 Builder.defineMacro("__mips_dspr2", Twine(1));
7835 Builder.defineMacro("__mips_dsp", Twine(1));
7836 break;
7837 }
7838
Jack Carter44ff1e52013-08-12 17:20:29 +00007839 if (HasMSA)
7840 Builder.defineMacro("__mips_msa", Twine(1));
7841
Simon Atanasyan26f19672012-04-05 19:28:31 +00007842 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
7843 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
7844 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00007845
7846 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
7847 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Daniel Sanders5176f7e2015-12-22 12:59:30 +00007848
7849 // These shouldn't be defined for MIPS-I but there's no need to check
7850 // for that since MIPS-I isn't supported.
7851 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
7852 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
7853 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007854
7855 // 32-bit MIPS processors don't have the necessary lld/scd instructions
7856 // found in 64-bit processors. In the case of O32 on a 64-bit processor,
7857 // the instructions exist but using them violates the ABI since they
7858 // require 64-bit GPRs and O32 only supports 32-bit GPRs.
7859 if (ABI == "n32" || ABI == "n64")
Daniel Sanders4672af62016-05-27 11:51:02 +00007860 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007861 }
7862
Craig Topper6c03a542015-10-19 04:51:35 +00007863 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7864 return llvm::makeArrayRef(BuiltinInfo,
7865 clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin);
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007866 }
Craig Topper3164f332014-03-11 03:39:26 +00007867 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00007868 return llvm::StringSwitch<bool>(Feature)
7869 .Case("mips", true)
7870 .Case("fp64", HasFP64)
7871 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00007872 }
Craig Topper3164f332014-03-11 03:39:26 +00007873 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00007874 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007875 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007876 ArrayRef<const char *> getGCCRegNames() const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00007877 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00007878 // CPU register names
7879 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007880 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
7881 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
7882 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00007883 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
7884 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007885 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
7886 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
7887 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
7888 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00007889 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007890 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Hrvoje Varga14c42ee2016-03-29 12:46:16 +00007891 "$fcc5","$fcc6","$fcc7","$ac1hi","$ac1lo","$ac2hi","$ac2lo",
7892 "$ac3hi","$ac3lo",
Daniel Sanders8b59af12013-11-12 12:56:01 +00007893 // MSA register names
7894 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
7895 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
7896 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
7897 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
7898 // MSA control register names
7899 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
7900 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007901 };
Craig Topperf054e3a2015-10-19 03:52:27 +00007902 return llvm::makeArrayRef(GCCRegNames);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007903 }
Craig Topper3164f332014-03-11 03:39:26 +00007904 bool validateAsmConstraint(const char *&Name,
7905 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007906 switch (*Name) {
7907 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00007908 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007909 case 'r': // CPU registers.
7910 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00007911 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007912 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00007913 case 'c': // $25 for indirect jumps
7914 case 'l': // lo register
7915 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007916 Info.setAllowsRegister();
7917 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00007918 case 'I': // Signed 16-bit constant
7919 case 'J': // Integer 0
7920 case 'K': // Unsigned 16-bit constant
7921 case 'L': // Signed 32-bit constant, lower 16-bit zeros (for lui)
7922 case 'M': // Constants not loadable via lui, addiu, or ori
7923 case 'N': // Constant -1 to -65535
7924 case 'O': // A signed 15-bit constant
7925 case 'P': // A constant between 1 go 65535
7926 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00007927 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00007928 Info.setAllowsMemory();
7929 return true;
Daniel Sanders48fa39e2015-03-30 13:47:23 +00007930 case 'Z':
7931 if (Name[1] == 'C') { // An address usable by ll, and sc.
7932 Info.setAllowsMemory();
7933 Name++; // Skip over 'Z'.
7934 return true;
7935 }
7936 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007937 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007938 }
7939
Daniel Sanders48fa39e2015-03-30 13:47:23 +00007940 std::string convertConstraint(const char *&Constraint) const override {
7941 std::string R;
7942 switch (*Constraint) {
7943 case 'Z': // Two-character constraint; add "^" hint for later parsing.
7944 if (Constraint[1] == 'C') {
7945 R = std::string("^") + std::string(Constraint, 2);
7946 Constraint++;
7947 return R;
7948 }
7949 break;
7950 }
7951 return TargetInfo::convertConstraint(Constraint);
7952 }
7953
Craig Topper3164f332014-03-11 03:39:26 +00007954 const char *getClobbers() const override {
Toma Tabacucfab40f2015-01-12 14:41:30 +00007955 // In GCC, $1 is not widely used in generated code (it's used only in a few
7956 // specific situations), so there is no real need for users to add it to
7957 // the clobbers list if they want to use it in their inline assembly code.
7958 //
7959 // In LLVM, $1 is treated as a normal GPR and is always allocatable during
7960 // code generation, so using it in inline assembly without adding it to the
7961 // clobbers list can cause conflicts between the inline assembly code and
7962 // the surrounding generated code.
7963 //
7964 // Another problem is that LLVM is allowed to choose $1 for inline assembly
7965 // operands, which will conflict with the ".set at" assembler option (which
7966 // we use only for inline assembly, in order to maintain compatibility with
7967 // GCC) and will also conflict with the user's usage of $1.
7968 //
7969 // The easiest way to avoid these conflicts and keep $1 as an allocatable
7970 // register for generated code is to automatically clobber $1 for all inline
7971 // assembly code.
7972 //
7973 // FIXME: We should automatically clobber $1 only for inline assembly code
7974 // which actually uses it. This would allow LLVM to use $1 for inline
7975 // assembly operands if the user's assembly code doesn't use it.
Toma Tabacu99411952014-12-17 12:02:58 +00007976 return "~{$1}";
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007977 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007978
Craig Topper3164f332014-03-11 03:39:26 +00007979 bool handleTargetFeatures(std::vector<std::string> &Features,
7980 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00007981 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00007982 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007983 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00007984 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007985 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007986 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007987 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007988
Eric Christopher610fe112015-08-26 08:21:55 +00007989 for (const auto &Feature : Features) {
7990 if (Feature == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00007991 IsSingleFloat = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007992 else if (Feature == "+soft-float")
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007993 FloatABI = SoftFloat;
Eric Christopher610fe112015-08-26 08:21:55 +00007994 else if (Feature == "+mips16")
Simon Atanasyan72244b62012-07-05 16:06:06 +00007995 IsMips16 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007996 else if (Feature == "+micromips")
Simon Atanasyan60777612013-04-14 14:07:51 +00007997 IsMicromips = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007998 else if (Feature == "+dsp")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007999 DspRev = std::max(DspRev, DSP1);
Eric Christopher610fe112015-08-26 08:21:55 +00008000 else if (Feature == "+dspr2")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00008001 DspRev = std::max(DspRev, DSP2);
Eric Christopher610fe112015-08-26 08:21:55 +00008002 else if (Feature == "+msa")
Jack Carter44ff1e52013-08-12 17:20:29 +00008003 HasMSA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00008004 else if (Feature == "+fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00008005 HasFP64 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00008006 else if (Feature == "-fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00008007 HasFP64 = false;
Eric Christopher610fe112015-08-26 08:21:55 +00008008 else if (Feature == "+nan2008")
Simon Atanasyan22127ce2013-09-24 09:09:16 +00008009 IsNan2008 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00008010 else if (Feature == "-nan2008")
Daniel Sanders9500d2d2014-07-09 13:56:23 +00008011 IsNan2008 = false;
Simon Dardisdf827a72017-02-21 16:01:00 +00008012 else if (Feature == "+noabicalls")
8013 IsNoABICalls = true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00008014 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00008015
James Y Knightb214cbc2016-03-04 19:00:41 +00008016 setDataLayout();
Akira Hatanaka9064e362013-10-29 18:30:33 +00008017
Rafael Espindolaeb265472013-08-21 21:59:03 +00008018 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00008019 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00008020
Craig Topper3164f332014-03-11 03:39:26 +00008021 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00008022 if (RegNo == 0) return 4;
8023 if (RegNo == 1) return 5;
8024 return -1;
8025 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00008026
8027 bool isCLZForZeroUndef() const override { return false; }
Daniel Sanders4672af62016-05-27 11:51:02 +00008028
8029 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8030 static const TargetInfo::GCCRegAlias O32RegAliases[] = {
8031 {{"at"}, "$1"}, {{"v0"}, "$2"}, {{"v1"}, "$3"},
8032 {{"a0"}, "$4"}, {{"a1"}, "$5"}, {{"a2"}, "$6"},
8033 {{"a3"}, "$7"}, {{"t0"}, "$8"}, {{"t1"}, "$9"},
8034 {{"t2"}, "$10"}, {{"t3"}, "$11"}, {{"t4"}, "$12"},
8035 {{"t5"}, "$13"}, {{"t6"}, "$14"}, {{"t7"}, "$15"},
8036 {{"s0"}, "$16"}, {{"s1"}, "$17"}, {{"s2"}, "$18"},
8037 {{"s3"}, "$19"}, {{"s4"}, "$20"}, {{"s5"}, "$21"},
8038 {{"s6"}, "$22"}, {{"s7"}, "$23"}, {{"t8"}, "$24"},
8039 {{"t9"}, "$25"}, {{"k0"}, "$26"}, {{"k1"}, "$27"},
8040 {{"gp"}, "$28"}, {{"sp", "$sp"}, "$29"}, {{"fp", "$fp"}, "$30"},
8041 {{"ra"}, "$31"}};
8042 static const TargetInfo::GCCRegAlias NewABIRegAliases[] = {
8043 {{"at"}, "$1"}, {{"v0"}, "$2"}, {{"v1"}, "$3"},
8044 {{"a0"}, "$4"}, {{"a1"}, "$5"}, {{"a2"}, "$6"},
8045 {{"a3"}, "$7"}, {{"a4"}, "$8"}, {{"a5"}, "$9"},
8046 {{"a6"}, "$10"}, {{"a7"}, "$11"}, {{"t0"}, "$12"},
8047 {{"t1"}, "$13"}, {{"t2"}, "$14"}, {{"t3"}, "$15"},
8048 {{"s0"}, "$16"}, {{"s1"}, "$17"}, {{"s2"}, "$18"},
8049 {{"s3"}, "$19"}, {{"s4"}, "$20"}, {{"s5"}, "$21"},
8050 {{"s6"}, "$22"}, {{"s7"}, "$23"}, {{"t8"}, "$24"},
8051 {{"t9"}, "$25"}, {{"k0"}, "$26"}, {{"k1"}, "$27"},
8052 {{"gp"}, "$28"}, {{"sp", "$sp"}, "$29"}, {{"fp", "$fp"}, "$30"},
8053 {{"ra"}, "$31"}};
Daniel Sanders26a56ad2016-06-06 09:07:08 +00008054 if (ABI == "o32")
Daniel Sanders4672af62016-05-27 11:51:02 +00008055 return llvm::makeArrayRef(O32RegAliases);
8056 return llvm::makeArrayRef(NewABIRegAliases);
8057 }
8058
8059 bool hasInt128Type() const override {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00008060 return ABI == "n32" || ABI == "n64";
Daniel Sanders4672af62016-05-27 11:51:02 +00008061 }
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00008062
8063 bool validateTarget(DiagnosticsEngine &Diags) const override {
8064 // FIXME: It's valid to use O32 on a 64-bit CPU but the backend can't handle
8065 // this yet. It's better to fail here than on the backend assertion.
8066 if (processorSupportsGPR64() && ABI == "o32") {
8067 Diags.Report(diag::err_target_unsupported_abi) << ABI << CPU;
8068 return false;
8069 }
8070
8071 // 64-bit ABI's require 64-bit CPU's.
8072 if (!processorSupportsGPR64() && (ABI == "n32" || ABI == "n64")) {
8073 Diags.Report(diag::err_target_unsupported_abi) << ABI << CPU;
8074 return false;
8075 }
8076
8077 // FIXME: It's valid to use O32 on a mips64/mips64el triple but the backend
8078 // can't handle this yet. It's better to fail here than on the
8079 // backend assertion.
8080 if ((getTriple().getArch() == llvm::Triple::mips64 ||
8081 getTriple().getArch() == llvm::Triple::mips64el) &&
8082 ABI == "o32") {
8083 Diags.Report(diag::err_target_unsupported_abi_for_triple)
8084 << ABI << getTriple().str();
8085 return false;
8086 }
8087
8088 // FIXME: It's valid to use N32/N64 on a mips/mipsel triple but the backend
8089 // can't handle this yet. It's better to fail here than on the
8090 // backend assertion.
8091 if ((getTriple().getArch() == llvm::Triple::mips ||
8092 getTriple().getArch() == llvm::Triple::mipsel) &&
8093 (ABI == "n32" || ABI == "n64")) {
8094 Diags.Report(diag::err_target_unsupported_abi_for_triple)
8095 << ABI << getTriple().str();
8096 return false;
8097 }
8098
8099 return true;
8100 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008101};
8102
Daniel Sanders4672af62016-05-27 11:51:02 +00008103const Builtin::Info MipsTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00008104#define BUILTIN(ID, TYPE, ATTRS) \
8105 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
8106#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
8107 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00008108#include "clang/Basic/BuiltinsMips.def"
8109};
8110
Ivan Krasindd7403e2011-08-24 20:22:22 +00008111class PNaClTargetInfo : public TargetInfo {
8112public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008113 PNaClTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8114 : TargetInfo(Triple) {
Ivan Krasindd7403e2011-08-24 20:22:22 +00008115 this->LongAlign = 32;
8116 this->LongWidth = 32;
8117 this->PointerAlign = 32;
8118 this->PointerWidth = 32;
8119 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00008120 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00008121 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00008122 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00008123 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00008124 this->SizeType = TargetInfo::UnsignedInt;
8125 this->PtrDiffType = TargetInfo::SignedInt;
8126 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00008127 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00008128 }
8129
Craig Toppere6f17d02014-03-11 04:07:52 +00008130 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00008131 Builder.defineMacro("__le32__");
8132 Builder.defineMacro("__pnacl__");
8133 }
Craig Topper3164f332014-03-11 03:39:26 +00008134 void getTargetDefines(const LangOptions &Opts,
8135 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00008136 getArchDefines(Opts, Builder);
8137 }
Craig Topper3164f332014-03-11 03:39:26 +00008138 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00008139 return Feature == "pnacl";
8140 }
Craig Topper6c03a542015-10-19 04:51:35 +00008141 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Craig Topper3164f332014-03-11 03:39:26 +00008142 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00008143 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00008144 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008145 ArrayRef<const char *> getGCCRegNames() const override;
8146 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00008147 bool validateAsmConstraint(const char *&Name,
8148 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00008149 return false;
8150 }
8151
Craig Topper3164f332014-03-11 03:39:26 +00008152 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00008153 return "";
8154 }
8155};
8156
Craig Topperf054e3a2015-10-19 03:52:27 +00008157ArrayRef<const char *> PNaClTargetInfo::getGCCRegNames() const {
8158 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00008159}
8160
Craig Topperf054e3a2015-10-19 03:52:27 +00008161ArrayRef<TargetInfo::GCCRegAlias> PNaClTargetInfo::getGCCRegAliases() const {
8162 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00008163}
Ivan Krasindd7403e2011-08-24 20:22:22 +00008164
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008165// We attempt to use PNaCl (le32) frontend and Mips32EL backend.
Daniel Sanders4672af62016-05-27 11:51:02 +00008166class NaClMips32TargetInfo : public MipsTargetInfo {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008167public:
Daniel Sanders4672af62016-05-27 11:51:02 +00008168 NaClMips32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8169 : MipsTargetInfo(Triple, Opts) {}
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008170
8171 BuiltinVaListKind getBuiltinVaListKind() const override {
8172 return TargetInfo::PNaClABIBuiltinVaList;
8173 }
8174};
8175
JF Bastien643817d2014-09-12 17:52:47 +00008176class Le64TargetInfo : public TargetInfo {
8177 static const Builtin::Info BuiltinInfo[];
8178
8179public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008180 Le64TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
8181 : TargetInfo(Triple) {
JF Bastien643817d2014-09-12 17:52:47 +00008182 NoAsmVariants = true;
8183 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
8184 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00008185 resetDataLayout("e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128");
JF Bastien643817d2014-09-12 17:52:47 +00008186 }
8187
8188 void getTargetDefines(const LangOptions &Opts,
8189 MacroBuilder &Builder) const override {
Saleem Abdulrasool56027092017-02-07 19:00:06 +00008190 DefineStd(Builder, "unix", Opts);
JF Bastien643817d2014-09-12 17:52:47 +00008191 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
8192 Builder.defineMacro("__ELF__");
8193 }
Craig Topper6c03a542015-10-19 04:51:35 +00008194 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
8195 return llvm::makeArrayRef(BuiltinInfo,
8196 clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin);
JF Bastien643817d2014-09-12 17:52:47 +00008197 }
8198 BuiltinVaListKind getBuiltinVaListKind() const override {
8199 return TargetInfo::PNaClABIBuiltinVaList;
8200 }
8201 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00008202 ArrayRef<const char *> getGCCRegNames() const override {
8203 return None;
JF Bastien643817d2014-09-12 17:52:47 +00008204 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008205 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8206 return None;
JF Bastien643817d2014-09-12 17:52:47 +00008207 }
8208 bool validateAsmConstraint(const char *&Name,
8209 TargetInfo::ConstraintInfo &Info) const override {
8210 return false;
8211 }
8212
8213 bool hasProtectedVisibility() const override { return false; }
JF Bastien643817d2014-09-12 17:52:47 +00008214};
Dan Gohmanc2853072015-09-03 22:51:53 +00008215
8216class WebAssemblyTargetInfo : public TargetInfo {
8217 static const Builtin::Info BuiltinInfo[];
8218
8219 enum SIMDEnum {
8220 NoSIMD,
8221 SIMD128,
8222 } SIMDLevel;
8223
8224public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008225 explicit WebAssemblyTargetInfo(const llvm::Triple &T, const TargetOptions &)
Dan Gohmanc2853072015-09-03 22:51:53 +00008226 : TargetInfo(T), SIMDLevel(NoSIMD) {
Dan Gohmanc2853072015-09-03 22:51:53 +00008227 NoAsmVariants = true;
8228 SuitableAlign = 128;
8229 LargeArrayMinWidth = 128;
8230 LargeArrayAlign = 128;
8231 SimdDefaultAlign = 128;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00008232 SigAtomicType = SignedLong;
Dan Gohman6db46402015-11-10 21:01:46 +00008233 LongDoubleWidth = LongDoubleAlign = 128;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00008234 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Derek Schuffacdc8e62016-09-01 22:38:37 +00008235 SizeType = UnsignedInt;
8236 PtrDiffType = SignedInt;
8237 IntPtrType = SignedInt;
Dan Gohmanc2853072015-09-03 22:51:53 +00008238 }
8239
8240protected:
8241 void getTargetDefines(const LangOptions &Opts,
8242 MacroBuilder &Builder) const override {
8243 defineCPUMacros(Builder, "wasm", /*Tuning=*/false);
8244 if (SIMDLevel >= SIMD128)
8245 Builder.defineMacro("__wasm_simd128__");
8246 }
8247
8248private:
Eric Christopher8c47b422015-10-09 18:39:55 +00008249 bool
8250 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
8251 StringRef CPU,
8252 const std::vector<std::string> &FeaturesVec) const override {
Dan Gohmanc2853072015-09-03 22:51:53 +00008253 if (CPU == "bleeding-edge")
8254 Features["simd128"] = true;
8255 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
8256 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00008257 bool hasFeature(StringRef Feature) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00008258 return llvm::StringSwitch<bool>(Feature)
8259 .Case("simd128", SIMDLevel >= SIMD128)
8260 .Default(false);
8261 }
8262 bool handleTargetFeatures(std::vector<std::string> &Features,
Hans Wennborg7eb54642015-09-10 17:07:54 +00008263 DiagnosticsEngine &Diags) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00008264 for (const auto &Feature : Features) {
8265 if (Feature == "+simd128") {
8266 SIMDLevel = std::max(SIMDLevel, SIMD128);
8267 continue;
8268 }
8269 if (Feature == "-simd128") {
8270 SIMDLevel = std::min(SIMDLevel, SIMDEnum(SIMD128 - 1));
8271 continue;
8272 }
8273
8274 Diags.Report(diag::err_opt_not_valid_with_opt) << Feature
8275 << "-target-feature";
8276 return false;
8277 }
8278 return true;
8279 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00008280 bool setCPU(const std::string &Name) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00008281 return llvm::StringSwitch<bool>(Name)
8282 .Case("mvp", true)
8283 .Case("bleeding-edge", true)
8284 .Case("generic", true)
8285 .Default(false);
8286 }
Craig Topper6c03a542015-10-19 04:51:35 +00008287 ArrayRef<Builtin::Info> getTargetBuiltins() const final {
8288 return llvm::makeArrayRef(BuiltinInfo,
8289 clang::WebAssembly::LastTSBuiltin - Builtin::FirstTSBuiltin);
Dan Gohmanc2853072015-09-03 22:51:53 +00008290 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00008291 BuiltinVaListKind getBuiltinVaListKind() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00008292 return VoidPtrBuiltinVaList;
8293 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008294 ArrayRef<const char *> getGCCRegNames() const final {
8295 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00008296 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008297 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const final {
8298 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00008299 }
8300 bool
8301 validateAsmConstraint(const char *&Name,
Hans Wennborg7eb54642015-09-10 17:07:54 +00008302 TargetInfo::ConstraintInfo &Info) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00008303 return false;
8304 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00008305 const char *getClobbers() const final { return ""; }
8306 bool isCLZForZeroUndef() const final { return false; }
8307 bool hasInt128Type() const final { return true; }
Dan Gohmanab0e31f2015-09-14 21:49:41 +00008308 IntType getIntTypeByWidth(unsigned BitWidth,
8309 bool IsSigned) const final {
8310 // WebAssembly prefers long long for explicitly 64-bit integers.
8311 return BitWidth == 64 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
8312 : TargetInfo::getIntTypeByWidth(BitWidth, IsSigned);
8313 }
8314 IntType getLeastIntTypeByWidth(unsigned BitWidth,
8315 bool IsSigned) const final {
8316 // WebAssembly uses long long for int_least64_t and int_fast64_t.
8317 return BitWidth == 64
8318 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
8319 : TargetInfo::getLeastIntTypeByWidth(BitWidth, IsSigned);
8320 }
Dan Gohmanc2853072015-09-03 22:51:53 +00008321};
8322
8323const Builtin::Info WebAssemblyTargetInfo::BuiltinInfo[] = {
8324#define BUILTIN(ID, TYPE, ATTRS) \
8325 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
8326#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
8327 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
8328#include "clang/Basic/BuiltinsWebAssembly.def"
8329};
8330
8331class WebAssembly32TargetInfo : public WebAssemblyTargetInfo {
8332public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008333 explicit WebAssembly32TargetInfo(const llvm::Triple &T,
8334 const TargetOptions &Opts)
8335 : WebAssemblyTargetInfo(T, Opts) {
Dan Gohmanf1c34e62015-09-14 21:56:37 +00008336 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
James Y Knightb214cbc2016-03-04 19:00:41 +00008337 resetDataLayout("e-m:e-p:32:32-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00008338 }
8339
8340protected:
8341 void getTargetDefines(const LangOptions &Opts,
8342 MacroBuilder &Builder) const override {
8343 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
8344 defineCPUMacros(Builder, "wasm32", /*Tuning=*/false);
8345 }
8346};
8347
8348class WebAssembly64TargetInfo : public WebAssemblyTargetInfo {
8349public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008350 explicit WebAssembly64TargetInfo(const llvm::Triple &T,
8351 const TargetOptions &Opts)
8352 : WebAssemblyTargetInfo(T, Opts) {
Dan Gohmanc2853072015-09-03 22:51:53 +00008353 LongAlign = LongWidth = 64;
8354 PointerAlign = PointerWidth = 64;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00008355 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Derek Schuffacdc8e62016-09-01 22:38:37 +00008356 SizeType = UnsignedLong;
8357 PtrDiffType = SignedLong;
8358 IntPtrType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00008359 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00008360 }
8361
8362protected:
8363 void getTargetDefines(const LangOptions &Opts,
8364 MacroBuilder &Builder) const override {
8365 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
8366 defineCPUMacros(Builder, "wasm64", /*Tuning=*/false);
8367 }
8368};
8369
JF Bastien643817d2014-09-12 17:52:47 +00008370const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
8371#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00008372 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
JF Bastien643817d2014-09-12 17:52:47 +00008373#include "clang/Basic/BuiltinsLe64.def"
8374};
8375
Eric Christopherc48497a2015-09-18 21:26:24 +00008376static const unsigned SPIRAddrSpaceMap[] = {
8377 1, // opencl_global
8378 3, // opencl_local
8379 2, // opencl_constant
8380 4, // opencl_generic
8381 0, // cuda_device
8382 0, // cuda_constant
8383 0 // cuda_shared
8384};
8385class SPIRTargetInfo : public TargetInfo {
8386public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008387 SPIRTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
8388 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00008389 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
8390 "SPIR target must use unknown OS");
8391 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
8392 "SPIR target must use unknown environment type");
Eric Christopherc48497a2015-09-18 21:26:24 +00008393 TLSSupported = false;
8394 LongWidth = LongAlign = 64;
8395 AddrSpaceMap = &SPIRAddrSpaceMap;
8396 UseAddrSpaceMapMangling = true;
8397 // Define available target features
8398 // These must be defined in sorted order!
8399 NoAsmVariants = true;
8400 }
8401 void getTargetDefines(const LangOptions &Opts,
8402 MacroBuilder &Builder) const override {
8403 DefineStd(Builder, "SPIR", Opts);
8404 }
8405 bool hasFeature(StringRef Feature) const override {
8406 return Feature == "spir";
8407 }
Craig Topper3164f332014-03-11 03:39:26 +00008408
Craig Topper6c03a542015-10-19 04:51:35 +00008409 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00008410 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00008411 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00008412 bool validateAsmConstraint(const char *&Name,
8413 TargetInfo::ConstraintInfo &info) const override {
8414 return true;
8415 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008416 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8417 return None;
8418 }
Eric Christopherc48497a2015-09-18 21:26:24 +00008419 BuiltinVaListKind getBuiltinVaListKind() const override {
8420 return TargetInfo::VoidPtrBuiltinVaList;
8421 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00008422
Eric Christopherc48497a2015-09-18 21:26:24 +00008423 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Nikolay Haustov8c6538b2016-06-30 09:06:33 +00008424 return (CC == CC_SpirFunction || CC == CC_OpenCLKernel) ? CCCR_OK
8425 : CCCR_Warning;
Eric Christopherc48497a2015-09-18 21:26:24 +00008426 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00008427
Eric Christopherc48497a2015-09-18 21:26:24 +00008428 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
8429 return CC_SpirFunction;
8430 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00008431
8432 void setSupportedOpenCLOpts() override {
8433 // Assume all OpenCL extensions and optional core features are supported
8434 // for SPIR since it is a generic target.
Yaxun Liu5b746652016-12-18 05:18:55 +00008435 getSupportedOpenCLOpts().supportAll();
Yaxun Liu39cf40f2016-05-16 17:06:34 +00008436 }
Eric Christopherc48497a2015-09-18 21:26:24 +00008437};
Guy Benyeib798fc92012-12-11 21:38:14 +00008438
Eric Christopherc48497a2015-09-18 21:26:24 +00008439class SPIR32TargetInfo : public SPIRTargetInfo {
8440public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008441 SPIR32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8442 : SPIRTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00008443 PointerWidth = PointerAlign = 32;
8444 SizeType = TargetInfo::UnsignedInt;
8445 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +00008446 resetDataLayout("e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
8447 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00008448 }
8449 void getTargetDefines(const LangOptions &Opts,
8450 MacroBuilder &Builder) const override {
8451 DefineStd(Builder, "SPIR32", Opts);
8452 }
8453};
Guy Benyeib798fc92012-12-11 21:38:14 +00008454
Eric Christopherc48497a2015-09-18 21:26:24 +00008455class SPIR64TargetInfo : public SPIRTargetInfo {
8456public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008457 SPIR64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8458 : SPIRTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00008459 PointerWidth = PointerAlign = 64;
8460 SizeType = TargetInfo::UnsignedLong;
8461 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00008462 resetDataLayout("e-i64:64-v16:16-v24:32-v32:32-v48:64-"
8463 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00008464 }
8465 void getTargetDefines(const LangOptions &Opts,
8466 MacroBuilder &Builder) const override {
8467 DefineStd(Builder, "SPIR64", Opts);
8468 }
8469};
Guy Benyeib798fc92012-12-11 21:38:14 +00008470
Robert Lytton0e076492013-08-13 09:43:10 +00008471class XCoreTargetInfo : public TargetInfo {
8472 static const Builtin::Info BuiltinInfo[];
8473public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008474 XCoreTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
8475 : TargetInfo(Triple) {
Robert Lytton0e076492013-08-13 09:43:10 +00008476 NoAsmVariants = true;
8477 LongLongAlign = 32;
8478 SuitableAlign = 32;
8479 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00008480 SizeType = UnsignedInt;
8481 PtrDiffType = SignedInt;
8482 IntPtrType = SignedInt;
8483 WCharType = UnsignedChar;
8484 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00008485 UseZeroLengthBitfieldAlignment = true;
James Y Knightb214cbc2016-03-04 19:00:41 +00008486 resetDataLayout("e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32"
8487 "-f64:32-a:0:32-n32");
Robert Lytton0e076492013-08-13 09:43:10 +00008488 }
Craig Topper3164f332014-03-11 03:39:26 +00008489 void getTargetDefines(const LangOptions &Opts,
8490 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008491 Builder.defineMacro("__XS1B__");
8492 }
Craig Topper6c03a542015-10-19 04:51:35 +00008493 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
8494 return llvm::makeArrayRef(BuiltinInfo,
8495 clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin);
Robert Lytton0e076492013-08-13 09:43:10 +00008496 }
Craig Topper3164f332014-03-11 03:39:26 +00008497 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008498 return TargetInfo::VoidPtrBuiltinVaList;
8499 }
Craig Topper3164f332014-03-11 03:39:26 +00008500 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008501 return "";
8502 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008503 ArrayRef<const char *> getGCCRegNames() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008504 static const char * const GCCRegNames[] = {
8505 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
8506 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
8507 };
Craig Topperf054e3a2015-10-19 03:52:27 +00008508 return llvm::makeArrayRef(GCCRegNames);
Robert Lytton0e076492013-08-13 09:43:10 +00008509 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008510 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8511 return None;
Robert Lytton0e076492013-08-13 09:43:10 +00008512 }
Craig Topper3164f332014-03-11 03:39:26 +00008513 bool validateAsmConstraint(const char *&Name,
8514 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008515 return false;
8516 }
Craig Topper3164f332014-03-11 03:39:26 +00008517 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00008518 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
8519 return (RegNo < 2)? RegNo : -1;
8520 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00008521 bool allowsLargerPreferedTypeAlignment() const override {
8522 return false;
8523 }
Robert Lytton0e076492013-08-13 09:43:10 +00008524};
8525
8526const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00008527#define BUILTIN(ID, TYPE, ATTRS) \
8528 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
8529#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
8530 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Robert Lytton0e076492013-08-13 09:43:10 +00008531#include "clang/Basic/BuiltinsXCore.def"
8532};
Robert Lytton0e076492013-08-13 09:43:10 +00008533
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008534// x86_32 Android target
8535class AndroidX86_32TargetInfo : public LinuxTargetInfo<X86_32TargetInfo> {
8536public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008537 AndroidX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8538 : LinuxTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008539 SuitableAlign = 32;
8540 LongDoubleWidth = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00008541 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008542 }
8543};
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008544
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008545// x86_64 Android target
8546class AndroidX86_64TargetInfo : public LinuxTargetInfo<X86_64TargetInfo> {
8547public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008548 AndroidX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8549 : LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Stephan Bergmann17c7f702016-12-14 11:57:17 +00008550 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008551 }
Chih-Hung Hsieh0b0eeaa2015-07-24 18:12:54 +00008552
8553 bool useFloat128ManglingForLongDouble() const override {
8554 return true;
8555 }
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008556};
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008557
8558// 32-bit RenderScript is armv7 with width and align of 'long' set to 8-bytes
8559class RenderScript32TargetInfo : public ARMleTargetInfo {
8560public:
8561 RenderScript32TargetInfo(const llvm::Triple &Triple,
8562 const TargetOptions &Opts)
8563 : ARMleTargetInfo(llvm::Triple("armv7", Triple.getVendorName(),
8564 Triple.getOSName(),
8565 Triple.getEnvironmentName()),
8566 Opts) {
Pirama Arumuga Nainarbb846a32016-07-27 19:01:51 +00008567 IsRenderScriptTarget = true;
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008568 LongWidth = LongAlign = 64;
8569 }
8570 void getTargetDefines(const LangOptions &Opts,
8571 MacroBuilder &Builder) const override {
8572 Builder.defineMacro("__RENDERSCRIPT__");
8573 ARMleTargetInfo::getTargetDefines(Opts, Builder);
8574 }
8575};
8576
8577// 64-bit RenderScript is aarch64
8578class RenderScript64TargetInfo : public AArch64leTargetInfo {
8579public:
8580 RenderScript64TargetInfo(const llvm::Triple &Triple,
8581 const TargetOptions &Opts)
8582 : AArch64leTargetInfo(llvm::Triple("aarch64", Triple.getVendorName(),
8583 Triple.getOSName(),
8584 Triple.getEnvironmentName()),
Pirama Arumuga Nainarbb846a32016-07-27 19:01:51 +00008585 Opts) {
8586 IsRenderScriptTarget = true;
8587 }
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008588
8589 void getTargetDefines(const LangOptions &Opts,
8590 MacroBuilder &Builder) const override {
8591 Builder.defineMacro("__RENDERSCRIPT__");
8592 AArch64leTargetInfo::getTargetDefines(Opts, Builder);
8593 }
8594};
8595
Dylan McKayecb6e7b2017-02-07 06:04:18 +00008596/// Information about a specific microcontroller.
8597struct MCUInfo {
8598 const char *Name;
8599 const char *DefineName;
8600};
8601
8602// This list should be kept up-to-date with AVRDevices.td in LLVM.
8603static ArrayRef<MCUInfo> AVRMcus = {
8604 { "at90s1200", "__AVR_AT90S1200__" },
Dylan McKay315edb02017-02-11 21:06:07 +00008605 { "attiny11", "__AVR_ATtiny11__" },
8606 { "attiny12", "__AVR_ATtiny12__" },
8607 { "attiny15", "__AVR_ATtiny15__" },
8608 { "attiny28", "__AVR_ATtiny28__" },
8609 { "at90s2313", "__AVR_AT90S2313__" },
8610 { "at90s2323", "__AVR_AT90S2323__" },
8611 { "at90s2333", "__AVR_AT90S2333__" },
8612 { "at90s2343", "__AVR_AT90S2343__" },
8613 { "attiny22", "__AVR_ATtiny22__" },
8614 { "attiny26", "__AVR_ATtiny26__" },
8615 { "at86rf401", "__AVR_AT86RF401__" },
8616 { "at90s4414", "__AVR_AT90S4414__" },
8617 { "at90s4433", "__AVR_AT90S4433__" },
8618 { "at90s4434", "__AVR_AT90S4434__" },
8619 { "at90s8515", "__AVR_AT90S8515__" },
8620 { "at90c8534", "__AVR_AT90c8534__" },
8621 { "at90s8535", "__AVR_AT90S8535__" },
8622 { "ata5272", "__AVR_ATA5272__" },
8623 { "attiny13", "__AVR_ATtiny13__" },
8624 { "attiny13a", "__AVR_ATtiny13A__" },
8625 { "attiny2313", "__AVR_ATtiny2313__" },
8626 { "attiny2313a", "__AVR_ATtiny2313A__" },
8627 { "attiny24", "__AVR_ATtiny24__" },
8628 { "attiny24a", "__AVR_ATtiny24A__" },
8629 { "attiny4313", "__AVR_ATtiny4313__" },
8630 { "attiny44", "__AVR_ATtiny44__" },
8631 { "attiny44a", "__AVR_ATtiny44A__" },
8632 { "attiny84", "__AVR_ATtiny84__" },
8633 { "attiny84a", "__AVR_ATtiny84A__" },
8634 { "attiny25", "__AVR_ATtiny25__" },
8635 { "attiny45", "__AVR_ATtiny45__" },
8636 { "attiny85", "__AVR_ATtiny85__" },
8637 { "attiny261", "__AVR_ATtiny261__" },
8638 { "attiny261a", "__AVR_ATtiny261A__" },
8639 { "attiny461", "__AVR_ATtiny461__" },
8640 { "attiny461a", "__AVR_ATtiny461A__" },
8641 { "attiny861", "__AVR_ATtiny861__" },
8642 { "attiny861a", "__AVR_ATtiny861A__" },
8643 { "attiny87", "__AVR_ATtiny87__" },
8644 { "attiny43u", "__AVR_ATtiny43U__" },
8645 { "attiny48", "__AVR_ATtiny48__" },
8646 { "attiny88", "__AVR_ATtiny88__" },
8647 { "attiny828", "__AVR_ATtiny828__" },
8648 { "at43usb355", "__AVR_AT43USB355__" },
8649 { "at76c711", "__AVR_AT76C711__" },
8650 { "atmega103", "__AVR_ATmega103__" },
8651 { "at43usb320", "__AVR_AT43USB320__" },
8652 { "attiny167", "__AVR_ATtiny167__" },
8653 { "at90usb82", "__AVR_AT90USB82__" },
8654 { "at90usb162", "__AVR_AT90USB162__" },
8655 { "ata5505", "__AVR_ATA5505__" },
8656 { "atmega8u2", "__AVR_ATmega8U2__" },
8657 { "atmega16u2", "__AVR_ATmega16U2__" },
8658 { "atmega32u2", "__AVR_ATmega32U2__" },
8659 { "attiny1634", "__AVR_ATtiny1634__" },
8660 { "atmega8", "__AVR_ATmega8__" },
8661 { "ata6289", "__AVR_ATA6289__" },
8662 { "atmega8a", "__AVR_ATmega8A__" },
8663 { "ata6285", "__AVR_ATA6285__" },
8664 { "ata6286", "__AVR_ATA6286__" },
8665 { "atmega48", "__AVR_ATmega48__" },
8666 { "atmega48a", "__AVR_ATmega48A__" },
8667 { "atmega48pa", "__AVR_ATmega48PA__" },
8668 { "atmega48p", "__AVR_ATmega48P__" },
8669 { "atmega88", "__AVR_ATmega88__" },
8670 { "atmega88a", "__AVR_ATmega88A__" },
8671 { "atmega88p", "__AVR_ATmega88P__" },
8672 { "atmega88pa", "__AVR_ATmega88PA__" },
8673 { "atmega8515", "__AVR_ATmega8515__" },
8674 { "atmega8535", "__AVR_ATmega8535__" },
8675 { "atmega8hva", "__AVR_ATmega8HVA__" },
8676 { "at90pwm1", "__AVR_AT90PWM1__" },
8677 { "at90pwm2", "__AVR_AT90PWM2__" },
8678 { "at90pwm2b", "__AVR_AT90PWM2B__" },
8679 { "at90pwm3", "__AVR_AT90PWM3__" },
8680 { "at90pwm3b", "__AVR_AT90PWM3B__" },
8681 { "at90pwm81", "__AVR_AT90PWM81__" },
8682 { "ata5790", "__AVR_ATA5790__" },
8683 { "ata5795", "__AVR_ATA5795__" },
8684 { "atmega16", "__AVR_ATmega16__" },
8685 { "atmega16a", "__AVR_ATmega16A__" },
8686 { "atmega161", "__AVR_ATmega161__" },
8687 { "atmega162", "__AVR_ATmega162__" },
8688 { "atmega163", "__AVR_ATmega163__" },
8689 { "atmega164a", "__AVR_ATmega164A__" },
8690 { "atmega164p", "__AVR_ATmega164P__" },
8691 { "atmega164pa", "__AVR_ATmega164PA__" },
8692 { "atmega165", "__AVR_ATmega165__" },
8693 { "atmega165a", "__AVR_ATmega165A__" },
8694 { "atmega165p", "__AVR_ATmega165P__" },
8695 { "atmega165pa", "__AVR_ATmega165PA__" },
8696 { "atmega168", "__AVR_ATmega168__" },
8697 { "atmega168a", "__AVR_ATmega168A__" },
8698 { "atmega168p", "__AVR_ATmega168P__" },
8699 { "atmega168pa", "__AVR_ATmega168PA__" },
8700 { "atmega169", "__AVR_ATmega169__" },
8701 { "atmega169a", "__AVR_ATmega169A__" },
8702 { "atmega169p", "__AVR_ATmega169P__" },
8703 { "atmega169pa", "__AVR_ATmega169PA__" },
8704 { "atmega32", "__AVR_ATmega32__" },
8705 { "atmega32a", "__AVR_ATmega32A__" },
8706 { "atmega323", "__AVR_ATmega323__" },
8707 { "atmega324a", "__AVR_ATmega324A__" },
8708 { "atmega324p", "__AVR_ATmega324P__" },
8709 { "atmega324pa", "__AVR_ATmega324PA__" },
8710 { "atmega325", "__AVR_ATmega325__" },
8711 { "atmega325a", "__AVR_ATmega325A__" },
8712 { "atmega325p", "__AVR_ATmega325P__" },
8713 { "atmega325pa", "__AVR_ATmega325PA__" },
8714 { "atmega3250", "__AVR_ATmega3250__" },
8715 { "atmega3250a", "__AVR_ATmega3250A__" },
8716 { "atmega3250p", "__AVR_ATmega3250P__" },
8717 { "atmega3250pa", "__AVR_ATmega3250PA__" },
8718 { "atmega328", "__AVR_ATmega328__" },
8719 { "atmega328p", "__AVR_ATmega328P__" },
8720 { "atmega329", "__AVR_ATmega329__" },
8721 { "atmega329a", "__AVR_ATmega329A__" },
8722 { "atmega329p", "__AVR_ATmega329P__" },
8723 { "atmega329pa", "__AVR_ATmega329PA__" },
8724 { "atmega3290", "__AVR_ATmega3290__" },
8725 { "atmega3290a", "__AVR_ATmega3290A__" },
8726 { "atmega3290p", "__AVR_ATmega3290P__" },
8727 { "atmega3290pa", "__AVR_ATmega3290PA__" },
8728 { "atmega406", "__AVR_ATmega406__" },
8729 { "atmega64", "__AVR_ATmega64__" },
8730 { "atmega64a", "__AVR_ATmega64A__" },
8731 { "atmega640", "__AVR_ATmega640__" },
8732 { "atmega644", "__AVR_ATmega644__" },
8733 { "atmega644a", "__AVR_ATmega644A__" },
8734 { "atmega644p", "__AVR_ATmega644P__" },
8735 { "atmega644pa", "__AVR_ATmega644PA__" },
8736 { "atmega645", "__AVR_ATmega645__" },
8737 { "atmega645a", "__AVR_ATmega645A__" },
8738 { "atmega645p", "__AVR_ATmega645P__" },
8739 { "atmega649", "__AVR_ATmega649__" },
8740 { "atmega649a", "__AVR_ATmega649A__" },
8741 { "atmega649p", "__AVR_ATmega649P__" },
8742 { "atmega6450", "__AVR_ATmega6450__" },
8743 { "atmega6450a", "__AVR_ATmega6450A__" },
8744 { "atmega6450p", "__AVR_ATmega6450P__" },
8745 { "atmega6490", "__AVR_ATmega6490__" },
8746 { "atmega6490a", "__AVR_ATmega6490A__" },
8747 { "atmega6490p", "__AVR_ATmega6490P__" },
8748 { "atmega64rfr2", "__AVR_ATmega64RFR2__" },
8749 { "atmega644rfr2", "__AVR_ATmega644RFR2__" },
8750 { "atmega16hva", "__AVR_ATmega16HVA__" },
8751 { "atmega16hva2", "__AVR_ATmega16HVA2__" },
8752 { "atmega16hvb", "__AVR_ATmega16HVB__" },
8753 { "atmega16hvbrevb", "__AVR_ATmega16HVBREVB__" },
8754 { "atmega32hvb", "__AVR_ATmega32HVB__" },
8755 { "atmega32hvbrevb", "__AVR_ATmega32HVBREVB__" },
8756 { "atmega64hve", "__AVR_ATmega64HVE__" },
8757 { "at90can32", "__AVR_AT90CAN32__" },
8758 { "at90can64", "__AVR_AT90CAN64__" },
8759 { "at90pwm161", "__AVR_AT90PWM161__" },
8760 { "at90pwm216", "__AVR_AT90PWM216__" },
8761 { "at90pwm316", "__AVR_AT90PWM316__" },
8762 { "atmega32c1", "__AVR_ATmega32C1__" },
8763 { "atmega64c1", "__AVR_ATmega64C1__" },
8764 { "atmega16m1", "__AVR_ATmega16M1__" },
8765 { "atmega32m1", "__AVR_ATmega32M1__" },
8766 { "atmega64m1", "__AVR_ATmega64M1__" },
8767 { "atmega16u4", "__AVR_ATmega16U4__" },
8768 { "atmega32u4", "__AVR_ATmega32U4__" },
8769 { "atmega32u6", "__AVR_ATmega32U6__" },
8770 { "at90usb646", "__AVR_AT90USB646__" },
8771 { "at90usb647", "__AVR_AT90USB647__" },
8772 { "at90scr100", "__AVR_AT90SCR100__" },
8773 { "at94k", "__AVR_AT94K__" },
8774 { "m3000", "__AVR_AT000__" },
8775 { "atmega128", "__AVR_ATmega128__" },
8776 { "atmega128a", "__AVR_ATmega128A__" },
8777 { "atmega1280", "__AVR_ATmega1280__" },
8778 { "atmega1281", "__AVR_ATmega1281__" },
8779 { "atmega1284", "__AVR_ATmega1284__" },
8780 { "atmega1284p", "__AVR_ATmega1284P__" },
8781 { "atmega128rfa1", "__AVR_ATmega128RFA1__" },
8782 { "atmega128rfr2", "__AVR_ATmega128RFR2__" },
8783 { "atmega1284rfr2", "__AVR_ATmega1284RFR2__" },
8784 { "at90can128", "__AVR_AT90CAN128__" },
8785 { "at90usb1286", "__AVR_AT90USB1286__" },
8786 { "at90usb1287", "__AVR_AT90USB1287__" },
8787 { "atmega2560", "__AVR_ATmega2560__" },
8788 { "atmega2561", "__AVR_ATmega2561__" },
8789 { "atmega256rfr2", "__AVR_ATmega256RFR2__" },
8790 { "atmega2564rfr2", "__AVR_ATmega2564RFR2__" },
8791 { "atxmega16a4", "__AVR_ATxmega16A4__" },
8792 { "atxmega16a4u", "__AVR_ATxmega16a4U__" },
8793 { "atxmega16c4", "__AVR_ATxmega16C4__" },
8794 { "atxmega16d4", "__AVR_ATxmega16D4__" },
8795 { "atxmega32a4", "__AVR_ATxmega32A4__" },
8796 { "atxmega32a4u", "__AVR_ATxmega32A4U__" },
8797 { "atxmega32c4", "__AVR_ATxmega32C4__" },
8798 { "atxmega32d4", "__AVR_ATxmega32D4__" },
8799 { "atxmega32e5", "__AVR_ATxmega32E5__" },
8800 { "atxmega16e5", "__AVR_ATxmega16E5__" },
8801 { "atxmega8e5", "__AVR_ATxmega8E5__" },
8802 { "atxmega32x1", "__AVR_ATxmega32X1__" },
8803 { "atxmega64a3", "__AVR_ATxmega64A3__" },
8804 { "atxmega64a3u", "__AVR_ATxmega64A3U__" },
8805 { "atxmega64a4u", "__AVR_ATxmega64A4U__" },
8806 { "atxmega64b1", "__AVR_ATxmega64B1__" },
8807 { "atxmega64b3", "__AVR_ATxmega64B3__" },
8808 { "atxmega64c3", "__AVR_ATxmega64C3__" },
8809 { "atxmega64d3", "__AVR_ATxmega64D3__" },
8810 { "atxmega64d4", "__AVR_ATxmega64D4__" },
8811 { "atxmega64a1", "__AVR_ATxmega64A1__" },
8812 { "atxmega64a1u", "__AVR_ATxmega64A1U__" },
8813 { "atxmega128a3", "__AVR_ATxmega128A3__" },
8814 { "atxmega128a3u", "__AVR_ATxmega128A3U__" },
8815 { "atxmega128b1", "__AVR_ATxmega128B1__" },
8816 { "atxmega128b3", "__AVR_ATxmega128B3__" },
8817 { "atxmega128c3", "__AVR_ATxmega128C3__" },
8818 { "atxmega128d3", "__AVR_ATxmega128D3__" },
8819 { "atxmega128d4", "__AVR_ATxmega128D4__" },
8820 { "atxmega192a3", "__AVR_ATxmega192A3__" },
8821 { "atxmega192a3u", "__AVR_ATxmega192A3U__" },
8822 { "atxmega192c3", "__AVR_ATxmega192C3__" },
8823 { "atxmega192d3", "__AVR_ATxmega192D3__" },
8824 { "atxmega256a3", "__AVR_ATxmega256A3__" },
8825 { "atxmega256a3u", "__AVR_ATxmega256A3U__" },
8826 { "atxmega256a3b", "__AVR_ATxmega256A3B__" },
8827 { "atxmega256a3bu", "__AVR_ATxmega256A3BU__" },
8828 { "atxmega256c3", "__AVR_ATxmega256C3__" },
8829 { "atxmega256d3", "__AVR_ATxmega256D3__" },
8830 { "atxmega384c3", "__AVR_ATxmega384C3__" },
8831 { "atxmega384d3", "__AVR_ATxmega384D3__" },
8832 { "atxmega128a1", "__AVR_ATxmega128A1__" },
8833 { "atxmega128a1u", "__AVR_ATxmega128A1U__" },
8834 { "atxmega128a4u", "__AVR_ATxmega128a4U__" },
8835 { "attiny4", "__AVR_ATtiny4__" },
8836 { "attiny5", "__AVR_ATtiny5__" },
8837 { "attiny9", "__AVR_ATtiny9__" },
8838 { "attiny10", "__AVR_ATtiny10__" },
8839 { "attiny20", "__AVR_ATtiny20__" },
8840 { "attiny40", "__AVR_ATtiny40__" },
8841 { "attiny102", "__AVR_ATtiny102__" },
8842 { "attiny104", "__AVR_ATtiny104__" },
Dylan McKayecb6e7b2017-02-07 06:04:18 +00008843};
Dylan McKay924fa3a2017-01-05 05:20:27 +00008844
8845// AVR Target
8846class AVRTargetInfo : public TargetInfo {
8847public:
8848 AVRTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
8849 : TargetInfo(Triple) {
8850 TLSSupported = false;
8851 PointerWidth = 16;
8852 PointerAlign = 8;
8853 IntWidth = 16;
8854 IntAlign = 8;
8855 LongWidth = 32;
8856 LongAlign = 8;
8857 LongLongWidth = 64;
8858 LongLongAlign = 8;
8859 SuitableAlign = 8;
8860 DefaultAlignForAttributeAligned = 8;
8861 HalfWidth = 16;
8862 HalfAlign = 8;
8863 FloatWidth = 32;
8864 FloatAlign = 8;
8865 DoubleWidth = 32;
8866 DoubleAlign = 8;
8867 DoubleFormat = &llvm::APFloat::IEEEsingle();
8868 LongDoubleWidth = 32;
8869 LongDoubleAlign = 8;
8870 LongDoubleFormat = &llvm::APFloat::IEEEsingle();
8871 SizeType = UnsignedInt;
8872 PtrDiffType = SignedInt;
8873 IntPtrType = SignedInt;
8874 Char16Type = UnsignedInt;
8875 WCharType = SignedInt;
8876 WIntType = SignedInt;
8877 Char32Type = UnsignedLong;
8878 SigAtomicType = SignedChar;
8879 resetDataLayout("e-p:16:16:16-i8:8:8-i16:16:16-i32:32:32-i64:64:64"
8880 "-f32:32:32-f64:64:64-n8");
8881 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008882
Dylan McKay924fa3a2017-01-05 05:20:27 +00008883 void getTargetDefines(const LangOptions &Opts,
8884 MacroBuilder &Builder) const override {
Dylan McKayecb6e7b2017-02-07 06:04:18 +00008885 Builder.defineMacro("AVR");
8886 Builder.defineMacro("__AVR");
Dylan McKay924fa3a2017-01-05 05:20:27 +00008887 Builder.defineMacro("__AVR__");
Dylan McKayecb6e7b2017-02-07 06:04:18 +00008888
8889 if (!this->CPU.empty()) {
8890 auto It = std::find_if(AVRMcus.begin(), AVRMcus.end(),
8891 [&](const MCUInfo &Info) { return Info.Name == this->CPU; });
8892
8893 if (It != AVRMcus.end())
8894 Builder.defineMacro(It->DefineName);
8895 }
Dylan McKay924fa3a2017-01-05 05:20:27 +00008896 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008897
Dylan McKay924fa3a2017-01-05 05:20:27 +00008898 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
8899 return None;
8900 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008901
Dylan McKay924fa3a2017-01-05 05:20:27 +00008902 BuiltinVaListKind getBuiltinVaListKind() const override {
8903 return TargetInfo::VoidPtrBuiltinVaList;
8904 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008905
Dylan McKay924fa3a2017-01-05 05:20:27 +00008906 const char *getClobbers() const override {
8907 return "";
8908 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008909
Dylan McKay924fa3a2017-01-05 05:20:27 +00008910 ArrayRef<const char *> getGCCRegNames() const override {
8911 static const char * const GCCRegNames[] = {
8912 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
8913 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
8914 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
Dylan McKay95aa2652017-01-05 07:17:46 +00008915 "r24", "r25", "X", "Y", "Z", "SP"
Dylan McKay924fa3a2017-01-05 05:20:27 +00008916 };
8917 return llvm::makeArrayRef(GCCRegNames);
8918 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008919
Dylan McKay924fa3a2017-01-05 05:20:27 +00008920 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8921 return None;
8922 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008923
Dylan McKay924fa3a2017-01-05 05:20:27 +00008924 ArrayRef<TargetInfo::AddlRegName> getGCCAddlRegNames() const override {
8925 static const TargetInfo::AddlRegName AddlRegNames[] = {
8926 { { "r26", "r27"}, 26 },
8927 { { "r28", "r29"}, 27 },
8928 { { "r30", "r31"}, 28 },
8929 { { "SPL", "SPH"}, 29 },
8930 };
8931 return llvm::makeArrayRef(AddlRegNames);
8932 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008933
Dylan McKay924fa3a2017-01-05 05:20:27 +00008934 bool validateAsmConstraint(const char *&Name,
8935 TargetInfo::ConstraintInfo &Info) const override {
Dylan McKayd31534c2017-02-06 09:01:59 +00008936 // There aren't any multi-character AVR specific constraints.
8937 if (StringRef(Name).size() > 1) return false;
8938
8939 switch (*Name) {
8940 default: return false;
8941 case 'a': // Simple upper registers
8942 case 'b': // Base pointer registers pairs
8943 case 'd': // Upper register
8944 case 'l': // Lower registers
8945 case 'e': // Pointer register pairs
8946 case 'q': // Stack pointer register
8947 case 'r': // Any register
8948 case 'w': // Special upper register pairs
8949 case 't': // Temporary register
8950 case 'x': case 'X': // Pointer register pair X
8951 case 'y': case 'Y': // Pointer register pair Y
8952 case 'z': case 'Z': // Pointer register pair Z
8953 Info.setAllowsRegister();
8954 return true;
8955 case 'I': // 6-bit positive integer constant
8956 Info.setRequiresImmediate(0, 63);
8957 return true;
8958 case 'J': // 6-bit negative integer constant
8959 Info.setRequiresImmediate(-63, 0);
8960 return true;
8961 case 'K': // Integer constant (Range: 2)
8962 Info.setRequiresImmediate(2);
8963 return true;
8964 case 'L': // Integer constant (Range: 0)
8965 Info.setRequiresImmediate(0);
8966 return true;
8967 case 'M': // 8-bit integer constant
8968 Info.setRequiresImmediate(0, 0xff);
8969 return true;
8970 case 'N': // Integer constant (Range: -1)
8971 Info.setRequiresImmediate(-1);
8972 return true;
8973 case 'O': // Integer constant (Range: 8, 16, 24)
8974 Info.setRequiresImmediate({8, 16, 24});
8975 return true;
8976 case 'P': // Integer constant (Range: 1)
8977 Info.setRequiresImmediate(1);
8978 return true;
8979 case 'R': // Integer constant (Range: -6 to 5)
8980 Info.setRequiresImmediate(-6, 5);
8981 return true;
8982 case 'G': // Floating point constant
8983 case 'Q': // A memory address based on Y or Z pointer with displacement.
8984 return true;
8985 }
8986
Dylan McKay924fa3a2017-01-05 05:20:27 +00008987 return false;
8988 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008989
Dylan McKay924fa3a2017-01-05 05:20:27 +00008990 IntType getIntTypeByWidth(unsigned BitWidth,
8991 bool IsSigned) const final {
8992 // AVR prefers int for 16-bit integers.
8993 return BitWidth == 16 ? (IsSigned ? SignedInt : UnsignedInt)
8994 : TargetInfo::getIntTypeByWidth(BitWidth, IsSigned);
8995 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008996
Dylan McKay924fa3a2017-01-05 05:20:27 +00008997 IntType getLeastIntTypeByWidth(unsigned BitWidth,
8998 bool IsSigned) const final {
8999 // AVR uses int for int_least16_t and int_fast16_t.
9000 return BitWidth == 16
9001 ? (IsSigned ? SignedInt : UnsignedInt)
9002 : TargetInfo::getLeastIntTypeByWidth(BitWidth, IsSigned);
9003 }
Dylan McKayecb6e7b2017-02-07 06:04:18 +00009004
9005 bool setCPU(const std::string &Name) override {
9006 bool IsFamily = llvm::StringSwitch<bool>(Name)
9007 .Case("avr1", true)
9008 .Case("avr2", true)
9009 .Case("avr25", true)
9010 .Case("avr3", true)
9011 .Case("avr31", true)
9012 .Case("avr35", true)
9013 .Case("avr4", true)
9014 .Case("avr5", true)
9015 .Case("avr51", true)
9016 .Case("avr6", true)
9017 .Case("avrxmega1", true)
9018 .Case("avrxmega2", true)
9019 .Case("avrxmega3", true)
9020 .Case("avrxmega4", true)
9021 .Case("avrxmega5", true)
9022 .Case("avrxmega6", true)
9023 .Case("avrxmega7", true)
9024 .Case("avrtiny", true)
9025 .Default(false);
9026
9027 if (IsFamily) this->CPU = Name;
9028
9029 bool IsMCU = std::find_if(AVRMcus.begin(), AVRMcus.end(),
9030 [&](const MCUInfo &Info) { return Info.Name == Name; }) != AVRMcus.end();
9031
9032 if (IsMCU) this->CPU = Name;
9033
9034 return IsFamily || IsMCU;
9035 }
9036
9037protected:
9038 std::string CPU;
Dylan McKay924fa3a2017-01-05 05:20:27 +00009039};
9040
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009041} // end anonymous namespace
9042
Chris Lattner5ba61f02006-10-14 07:39:34 +00009043//===----------------------------------------------------------------------===//
9044// Driver code
9045//===----------------------------------------------------------------------===//
9046
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009047static TargetInfo *AllocateTarget(const llvm::Triple &Triple,
9048 const TargetOptions &Opts) {
Daniel Dunbar52322032009-08-18 05:47:58 +00009049 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00009050
Daniel Dunbar52322032009-08-18 05:47:58 +00009051 switch (Triple.getArch()) {
9052 default:
Craig Topperf1186c52014-05-08 06:41:40 +00009053 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00009054
Tim Northover2a0783d2014-05-30 14:14:07 +00009055 case llvm::Triple::xcore:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009056 return new XCoreTargetInfo(Triple, Opts);
Tim Northover2a0783d2014-05-30 14:14:07 +00009057
9058 case llvm::Triple::hexagon:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009059 return new HexagonTargetInfo(Triple, Opts);
Tim Northover2a0783d2014-05-30 14:14:07 +00009060
Jacques Pienaard964cc22016-03-28 21:02:54 +00009061 case llvm::Triple::lanai:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009062 return new LanaiTargetInfo(Triple, Opts);
Jacques Pienaard964cc22016-03-28 21:02:54 +00009063
Tim Northover2a0783d2014-05-30 14:14:07 +00009064 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00009065 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009066 return new DarwinAArch64TargetInfo(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00009067
9068 switch (os) {
Ed Schoutenea9448e2015-10-15 15:07:07 +00009069 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009070 return new CloudABITargetInfo<AArch64leTargetInfo>(Triple, Opts);
Ed Maste6a9eda52014-11-13 16:55:42 +00009071 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009072 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Petr Hosek9834fcd2016-10-24 22:55:57 +00009073 case llvm::Triple::Fuchsia:
9074 return new FuchsiaTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00009075 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009076 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple, Opts);
James Molloy5e73df52014-04-16 15:06:20 +00009077 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009078 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Brad Smith9aa2bf22017-02-21 23:13:09 +00009079 case llvm::Triple::OpenBSD:
9080 return new OpenBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00009081 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009082 return new AArch64leTargetInfo(Triple, Opts);
James Molloy5e73df52014-04-16 15:06:20 +00009083 }
9084
Christian Pirker9b019ae2014-02-25 13:51:00 +00009085 case llvm::Triple::aarch64_be:
9086 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00009087 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009088 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Petr Hosek9834fcd2016-10-24 22:55:57 +00009089 case llvm::Triple::Fuchsia:
9090 return new FuchsiaTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00009091 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009092 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00009093 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009094 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00009095 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009096 return new AArch64beTargetInfo(Triple, Opts);
Tim Northover9bb857a2013-01-31 12:13:10 +00009097 }
9098
Daniel Dunbar52322032009-08-18 05:47:58 +00009099 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00009100 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00009101 if (Triple.isOSBinFormatMachO())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009102 return new DarwinARMTargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00009103
Daniel Dunbar52322032009-08-18 05:47:58 +00009104 switch (os) {
Ed Schoutenc6d1a732016-09-05 18:38:34 +00009105 case llvm::Triple::CloudABI:
9106 return new CloudABITargetInfo<ARMleTargetInfo>(Triple, Opts);
Rafael Espindolaad8fed52010-06-10 00:46:51 +00009107 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009108 return new LinuxTargetInfo<ARMleTargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009109 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009110 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009111 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009112 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00009113 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009114 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00009115 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009116 return new BitrigTargetInfo<ARMleTargetInfo>(Triple, Opts);
Douglas Gregor9fabd852011-07-01 22:41:14 +00009117 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009118 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00009119 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009120 return new NaClTargetInfo<ARMleTargetInfo>(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00009121 case llvm::Triple::Win32:
9122 switch (Triple.getEnvironment()) {
Yaron Keren321249c2015-07-15 13:32:23 +00009123 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009124 return new CygwinARMTargetInfo(Triple, Opts);
Yaron Keren321249c2015-07-15 13:32:23 +00009125 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009126 return new MinGWARMTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00009127 case llvm::Triple::Itanium:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009128 return new ItaniumWindowsARMleTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00009129 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00009130 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009131 return new MicrosoftARMleTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00009132 }
Daniel Dunbar52322032009-08-18 05:47:58 +00009133 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009134 return new ARMleTargetInfo(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009135 }
9136
9137 case llvm::Triple::armeb:
9138 case llvm::Triple::thumbeb:
9139 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009140 return new DarwinARMTargetInfo(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009141
9142 switch (os) {
9143 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009144 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009145 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009146 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009147 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009148 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009149 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009150 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009151 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009152 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009153 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009154 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009155 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009156 return new NaClTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009157 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009158 return new ARMbeTargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009159 }
Eli Friedmanb5366062008-05-20 14:21:01 +00009160
Dylan McKay924fa3a2017-01-05 05:20:27 +00009161 case llvm::Triple::avr:
9162 return new AVRTargetInfo(Triple, Opts);
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00009163 case llvm::Triple::bpfeb:
9164 case llvm::Triple::bpfel:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009165 return new BPFTargetInfo(Triple, Opts);
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00009166
Daniel Dunbar52322032009-08-18 05:47:58 +00009167 case llvm::Triple::msp430:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009168 return new MSP430TargetInfo(Triple, Opts);
Eli Friedmanb5366062008-05-20 14:21:01 +00009169
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00009170 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009171 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009172 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00009173 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009174 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00009175 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009176 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009177 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009178 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009179 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009180 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00009181 return new MipsTargetInfo(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009182 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00009183
9184 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009185 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009186 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00009187 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009188 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00009189 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009190 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009191 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009192 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009193 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00009194 case llvm::Triple::NaCl:
Daniel Sanders4672af62016-05-27 11:51:02 +00009195 return new NaClTargetInfo<NaClMips32TargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009196 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00009197 return new MipsTargetInfo(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009198 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00009199
Akira Hatanakabef17452011-09-20 19:21:49 +00009200 case llvm::Triple::mips64:
9201 switch (os) {
9202 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00009203 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009204 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00009205 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009206 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009207 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009208 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009209 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00009210 case llvm::Triple::OpenBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009211 return new OpenBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009212 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00009213 return new MipsTargetInfo(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009214 }
9215
9216 case llvm::Triple::mips64el:
9217 switch (os) {
9218 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00009219 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009220 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00009221 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009222 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009223 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009224 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009225 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00009226 case llvm::Triple::OpenBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009227 return new OpenBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009228 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00009229 return new MipsTargetInfo(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009230 }
9231
Ivan Krasindd7403e2011-08-24 20:22:22 +00009232 case llvm::Triple::le32:
9233 switch (os) {
Douglas Katzman78d7c542015-05-12 21:18:10 +00009234 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009235 return new NaClTargetInfo<PNaClTargetInfo>(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00009236 default:
9237 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00009238 }
9239
JF Bastien643817d2014-09-12 17:52:47 +00009240 case llvm::Triple::le64:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009241 return new Le64TargetInfo(Triple, Opts);
JF Bastien643817d2014-09-12 17:52:47 +00009242
Daniel Dunbar52322032009-08-18 05:47:58 +00009243 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00009244 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009245 return new DarwinPPC32TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009246 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00009247 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009248 return new LinuxTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009249 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009250 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009251 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009252 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00009253 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009254 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009255 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009256 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009257 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009258 return new PPC32TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009259 }
Daniel Dunbar52322032009-08-18 05:47:58 +00009260
9261 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00009262 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009263 return new DarwinPPC64TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009264 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00009265 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009266 return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009267 case llvm::Triple::Lv2:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009268 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009269 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009270 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009271 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009272 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009273 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009274 return new PPC64TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009275 }
Daniel Dunbar52322032009-08-18 05:47:58 +00009276
Bill Schmidt778d3872013-07-26 01:36:11 +00009277 case llvm::Triple::ppc64le:
9278 switch (os) {
9279 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009280 return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger22a2d992015-04-10 20:53:48 +00009281 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009282 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Bill Schmidt778d3872013-07-26 01:36:11 +00009283 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009284 return new PPC64TargetInfo(Triple, Opts);
Bill Schmidt778d3872013-07-26 01:36:11 +00009285 }
9286
Peter Collingbournec947aae2012-05-20 23:28:41 +00009287 case llvm::Triple::nvptx:
Justin Lebarb6626592017-01-05 16:53:21 +00009288 return new NVPTXTargetInfo(Triple, Opts, /*TargetPointerWidth=*/32);
Peter Collingbournec947aae2012-05-20 23:28:41 +00009289 case llvm::Triple::nvptx64:
Justin Lebarb6626592017-01-05 16:53:21 +00009290 return new NVPTXTargetInfo(Triple, Opts, /*TargetPointerWidth=*/64);
Peter Collingbournec947aae2012-05-20 23:28:41 +00009291
Tom Stellardd8e38a32015-01-06 20:34:47 +00009292 case llvm::Triple::amdgcn:
Eli Friedmand13b41e2012-10-12 23:32:00 +00009293 case llvm::Triple::r600:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009294 return new AMDGPUTargetInfo(Triple, Opts);
Eli Friedmand13b41e2012-10-12 23:32:00 +00009295
Daniel Dunbar52322032009-08-18 05:47:58 +00009296 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009297 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00009298 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009299 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009300 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009301 return new SolarisTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009302 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009303 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00009304 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009305 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009306 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009307 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009308 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009309 return new SparcV8TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009310 }
Daniel Dunbar52322032009-08-18 05:47:58 +00009311
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009312 // The 'sparcel' architecture copies all the above cases except for Solaris.
9313 case llvm::Triple::sparcel:
9314 switch (os) {
9315 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009316 return new LinuxTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009317 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009318 return new NetBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009319 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009320 return new OpenBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009321 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009322 return new RTEMSTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009323 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009324 return new SparcV8elTargetInfo(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009325 }
9326
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009327 case llvm::Triple::sparcv9:
9328 switch (os) {
9329 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009330 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009331 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009332 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009333 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009334 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009335 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009336 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009337 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009338 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009339 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009340 return new SparcV9TargetInfo(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009341 }
9342
Ulrich Weigand47445072013-05-06 16:26:41 +00009343 case llvm::Triple::systemz:
9344 switch (os) {
9345 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009346 return new LinuxTargetInfo<SystemZTargetInfo>(Triple, Opts);
Ulrich Weigand47445072013-05-06 16:26:41 +00009347 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009348 return new SystemZTargetInfo(Triple, Opts);
Ulrich Weigand47445072013-05-06 16:26:41 +00009349 }
9350
Eli Friedmana9c3d712009-08-19 20:47:07 +00009351 case llvm::Triple::tce:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009352 return new TCETargetInfo(Triple, Opts);
Eli Friedmana9c3d712009-08-19 20:47:07 +00009353
Pekka Jaaskelainen67354482016-11-16 15:22:31 +00009354 case llvm::Triple::tcele:
9355 return new TCELETargetInfo(Triple, Opts);
9356
Daniel Dunbar52322032009-08-18 05:47:58 +00009357 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00009358 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009359 return new DarwinI386TargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00009360
Daniel Dunbar52322032009-08-18 05:47:58 +00009361 switch (os) {
Ed Schouten7893e682015-06-13 21:33:49 +00009362 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009363 return new CloudABITargetInfo<X86_32TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009364 case llvm::Triple::Linux: {
9365 switch (Triple.getEnvironment()) {
9366 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009367 return new LinuxTargetInfo<X86_32TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009368 case llvm::Triple::Android:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009369 return new AndroidX86_32TargetInfo(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009370 }
9371 }
Daniel Dunbar52322032009-08-18 05:47:58 +00009372 case llvm::Triple::DragonFly:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009373 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009374 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009375 return new NetBSDI386TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009376 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009377 return new OpenBSDI386TargetInfo(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00009378 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009379 return new BitrigI386TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009380 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009381 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00009382 case llvm::Triple::KFreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009383 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009384 case llvm::Triple::Minix:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009385 return new MinixTargetInfo<X86_32TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009386 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009387 return new SolarisTargetInfo<X86_32TargetInfo>(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009388 case llvm::Triple::Win32: {
9389 switch (Triple.getEnvironment()) {
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009390 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009391 return new CygwinX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009392 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009393 return new MinGWX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00009394 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009395 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00009396 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009397 return new MicrosoftX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009398 }
9399 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00009400 case llvm::Triple::Haiku:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009401 return new HaikuX86_32TargetInfo(Triple, Opts);
Douglas Gregor9fabd852011-07-01 22:41:14 +00009402 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009403 return new RTEMSX86_32TargetInfo(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00009404 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009405 return new NaClTargetInfo<X86_32TargetInfo>(Triple, Opts);
Alexey Bataevc99b0492015-11-25 09:24:26 +00009406 case llvm::Triple::ELFIAMCU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009407 return new MCUX86_32TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009408 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009409 return new X86_32TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009410 }
9411
9412 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009413 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009414 return new DarwinX86_64TargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00009415
Daniel Dunbar52322032009-08-18 05:47:58 +00009416 switch (os) {
Ed Schoutenf33c6072015-03-11 08:42:46 +00009417 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009418 return new CloudABITargetInfo<X86_64TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009419 case llvm::Triple::Linux: {
9420 switch (Triple.getEnvironment()) {
9421 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009422 return new LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009423 case llvm::Triple::Android:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009424 return new AndroidX86_64TargetInfo(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009425 }
9426 }
Chris Lattner002ba6b2010-01-09 05:41:14 +00009427 case llvm::Triple::DragonFly:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009428 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009429 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009430 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009431 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009432 return new OpenBSDX86_64TargetInfo(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00009433 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009434 return new BitrigX86_64TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009435 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009436 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Petr Hosek9834fcd2016-10-24 22:55:57 +00009437 case llvm::Triple::Fuchsia:
9438 return new FuchsiaTargetInfo<X86_64TargetInfo>(Triple, Opts);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00009439 case llvm::Triple::KFreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009440 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009441 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009442 return new SolarisTargetInfo<X86_64TargetInfo>(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009443 case llvm::Triple::Win32: {
9444 switch (Triple.getEnvironment()) {
Yaron Kerend030d112015-07-22 17:38:19 +00009445 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009446 return new CygwinX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009447 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009448 return new MinGWX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009449 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00009450 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009451 return new MicrosoftX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009452 }
9453 }
Reid Kleckner330fb172016-05-11 16:19:05 +00009454 case llvm::Triple::Haiku:
9455 return new HaikuTargetInfo<X86_64TargetInfo>(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00009456 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009457 return new NaClTargetInfo<X86_64TargetInfo>(Triple, Opts);
Alex Rosenberg12207fa2015-01-27 14:47:44 +00009458 case llvm::Triple::PS4:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009459 return new PS4OSTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009460 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009461 return new X86_64TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009462 }
Guy Benyeib798fc92012-12-11 21:38:14 +00009463
Douglas Katzman78d7c542015-05-12 21:18:10 +00009464 case llvm::Triple::spir: {
9465 if (Triple.getOS() != llvm::Triple::UnknownOS ||
9466 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
9467 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009468 return new SPIR32TargetInfo(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00009469 }
9470 case llvm::Triple::spir64: {
9471 if (Triple.getOS() != llvm::Triple::UnknownOS ||
9472 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
9473 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009474 return new SPIR64TargetInfo(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00009475 }
Dan Gohmanc2853072015-09-03 22:51:53 +00009476 case llvm::Triple::wasm32:
Dan Gohman839f2152017-01-17 21:46:38 +00009477 if (Triple.getSubArch() != llvm::Triple::NoSubArch ||
9478 Triple.getVendor() != llvm::Triple::UnknownVendor ||
9479 Triple.getOS() != llvm::Triple::UnknownOS ||
9480 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment ||
9481 !(Triple.isOSBinFormatELF() || Triple.isOSBinFormatWasm()))
Dan Gohmanc2853072015-09-03 22:51:53 +00009482 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009483 return new WebAssemblyOSTargetInfo<WebAssembly32TargetInfo>(Triple, Opts);
Dan Gohmanc2853072015-09-03 22:51:53 +00009484 case llvm::Triple::wasm64:
Dan Gohman839f2152017-01-17 21:46:38 +00009485 if (Triple.getSubArch() != llvm::Triple::NoSubArch ||
9486 Triple.getVendor() != llvm::Triple::UnknownVendor ||
9487 Triple.getOS() != llvm::Triple::UnknownOS ||
9488 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment ||
9489 !(Triple.isOSBinFormatELF() || Triple.isOSBinFormatWasm()))
Dan Gohmanc2853072015-09-03 22:51:53 +00009490 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009491 return new WebAssemblyOSTargetInfo<WebAssembly64TargetInfo>(Triple, Opts);
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00009492
9493 case llvm::Triple::renderscript32:
9494 return new LinuxTargetInfo<RenderScript32TargetInfo>(Triple, Opts);
9495 case llvm::Triple::renderscript64:
9496 return new LinuxTargetInfo<RenderScript64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009497 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00009498}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009499
9500/// CreateTargetInfo - Return the target info object for the specified target
Eric Christophere4f73b32015-08-07 19:07:08 +00009501/// options.
Alp Toker80758082014-07-06 05:26:44 +00009502TargetInfo *
9503TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
Saleem Abdulrasool10a49722016-04-08 16:52:00 +00009504 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00009505 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009506
9507 // Construct the target
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009508 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple, *Opts));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009509 if (!Target) {
9510 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00009511 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009512 }
Alp Toker80758082014-07-06 05:26:44 +00009513 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009514
Daniel Dunbaracde99e2009-12-18 18:42:37 +00009515 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00009516 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
9517 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00009518 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00009519 }
9520
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009521 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00009522 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
9523 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00009524 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009525 }
9526
Rafael Espindolaeb265472013-08-21 21:59:03 +00009527 // Set the fp math unit.
9528 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
9529 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00009530 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00009531 }
9532
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009533 // Compute the default target features, we need the target to handle this
9534 // because features may have dependencies on one another.
9535 llvm::StringMap<bool> Features;
Eric Christopher007b0a02015-08-28 22:32:01 +00009536 if (!Target->initFeatureMap(Features, Diags, Opts->CPU,
9537 Opts->FeaturesAsWritten))
Eric Christopher6b454372015-08-25 13:45:24 +00009538 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009539
9540 // Add the features to the compile options.
Douglas Gregorf8715de2012-11-16 04:24:59 +00009541 Opts->Features.clear();
Aaron Ballmanb226d3d2015-08-12 13:38:59 +00009542 for (const auto &F : Features)
9543 Opts->Features.push_back((F.getValue() ? "+" : "-") + F.getKey().str());
9544
Eric Christopher3ff21b32013-10-16 21:26:26 +00009545 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00009546 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009547
Yaxun Liu39cf40f2016-05-16 17:06:34 +00009548 Target->setSupportedOpenCLOpts();
Alexey Bader0ea07532016-11-01 15:50:52 +00009549 Target->setOpenCLExtensionOpts();
Yaxun Liu39cf40f2016-05-16 17:06:34 +00009550
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00009551 if (!Target->validateTarget(Diags))
9552 return nullptr;
9553
Ahmed Charles9a16beb2014-03-07 19:33:25 +00009554 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009555}