blob: 0c794e9702912f6f509afe488172a8f9def109eb [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) {
Alexey Bataev00396512015-07-02 03:40:19 +0000910 SimdDefaultAlign = 128;
Nico Weber3435ede2012-01-31 02:07:33 +0000911 LongDoubleWidth = LongDoubleAlign = 128;
Stephan Bergmann17c7f702016-12-14 11:57:17 +0000912 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble();
Nico Weber3435ede2012-01-31 02:07:33 +0000913 }
Eli Friedman9ffd4a92009-06-05 07:05:05 +0000914
Hal Finkel6b984f02012-07-03 16:51:04 +0000915 /// \brief Flags for architecture specific defines.
916 typedef enum {
917 ArchDefineNone = 0,
918 ArchDefineName = 1 << 0, // <name> is substituted for arch name.
919 ArchDefinePpcgr = 1 << 1,
920 ArchDefinePpcsq = 1 << 2,
921 ArchDefine440 = 1 << 3,
922 ArchDefine603 = 1 << 4,
923 ArchDefine604 = 1 << 5,
924 ArchDefinePwr4 = 1 << 6,
Bill Schmidt38378a02013-02-01 20:23:10 +0000925 ArchDefinePwr5 = 1 << 7,
926 ArchDefinePwr5x = 1 << 8,
927 ArchDefinePwr6 = 1 << 9,
928 ArchDefinePwr6x = 1 << 10,
929 ArchDefinePwr7 = 1 << 11,
Will Schmidtf0487512014-06-26 13:34:10 +0000930 ArchDefinePwr8 = 1 << 12,
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +0000931 ArchDefinePwr9 = 1 << 13,
932 ArchDefineA2 = 1 << 14,
933 ArchDefineA2q = 1 << 15
Hal Finkel6b984f02012-07-03 16:51:04 +0000934 } ArchDefineTypes;
935
Eric Christopher3646e622017-03-22 06:36:09 +0000936 // Set the language option for altivec based on our value.
937 void adjust(LangOptions &Opts) override {
938 if (HasAltivec)
939 Opts.AltiVec = 1;
940 TargetInfo::adjust(Opts);
941 }
942
Bill Schmidt38378a02013-02-01 20:23:10 +0000943 // Note: GCC recognizes the following additional cpus:
944 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
945 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
946 // titan, rs64.
Craig Topper3164f332014-03-11 03:39:26 +0000947 bool setCPU(const std::string &Name) override {
Hal Finkel8eb59282012-06-11 22:35:19 +0000948 bool CPUKnown = llvm::StringSwitch<bool>(Name)
949 .Case("generic", true)
950 .Case("440", true)
951 .Case("450", true)
952 .Case("601", true)
953 .Case("602", true)
954 .Case("603", true)
955 .Case("603e", true)
956 .Case("603ev", true)
957 .Case("604", true)
958 .Case("604e", true)
959 .Case("620", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000960 .Case("630", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000961 .Case("g3", true)
962 .Case("7400", true)
963 .Case("g4", true)
964 .Case("7450", true)
965 .Case("g4+", true)
966 .Case("750", true)
967 .Case("970", true)
968 .Case("g5", true)
969 .Case("a2", true)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +0000970 .Case("a2q", true)
Hal Finkelf6d6cb02012-09-18 22:25:03 +0000971 .Case("e500mc", true)
972 .Case("e5500", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000973 .Case("power3", true)
974 .Case("pwr3", true)
975 .Case("power4", true)
976 .Case("pwr4", true)
977 .Case("power5", true)
978 .Case("pwr5", true)
979 .Case("power5x", true)
980 .Case("pwr5x", true)
981 .Case("power6", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000982 .Case("pwr6", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000983 .Case("power6x", true)
984 .Case("pwr6x", true)
985 .Case("power7", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000986 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +0000987 .Case("power8", true)
988 .Case("pwr8", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +0000989 .Case("power9", true)
990 .Case("pwr9", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000991 .Case("powerpc", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000992 .Case("ppc", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000993 .Case("powerpc64", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000994 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +0000995 .Case("powerpc64le", true)
996 .Case("ppc64le", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000997 .Default(false);
998
999 if (CPUKnown)
1000 CPU = Name;
1001
1002 return CPUKnown;
1003 }
1004
Ulrich Weigand8afad612014-07-28 13:17:52 +00001005
1006 StringRef getABI() const override { return ABI; }
1007
Craig Topper6c03a542015-10-19 04:51:35 +00001008 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
1009 return llvm::makeArrayRef(BuiltinInfo,
1010 clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner10a5b382007-01-29 05:24:35 +00001011 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001012
Craig Topper3164f332014-03-11 03:39:26 +00001013 bool isCLZForZeroUndef() const override { return false; }
Bob Wilson19a2f2b2012-01-28 18:02:29 +00001014
Craig Topper3164f332014-03-11 03:39:26 +00001015 void getTargetDefines(const LangOptions &Opts,
1016 MacroBuilder &Builder) const override;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001017
Eric Christopher8c47b422015-10-09 18:39:55 +00001018 bool
1019 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
1020 StringRef CPU,
1021 const std::vector<std::string> &FeaturesVec) const override;
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001022
Craig Topper3164f332014-03-11 03:39:26 +00001023 bool handleTargetFeatures(std::vector<std::string> &Features,
1024 DiagnosticsEngine &Diags) override;
1025 bool hasFeature(StringRef Feature) const override;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001026 void setFeatureEnabled(llvm::StringMap<bool> &Features, StringRef Name,
1027 bool Enabled) const override;
Craig Topper3164f332014-03-11 03:39:26 +00001028
Craig Topperf054e3a2015-10-19 03:52:27 +00001029 ArrayRef<const char *> getGCCRegNames() const override;
1030 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00001031 bool validateAsmConstraint(const char *&Name,
1032 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00001033 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +00001034 default: return false;
1035 case 'O': // Zero
John Thompson07a61a42010-06-24 22:44:13 +00001036 break;
Anders Carlssonf511f642007-11-27 04:11:28 +00001037 case 'b': // Base register
1038 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +00001039 Info.setAllowsRegister();
John Thompson07a61a42010-06-24 22:44:13 +00001040 break;
1041 // FIXME: The following are added to allow parsing.
1042 // I just took a guess at what the actions should be.
1043 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001044 case 'd': // Floating point register (containing 64-bit value)
John Thompson07a61a42010-06-24 22:44:13 +00001045 case 'v': // Altivec vector register
1046 Info.setAllowsRegister();
1047 break;
1048 case 'w':
1049 switch (Name[1]) {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001050 case 'd':// VSX vector register to hold vector double data
1051 case 'f':// VSX vector register to hold vector float data
1052 case 's':// VSX vector register to hold scalar float data
1053 case 'a':// Any VSX register
Hal Finkelf7a07a52014-03-02 18:24:18 +00001054 case 'c':// An individual CR bit
John Thompson07a61a42010-06-24 22:44:13 +00001055 break;
1056 default:
1057 return false;
1058 }
1059 Info.setAllowsRegister();
1060 Name++; // Skip over 'w'.
1061 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001062 case 'h': // `MQ', `CTR', or `LINK' register
1063 case 'q': // `MQ' register
1064 case 'c': // `CTR' register
1065 case 'l': // `LINK' register
1066 case 'x': // `CR' register (condition register) number 0
1067 case 'y': // `CR' register (condition register)
1068 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson07a61a42010-06-24 22:44:13 +00001069 Info.setAllowsRegister();
1070 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001071 case 'I': // Signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +00001072 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001073 // (use `L' instead for SImode constants)
1074 case 'K': // Unsigned 16-bit constant
1075 case 'L': // Signed 16-bit constant shifted left 16 bits
1076 case 'M': // Constant larger than 31
1077 case 'N': // Exact power of 2
1078 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +00001079 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001080 // register with one instruction per word
John Thompson07a61a42010-06-24 22:44:13 +00001081 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001082 // into a register using three instructions
John Thompson07a61a42010-06-24 22:44:13 +00001083 break;
1084 case 'm': // Memory operand. Note that on PowerPC targets, m can
1085 // include addresses that update the base register. It
1086 // is therefore only safe to use `m' in an asm statement
1087 // if that asm statement accesses the operand exactly once.
1088 // The asm statement must also use `%U<opno>' as a
Sebastian Redldd008712010-08-17 22:42:34 +00001089 // placeholder for the "update" flag in the corresponding
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001090 // load or store instruction. For example:
John Thompson07a61a42010-06-24 22:44:13 +00001091 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001092 // is correct but:
John Thompson07a61a42010-06-24 22:44:13 +00001093 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
1094 // is not. Use es rather than m if you don't want the base
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001095 // register to be updated.
1096 case 'e':
John Thompsonceebdf12010-06-25 00:02:05 +00001097 if (Name[1] != 's')
1098 return false;
Sebastian Redldd008712010-08-17 22:42:34 +00001099 // es: A "stable" memory operand; that is, one which does not
John Thompson07a61a42010-06-24 22:44:13 +00001100 // include any automodification of the base register. Unlike
1101 // `m', this constraint can be used in asm statements that
1102 // might access the operand several times, or that might not
John Thompsonceebdf12010-06-25 00:02:05 +00001103 // access it at all.
John Thompson07a61a42010-06-24 22:44:13 +00001104 Info.setAllowsMemory();
John Thompsonceebdf12010-06-25 00:02:05 +00001105 Name++; // Skip over 'e'.
John Thompson07a61a42010-06-24 22:44:13 +00001106 break;
1107 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001108 // usually better to use `m' or `es' in asm statements)
John Thompson07a61a42010-06-24 22:44:13 +00001109 case 'Z': // Memory operand that is an indexed or indirect from a
1110 // register (it is usually better to use `m' or `es' in
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001111 // asm statements)
John Thompson07a61a42010-06-24 22:44:13 +00001112 Info.setAllowsMemory();
1113 Info.setAllowsRegister();
1114 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001115 case 'R': // AIX TOC entry
John Thompson07a61a42010-06-24 22:44:13 +00001116 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001117 // register (`p' is preferable for asm statements)
1118 case 'S': // Constant suitable as a 64-bit mask operand
1119 case 'T': // Constant suitable as a 32-bit mask operand
1120 case 'U': // System V Release 4 small data area reference
John Thompson07a61a42010-06-24 22:44:13 +00001121 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001122 // instructions
1123 case 'W': // Vector constant that does not require memory
1124 case 'j': // Vector constant that is all zeros.
John Thompson07a61a42010-06-24 22:44:13 +00001125 break;
1126 // End FIXME.
Anders Carlssonf511f642007-11-27 04:11:28 +00001127 }
John Thompson07a61a42010-06-24 22:44:13 +00001128 return true;
Anders Carlssonf511f642007-11-27 04:11:28 +00001129 }
Craig Topper3164f332014-03-11 03:39:26 +00001130 std::string convertConstraint(const char *&Constraint) const override {
Hal Finkelf7a07a52014-03-02 18:24:18 +00001131 std::string R;
1132 switch (*Constraint) {
1133 case 'e':
1134 case 'w':
1135 // Two-character constraint; add "^" hint for later parsing.
1136 R = std::string("^") + std::string(Constraint, 2);
1137 Constraint++;
1138 break;
1139 default:
1140 return TargetInfo::convertConstraint(Constraint);
1141 }
1142 return R;
1143 }
Craig Topper3164f332014-03-11 03:39:26 +00001144 const char *getClobbers() const override {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001145 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +00001146 }
Craig Topper3164f332014-03-11 03:39:26 +00001147 int getEHDataRegisterNumber(unsigned RegNo) const override {
Adhemerval Zanella5d874ae2013-01-22 20:02:45 +00001148 if (RegNo == 0) return 3;
1149 if (RegNo == 1) return 4;
1150 return -1;
1151 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00001152
1153 bool hasSjLjLowering() const override {
1154 return true;
1155 }
David Majnemer2617ea62015-06-09 18:05:33 +00001156
1157 bool useFloat128ManglingForLongDouble() const override {
1158 return LongDoubleWidth == 128 &&
Stephan Bergmann17c7f702016-12-14 11:57:17 +00001159 LongDoubleFormat == &llvm::APFloat::PPCDoubleDouble() &&
David Majnemer2617ea62015-06-09 18:05:33 +00001160 getTriple().isOSBinFormatELF();
1161 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001162};
Anders Carlssonf511f642007-11-27 04:11:28 +00001163
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001164const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00001165#define BUILTIN(ID, TYPE, ATTRS) \
1166 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1167#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1168 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5abdec72009-06-14 01:05:48 +00001169#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001170};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001171
Eric Christopher917e9522014-11-18 22:36:15 +00001172/// handleTargetFeatures - Perform initialization based on the user
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001173/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00001174bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001175 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00001176 for (const auto &Feature : Features) {
Eric Christopher758aad72017-03-21 22:06:18 +00001177 if (Feature == "+altivec") {
1178 HasAltivec = true;
1179 } else if (Feature == "+vsx") {
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001180 HasVSX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001181 } else if (Feature == "+bpermd") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001182 HasBPERMD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001183 } else if (Feature == "+extdiv") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001184 HasExtDiv = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001185 } else if (Feature == "+power8-vector") {
Bill Schmidt8c184e32014-10-10 17:21:23 +00001186 HasP8Vector = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001187 } else if (Feature == "+crypto") {
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001188 HasP8Crypto = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001189 } else if (Feature == "+direct-move") {
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001190 HasDirectMove = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001191 } else if (Feature == "+qpx") {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001192 HasQPX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001193 } else if (Feature == "+htm") {
Kit Barton8246f282015-03-25 19:41:41 +00001194 HasHTM = true;
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001195 } else if (Feature == "+float128") {
1196 HasFloat128 = true;
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001197 } else if (Feature == "+power9-vector") {
1198 HasP9Vector = true;
Kit Barton8246f282015-03-25 19:41:41 +00001199 }
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001200 // TODO: Finish this list and add an assert that we've handled them
1201 // all.
1202 }
Eric Christopher02c33352015-08-25 00:59:11 +00001203
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001204 return true;
1205}
1206
Chris Lattnerecd49032009-03-02 22:27:17 +00001207/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
1208/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001209void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001210 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00001211 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001212 Builder.defineMacro("__ppc__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001213 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001214 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001215 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001216 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001217 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001218 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001219 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001220 Builder.defineMacro("__ppc64__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001221 Builder.defineMacro("__PPC64__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001222 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001223
Chris Lattnerecd49032009-03-02 22:27:17 +00001224 // Target properties.
Bill Schmidt778d3872013-07-26 01:36:11 +00001225 if (getTriple().getArch() == llvm::Triple::ppc64le) {
1226 Builder.defineMacro("_LITTLE_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001227 } else {
1228 if (getTriple().getOS() != llvm::Triple::NetBSD &&
1229 getTriple().getOS() != llvm::Triple::OpenBSD)
1230 Builder.defineMacro("_BIG_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001231 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001232
Ulrich Weigand8afad612014-07-28 13:17:52 +00001233 // ABI options.
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001234 if (ABI == "elfv1" || ABI == "elfv1-qpx")
Ulrich Weigand8afad612014-07-28 13:17:52 +00001235 Builder.defineMacro("_CALL_ELF", "1");
1236 if (ABI == "elfv2")
1237 Builder.defineMacro("_CALL_ELF", "2");
1238
Chris Lattnerecd49032009-03-02 22:27:17 +00001239 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001240 Builder.defineMacro("__NATURAL_ALIGNMENT__");
1241 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001242
Chris Lattnerecd49032009-03-02 22:27:17 +00001243 // FIXME: Should be controlled by command line option.
Roman Divacky13b586f2013-07-03 19:45:54 +00001244 if (LongDoubleWidth == 128)
1245 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001246
Eric Christopher32ac5e42017-02-15 07:50:11 +00001247 // Define this for elfv2 (64-bit only) or 64-bit darwin.
1248 if (ABI == "elfv2" ||
1249 (getTriple().getOS() == llvm::Triple::Darwin && PointerWidth == 64))
1250 Builder.defineMacro("__STRUCT_PARM_ALIGN__", "16");
1251
Hal Finkel8eb59282012-06-11 22:35:19 +00001252 // CPU identification.
Eric Christopherb70819e2017-03-25 02:29:18 +00001253 ArchDefineTypes defs =
1254 (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
1255 .Case("440", ArchDefineName)
1256 .Case("450", ArchDefineName | ArchDefine440)
1257 .Case("601", ArchDefineName)
1258 .Case("602", ArchDefineName | ArchDefinePpcgr)
1259 .Case("603", ArchDefineName | ArchDefinePpcgr)
1260 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1261 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1262 .Case("604", ArchDefineName | ArchDefinePpcgr)
1263 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
1264 .Case("620", ArchDefineName | ArchDefinePpcgr)
1265 .Case("630", ArchDefineName | ArchDefinePpcgr)
1266 .Case("7400", ArchDefineName | ArchDefinePpcgr)
1267 .Case("7450", ArchDefineName | ArchDefinePpcgr)
1268 .Case("750", ArchDefineName | ArchDefinePpcgr)
1269 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr |
1270 ArchDefinePpcsq)
1271 .Case("a2", ArchDefineA2)
1272 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
1273 .Case("pwr3", ArchDefinePpcgr)
1274 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
1275 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr |
1276 ArchDefinePpcsq)
1277 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4 |
1278 ArchDefinePpcgr | ArchDefinePpcsq)
1279 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5 |
1280 ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1281 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x |
1282 ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr |
1283 ArchDefinePpcsq)
1284 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6 |
1285 ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4 |
1286 ArchDefinePpcgr | ArchDefinePpcsq)
1287 .Case("pwr8", ArchDefineName | ArchDefinePwr7 | ArchDefinePwr6x |
1288 ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5 |
1289 ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1290 .Case("pwr9", ArchDefineName | ArchDefinePwr8 | ArchDefinePwr7 |
1291 ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x |
1292 ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr |
1293 ArchDefinePpcsq)
1294 .Case("power3", ArchDefinePpcgr)
1295 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1296 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr |
1297 ArchDefinePpcsq)
1298 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4 |
1299 ArchDefinePpcgr | ArchDefinePpcsq)
1300 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5 |
1301 ArchDefinePwr4 | ArchDefinePpcgr |
1302 ArchDefinePpcsq)
1303 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x |
1304 ArchDefinePwr5 | ArchDefinePwr4 |
1305 ArchDefinePpcgr | ArchDefinePpcsq)
1306 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6 |
1307 ArchDefinePwr5x | ArchDefinePwr5 |
1308 ArchDefinePwr4 | ArchDefinePpcgr |
1309 ArchDefinePpcsq)
1310 .Case("power8", ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr6x |
1311 ArchDefinePwr6 | ArchDefinePwr5x |
1312 ArchDefinePwr5 | ArchDefinePwr4 |
1313 ArchDefinePpcgr | ArchDefinePpcsq)
1314 .Case("power9", ArchDefinePwr9 | ArchDefinePwr8 | ArchDefinePwr7 |
1315 ArchDefinePwr6x | ArchDefinePwr6 |
1316 ArchDefinePwr5x | ArchDefinePwr5 |
1317 ArchDefinePwr4 | ArchDefinePpcgr |
1318 ArchDefinePpcsq)
1319 // powerpc64le automatically defaults to at least power8.
1320 .Case("ppc64le", ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr6x |
1321 ArchDefinePwr6 | ArchDefinePwr5x |
1322 ArchDefinePwr5 | ArchDefinePwr4 |
1323 ArchDefinePpcgr | ArchDefinePpcsq)
1324 .Default(ArchDefineNone);
Hal Finkel6b984f02012-07-03 16:51:04 +00001325
1326 if (defs & ArchDefineName)
1327 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
1328 if (defs & ArchDefinePpcgr)
1329 Builder.defineMacro("_ARCH_PPCGR");
1330 if (defs & ArchDefinePpcsq)
1331 Builder.defineMacro("_ARCH_PPCSQ");
1332 if (defs & ArchDefine440)
Hal Finkel8eb59282012-06-11 22:35:19 +00001333 Builder.defineMacro("_ARCH_440");
Hal Finkel6b984f02012-07-03 16:51:04 +00001334 if (defs & ArchDefine603)
1335 Builder.defineMacro("_ARCH_603");
1336 if (defs & ArchDefine604)
1337 Builder.defineMacro("_ARCH_604");
Bill Schmidt38378a02013-02-01 20:23:10 +00001338 if (defs & ArchDefinePwr4)
Hal Finkel6b984f02012-07-03 16:51:04 +00001339 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt38378a02013-02-01 20:23:10 +00001340 if (defs & ArchDefinePwr5)
Hal Finkel6b984f02012-07-03 16:51:04 +00001341 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt38378a02013-02-01 20:23:10 +00001342 if (defs & ArchDefinePwr5x)
1343 Builder.defineMacro("_ARCH_PWR5X");
1344 if (defs & ArchDefinePwr6)
Hal Finkel8eb59282012-06-11 22:35:19 +00001345 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt38378a02013-02-01 20:23:10 +00001346 if (defs & ArchDefinePwr6x)
1347 Builder.defineMacro("_ARCH_PWR6X");
1348 if (defs & ArchDefinePwr7)
1349 Builder.defineMacro("_ARCH_PWR7");
Will Schmidtf0487512014-06-26 13:34:10 +00001350 if (defs & ArchDefinePwr8)
1351 Builder.defineMacro("_ARCH_PWR8");
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001352 if (defs & ArchDefinePwr9)
1353 Builder.defineMacro("_ARCH_PWR9");
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001354 if (defs & ArchDefineA2)
1355 Builder.defineMacro("_ARCH_A2");
1356 if (defs & ArchDefineA2q) {
1357 Builder.defineMacro("_ARCH_A2Q");
1358 Builder.defineMacro("_ARCH_QP");
1359 }
1360
1361 if (getTriple().getVendor() == llvm::Triple::BGQ) {
1362 Builder.defineMacro("__bg__");
1363 Builder.defineMacro("__THW_BLUEGENE__");
1364 Builder.defineMacro("__bgq__");
1365 Builder.defineMacro("__TOS_BGQ__");
1366 }
Bill Schmidt38378a02013-02-01 20:23:10 +00001367
Eric Christopher758aad72017-03-21 22:06:18 +00001368 if (HasAltivec) {
1369 Builder.defineMacro("__VEC__", "10206");
1370 Builder.defineMacro("__ALTIVEC__");
1371 }
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001372 if (HasVSX)
1373 Builder.defineMacro("__VSX__");
Bill Schmidt8c184e32014-10-10 17:21:23 +00001374 if (HasP8Vector)
Bill Schmidt59eb7672014-10-10 15:09:43 +00001375 Builder.defineMacro("__POWER8_VECTOR__");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001376 if (HasP8Crypto)
1377 Builder.defineMacro("__CRYPTO__");
Kit Barton8246f282015-03-25 19:41:41 +00001378 if (HasHTM)
1379 Builder.defineMacro("__HTM__");
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001380 if (HasFloat128)
1381 Builder.defineMacro("__FLOAT128__");
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001382 if (HasP9Vector)
1383 Builder.defineMacro("__POWER9_VECTOR__");
Hal Finkela57b8902015-10-01 13:39:49 +00001384
1385 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
1386 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
1387 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
1388 if (PointerWidth == 64)
1389 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001390
Bill Schmidt38378a02013-02-01 20:23:10 +00001391 // FIXME: The following are not yet generated here by Clang, but are
1392 // generated by GCC:
1393 //
1394 // _SOFT_FLOAT_
1395 // __RECIP_PRECISION__
1396 // __APPLE_ALTIVEC__
Bill Schmidt38378a02013-02-01 20:23:10 +00001397 // __RECIP__
1398 // __RECIPF__
1399 // __RSQRTE__
1400 // __RSQRTEF__
1401 // _SOFT_DOUBLE_
1402 // __NO_LWSYNC__
1403 // __HAVE_BSWAP__
1404 // __LONGDOUBLE128
1405 // __CMODEL_MEDIUM__
1406 // __CMODEL_LARGE__
1407 // _CALL_SYSV
1408 // _CALL_DARWIN
1409 // __NO_FPRS__
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001410}
1411
Eric Christophera8a14c32015-08-31 18:39:16 +00001412// Handle explicit options being passed to the compiler here: if we've
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001413// explicitly turned off vsx and turned on any of:
1414// - power8-vector
1415// - direct-move
1416// - float128
1417// - power9-vector
1418// then go ahead and error since the customer has expressed an incompatible
Eric Christophera8a14c32015-08-31 18:39:16 +00001419// set of options.
1420static bool ppcUserFeaturesCheck(DiagnosticsEngine &Diags,
Eric Christopher8c47b422015-10-09 18:39:55 +00001421 const std::vector<std::string> &FeaturesVec) {
Eric Christophera8a14c32015-08-31 18:39:16 +00001422
1423 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "-vsx") !=
1424 FeaturesVec.end()) {
1425 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+power8-vector") !=
1426 FeaturesVec.end()) {
1427 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mpower8-vector"
1428 << "-mno-vsx";
1429 return false;
1430 }
1431
1432 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+direct-move") !=
1433 FeaturesVec.end()) {
1434 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mdirect-move"
1435 << "-mno-vsx";
1436 return false;
1437 }
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001438
1439 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+float128") !=
1440 FeaturesVec.end()) {
1441 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mfloat128"
1442 << "-mno-vsx";
1443 return false;
1444 }
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001445
1446 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+power9-vector") !=
1447 FeaturesVec.end()) {
1448 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mpower9-vector"
1449 << "-mno-vsx";
1450 return false;
1451 }
Eric Christophera8a14c32015-08-31 18:39:16 +00001452 }
1453
1454 return true;
1455}
1456
Eric Christopher8c47b422015-10-09 18:39:55 +00001457bool PPCTargetInfo::initFeatureMap(
1458 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
1459 const std::vector<std::string> &FeaturesVec) const {
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001460 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1461 .Case("7400", true)
1462 .Case("g4", true)
1463 .Case("7450", true)
1464 .Case("g4+", true)
1465 .Case("970", true)
1466 .Case("g5", true)
1467 .Case("pwr6", true)
1468 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +00001469 .Case("pwr8", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001470 .Case("pwr9", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001471 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +00001472 .Case("ppc64le", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001473 .Default(false);
Hal Finkelb58ce852013-02-01 18:44:19 +00001474
1475 Features["qpx"] = (CPU == "a2q");
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001476 Features["power9-vector"] = (CPU == "pwr9");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001477 Features["crypto"] = llvm::StringSwitch<bool>(CPU)
1478 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001479 .Case("pwr9", true)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001480 .Case("pwr8", true)
1481 .Default(false);
1482 Features["power8-vector"] = llvm::StringSwitch<bool>(CPU)
1483 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001484 .Case("pwr9", true)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001485 .Case("pwr8", true)
1486 .Default(false);
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001487 Features["bpermd"] = llvm::StringSwitch<bool>(CPU)
1488 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001489 .Case("pwr9", true)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001490 .Case("pwr8", true)
1491 .Case("pwr7", true)
1492 .Default(false);
1493 Features["extdiv"] = llvm::StringSwitch<bool>(CPU)
1494 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001495 .Case("pwr9", true)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001496 .Case("pwr8", true)
1497 .Case("pwr7", true)
1498 .Default(false);
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001499 Features["direct-move"] = llvm::StringSwitch<bool>(CPU)
1500 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001501 .Case("pwr9", true)
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001502 .Case("pwr8", true)
1503 .Default(false);
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001504 Features["vsx"] = llvm::StringSwitch<bool>(CPU)
1505 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001506 .Case("pwr9", true)
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001507 .Case("pwr8", true)
1508 .Case("pwr7", true)
1509 .Default(false);
Eric Christopher74fa24f2017-03-20 21:12:53 +00001510 Features["htm"] = llvm::StringSwitch<bool>(CPU)
1511 .Case("ppc64le", true)
1512 .Case("pwr9", true)
1513 .Case("pwr8", true)
1514 .Default(false);
Eric Christopheref1e2952015-08-28 02:13:58 +00001515
Eric Christophera8a14c32015-08-31 18:39:16 +00001516 if (!ppcUserFeaturesCheck(Diags, FeaturesVec))
1517 return false;
Eric Christopher007b0a02015-08-28 22:32:01 +00001518
Eric Christopher007b0a02015-08-28 22:32:01 +00001519 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001520}
1521
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001522bool PPCTargetInfo::hasFeature(StringRef Feature) const {
Bill Schmidte6e9d152014-11-02 14:56:41 +00001523 return llvm::StringSwitch<bool>(Feature)
Eric Christopher758aad72017-03-21 22:06:18 +00001524 .Case("powerpc", true)
1525 .Case("altivec", HasAltivec)
1526 .Case("vsx", HasVSX)
1527 .Case("power8-vector", HasP8Vector)
1528 .Case("crypto", HasP8Crypto)
1529 .Case("direct-move", HasDirectMove)
1530 .Case("qpx", HasQPX)
1531 .Case("htm", HasHTM)
1532 .Case("bpermd", HasBPERMD)
1533 .Case("extdiv", HasExtDiv)
1534 .Case("float128", HasFloat128)
1535 .Case("power9-vector", HasP9Vector)
1536 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001537}
Chris Lattner17df24e2008-04-21 18:56:49 +00001538
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001539void PPCTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
1540 StringRef Name, bool Enabled) const {
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001541 // If we're enabling direct-move or power8-vector go ahead and enable vsx
1542 // as well. Do the inverse if we're disabling vsx. We'll diagnose any user
1543 // incompatible options.
1544 if (Enabled) {
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001545 if (Name == "direct-move" ||
1546 Name == "power8-vector" ||
1547 Name == "float128" ||
1548 Name == "power9-vector") {
1549 // power9-vector is really a superset of power8-vector so encode that.
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001550 Features[Name] = Features["vsx"] = true;
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001551 if (Name == "power9-vector")
1552 Features["power8-vector"] = true;
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001553 } else {
1554 Features[Name] = true;
1555 }
1556 } else {
1557 if (Name == "vsx") {
1558 Features[Name] = Features["direct-move"] = Features["power8-vector"] =
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001559 Features["float128"] = Features["power9-vector"] = false;
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001560 } else {
1561 Features[Name] = false;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001562 }
1563 }
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001564}
1565
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001566const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001567 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1568 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1569 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1570 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1571 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1572 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1573 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1574 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001575 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001576 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001577 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001578 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1579 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1580 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1581 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001582 "vrsave", "vscr",
1583 "spe_acc", "spefscr",
1584 "sfp"
1585};
Chris Lattner10a5b382007-01-29 05:24:35 +00001586
Craig Topperf054e3a2015-10-19 03:52:27 +00001587ArrayRef<const char*> PPCTargetInfo::getGCCRegNames() const {
1588 return llvm::makeArrayRef(GCCRegNames);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001589}
Chris Lattner5ba61f02006-10-14 07:39:34 +00001590
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001591const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1592 // While some of these aliases do map to different registers
1593 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001594 { { "0" }, "r0" },
1595 { { "1"}, "r1" },
1596 { { "2" }, "r2" },
1597 { { "3" }, "r3" },
1598 { { "4" }, "r4" },
1599 { { "5" }, "r5" },
1600 { { "6" }, "r6" },
1601 { { "7" }, "r7" },
1602 { { "8" }, "r8" },
1603 { { "9" }, "r9" },
1604 { { "10" }, "r10" },
1605 { { "11" }, "r11" },
1606 { { "12" }, "r12" },
1607 { { "13" }, "r13" },
1608 { { "14" }, "r14" },
1609 { { "15" }, "r15" },
1610 { { "16" }, "r16" },
1611 { { "17" }, "r17" },
1612 { { "18" }, "r18" },
1613 { { "19" }, "r19" },
1614 { { "20" }, "r20" },
1615 { { "21" }, "r21" },
1616 { { "22" }, "r22" },
1617 { { "23" }, "r23" },
1618 { { "24" }, "r24" },
1619 { { "25" }, "r25" },
1620 { { "26" }, "r26" },
1621 { { "27" }, "r27" },
1622 { { "28" }, "r28" },
1623 { { "29" }, "r29" },
1624 { { "30" }, "r30" },
1625 { { "31" }, "r31" },
1626 { { "fr0" }, "f0" },
1627 { { "fr1" }, "f1" },
1628 { { "fr2" }, "f2" },
1629 { { "fr3" }, "f3" },
1630 { { "fr4" }, "f4" },
1631 { { "fr5" }, "f5" },
1632 { { "fr6" }, "f6" },
1633 { { "fr7" }, "f7" },
1634 { { "fr8" }, "f8" },
1635 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +00001636 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001637 { { "fr11" }, "f11" },
1638 { { "fr12" }, "f12" },
1639 { { "fr13" }, "f13" },
1640 { { "fr14" }, "f14" },
1641 { { "fr15" }, "f15" },
1642 { { "fr16" }, "f16" },
1643 { { "fr17" }, "f17" },
1644 { { "fr18" }, "f18" },
1645 { { "fr19" }, "f19" },
1646 { { "fr20" }, "f20" },
1647 { { "fr21" }, "f21" },
1648 { { "fr22" }, "f22" },
1649 { { "fr23" }, "f23" },
1650 { { "fr24" }, "f24" },
1651 { { "fr25" }, "f25" },
1652 { { "fr26" }, "f26" },
1653 { { "fr27" }, "f27" },
1654 { { "fr28" }, "f28" },
1655 { { "fr29" }, "f29" },
1656 { { "fr30" }, "f30" },
1657 { { "fr31" }, "f31" },
1658 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001659};
1660
Craig Topperf054e3a2015-10-19 03:52:27 +00001661ArrayRef<TargetInfo::GCCRegAlias> PPCTargetInfo::getGCCRegAliases() const {
1662 return llvm::makeArrayRef(GCCRegAliases);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001663}
Chris Lattner02dffbd2006-10-14 07:50:21 +00001664
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001665class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001666public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001667 PPC32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1668 : PPCTargetInfo(Triple, Opts) {
James Y Knightb214cbc2016-03-04 19:00:41 +00001669 resetDataLayout("E-m:e-p:32:32-i64:64-n32");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001670
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001671 switch (getTriple().getOS()) {
Nico Weber3435ede2012-01-31 02:07:33 +00001672 case llvm::Triple::Linux:
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001673 case llvm::Triple::FreeBSD:
1674 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001675 SizeType = UnsignedInt;
Hal Finkel26908382012-03-02 20:54:36 +00001676 PtrDiffType = SignedInt;
1677 IntPtrType = SignedInt;
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001678 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +00001679 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001680 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001681 }
Roman Divacky816dcd12012-03-13 16:53:54 +00001682
Roman Divacky3ffe7462012-03-13 19:20:17 +00001683 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1684 LongDoubleWidth = LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00001685 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Roman Divacky3ffe7462012-03-13 19:20:17 +00001686 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001687
1688 // PPC32 supports atomics up to 4 bytes.
1689 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divacky965b0b72011-01-06 08:27:10 +00001690 }
1691
Craig Topper3164f332014-03-11 03:39:26 +00001692 BuiltinVaListKind getBuiltinVaListKind() const override {
Roman Divacky965b0b72011-01-06 08:27:10 +00001693 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Inge5d3fb222012-06-16 03:34:49 +00001694 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman873f65a2008-08-21 00:13:15 +00001695 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001696};
Chris Lattner5ba61f02006-10-14 07:39:34 +00001697
Bill Schmidt778d3872013-07-26 01:36:11 +00001698// Note: ABI differences may eventually require us to have a separate
1699// TargetInfo for little endian.
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001700class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001701public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001702 PPC64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1703 : PPCTargetInfo(Triple, Opts) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001704 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001705 IntMaxType = SignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001706 Int64Type = SignedLong;
Roman Divacky816dcd12012-03-13 16:53:54 +00001707
Eric Christopherf6ee1f32017-02-10 04:35:21 +00001708 if ((Triple.getArch() == llvm::Triple::ppc64le)) {
1709 resetDataLayout("e-m:e-i64:64-n32:64");
Eric Christopher4855ba82017-02-10 03:32:34 +00001710 ABI = "elfv2";
Eric Christopherf6ee1f32017-02-10 04:35:21 +00001711 } else {
1712 resetDataLayout("E-m:e-i64:64-n32:64");
Eric Christopher4855ba82017-02-10 03:32:34 +00001713 ABI = "elfv1";
Eric Christopherf6ee1f32017-02-10 04:35:21 +00001714 }
Eric Christopher4855ba82017-02-10 03:32:34 +00001715
Eric Christopherf6ee1f32017-02-10 04:35:21 +00001716 switch (getTriple().getOS()) {
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001717 case llvm::Triple::FreeBSD:
Roman Divacky3ffe7462012-03-13 19:20:17 +00001718 LongDoubleWidth = LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00001719 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001720 break;
Joerg Sonnenbergeraac82c42014-10-15 19:52:03 +00001721 case llvm::Triple::NetBSD:
1722 IntMaxType = SignedLongLong;
1723 Int64Type = SignedLongLong;
1724 break;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001725 default:
1726 break;
Ulrich Weigand8afad612014-07-28 13:17:52 +00001727 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001728
1729 // PPC64 supports atomics up to 8 bytes.
1730 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001731 }
Craig Topper3164f332014-03-11 03:39:26 +00001732 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001733 return TargetInfo::CharPtrBuiltinVaList;
Roman Divacky965b0b72011-01-06 08:27:10 +00001734 }
Eric Christophere6b7cf42015-07-10 18:25:52 +00001735 // PPC64 Linux-specific ABI options.
Ulrich Weigand8afad612014-07-28 13:17:52 +00001736 bool setABI(const std::string &Name) override {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001737 if (Name == "elfv1" || Name == "elfv1-qpx" || Name == "elfv2") {
Ulrich Weigand8afad612014-07-28 13:17:52 +00001738 ABI = Name;
1739 return true;
1740 }
1741 return false;
1742 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001743};
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001744
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001745class DarwinPPC32TargetInfo : public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001746public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001747 DarwinPPC32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1748 : DarwinTargetInfo<PPC32TargetInfo>(Triple, Opts) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001749 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +00001750 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Eric Christopher917e9522014-11-18 22:36:15 +00001751 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev68d773c2012-01-17 22:40:00 +00001752 LongLongAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001753 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00001754 resetDataLayout("E-m:o-p:32:32-f64:32:64-n32");
Roman Divacky965b0b72011-01-06 08:27:10 +00001755 }
Craig Topper3164f332014-03-11 03:39:26 +00001756 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001757 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001758 }
1759};
1760
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001761class DarwinPPC64TargetInfo : public DarwinTargetInfo<PPC64TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001762public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001763 DarwinPPC64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1764 : DarwinTargetInfo<PPC64TargetInfo>(Triple, Opts) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001765 HasAlignMac68kSupport = true;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001766 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00001767 resetDataLayout("E-m:o-i64:64-n32:64");
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001768 }
1769};
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001770
Eric Christopherc48497a2015-09-18 21:26:24 +00001771static const unsigned NVPTXAddrSpaceMap[] = {
1772 1, // opencl_global
1773 3, // opencl_local
1774 4, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00001775 // FIXME: generic has to be added to the target
Eric Christopherc48497a2015-09-18 21:26:24 +00001776 0, // opencl_generic
1777 1, // cuda_device
1778 4, // cuda_constant
1779 3, // cuda_shared
1780};
1781
1782class NVPTXTargetInfo : public TargetInfo {
1783 static const char *const GCCRegNames[];
1784 static const Builtin::Info BuiltinInfo[];
Justin Lebar62907612016-07-06 21:21:39 +00001785 CudaArch GPU;
Justin Lebarb6626592017-01-05 16:53:21 +00001786 std::unique_ptr<TargetInfo> HostTarget;
Reid Klecknerbbc01782014-12-03 21:53:36 +00001787
Eric Christopherc48497a2015-09-18 21:26:24 +00001788public:
Justin Lebarb6626592017-01-05 16:53:21 +00001789 NVPTXTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts,
1790 unsigned TargetPointerWidth)
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001791 : TargetInfo(Triple) {
Justin Lebarb6626592017-01-05 16:53:21 +00001792 assert((TargetPointerWidth == 32 || TargetPointerWidth == 64) &&
1793 "NVPTX only supports 32- and 64-bit modes.");
1794
Eric Christopherc48497a2015-09-18 21:26:24 +00001795 TLSSupported = false;
Eric Christopherc48497a2015-09-18 21:26:24 +00001796 AddrSpaceMap = &NVPTXAddrSpaceMap;
1797 UseAddrSpaceMapMangling = true;
Justin Lebarb6626592017-01-05 16:53:21 +00001798
Eric Christopherc48497a2015-09-18 21:26:24 +00001799 // Define available target features
1800 // These must be defined in sorted order!
1801 NoAsmVariants = true;
Justin Lebar62907612016-07-06 21:21:39 +00001802 GPU = CudaArch::SM_20;
Justin Lebar76945b22016-04-29 23:05:19 +00001803
Justin Lebarb6626592017-01-05 16:53:21 +00001804 if (TargetPointerWidth == 32)
1805 resetDataLayout("e-p:32:32-i64:64-v16:16-v32:32-n16:32:64");
1806 else
1807 resetDataLayout("e-i64:64-v16:16-v32:32-n16:32:64");
1808
Justin Lebar76945b22016-04-29 23:05:19 +00001809 // If possible, get a TargetInfo for our host triple, so we can match its
1810 // types.
1811 llvm::Triple HostTriple(Opts.HostTriple);
Justin Lebarb6626592017-01-05 16:53:21 +00001812 if (!HostTriple.isNVPTX())
1813 HostTarget.reset(AllocateTarget(llvm::Triple(Opts.HostTriple), Opts));
1814
1815 // If no host target, make some guesses about the data layout and return.
Justin Lebar76945b22016-04-29 23:05:19 +00001816 if (!HostTarget) {
Justin Lebarb6626592017-01-05 16:53:21 +00001817 LongWidth = LongAlign = TargetPointerWidth;
1818 PointerWidth = PointerAlign = TargetPointerWidth;
1819 switch (TargetPointerWidth) {
1820 case 32:
1821 SizeType = TargetInfo::UnsignedInt;
1822 PtrDiffType = TargetInfo::SignedInt;
1823 IntPtrType = TargetInfo::SignedInt;
1824 break;
1825 case 64:
1826 SizeType = TargetInfo::UnsignedLong;
1827 PtrDiffType = TargetInfo::SignedLong;
1828 IntPtrType = TargetInfo::SignedLong;
1829 break;
1830 default:
1831 llvm_unreachable("TargetPointerWidth must be 32 or 64");
1832 }
Justin Lebar76945b22016-04-29 23:05:19 +00001833 return;
1834 }
1835
Justin Lebarb6626592017-01-05 16:53:21 +00001836 // Copy properties from host target.
Justin Lebar76945b22016-04-29 23:05:19 +00001837 PointerWidth = HostTarget->getPointerWidth(/* AddrSpace = */ 0);
1838 PointerAlign = HostTarget->getPointerAlign(/* AddrSpace = */ 0);
1839 BoolWidth = HostTarget->getBoolWidth();
1840 BoolAlign = HostTarget->getBoolAlign();
1841 IntWidth = HostTarget->getIntWidth();
1842 IntAlign = HostTarget->getIntAlign();
1843 HalfWidth = HostTarget->getHalfWidth();
1844 HalfAlign = HostTarget->getHalfAlign();
1845 FloatWidth = HostTarget->getFloatWidth();
1846 FloatAlign = HostTarget->getFloatAlign();
1847 DoubleWidth = HostTarget->getDoubleWidth();
1848 DoubleAlign = HostTarget->getDoubleAlign();
1849 LongWidth = HostTarget->getLongWidth();
1850 LongAlign = HostTarget->getLongAlign();
1851 LongLongWidth = HostTarget->getLongLongWidth();
1852 LongLongAlign = HostTarget->getLongLongAlign();
1853 MinGlobalAlign = HostTarget->getMinGlobalAlign();
Richard Smith59139022016-09-30 22:41:36 +00001854 NewAlign = HostTarget->getNewAlign();
Justin Lebar76945b22016-04-29 23:05:19 +00001855 DefaultAlignForAttributeAligned =
1856 HostTarget->getDefaultAlignForAttributeAligned();
1857 SizeType = HostTarget->getSizeType();
1858 IntMaxType = HostTarget->getIntMaxType();
1859 PtrDiffType = HostTarget->getPtrDiffType(/* AddrSpace = */ 0);
1860 IntPtrType = HostTarget->getIntPtrType();
1861 WCharType = HostTarget->getWCharType();
1862 WIntType = HostTarget->getWIntType();
1863 Char16Type = HostTarget->getChar16Type();
1864 Char32Type = HostTarget->getChar32Type();
1865 Int64Type = HostTarget->getInt64Type();
1866 SigAtomicType = HostTarget->getSigAtomicType();
1867 ProcessIDType = HostTarget->getProcessIDType();
1868
1869 UseBitFieldTypeAlignment = HostTarget->useBitFieldTypeAlignment();
1870 UseZeroLengthBitfieldAlignment =
1871 HostTarget->useZeroLengthBitfieldAlignment();
1872 UseExplicitBitFieldAlignment = HostTarget->useExplicitBitFieldAlignment();
1873 ZeroLengthBitfieldBoundary = HostTarget->getZeroLengthBitfieldBoundary();
1874
Justin Lebar5057f172016-09-09 20:35:43 +00001875 // This is a bit of a lie, but it controls __GCC_ATOMIC_XXX_LOCK_FREE, and
1876 // we need those macros to be identical on host and device, because (among
1877 // other things) they affect which standard library classes are defined, and
1878 // we need all classes to be defined on both the host and device.
1879 MaxAtomicInlineWidth = HostTarget->getMaxAtomicInlineWidth();
1880
Justin Lebar76945b22016-04-29 23:05:19 +00001881 // Properties intentionally not copied from host:
1882 // - LargeArrayMinWidth, LargeArrayAlign: Not visible across the
1883 // host/device boundary.
1884 // - SuitableAlign: Not visible across the host/device boundary, and may
1885 // correctly be different on host/device, e.g. if host has wider vector
1886 // types than device.
1887 // - LongDoubleWidth, LongDoubleAlign: nvptx's long double type is the same
1888 // as its double type, but that's not necessarily true on the host.
1889 // TODO: nvcc emits a warning when using long double on device; we should
1890 // do the same.
Eric Christopherc48497a2015-09-18 21:26:24 +00001891 }
1892 void getTargetDefines(const LangOptions &Opts,
1893 MacroBuilder &Builder) const override {
1894 Builder.defineMacro("__PTX__");
1895 Builder.defineMacro("__NVPTX__");
1896 if (Opts.CUDAIsDevice) {
1897 // Set __CUDA_ARCH__ for the GPU specified.
Justin Lebaref1aaac2016-07-06 21:21:14 +00001898 std::string CUDAArchCode = [this] {
1899 switch (GPU) {
Simon Pilgrim13dff572016-07-07 22:32:26 +00001900 case CudaArch::UNKNOWN:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001901 assert(false && "No GPU arch when compiling CUDA device code.");
1902 return "";
Justin Lebar62907612016-07-06 21:21:39 +00001903 case CudaArch::SM_20:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001904 return "200";
Justin Lebar62907612016-07-06 21:21:39 +00001905 case CudaArch::SM_21:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001906 return "210";
Justin Lebar62907612016-07-06 21:21:39 +00001907 case CudaArch::SM_30:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001908 return "300";
Justin Lebar62907612016-07-06 21:21:39 +00001909 case CudaArch::SM_32:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001910 return "320";
Justin Lebar62907612016-07-06 21:21:39 +00001911 case CudaArch::SM_35:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001912 return "350";
Justin Lebar62907612016-07-06 21:21:39 +00001913 case CudaArch::SM_37:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001914 return "370";
Justin Lebar62907612016-07-06 21:21:39 +00001915 case CudaArch::SM_50:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001916 return "500";
Justin Lebar62907612016-07-06 21:21:39 +00001917 case CudaArch::SM_52:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001918 return "520";
Justin Lebar62907612016-07-06 21:21:39 +00001919 case CudaArch::SM_53:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001920 return "530";
Justin Lebar62907612016-07-06 21:21:39 +00001921 case CudaArch::SM_60:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001922 return "600";
Justin Lebar62907612016-07-06 21:21:39 +00001923 case CudaArch::SM_61:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001924 return "610";
Justin Lebar62907612016-07-06 21:21:39 +00001925 case CudaArch::SM_62:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001926 return "620";
1927 }
Simon Pilgrim13dff572016-07-07 22:32:26 +00001928 llvm_unreachable("unhandled CudaArch");
Justin Lebaref1aaac2016-07-06 21:21:14 +00001929 }();
Eric Christopherc48497a2015-09-18 21:26:24 +00001930 Builder.defineMacro("__CUDA_ARCH__", CUDAArchCode);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001931 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001932 }
Craig Topper6c03a542015-10-19 04:51:35 +00001933 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
1934 return llvm::makeArrayRef(BuiltinInfo,
1935 clang::NVPTX::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eric Christopherc48497a2015-09-18 21:26:24 +00001936 }
Artem Belevichfda99052016-09-28 17:47:35 +00001937 bool
1938 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
1939 StringRef CPU,
1940 const std::vector<std::string> &FeaturesVec) const override {
1941 Features["satom"] = GPU >= CudaArch::SM_60;
1942 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
1943 }
1944
Eric Christopherc48497a2015-09-18 21:26:24 +00001945 bool hasFeature(StringRef Feature) const override {
Artem Belevichfda99052016-09-28 17:47:35 +00001946 return llvm::StringSwitch<bool>(Feature)
1947 .Cases("ptx", "nvptx", true)
1948 .Case("satom", GPU >= CudaArch::SM_60) // Atomics w/ scope.
1949 .Default(false);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001950 }
1951
Craig Topperf054e3a2015-10-19 03:52:27 +00001952 ArrayRef<const char *> getGCCRegNames() const override;
1953 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00001954 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00001955 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00001956 }
1957 bool validateAsmConstraint(const char *&Name,
1958 TargetInfo::ConstraintInfo &Info) const override {
1959 switch (*Name) {
1960 default:
1961 return false;
1962 case 'c':
1963 case 'h':
1964 case 'r':
1965 case 'l':
1966 case 'f':
1967 case 'd':
1968 Info.setAllowsRegister();
1969 return true;
Eli Bendersky13467172015-04-01 20:29:18 +00001970 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001971 }
1972 const char *getClobbers() const override {
1973 // FIXME: Is this really right?
1974 return "";
1975 }
1976 BuiltinVaListKind getBuiltinVaListKind() const override {
1977 // FIXME: implement
1978 return TargetInfo::CharPtrBuiltinVaList;
1979 }
1980 bool setCPU(const std::string &Name) override {
Justin Lebar62907612016-07-06 21:21:39 +00001981 GPU = StringToCudaArch(Name);
1982 return GPU != CudaArch::UNKNOWN;
Eric Christopherc48497a2015-09-18 21:26:24 +00001983 }
Jan Vesely9674bd42016-06-17 19:02:14 +00001984 void setSupportedOpenCLOpts() override {
1985 auto &Opts = getSupportedOpenCLOpts();
Yaxun Liu5b746652016-12-18 05:18:55 +00001986 Opts.support("cl_clang_storage_class_specifiers");
1987 Opts.support("cl_khr_gl_sharing");
1988 Opts.support("cl_khr_icd");
Jan Vesely9674bd42016-06-17 19:02:14 +00001989
Yaxun Liu5b746652016-12-18 05:18:55 +00001990 Opts.support("cl_khr_fp64");
1991 Opts.support("cl_khr_byte_addressable_store");
1992 Opts.support("cl_khr_global_int32_base_atomics");
1993 Opts.support("cl_khr_global_int32_extended_atomics");
1994 Opts.support("cl_khr_local_int32_base_atomics");
1995 Opts.support("cl_khr_local_int32_extended_atomics");
Jan Vesely9674bd42016-06-17 19:02:14 +00001996 }
Justin Lebar86c4e632017-01-05 16:53:38 +00001997
1998 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
1999 // CUDA compilations support all of the host's calling conventions.
2000 //
2001 // TODO: We should warn if you apply a non-default CC to anything other than
2002 // a host function.
2003 if (HostTarget)
2004 return HostTarget->checkCallingConvention(CC);
2005 return CCCR_Warning;
2006 }
Eric Christopherc48497a2015-09-18 21:26:24 +00002007};
2008
2009const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
2010#define BUILTIN(ID, TYPE, ATTRS) \
2011 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
2012#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
2013 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Artem Belevichfda99052016-09-28 17:47:35 +00002014#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
2015 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Eric Christopherc48497a2015-09-18 21:26:24 +00002016#include "clang/Basic/BuiltinsNVPTX.def"
2017};
2018
2019const char *const NVPTXTargetInfo::GCCRegNames[] = {"r0"};
2020
Craig Topperf054e3a2015-10-19 03:52:27 +00002021ArrayRef<const char *> NVPTXTargetInfo::getGCCRegNames() const {
2022 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00002023}
2024
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002025static const unsigned AMDGPUAddrSpaceMap[] = {
Eli Friedmand13b41e2012-10-12 23:32:00 +00002026 1, // opencl_global
2027 3, // opencl_local
2028 2, // opencl_constant
Matt Arsenaultbfe25b22014-12-01 16:46:03 +00002029 4, // opencl_generic
Eli Friedmand13b41e2012-10-12 23:32:00 +00002030 1, // cuda_device
2031 2, // cuda_constant
2032 3 // cuda_shared
2033};
2034
Tom Stellarda96344b2014-08-21 13:58:40 +00002035// If you edit the description strings, make sure you update
2036// getPointerWidthV().
2037
Craig Topper273dbc62015-10-18 05:29:26 +00002038static const char *const DataLayoutStringR600 =
Rafael Espindola29db13a2014-01-03 18:13:17 +00002039 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
2040 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00002041
Craig Topper273dbc62015-10-18 05:29:26 +00002042static const char *const DataLayoutStringSI =
Matt Arsenault6dc455f2016-05-31 16:58:18 +00002043 "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 +00002044 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
2045 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00002046
Matt Arsenault250024f2016-06-08 01:56:42 +00002047class AMDGPUTargetInfo final : public TargetInfo {
Matt Arsenault56f008d2014-06-24 20:45:01 +00002048 static const Builtin::Info BuiltinInfo[];
Tom Stellard7b1059b2015-04-14 14:36:56 +00002049 static const char * const GCCRegNames[];
Matt Arsenault56f008d2014-06-24 20:45:01 +00002050
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002051 /// \brief The GPU profiles supported by the AMDGPU target.
Tom Stellardc74b1e02013-03-04 17:40:53 +00002052 enum GPUKind {
2053 GK_NONE,
2054 GK_R600,
2055 GK_R600_DOUBLE_OPS,
2056 GK_R700,
2057 GK_R700_DOUBLE_OPS,
2058 GK_EVERGREEN,
2059 GK_EVERGREEN_DOUBLE_OPS,
2060 GK_NORTHERN_ISLANDS,
2061 GK_CAYMAN,
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002062 GK_GFX6,
2063 GK_GFX7,
Matt Arsenaulteb952fd2017-02-18 19:02:41 +00002064 GK_GFX8,
2065 GK_GFX9
Tom Stellardc74b1e02013-03-04 17:40:53 +00002066 } GPU;
2067
Jan Veselyeebeaea2015-05-04 19:53:36 +00002068 bool hasFP64:1;
2069 bool hasFMAF:1;
2070 bool hasLDEXPF:1;
Yaxun Liud3e85b92016-09-13 17:37:09 +00002071 bool hasFullSpeedFP32Denorms:1;
Jan Veselya3abd6d2015-05-01 17:38:13 +00002072
Matt Arsenault250024f2016-06-08 01:56:42 +00002073 static bool isAMDGCN(const llvm::Triple &TT) {
2074 return TT.getArch() == llvm::Triple::amdgcn;
2075 }
2076
Eli Friedmand13b41e2012-10-12 23:32:00 +00002077public:
Yaxun Liu2c17e822016-08-09 19:43:38 +00002078 AMDGPUTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Matt Arsenault250024f2016-06-08 01:56:42 +00002079 : TargetInfo(Triple) ,
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002080 GPU(isAMDGCN(Triple) ? GK_GFX6 : GK_R600),
Matt Arsenault250024f2016-06-08 01:56:42 +00002081 hasFP64(false),
2082 hasFMAF(false),
Yaxun Liu2c17e822016-08-09 19:43:38 +00002083 hasLDEXPF(false),
Yaxun Liud3e85b92016-09-13 17:37:09 +00002084 hasFullSpeedFP32Denorms(false){
Matt Arsenault250024f2016-06-08 01:56:42 +00002085 if (getTriple().getArch() == llvm::Triple::amdgcn) {
Jan Veselya3abd6d2015-05-01 17:38:13 +00002086 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00002087 hasFMAF = true;
2088 hasLDEXPF = true;
Tom Stellardd99fb952015-01-28 15:38:44 +00002089 }
Matt Arsenault250024f2016-06-08 01:56:42 +00002090
2091 resetDataLayout(getTriple().getArch() == llvm::Triple::amdgcn ?
2092 DataLayoutStringSI : DataLayoutStringR600);
2093
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002094 AddrSpaceMap = &AMDGPUAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00002095 UseAddrSpaceMapMangling = true;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002096 }
2097
Tom Stellarda96344b2014-08-21 13:58:40 +00002098 uint64_t getPointerWidthV(unsigned AddrSpace) const override {
2099 if (GPU <= GK_CAYMAN)
2100 return 32;
2101
2102 switch(AddrSpace) {
2103 default:
2104 return 64;
2105 case 0:
2106 case 3:
2107 case 5:
2108 return 32;
2109 }
2110 }
2111
Yaxun Liu26f75662016-08-19 05:17:25 +00002112 uint64_t getMaxPointerWidth() const override {
2113 return getTriple().getArch() == llvm::Triple::amdgcn ? 64 : 32;
2114 }
2115
Craig Topper3164f332014-03-11 03:39:26 +00002116 const char * getClobbers() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00002117 return "";
2118 }
2119
Craig Topperf054e3a2015-10-19 03:52:27 +00002120 ArrayRef<const char *> getGCCRegNames() const override;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002121
Craig Topperf054e3a2015-10-19 03:52:27 +00002122 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
2123 return None;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002124 }
2125
Craig Topper3164f332014-03-11 03:39:26 +00002126 bool validateAsmConstraint(const char *&Name,
Tom Stellardd097e942015-11-19 22:11:58 +00002127 TargetInfo::ConstraintInfo &Info) const override {
2128 switch (*Name) {
2129 default: break;
2130 case 'v': // vgpr
2131 case 's': // sgpr
2132 Info.setAllowsRegister();
2133 return true;
2134 }
2135 return false;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002136 }
2137
Matt Arsenault250024f2016-06-08 01:56:42 +00002138 bool initFeatureMap(llvm::StringMap<bool> &Features,
2139 DiagnosticsEngine &Diags, StringRef CPU,
2140 const std::vector<std::string> &FeatureVec) const override;
2141
Yaxun Liu2c17e822016-08-09 19:43:38 +00002142 void adjustTargetOptions(const CodeGenOptions &CGOpts,
2143 TargetOptions &TargetOpts) const override {
Yaxun Liu2c17e822016-08-09 19:43:38 +00002144 bool hasFP32Denormals = false;
2145 bool hasFP64Denormals = false;
2146 for (auto &I : TargetOpts.FeaturesAsWritten) {
2147 if (I == "+fp32-denormals" || I == "-fp32-denormals")
2148 hasFP32Denormals = true;
Matt Arsenault09cca092017-01-23 22:31:14 +00002149 if (I == "+fp64-fp16-denormals" || I == "-fp64-fp16-denormals")
Yaxun Liu2c17e822016-08-09 19:43:38 +00002150 hasFP64Denormals = true;
2151 }
2152 if (!hasFP32Denormals)
Yaxun Liud3e85b92016-09-13 17:37:09 +00002153 TargetOpts.Features.push_back((Twine(hasFullSpeedFP32Denorms &&
2154 !CGOpts.FlushDenorm ? '+' : '-') + Twine("fp32-denormals")).str());
Matt Arsenault09cca092017-01-23 22:31:14 +00002155 // Always do not flush fp64 or fp16 denorms.
Yaxun Liu2c17e822016-08-09 19:43:38 +00002156 if (!hasFP64Denormals && hasFP64)
Matt Arsenault09cca092017-01-23 22:31:14 +00002157 TargetOpts.Features.push_back("+fp64-fp16-denormals");
Yaxun Liu2c17e822016-08-09 19:43:38 +00002158 }
2159
Craig Topper6c03a542015-10-19 04:51:35 +00002160 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
2161 return llvm::makeArrayRef(BuiltinInfo,
2162 clang::AMDGPU::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eli Friedmand13b41e2012-10-12 23:32:00 +00002163 }
2164
Craig Topper3164f332014-03-11 03:39:26 +00002165 void getTargetDefines(const LangOptions &Opts,
2166 MacroBuilder &Builder) const override {
Matt Arsenault5e020b22016-02-27 09:06:26 +00002167 if (getTriple().getArch() == llvm::Triple::amdgcn)
2168 Builder.defineMacro("__AMDGCN__");
2169 else
2170 Builder.defineMacro("__R600__");
2171
Jan Veselyeebeaea2015-05-04 19:53:36 +00002172 if (hasFMAF)
2173 Builder.defineMacro("__HAS_FMAF__");
2174 if (hasLDEXPF)
2175 Builder.defineMacro("__HAS_LDEXPF__");
Jan Vesely211ba782016-06-17 02:25:03 +00002176 if (hasFP64)
2177 Builder.defineMacro("__HAS_FP64__");
Eli Friedmand13b41e2012-10-12 23:32:00 +00002178 }
2179
Craig Topper3164f332014-03-11 03:39:26 +00002180 BuiltinVaListKind getBuiltinVaListKind() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00002181 return TargetInfo::CharPtrBuiltinVaList;
2182 }
2183
Matt Arsenault250024f2016-06-08 01:56:42 +00002184 static GPUKind parseR600Name(StringRef Name) {
2185 return llvm::StringSwitch<GPUKind>(Name)
Tom Stellardc74b1e02013-03-04 17:40:53 +00002186 .Case("r600" , GK_R600)
2187 .Case("rv610", GK_R600)
2188 .Case("rv620", GK_R600)
2189 .Case("rv630", GK_R600)
2190 .Case("rv635", GK_R600)
2191 .Case("rs780", GK_R600)
2192 .Case("rs880", GK_R600)
2193 .Case("rv670", GK_R600_DOUBLE_OPS)
2194 .Case("rv710", GK_R700)
2195 .Case("rv730", GK_R700)
2196 .Case("rv740", GK_R700_DOUBLE_OPS)
2197 .Case("rv770", GK_R700_DOUBLE_OPS)
2198 .Case("palm", GK_EVERGREEN)
2199 .Case("cedar", GK_EVERGREEN)
2200 .Case("sumo", GK_EVERGREEN)
2201 .Case("sumo2", GK_EVERGREEN)
2202 .Case("redwood", GK_EVERGREEN)
2203 .Case("juniper", GK_EVERGREEN)
2204 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
2205 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
2206 .Case("barts", GK_NORTHERN_ISLANDS)
2207 .Case("turks", GK_NORTHERN_ISLANDS)
2208 .Case("caicos", GK_NORTHERN_ISLANDS)
2209 .Case("cayman", GK_CAYMAN)
2210 .Case("aruba", GK_CAYMAN)
Matt Arsenault250024f2016-06-08 01:56:42 +00002211 .Default(GK_NONE);
2212 }
2213
2214 static GPUKind parseAMDGCNName(StringRef Name) {
2215 return llvm::StringSwitch<GPUKind>(Name)
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002216 .Case("tahiti", GK_GFX6)
2217 .Case("pitcairn", GK_GFX6)
2218 .Case("verde", GK_GFX6)
2219 .Case("oland", GK_GFX6)
2220 .Case("hainan", GK_GFX6)
2221 .Case("bonaire", GK_GFX7)
2222 .Case("kabini", GK_GFX7)
2223 .Case("kaveri", GK_GFX7)
2224 .Case("hawaii", GK_GFX7)
2225 .Case("mullins", GK_GFX7)
Yaxun Liue59a0bc2016-10-26 16:40:21 +00002226 .Case("gfx700", GK_GFX7)
2227 .Case("gfx701", GK_GFX7)
2228 .Case("gfx702", GK_GFX7)
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002229 .Case("tonga", GK_GFX8)
2230 .Case("iceland", GK_GFX8)
2231 .Case("carrizo", GK_GFX8)
2232 .Case("fiji", GK_GFX8)
2233 .Case("stoney", GK_GFX8)
2234 .Case("polaris10", GK_GFX8)
2235 .Case("polaris11", GK_GFX8)
Yaxun Liue59a0bc2016-10-26 16:40:21 +00002236 .Case("gfx800", GK_GFX8)
2237 .Case("gfx801", GK_GFX8)
2238 .Case("gfx802", GK_GFX8)
2239 .Case("gfx803", GK_GFX8)
2240 .Case("gfx804", GK_GFX8)
2241 .Case("gfx810", GK_GFX8)
Matt Arsenaulteb952fd2017-02-18 19:02:41 +00002242 .Case("gfx900", GK_GFX9)
2243 .Case("gfx901", GK_GFX9)
Tom Stellardc74b1e02013-03-04 17:40:53 +00002244 .Default(GK_NONE);
Matt Arsenault250024f2016-06-08 01:56:42 +00002245 }
Tom Stellardc74b1e02013-03-04 17:40:53 +00002246
Matt Arsenault250024f2016-06-08 01:56:42 +00002247 bool setCPU(const std::string &Name) override {
2248 if (getTriple().getArch() == llvm::Triple::amdgcn)
2249 GPU = parseAMDGCNName(Name);
2250 else
2251 GPU = parseR600Name(Name);
Tom Stellardc74b1e02013-03-04 17:40:53 +00002252
Matt Arsenault250024f2016-06-08 01:56:42 +00002253 return GPU != GK_NONE;
Tom Stellardc74b1e02013-03-04 17:40:53 +00002254 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002255
Jan Vesely211ba782016-06-17 02:25:03 +00002256 void setSupportedOpenCLOpts() override {
2257 auto &Opts = getSupportedOpenCLOpts();
Yaxun Liu5b746652016-12-18 05:18:55 +00002258 Opts.support("cl_clang_storage_class_specifiers");
2259 Opts.support("cl_khr_icd");
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002260
Jan Vesely211ba782016-06-17 02:25:03 +00002261 if (hasFP64)
Yaxun Liu5b746652016-12-18 05:18:55 +00002262 Opts.support("cl_khr_fp64");
Jan Vesely211ba782016-06-17 02:25:03 +00002263 if (GPU >= GK_EVERGREEN) {
Yaxun Liu5b746652016-12-18 05:18:55 +00002264 Opts.support("cl_khr_byte_addressable_store");
2265 Opts.support("cl_khr_global_int32_base_atomics");
2266 Opts.support("cl_khr_global_int32_extended_atomics");
2267 Opts.support("cl_khr_local_int32_base_atomics");
2268 Opts.support("cl_khr_local_int32_extended_atomics");
Jan Vesely211ba782016-06-17 02:25:03 +00002269 }
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002270 if (GPU >= GK_GFX6) {
Yaxun Liu5b746652016-12-18 05:18:55 +00002271 Opts.support("cl_khr_fp16");
2272 Opts.support("cl_khr_int64_base_atomics");
2273 Opts.support("cl_khr_int64_extended_atomics");
2274 Opts.support("cl_khr_mipmap_image");
2275 Opts.support("cl_khr_subgroups");
2276 Opts.support("cl_khr_3d_image_writes");
2277 Opts.support("cl_amd_media_ops");
2278 Opts.support("cl_amd_media_ops2");
Jan Vesely211ba782016-06-17 02:25:03 +00002279 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002280 }
Nikolay Haustov8c6538b2016-06-30 09:06:33 +00002281
Yaxun Liu99444cb2016-08-03 20:38:06 +00002282 LangAS::ID getOpenCLImageAddrSpace() const override {
2283 return LangAS::opencl_constant;
2284 }
2285
Konstantin Zhuravlyovd1ba16e2017-03-08 23:56:48 +00002286 /// \returns Target specific vtbl ptr address space.
2287 unsigned getVtblPtrAddressSpace() const override {
2288 // \todo: We currently have address spaces defined in AMDGPU Backend. It
2289 // would be nice if we could use it here instead of using bare numbers (same
2290 // applies to getDWARFAddressSpace).
2291 return 2; // constant.
2292 }
2293
2294 /// \returns If a target requires an address within a target specific address
2295 /// space \p AddressSpace to be converted in order to be used, then return the
2296 /// corresponding target specific DWARF address space.
2297 ///
2298 /// \returns Otherwise return None and no conversion will be emitted in the
2299 /// DWARF.
2300 Optional<unsigned> getDWARFAddressSpace(
2301 unsigned AddressSpace) const override {
2302 switch (AddressSpace) {
2303 case 0: // LLVM Private.
2304 return 1; // DWARF Private.
2305 case 3: // LLVM Local.
2306 return 2; // DWARF Local.
2307 default:
2308 return None;
2309 }
2310 }
2311
Nikolay Haustov8c6538b2016-06-30 09:06:33 +00002312 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
2313 switch (CC) {
2314 default:
2315 return CCCR_Warning;
2316 case CC_C:
2317 case CC_OpenCLKernel:
2318 return CCCR_OK;
2319 }
2320 }
Yaxun Liu402804b2016-12-15 08:09:08 +00002321
2322 // In amdgcn target the null pointer in global, constant, and generic
2323 // address space has value 0 but in private and local address space has
2324 // value ~0.
2325 uint64_t getNullPointerValue(unsigned AS) const override {
Matt Arsenaultbf5e3e42017-03-13 19:47:53 +00002326 return AS == LangAS::opencl_local ? ~0 : 0;
Yaxun Liu402804b2016-12-15 08:09:08 +00002327 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00002328};
2329
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002330const Builtin::Info AMDGPUTargetInfo::BuiltinInfo[] = {
Matt Arsenault56f008d2014-06-24 20:45:01 +00002331#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00002332 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Matt Arsenault250024f2016-06-08 01:56:42 +00002333#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
2334 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002335#include "clang/Basic/BuiltinsAMDGPU.def"
Matt Arsenault56f008d2014-06-24 20:45:01 +00002336};
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002337const char * const AMDGPUTargetInfo::GCCRegNames[] = {
Tom Stellard7b1059b2015-04-14 14:36:56 +00002338 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
2339 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
2340 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
2341 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
2342 "v32", "v33", "v34", "v35", "v36", "v37", "v38", "v39",
2343 "v40", "v41", "v42", "v43", "v44", "v45", "v46", "v47",
2344 "v48", "v49", "v50", "v51", "v52", "v53", "v54", "v55",
2345 "v56", "v57", "v58", "v59", "v60", "v61", "v62", "v63",
2346 "v64", "v65", "v66", "v67", "v68", "v69", "v70", "v71",
2347 "v72", "v73", "v74", "v75", "v76", "v77", "v78", "v79",
2348 "v80", "v81", "v82", "v83", "v84", "v85", "v86", "v87",
2349 "v88", "v89", "v90", "v91", "v92", "v93", "v94", "v95",
2350 "v96", "v97", "v98", "v99", "v100", "v101", "v102", "v103",
2351 "v104", "v105", "v106", "v107", "v108", "v109", "v110", "v111",
2352 "v112", "v113", "v114", "v115", "v116", "v117", "v118", "v119",
2353 "v120", "v121", "v122", "v123", "v124", "v125", "v126", "v127",
2354 "v128", "v129", "v130", "v131", "v132", "v133", "v134", "v135",
2355 "v136", "v137", "v138", "v139", "v140", "v141", "v142", "v143",
2356 "v144", "v145", "v146", "v147", "v148", "v149", "v150", "v151",
2357 "v152", "v153", "v154", "v155", "v156", "v157", "v158", "v159",
2358 "v160", "v161", "v162", "v163", "v164", "v165", "v166", "v167",
2359 "v168", "v169", "v170", "v171", "v172", "v173", "v174", "v175",
2360 "v176", "v177", "v178", "v179", "v180", "v181", "v182", "v183",
2361 "v184", "v185", "v186", "v187", "v188", "v189", "v190", "v191",
2362 "v192", "v193", "v194", "v195", "v196", "v197", "v198", "v199",
2363 "v200", "v201", "v202", "v203", "v204", "v205", "v206", "v207",
2364 "v208", "v209", "v210", "v211", "v212", "v213", "v214", "v215",
2365 "v216", "v217", "v218", "v219", "v220", "v221", "v222", "v223",
2366 "v224", "v225", "v226", "v227", "v228", "v229", "v230", "v231",
2367 "v232", "v233", "v234", "v235", "v236", "v237", "v238", "v239",
2368 "v240", "v241", "v242", "v243", "v244", "v245", "v246", "v247",
2369 "v248", "v249", "v250", "v251", "v252", "v253", "v254", "v255",
2370 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
2371 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
2372 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
2373 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
2374 "s32", "s33", "s34", "s35", "s36", "s37", "s38", "s39",
2375 "s40", "s41", "s42", "s43", "s44", "s45", "s46", "s47",
2376 "s48", "s49", "s50", "s51", "s52", "s53", "s54", "s55",
2377 "s56", "s57", "s58", "s59", "s60", "s61", "s62", "s63",
2378 "s64", "s65", "s66", "s67", "s68", "s69", "s70", "s71",
2379 "s72", "s73", "s74", "s75", "s76", "s77", "s78", "s79",
2380 "s80", "s81", "s82", "s83", "s84", "s85", "s86", "s87",
2381 "s88", "s89", "s90", "s91", "s92", "s93", "s94", "s95",
2382 "s96", "s97", "s98", "s99", "s100", "s101", "s102", "s103",
2383 "s104", "s105", "s106", "s107", "s108", "s109", "s110", "s111",
2384 "s112", "s113", "s114", "s115", "s116", "s117", "s118", "s119",
Etienne Bergerone8ae26f2016-03-24 18:29:24 +00002385 "s120", "s121", "s122", "s123", "s124", "s125", "s126", "s127",
Matt Arsenaultb015d622016-02-27 09:06:22 +00002386 "exec", "vcc", "scc", "m0", "flat_scratch", "exec_lo", "exec_hi",
2387 "vcc_lo", "vcc_hi", "flat_scratch_lo", "flat_scratch_hi"
Tom Stellard7b1059b2015-04-14 14:36:56 +00002388};
2389
Craig Topperf054e3a2015-10-19 03:52:27 +00002390ArrayRef<const char *> AMDGPUTargetInfo::getGCCRegNames() const {
2391 return llvm::makeArrayRef(GCCRegNames);
Tom Stellard7b1059b2015-04-14 14:36:56 +00002392}
Matt Arsenault56f008d2014-06-24 20:45:01 +00002393
Matt Arsenault250024f2016-06-08 01:56:42 +00002394bool AMDGPUTargetInfo::initFeatureMap(
2395 llvm::StringMap<bool> &Features,
2396 DiagnosticsEngine &Diags, StringRef CPU,
2397 const std::vector<std::string> &FeatureVec) const {
2398
2399 // XXX - What does the member GPU mean if device name string passed here?
2400 if (getTriple().getArch() == llvm::Triple::amdgcn) {
2401 if (CPU.empty())
2402 CPU = "tahiti";
2403
2404 switch (parseAMDGCNName(CPU)) {
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002405 case GK_GFX6:
2406 case GK_GFX7:
Matt Arsenault250024f2016-06-08 01:56:42 +00002407 break;
2408
Matt Arsenaulta0c6dca2017-02-22 20:55:59 +00002409 case GK_GFX9:
2410 Features["gfx9-insts"] = true;
2411 LLVM_FALLTHROUGH;
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002412 case GK_GFX8:
Matt Arsenault250024f2016-06-08 01:56:42 +00002413 Features["s-memrealtime"] = true;
2414 Features["16-bit-insts"] = true;
Yaxun Liu4d867992017-03-10 01:30:46 +00002415 Features["dpp"] = true;
Matt Arsenault250024f2016-06-08 01:56:42 +00002416 break;
2417
2418 case GK_NONE:
2419 return false;
2420 default:
2421 llvm_unreachable("unhandled subtarget");
2422 }
2423 } else {
2424 if (CPU.empty())
2425 CPU = "r600";
2426
2427 switch (parseR600Name(CPU)) {
2428 case GK_R600:
2429 case GK_R700:
2430 case GK_EVERGREEN:
2431 case GK_NORTHERN_ISLANDS:
2432 break;
2433 case GK_R600_DOUBLE_OPS:
2434 case GK_R700_DOUBLE_OPS:
2435 case GK_EVERGREEN_DOUBLE_OPS:
2436 case GK_CAYMAN:
2437 Features["fp64"] = true;
2438 break;
2439 case GK_NONE:
2440 return false;
2441 default:
2442 llvm_unreachable("unhandled subtarget");
2443 }
2444 }
2445
2446 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeatureVec);
2447}
2448
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00002449const Builtin::Info BuiltinInfoX86[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00002450#define BUILTIN(ID, TYPE, ATTRS) \
2451 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002452#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
Craig Topper07d3b622015-08-07 05:14:44 +00002453 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Albert Gutowski727ab8a2016-09-14 21:19:43 +00002454#define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANGS, FEATURE) \
2455 { #ID, TYPE, ATTRS, HEADER, LANGS, FEATURE },
Chris Lattner5abdec72009-06-14 01:05:48 +00002456#include "clang/Basic/BuiltinsX86.def"
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00002457
2458#define BUILTIN(ID, TYPE, ATTRS) \
2459 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Albert Gutowski0fd6e962016-10-12 17:28:44 +00002460#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
2461 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00002462#define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANGS, FEATURE) \
2463 { #ID, TYPE, ATTRS, HEADER, LANGS, FEATURE },
2464#include "clang/Basic/BuiltinsX86_64.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00002465};
Eli Friedmanb5366062008-05-20 14:21:01 +00002466
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00002467
Nuno Lopescfca1f02009-12-23 17:49:57 +00002468static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002469 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
2470 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00002471 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002472 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
2473 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
2474 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00002475 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00002476 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
2477 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Marina Yatsina41c45fa2016-02-03 11:32:08 +00002478 "xmm16", "xmm17", "xmm18", "xmm19", "xmm20", "xmm21", "xmm22", "xmm23",
2479 "xmm24", "xmm25", "xmm26", "xmm27", "xmm28", "xmm29", "xmm30", "xmm31",
2480 "ymm16", "ymm17", "ymm18", "ymm19", "ymm20", "ymm21", "ymm22", "ymm23",
2481 "ymm24", "ymm25", "ymm26", "ymm27", "ymm28", "ymm29", "ymm30", "ymm31",
2482 "zmm0", "zmm1", "zmm2", "zmm3", "zmm4", "zmm5", "zmm6", "zmm7",
2483 "zmm8", "zmm9", "zmm10", "zmm11", "zmm12", "zmm13", "zmm14", "zmm15",
2484 "zmm16", "zmm17", "zmm18", "zmm19", "zmm20", "zmm21", "zmm22", "zmm23",
2485 "zmm24", "zmm25", "zmm26", "zmm27", "zmm28", "zmm29", "zmm30", "zmm31",
Michael Zuckerman15604b92016-10-31 14:16:57 +00002486 "k0", "k1", "k2", "k3", "k4", "k5", "k6", "k7",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002487};
2488
Eric Christophercdd36352011-06-21 00:05:20 +00002489const TargetInfo::AddlRegName AddlRegNames[] = {
2490 { { "al", "ah", "eax", "rax" }, 0 },
2491 { { "bl", "bh", "ebx", "rbx" }, 3 },
2492 { { "cl", "ch", "ecx", "rcx" }, 2 },
2493 { { "dl", "dh", "edx", "rdx" }, 1 },
2494 { { "esi", "rsi" }, 4 },
2495 { { "edi", "rdi" }, 5 },
2496 { { "esp", "rsp" }, 7 },
2497 { { "ebp", "rbp" }, 6 },
Alexey Bataeva7ab1b42015-09-04 03:42:23 +00002498 { { "r8d", "r8w", "r8b" }, 38 },
2499 { { "r9d", "r9w", "r9b" }, 39 },
2500 { { "r10d", "r10w", "r10b" }, 40 },
2501 { { "r11d", "r11w", "r11b" }, 41 },
2502 { { "r12d", "r12w", "r12b" }, 42 },
2503 { { "r13d", "r13w", "r13b" }, 43 },
2504 { { "r14d", "r14w", "r14b" }, 44 },
2505 { { "r15d", "r15w", "r15b" }, 45 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00002506};
2507
2508// X86 target abstract base class; x86-32 and x86-64 are very close, so
2509// most of the implementation can be shared.
2510class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00002511 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002512 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Craig Topper543f3bd2015-10-14 23:47:57 +00002513 } SSELevel = NoSSE;
Eli Friedman33465822011-07-08 23:31:17 +00002514 enum MMX3DNowEnum {
2515 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
Craig Topper543f3bd2015-10-14 23:47:57 +00002516 } MMX3DNowLevel = NoMMX3DNow;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002517 enum XOPEnum {
2518 NoXOP,
2519 SSE4A,
2520 FMA4,
2521 XOP
Craig Topper543f3bd2015-10-14 23:47:57 +00002522 } XOPLevel = NoXOP;
Anders Carlssone437c682010-01-27 03:47:49 +00002523
Craig Topper543f3bd2015-10-14 23:47:57 +00002524 bool HasAES = false;
2525 bool HasPCLMUL = false;
2526 bool HasLZCNT = false;
2527 bool HasRDRND = false;
2528 bool HasFSGSBASE = false;
2529 bool HasBMI = false;
2530 bool HasBMI2 = false;
2531 bool HasPOPCNT = false;
2532 bool HasRTM = false;
2533 bool HasPRFCHW = false;
2534 bool HasRDSEED = false;
2535 bool HasADX = false;
2536 bool HasTBM = false;
2537 bool HasFMA = false;
2538 bool HasF16C = false;
2539 bool HasAVX512CD = false;
2540 bool HasAVX512ER = false;
2541 bool HasAVX512PF = false;
2542 bool HasAVX512DQ = false;
2543 bool HasAVX512BW = false;
2544 bool HasAVX512VL = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002545 bool HasAVX512VBMI = false;
2546 bool HasAVX512IFMA = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002547 bool HasSHA = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002548 bool HasMPX = false;
2549 bool HasSGX = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002550 bool HasCX16 = false;
Craig Toppere33f51f2015-10-16 06:22:36 +00002551 bool HasFXSR = false;
Craig Topperda9fe562015-10-15 05:23:38 +00002552 bool HasXSAVE = false;
2553 bool HasXSAVEOPT = false;
2554 bool HasXSAVEC = false;
2555 bool HasXSAVES = false;
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00002556 bool HasMWAITX = false;
Craig Topper45742262017-02-09 06:10:14 +00002557 bool HasCLZERO = false;
Asaf Badouha9d1e182015-12-31 14:14:07 +00002558 bool HasPKU = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002559 bool HasCLFLUSHOPT = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002560 bool HasCLWB = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002561 bool HasMOVBE = false;
2562 bool HasPREFETCHWT1 = false;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00002563
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002564 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
2565 ///
2566 /// Each enumeration represents a particular CPU supported by Clang. These
2567 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
2568 enum CPUKind {
2569 CK_Generic,
2570
2571 /// \name i386
2572 /// i386-generation processors.
2573 //@{
2574 CK_i386,
2575 //@}
2576
2577 /// \name i486
2578 /// i486-generation processors.
2579 //@{
2580 CK_i486,
2581 CK_WinChipC6,
2582 CK_WinChip2,
2583 CK_C3,
2584 //@}
2585
2586 /// \name i586
2587 /// i586-generation processors, P5 microarchitecture based.
2588 //@{
2589 CK_i586,
2590 CK_Pentium,
2591 CK_PentiumMMX,
2592 //@}
2593
2594 /// \name i686
2595 /// i686-generation processors, P6 / Pentium M microarchitecture based.
2596 //@{
2597 CK_i686,
2598 CK_PentiumPro,
2599 CK_Pentium2,
2600 CK_Pentium3,
2601 CK_Pentium3M,
2602 CK_PentiumM,
2603 CK_C3_2,
2604
2605 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
2606 /// Clang however has some logic to suport this.
2607 // FIXME: Warn, deprecate, and potentially remove this.
2608 CK_Yonah,
2609 //@}
2610
2611 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00002612 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002613 //@{
2614 CK_Pentium4,
2615 CK_Pentium4M,
2616 CK_Prescott,
2617 CK_Nocona,
2618 //@}
2619
2620 /// \name Core
2621 /// Core microarchitecture based processors.
2622 //@{
2623 CK_Core2,
2624
2625 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
2626 /// codename which GCC no longer accepts as an option to -march, but Clang
2627 /// has some logic for recognizing it.
2628 // FIXME: Warn, deprecate, and potentially remove this.
2629 CK_Penryn,
2630 //@}
2631
2632 /// \name Atom
2633 /// Atom processors
2634 //@{
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002635 CK_Bonnell,
Preston Gurda3c58c02013-09-13 19:27:17 +00002636 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002637 //@}
2638
2639 /// \name Nehalem
2640 /// Nehalem microarchitecture based processors.
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002641 CK_Nehalem,
2642
2643 /// \name Westmere
2644 /// Westmere microarchitecture based processors.
2645 CK_Westmere,
2646
2647 /// \name Sandy Bridge
2648 /// Sandy Bridge microarchitecture based processors.
2649 CK_SandyBridge,
2650
2651 /// \name Ivy Bridge
2652 /// Ivy Bridge microarchitecture based processors.
2653 CK_IvyBridge,
2654
2655 /// \name Haswell
2656 /// Haswell microarchitecture based processors.
2657 CK_Haswell,
2658
2659 /// \name Broadwell
2660 /// Broadwell microarchitecture based processors.
Robert Khasanov50e6f582014-09-19 09:53:48 +00002661 CK_Broadwell,
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002662
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002663 /// \name Skylake Client
2664 /// Skylake client microarchitecture based processors.
2665 CK_SkylakeClient,
2666
2667 /// \name Skylake Server
2668 /// Skylake server microarchitecture based processors.
2669 CK_SkylakeServer,
2670
2671 /// \name Cannonlake Client
2672 /// Cannonlake client microarchitecture based processors.
2673 CK_Cannonlake,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002674
Craig Topper449314e2013-08-20 07:09:39 +00002675 /// \name Knights Landing
2676 /// Knights Landing processor.
2677 CK_KNL,
2678
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002679 /// \name Lakemont
2680 /// Lakemont microarchitecture based processors.
2681 CK_Lakemont,
2682
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002683 /// \name K6
2684 /// K6 architecture processors.
2685 //@{
2686 CK_K6,
2687 CK_K6_2,
2688 CK_K6_3,
2689 //@}
2690
2691 /// \name K7
2692 /// K7 architecture processors.
2693 //@{
2694 CK_Athlon,
2695 CK_AthlonThunderbird,
2696 CK_Athlon4,
2697 CK_AthlonXP,
2698 CK_AthlonMP,
2699 //@}
2700
2701 /// \name K8
2702 /// K8 architecture processors.
2703 //@{
2704 CK_Athlon64,
2705 CK_Athlon64SSE3,
2706 CK_AthlonFX,
2707 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00002708 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002709 CK_Opteron,
2710 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00002711 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002712 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002713
Benjamin Kramer569f2152012-01-10 11:50:18 +00002714 /// \name Bobcat
2715 /// Bobcat architecture processors.
2716 //@{
2717 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002718 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002719 //@}
2720
2721 /// \name Bulldozer
2722 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002723 //@{
2724 CK_BDVER1,
2725 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002726 CK_BDVER3,
Benjamin Kramer56c58222014-05-02 15:47:51 +00002727 CK_BDVER4,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002728 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002729
Craig Topperc45744a2017-01-10 06:02:12 +00002730 /// \name zen
2731 /// Zen architecture processors.
2732 //@{
2733 CK_ZNVER1,
2734 //@}
2735
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002736 /// This specification is deprecated and will be removed in the future.
2737 /// Users should prefer \see CK_K8.
2738 // FIXME: Warn on this when the CPU is set to it.
Saleem Abdulrasoolcb29c1a2014-11-17 18:40:15 +00002739 //@{
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002740 CK_x86_64,
2741 //@}
2742
2743 /// \name Geode
2744 /// Geode processors.
2745 //@{
2746 CK_Geode
2747 //@}
Craig Topper543f3bd2015-10-14 23:47:57 +00002748 } CPU = CK_Generic;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002749
Eric Christopherc50738f2015-08-27 00:05:50 +00002750 CPUKind getCPUKind(StringRef CPU) const {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002751 return llvm::StringSwitch<CPUKind>(CPU)
2752 .Case("i386", CK_i386)
2753 .Case("i486", CK_i486)
2754 .Case("winchip-c6", CK_WinChipC6)
2755 .Case("winchip2", CK_WinChip2)
2756 .Case("c3", CK_C3)
2757 .Case("i586", CK_i586)
2758 .Case("pentium", CK_Pentium)
2759 .Case("pentium-mmx", CK_PentiumMMX)
2760 .Case("i686", CK_i686)
2761 .Case("pentiumpro", CK_PentiumPro)
2762 .Case("pentium2", CK_Pentium2)
2763 .Case("pentium3", CK_Pentium3)
2764 .Case("pentium3m", CK_Pentium3M)
2765 .Case("pentium-m", CK_PentiumM)
2766 .Case("c3-2", CK_C3_2)
2767 .Case("yonah", CK_Yonah)
2768 .Case("pentium4", CK_Pentium4)
2769 .Case("pentium4m", CK_Pentium4M)
2770 .Case("prescott", CK_Prescott)
2771 .Case("nocona", CK_Nocona)
2772 .Case("core2", CK_Core2)
2773 .Case("penryn", CK_Penryn)
2774 .Case("bonnell", CK_Bonnell)
2775 .Case("atom", CK_Bonnell) // Legacy name.
2776 .Case("silvermont", CK_Silvermont)
2777 .Case("slm", CK_Silvermont) // Legacy name.
2778 .Case("nehalem", CK_Nehalem)
2779 .Case("corei7", CK_Nehalem) // Legacy name.
2780 .Case("westmere", CK_Westmere)
2781 .Case("sandybridge", CK_SandyBridge)
2782 .Case("corei7-avx", CK_SandyBridge) // Legacy name.
2783 .Case("ivybridge", CK_IvyBridge)
2784 .Case("core-avx-i", CK_IvyBridge) // Legacy name.
2785 .Case("haswell", CK_Haswell)
2786 .Case("core-avx2", CK_Haswell) // Legacy name.
2787 .Case("broadwell", CK_Broadwell)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002788 .Case("skylake", CK_SkylakeClient)
2789 .Case("skylake-avx512", CK_SkylakeServer)
2790 .Case("skx", CK_SkylakeServer) // Legacy name.
2791 .Case("cannonlake", CK_Cannonlake)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002792 .Case("knl", CK_KNL)
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002793 .Case("lakemont", CK_Lakemont)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002794 .Case("k6", CK_K6)
2795 .Case("k6-2", CK_K6_2)
2796 .Case("k6-3", CK_K6_3)
2797 .Case("athlon", CK_Athlon)
2798 .Case("athlon-tbird", CK_AthlonThunderbird)
2799 .Case("athlon-4", CK_Athlon4)
2800 .Case("athlon-xp", CK_AthlonXP)
2801 .Case("athlon-mp", CK_AthlonMP)
2802 .Case("athlon64", CK_Athlon64)
2803 .Case("athlon64-sse3", CK_Athlon64SSE3)
2804 .Case("athlon-fx", CK_AthlonFX)
2805 .Case("k8", CK_K8)
2806 .Case("k8-sse3", CK_K8SSE3)
2807 .Case("opteron", CK_Opteron)
2808 .Case("opteron-sse3", CK_OpteronSSE3)
2809 .Case("barcelona", CK_AMDFAM10)
2810 .Case("amdfam10", CK_AMDFAM10)
2811 .Case("btver1", CK_BTVER1)
2812 .Case("btver2", CK_BTVER2)
2813 .Case("bdver1", CK_BDVER1)
2814 .Case("bdver2", CK_BDVER2)
2815 .Case("bdver3", CK_BDVER3)
2816 .Case("bdver4", CK_BDVER4)
Craig Topperc45744a2017-01-10 06:02:12 +00002817 .Case("znver1", CK_ZNVER1)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002818 .Case("x86-64", CK_x86_64)
2819 .Case("geode", CK_Geode)
2820 .Default(CK_Generic);
2821 }
2822
Rafael Espindolaeb265472013-08-21 21:59:03 +00002823 enum FPMathKind {
2824 FP_Default,
2825 FP_SSE,
2826 FP_387
Craig Topper543f3bd2015-10-14 23:47:57 +00002827 } FPMath = FP_Default;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002828
Eli Friedman3fd920a2008-08-20 02:34:37 +00002829public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00002830 X86TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
2831 : TargetInfo(Triple) {
Stephan Bergmann17c7f702016-12-14 11:57:17 +00002832 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended();
Chris Lattner1f5ad112006-10-14 18:32:12 +00002833 }
Craig Topper3164f332014-03-11 03:39:26 +00002834 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00002835 // X87 evaluates with 80 bits "long double" precision.
2836 return SSELevel == NoSSE ? 2 : 0;
2837 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002838 ArrayRef<const char *> getGCCRegNames() const override {
2839 return llvm::makeArrayRef(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00002840 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002841 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
2842 return None;
Eric Christophercdd36352011-06-21 00:05:20 +00002843 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002844 ArrayRef<TargetInfo::AddlRegName> getGCCAddlRegNames() const override {
2845 return llvm::makeArrayRef(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00002846 }
Eric Christopherd9832702015-06-29 21:00:05 +00002847 bool validateCpuSupports(StringRef Name) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002848 bool validateAsmConstraint(const char *&Name,
Eric Christopher917e9522014-11-18 22:36:15 +00002849 TargetInfo::ConstraintInfo &info) const override;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002850
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00002851 bool validateGlobalRegisterVariable(StringRef RegName,
2852 unsigned RegSize,
2853 bool &HasSizeMismatch) const override {
2854 // esp and ebp are the only 32-bit registers the x86 backend can currently
2855 // handle.
2856 if (RegName.equals("esp") || RegName.equals("ebp")) {
2857 // Check that the register size is 32-bit.
2858 HasSizeMismatch = RegSize != 32;
2859 return true;
2860 }
2861
2862 return false;
2863 }
2864
Akira Hatanaka974131e2014-09-18 18:17:18 +00002865 bool validateOutputSize(StringRef Constraint, unsigned Size) const override;
2866
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002867 bool validateInputSize(StringRef Constraint, unsigned Size) const override;
2868
Akira Hatanaka974131e2014-09-18 18:17:18 +00002869 virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const;
2870
Craig Topper3164f332014-03-11 03:39:26 +00002871 std::string convertConstraint(const char *&Constraint) const override;
2872 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002873 return "~{dirflag},~{fpsr},~{flags}";
2874 }
Marina Yatsinac42fd032016-12-26 12:23:42 +00002875
2876 StringRef getConstraintRegister(const StringRef &Constraint,
2877 const StringRef &Expression) const override {
2878 StringRef::iterator I, E;
2879 for (I = Constraint.begin(), E = Constraint.end(); I != E; ++I) {
2880 if (isalpha(*I))
2881 break;
2882 }
2883 if (I == E)
2884 return "";
2885 switch (*I) {
2886 // For the register constraints, return the matching register name
2887 case 'a':
2888 return "ax";
2889 case 'b':
2890 return "bx";
2891 case 'c':
2892 return "cx";
2893 case 'd':
2894 return "dx";
2895 case 'S':
2896 return "si";
2897 case 'D':
2898 return "di";
2899 // In case the constraint is 'r' we need to return Expression
2900 case 'r':
2901 return Expression;
2902 default:
2903 // Default value if there is no constraint for the register
2904 return "";
2905 }
2906 return "";
2907 }
2908
Craig Topper3164f332014-03-11 03:39:26 +00002909 void getTargetDefines(const LangOptions &Opts,
2910 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00002911 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
2912 bool Enabled);
2913 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
2914 bool Enabled);
2915 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
2916 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002917 void setFeatureEnabled(llvm::StringMap<bool> &Features,
2918 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00002919 setFeatureEnabledImpl(Features, Name, Enabled);
2920 }
2921 // This exists purely to cut down on the number of virtual calls in
Eric Christopheref1e2952015-08-28 02:13:58 +00002922 // initFeatureMap which calls this repeatedly.
Craig Topper86d79ef2013-09-17 04:51:29 +00002923 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2924 StringRef Name, bool Enabled);
Eric Christopher8c47b422015-10-09 18:39:55 +00002925 bool
2926 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
2927 StringRef CPU,
2928 const std::vector<std::string> &FeaturesVec) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002929 bool hasFeature(StringRef Feature) const override;
2930 bool handleTargetFeatures(std::vector<std::string> &Features,
2931 DiagnosticsEngine &Diags) override;
Alp Toker4925ba72014-06-07 23:30:42 +00002932 StringRef getABI() const override {
Ahmed Bougacha0b938282015-06-22 21:31:43 +00002933 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX512F)
2934 return "avx512";
Craig Topperd945d502015-10-20 00:00:17 +00002935 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002936 return "avx";
Craig Topperd945d502015-10-20 00:00:17 +00002937 if (getTriple().getArch() == llvm::Triple::x86 &&
Derek Schuffc7dd7222012-10-11 15:52:22 +00002938 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002939 return "no-mmx";
2940 return "";
Eli Friedman33465822011-07-08 23:31:17 +00002941 }
Craig Topper3164f332014-03-11 03:39:26 +00002942 bool setCPU(const std::string &Name) override {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002943 CPU = getCPUKind(Name);
Chandler Carruth212334f2011-09-28 08:55:37 +00002944
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002945 // Perform any per-CPU checks necessary to determine if this CPU is
2946 // acceptable.
2947 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
2948 // invalid without explaining *why*.
2949 switch (CPU) {
2950 case CK_Generic:
2951 // No processor selected!
2952 return false;
2953
2954 case CK_i386:
2955 case CK_i486:
2956 case CK_WinChipC6:
2957 case CK_WinChip2:
2958 case CK_C3:
2959 case CK_i586:
2960 case CK_Pentium:
2961 case CK_PentiumMMX:
2962 case CK_i686:
2963 case CK_PentiumPro:
2964 case CK_Pentium2:
2965 case CK_Pentium3:
2966 case CK_Pentium3M:
2967 case CK_PentiumM:
2968 case CK_Yonah:
2969 case CK_C3_2:
2970 case CK_Pentium4:
2971 case CK_Pentium4M:
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002972 case CK_Lakemont:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002973 case CK_Prescott:
2974 case CK_K6:
2975 case CK_K6_2:
2976 case CK_K6_3:
2977 case CK_Athlon:
2978 case CK_AthlonThunderbird:
2979 case CK_Athlon4:
2980 case CK_AthlonXP:
2981 case CK_AthlonMP:
2982 case CK_Geode:
2983 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002984 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002985 return false;
2986
2987 // Fallthrough
2988 case CK_Nocona:
2989 case CK_Core2:
2990 case CK_Penryn:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002991 case CK_Bonnell:
Preston Gurda3c58c02013-09-13 19:27:17 +00002992 case CK_Silvermont:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002993 case CK_Nehalem:
2994 case CK_Westmere:
2995 case CK_SandyBridge:
2996 case CK_IvyBridge:
2997 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002998 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002999 case CK_SkylakeClient:
3000 case CK_SkylakeServer:
3001 case CK_Cannonlake:
Craig Topper449314e2013-08-20 07:09:39 +00003002 case CK_KNL:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00003003 case CK_Athlon64:
3004 case CK_Athlon64SSE3:
3005 case CK_AthlonFX:
3006 case CK_K8:
3007 case CK_K8SSE3:
3008 case CK_Opteron:
3009 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00003010 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00003011 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003012 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003013 case CK_BDVER1:
3014 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003015 case CK_BDVER3:
Benjamin Kramer56c58222014-05-02 15:47:51 +00003016 case CK_BDVER4:
Craig Topperc45744a2017-01-10 06:02:12 +00003017 case CK_ZNVER1:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00003018 case CK_x86_64:
3019 return true;
3020 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00003021 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003022 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003023
Craig Topper3164f332014-03-11 03:39:26 +00003024 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00003025
Craig Topper3164f332014-03-11 03:39:26 +00003026 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00003027 // Most of the non-ARM calling conventions are i386 conventions.
3028 switch (CC) {
3029 case CC_X86ThisCall:
3030 case CC_X86FastCall:
3031 case CC_X86StdCall:
3032 case CC_X86VectorCall:
Erich Keane757d3172016-11-02 18:29:35 +00003033 case CC_X86RegCall:
John McCall477f2bb2016-03-03 06:39:32 +00003034 case CC_C:
3035 case CC_Swift:
3036 case CC_X86Pascal:
3037 case CC_IntelOclBicc:
3038 return CCCR_OK;
3039 default:
3040 return CCCR_Warning;
3041 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003042 }
3043
Craig Topper3164f332014-03-11 03:39:26 +00003044 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00003045 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003046 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00003047
3048 bool hasSjLjLowering() const override {
3049 return true;
3050 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00003051
3052 void setSupportedOpenCLOpts() override {
Yaxun Liu5b746652016-12-18 05:18:55 +00003053 getSupportedOpenCLOpts().supportAll();
Yaxun Liu39cf40f2016-05-16 17:06:34 +00003054 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00003055};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00003056
Rafael Espindolaeb265472013-08-21 21:59:03 +00003057bool X86TargetInfo::setFPMath(StringRef Name) {
3058 if (Name == "387") {
3059 FPMath = FP_387;
3060 return true;
3061 }
3062 if (Name == "sse") {
3063 FPMath = FP_SSE;
3064 return true;
3065 }
3066 return false;
3067}
3068
Eric Christopher007b0a02015-08-28 22:32:01 +00003069bool X86TargetInfo::initFeatureMap(
3070 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
Eric Christopher8c47b422015-10-09 18:39:55 +00003071 const std::vector<std::string> &FeaturesVec) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003072 // FIXME: This *really* should not be here.
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003073 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00003074 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00003075 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003076
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003077 const CPUKind Kind = getCPUKind(CPU);
Andrey Turetskiy5f1cf5f2016-03-23 11:15:10 +00003078
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003079 // Enable X87 for all X86 processors but Lakemont.
3080 if (Kind != CK_Lakemont)
3081 setFeatureEnabledImpl(Features, "x87", true);
3082
3083 switch (Kind) {
Chandler Carruth212334f2011-09-28 08:55:37 +00003084 case CK_Generic:
3085 case CK_i386:
3086 case CK_i486:
3087 case CK_i586:
3088 case CK_Pentium:
3089 case CK_i686:
3090 case CK_PentiumPro:
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003091 case CK_Lakemont:
Chandler Carruth212334f2011-09-28 08:55:37 +00003092 break;
3093 case CK_PentiumMMX:
3094 case CK_Pentium2:
Craig Topperdb4dc082014-11-06 05:52:19 +00003095 case CK_K6:
3096 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00003097 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003098 break;
3099 case CK_Pentium3:
3100 case CK_Pentium3M:
Craig Topperdb4dc082014-11-06 05:52:19 +00003101 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00003102 setFeatureEnabledImpl(Features, "sse", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003103 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003104 break;
3105 case CK_PentiumM:
3106 case CK_Pentium4:
3107 case CK_Pentium4M:
3108 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00003109 setFeatureEnabledImpl(Features, "sse2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003110 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003111 break;
3112 case CK_Yonah:
3113 case CK_Prescott:
3114 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00003115 setFeatureEnabledImpl(Features, "sse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003116 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003117 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003118 break;
3119 case CK_Core2:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003120 case CK_Bonnell:
Craig Topper86d79ef2013-09-17 04:51:29 +00003121 setFeatureEnabledImpl(Features, "ssse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003122 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003123 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003124 break;
3125 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00003126 setFeatureEnabledImpl(Features, "sse4.1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003127 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003128 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003129 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003130 case CK_Cannonlake:
3131 setFeatureEnabledImpl(Features, "avx512ifma", true);
3132 setFeatureEnabledImpl(Features, "avx512vbmi", true);
3133 setFeatureEnabledImpl(Features, "sha", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003134 LLVM_FALLTHROUGH;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003135 case CK_SkylakeServer:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003136 setFeatureEnabledImpl(Features, "avx512f", true);
3137 setFeatureEnabledImpl(Features, "avx512cd", true);
3138 setFeatureEnabledImpl(Features, "avx512dq", true);
3139 setFeatureEnabledImpl(Features, "avx512bw", true);
3140 setFeatureEnabledImpl(Features, "avx512vl", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003141 setFeatureEnabledImpl(Features, "pku", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003142 setFeatureEnabledImpl(Features, "clwb", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003143 LLVM_FALLTHROUGH;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003144 case CK_SkylakeClient:
Craig Topperda9fe562015-10-15 05:23:38 +00003145 setFeatureEnabledImpl(Features, "xsavec", true);
3146 setFeatureEnabledImpl(Features, "xsaves", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003147 setFeatureEnabledImpl(Features, "mpx", true);
3148 setFeatureEnabledImpl(Features, "sgx", true);
3149 setFeatureEnabledImpl(Features, "clflushopt", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003150 LLVM_FALLTHROUGH;
Craig Topperdb4dc082014-11-06 05:52:19 +00003151 case CK_Broadwell:
3152 setFeatureEnabledImpl(Features, "rdseed", true);
3153 setFeatureEnabledImpl(Features, "adx", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003154 LLVM_FALLTHROUGH;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003155 case CK_Haswell:
Craig Topperdb4dc082014-11-06 05:52:19 +00003156 setFeatureEnabledImpl(Features, "avx2", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003157 setFeatureEnabledImpl(Features, "lzcnt", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003158 setFeatureEnabledImpl(Features, "bmi", true);
3159 setFeatureEnabledImpl(Features, "bmi2", true);
3160 setFeatureEnabledImpl(Features, "rtm", true);
3161 setFeatureEnabledImpl(Features, "fma", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003162 setFeatureEnabledImpl(Features, "movbe", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003163 LLVM_FALLTHROUGH;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003164 case CK_IvyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00003165 setFeatureEnabledImpl(Features, "rdrnd", true);
3166 setFeatureEnabledImpl(Features, "f16c", true);
3167 setFeatureEnabledImpl(Features, "fsgsbase", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003168 LLVM_FALLTHROUGH;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003169 case CK_SandyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00003170 setFeatureEnabledImpl(Features, "avx", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003171 setFeatureEnabledImpl(Features, "xsave", true);
3172 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003173 LLVM_FALLTHROUGH;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003174 case CK_Westmere:
Craig Topperdb4dc082014-11-06 05:52:19 +00003175 case CK_Silvermont:
3176 setFeatureEnabledImpl(Features, "aes", true);
3177 setFeatureEnabledImpl(Features, "pclmul", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003178 LLVM_FALLTHROUGH;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003179 case CK_Nehalem:
Craig Topperdb4dc082014-11-06 05:52:19 +00003180 setFeatureEnabledImpl(Features, "sse4.2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003181 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00003182 setFeatureEnabledImpl(Features, "cx16", true);
3183 break;
3184 case CK_KNL:
3185 setFeatureEnabledImpl(Features, "avx512f", true);
3186 setFeatureEnabledImpl(Features, "avx512cd", true);
3187 setFeatureEnabledImpl(Features, "avx512er", true);
3188 setFeatureEnabledImpl(Features, "avx512pf", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003189 setFeatureEnabledImpl(Features, "prefetchwt1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003190 setFeatureEnabledImpl(Features, "fxsr", true);
Robert Khasanov50e6f582014-09-19 09:53:48 +00003191 setFeatureEnabledImpl(Features, "rdseed", true);
3192 setFeatureEnabledImpl(Features, "adx", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00003193 setFeatureEnabledImpl(Features, "lzcnt", true);
3194 setFeatureEnabledImpl(Features, "bmi", true);
3195 setFeatureEnabledImpl(Features, "bmi2", true);
3196 setFeatureEnabledImpl(Features, "rtm", true);
3197 setFeatureEnabledImpl(Features, "fma", true);
3198 setFeatureEnabledImpl(Features, "rdrnd", true);
3199 setFeatureEnabledImpl(Features, "f16c", true);
3200 setFeatureEnabledImpl(Features, "fsgsbase", true);
3201 setFeatureEnabledImpl(Features, "aes", true);
3202 setFeatureEnabledImpl(Features, "pclmul", true);
3203 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003204 setFeatureEnabledImpl(Features, "xsaveopt", true);
3205 setFeatureEnabledImpl(Features, "xsave", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003206 setFeatureEnabledImpl(Features, "movbe", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003207 break;
3208 case CK_K6_2:
3209 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00003210 case CK_WinChip2:
3211 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00003212 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003213 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00003214 case CK_Athlon:
3215 case CK_AthlonThunderbird:
3216 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00003217 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00003218 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003219 case CK_Athlon4:
3220 case CK_AthlonXP:
3221 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00003222 setFeatureEnabledImpl(Features, "sse", true);
3223 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003224 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003225 break;
3226 case CK_K8:
3227 case CK_Opteron:
3228 case CK_Athlon64:
3229 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00003230 setFeatureEnabledImpl(Features, "sse2", true);
3231 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003232 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003233 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00003234 case CK_AMDFAM10:
3235 setFeatureEnabledImpl(Features, "sse4a", true);
3236 setFeatureEnabledImpl(Features, "lzcnt", true);
3237 setFeatureEnabledImpl(Features, "popcnt", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003238 LLVM_FALLTHROUGH;
Chandler Carruth212334f2011-09-28 08:55:37 +00003239 case CK_K8SSE3:
3240 case CK_OpteronSSE3:
3241 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00003242 setFeatureEnabledImpl(Features, "sse3", true);
3243 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003244 setFeatureEnabledImpl(Features, "fxsr", true);
Roman Divackyce253d82011-10-30 13:47:56 +00003245 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00003246 case CK_BTVER2:
3247 setFeatureEnabledImpl(Features, "avx", true);
3248 setFeatureEnabledImpl(Features, "aes", true);
3249 setFeatureEnabledImpl(Features, "pclmul", true);
3250 setFeatureEnabledImpl(Features, "bmi", true);
3251 setFeatureEnabledImpl(Features, "f16c", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003252 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003253 LLVM_FALLTHROUGH;
Benjamin Kramer569f2152012-01-10 11:50:18 +00003254 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00003255 setFeatureEnabledImpl(Features, "ssse3", true);
3256 setFeatureEnabledImpl(Features, "sse4a", true);
3257 setFeatureEnabledImpl(Features, "lzcnt", true);
3258 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00003259 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003260 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003261 setFeatureEnabledImpl(Features, "fxsr", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003262 break;
Craig Topperc45744a2017-01-10 06:02:12 +00003263 case CK_ZNVER1:
3264 setFeatureEnabledImpl(Features, "adx", true);
3265 setFeatureEnabledImpl(Features, "aes", true);
3266 setFeatureEnabledImpl(Features, "avx2", true);
3267 setFeatureEnabledImpl(Features, "bmi", true);
3268 setFeatureEnabledImpl(Features, "bmi2", true);
3269 setFeatureEnabledImpl(Features, "clflushopt", true);
Craig Topper45742262017-02-09 06:10:14 +00003270 setFeatureEnabledImpl(Features, "clzero", true);
Craig Topperc45744a2017-01-10 06:02:12 +00003271 setFeatureEnabledImpl(Features, "cx16", true);
3272 setFeatureEnabledImpl(Features, "f16c", true);
3273 setFeatureEnabledImpl(Features, "fma", true);
3274 setFeatureEnabledImpl(Features, "fsgsbase", true);
3275 setFeatureEnabledImpl(Features, "fxsr", true);
3276 setFeatureEnabledImpl(Features, "lzcnt", true);
3277 setFeatureEnabledImpl(Features, "mwaitx", true);
3278 setFeatureEnabledImpl(Features, "movbe", true);
3279 setFeatureEnabledImpl(Features, "pclmul", true);
3280 setFeatureEnabledImpl(Features, "popcnt", true);
3281 setFeatureEnabledImpl(Features, "prfchw", true);
3282 setFeatureEnabledImpl(Features, "rdrnd", true);
3283 setFeatureEnabledImpl(Features, "rdseed", true);
3284 setFeatureEnabledImpl(Features, "sha", true);
3285 setFeatureEnabledImpl(Features, "sse4a", true);
3286 setFeatureEnabledImpl(Features, "xsave", true);
3287 setFeatureEnabledImpl(Features, "xsavec", true);
3288 setFeatureEnabledImpl(Features, "xsaveopt", true);
3289 setFeatureEnabledImpl(Features, "xsaves", true);
3290 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003291 case CK_BDVER4:
3292 setFeatureEnabledImpl(Features, "avx2", true);
3293 setFeatureEnabledImpl(Features, "bmi2", true);
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003294 setFeatureEnabledImpl(Features, "mwaitx", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003295 LLVM_FALLTHROUGH;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003296 case CK_BDVER3:
Craig Topper8c7f2512014-11-03 06:51:41 +00003297 setFeatureEnabledImpl(Features, "fsgsbase", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003298 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003299 LLVM_FALLTHROUGH;
Craig Topper8c7f2512014-11-03 06:51:41 +00003300 case CK_BDVER2:
Andrea Di Biagio9760a442014-11-06 12:08:57 +00003301 setFeatureEnabledImpl(Features, "bmi", true);
3302 setFeatureEnabledImpl(Features, "fma", true);
3303 setFeatureEnabledImpl(Features, "f16c", true);
3304 setFeatureEnabledImpl(Features, "tbm", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003305 LLVM_FALLTHROUGH;
Andrea Di Biagio9760a442014-11-06 12:08:57 +00003306 case CK_BDVER1:
3307 // xop implies avx, sse4a and fma4.
Craig Topper86d79ef2013-09-17 04:51:29 +00003308 setFeatureEnabledImpl(Features, "xop", true);
3309 setFeatureEnabledImpl(Features, "lzcnt", true);
3310 setFeatureEnabledImpl(Features, "aes", true);
3311 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00003312 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003313 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003314 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003315 setFeatureEnabledImpl(Features, "xsave", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003316 break;
Eli Friedman33465822011-07-08 23:31:17 +00003317 }
Eric Christopherbbd746d2015-10-08 20:10:14 +00003318 if (!TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec))
3319 return false;
3320
3321 // Can't do this earlier because we need to be able to explicitly enable
3322 // or disable these features and the things that they depend upon.
3323
3324 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
3325 auto I = Features.find("sse4.2");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003326 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00003327 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-popcnt") ==
3328 FeaturesVec.end())
3329 Features["popcnt"] = true;
3330
3331 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
3332 I = Features.find("3dnow");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003333 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00003334 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-prfchw") ==
3335 FeaturesVec.end())
3336 Features["prfchw"] = true;
3337
Eric Christophera7260af2015-10-08 20:10:18 +00003338 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
3339 // then enable MMX.
3340 I = Features.find("sse");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003341 if (I != Features.end() && I->getValue() &&
Eric Christophera7260af2015-10-08 20:10:18 +00003342 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-mmx") ==
3343 FeaturesVec.end())
3344 Features["mmx"] = true;
3345
Eric Christopherbbd746d2015-10-08 20:10:14 +00003346 return true;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003347}
3348
Rafael Espindolae62e2792013-08-20 13:44:29 +00003349void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00003350 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003351 if (Enabled) {
3352 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003353 case AVX512F:
3354 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003355 case AVX2:
3356 Features["avx2"] = true;
3357 case AVX:
3358 Features["avx"] = true;
Craig Topperda9fe562015-10-15 05:23:38 +00003359 Features["xsave"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003360 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00003361 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003362 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00003363 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003364 case SSSE3:
3365 Features["ssse3"] = true;
3366 case SSE3:
3367 Features["sse3"] = true;
3368 case SSE2:
3369 Features["sse2"] = true;
3370 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00003371 Features["sse"] = true;
3372 case NoSSE:
3373 break;
3374 }
3375 return;
3376 }
3377
3378 switch (Level) {
3379 case NoSSE:
3380 case SSE1:
3381 Features["sse"] = false;
3382 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00003383 Features["sse2"] = Features["pclmul"] = Features["aes"] =
3384 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003385 case SSE3:
3386 Features["sse3"] = false;
3387 setXOPLevel(Features, NoXOP, false);
3388 case SSSE3:
3389 Features["ssse3"] = false;
3390 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00003391 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003392 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00003393 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003394 case AVX:
Craig Topperda9fe562015-10-15 05:23:38 +00003395 Features["fma"] = Features["avx"] = Features["f16c"] = Features["xsave"] =
3396 Features["xsaveopt"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00003397 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003398 case AVX2:
3399 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00003400 case AVX512F:
Eric Christopher917e9522014-11-18 22:36:15 +00003401 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
Craig Toppera31a5da2014-12-27 06:59:37 +00003402 Features["avx512pf"] = Features["avx512dq"] = Features["avx512bw"] =
Craig Topperb4f83a02016-02-29 06:51:38 +00003403 Features["avx512vl"] = Features["avx512vbmi"] =
3404 Features["avx512ifma"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003405 }
3406}
3407
3408void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00003409 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003410 if (Enabled) {
3411 switch (Level) {
3412 case AMD3DNowAthlon:
3413 Features["3dnowa"] = true;
3414 case AMD3DNow:
3415 Features["3dnow"] = true;
3416 case MMX:
3417 Features["mmx"] = true;
3418 case NoMMX3DNow:
3419 break;
3420 }
3421 return;
3422 }
3423
3424 switch (Level) {
3425 case NoMMX3DNow:
3426 case MMX:
3427 Features["mmx"] = false;
3428 case AMD3DNow:
3429 Features["3dnow"] = false;
3430 case AMD3DNowAthlon:
3431 Features["3dnowa"] = false;
3432 }
3433}
3434
3435void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00003436 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003437 if (Enabled) {
3438 switch (Level) {
3439 case XOP:
3440 Features["xop"] = true;
3441 case FMA4:
3442 Features["fma4"] = true;
3443 setSSELevel(Features, AVX, true);
3444 case SSE4A:
3445 Features["sse4a"] = true;
3446 setSSELevel(Features, SSE3, true);
3447 case NoXOP:
3448 break;
3449 }
3450 return;
3451 }
3452
3453 switch (Level) {
3454 case NoXOP:
3455 case SSE4A:
3456 Features["sse4a"] = false;
3457 case FMA4:
3458 Features["fma4"] = false;
3459 case XOP:
3460 Features["xop"] = false;
3461 }
3462}
3463
Craig Topper86d79ef2013-09-17 04:51:29 +00003464void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
3465 StringRef Name, bool Enabled) {
Eric Christopher298ac302015-07-01 00:08:32 +00003466 // This is a bit of a hack to deal with the sse4 target feature when used
3467 // as part of the target attribute. We handle sse4 correctly everywhere
3468 // else. See below for more information on how we handle the sse4 options.
3469 if (Name != "sse4")
3470 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00003471
Craig Topper29561122013-09-19 01:13:07 +00003472 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003473 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003474 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003475 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003476 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003477 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003478 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003479 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003480 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003481 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003482 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003483 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003484 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003485 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003486 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003487 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003488 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003489 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003490 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003491 if (Enabled)
3492 setSSELevel(Features, SSE2, Enabled);
3493 } else if (Name == "pclmul") {
3494 if (Enabled)
3495 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003496 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003497 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003498 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003499 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003500 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003501 setSSELevel(Features, AVX512F, Enabled);
Craig Topperb4f83a02016-02-29 06:51:38 +00003502 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf" ||
3503 Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl" ||
3504 Name == "avx512vbmi" || Name == "avx512ifma") {
Craig Topper679b53a2013-08-21 05:29:10 +00003505 if (Enabled)
3506 setSSELevel(Features, AVX512F, Enabled);
Craig Topper6c7ecc52016-11-09 04:51:03 +00003507 // Enable BWI instruction if VBMI is being enabled.
3508 if (Name == "avx512vbmi" && Enabled)
3509 Features["avx512bw"] = true;
3510 // Also disable VBMI if BWI is being disabled.
3511 if (Name == "avx512bw" && !Enabled)
3512 Features["avx512vbmi"] = false;
Craig Topper679b53a2013-08-21 05:29:10 +00003513 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003514 if (Enabled)
3515 setSSELevel(Features, AVX, Enabled);
3516 } else if (Name == "fma4") {
3517 setXOPLevel(Features, FMA4, Enabled);
3518 } else if (Name == "xop") {
3519 setXOPLevel(Features, XOP, Enabled);
3520 } else if (Name == "sse4a") {
3521 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00003522 } else if (Name == "f16c") {
3523 if (Enabled)
3524 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00003525 } else if (Name == "sha") {
3526 if (Enabled)
3527 setSSELevel(Features, SSE2, Enabled);
Eric Christopher298ac302015-07-01 00:08:32 +00003528 } else if (Name == "sse4") {
3529 // We can get here via the __target__ attribute since that's not controlled
3530 // via the -msse4/-mno-sse4 command line alias. Handle this the same way
3531 // here - turn on the sse4.2 if enabled, turn off the sse4.1 level if
3532 // disabled.
3533 if (Enabled)
3534 setSSELevel(Features, SSE42, Enabled);
3535 else
3536 setSSELevel(Features, SSE41, Enabled);
Craig Topperda9fe562015-10-15 05:23:38 +00003537 } else if (Name == "xsave") {
Craig Topper840927e2016-02-29 06:51:34 +00003538 if (!Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003539 Features["xsaveopt"] = false;
3540 } else if (Name == "xsaveopt" || Name == "xsavec" || Name == "xsaves") {
Craig Topper840927e2016-02-29 06:51:34 +00003541 if (Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003542 Features["xsave"] = true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003543 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003544}
3545
Eric Christopher3ff21b32013-10-16 21:26:26 +00003546/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003547/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00003548bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00003549 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00003550 for (const auto &Feature : Features) {
3551 if (Feature[0] != '+')
Daniel Dunbar979586e2009-11-11 09:38:56 +00003552 continue;
3553
Eric Christopher610fe112015-08-26 08:21:55 +00003554 if (Feature == "+aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00003555 HasAES = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003556 } else if (Feature == "+pclmul") {
Craig Topper3f122a72012-05-31 05:18:48 +00003557 HasPCLMUL = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003558 } else if (Feature == "+lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00003559 HasLZCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003560 } else if (Feature == "+rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00003561 HasRDRND = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003562 } else if (Feature == "+fsgsbase") {
Craig Topper8c7f2512014-11-03 06:51:41 +00003563 HasFSGSBASE = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003564 } else if (Feature == "+bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00003565 HasBMI = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003566 } else if (Feature == "+bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00003567 HasBMI2 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003568 } else if (Feature == "+popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00003569 HasPOPCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003570 } else if (Feature == "+rtm") {
Michael Liao625a8752012-11-10 05:17:46 +00003571 HasRTM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003572 } else if (Feature == "+prfchw") {
Michael Liao74f4eaf2013-03-26 17:52:08 +00003573 HasPRFCHW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003574 } else if (Feature == "+rdseed") {
Michael Liaoffaae352013-03-29 05:17:55 +00003575 HasRDSEED = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003576 } else if (Feature == "+adx") {
Robert Khasanov50e6f582014-09-19 09:53:48 +00003577 HasADX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003578 } else if (Feature == "+tbm") {
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003579 HasTBM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003580 } else if (Feature == "+fma") {
Craig Topperbba778b2012-06-03 21:46:30 +00003581 HasFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003582 } else if (Feature == "+f16c") {
Manman Rena45358c2012-10-11 00:59:55 +00003583 HasF16C = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003584 } else if (Feature == "+avx512cd") {
Craig Topper679b53a2013-08-21 05:29:10 +00003585 HasAVX512CD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003586 } else if (Feature == "+avx512er") {
Craig Topper679b53a2013-08-21 05:29:10 +00003587 HasAVX512ER = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003588 } else if (Feature == "+avx512pf") {
Craig Topper679b53a2013-08-21 05:29:10 +00003589 HasAVX512PF = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003590 } else if (Feature == "+avx512dq") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003591 HasAVX512DQ = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003592 } else if (Feature == "+avx512bw") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003593 HasAVX512BW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003594 } else if (Feature == "+avx512vl") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003595 HasAVX512VL = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003596 } else if (Feature == "+avx512vbmi") {
3597 HasAVX512VBMI = true;
3598 } else if (Feature == "+avx512ifma") {
3599 HasAVX512IFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003600 } else if (Feature == "+sha") {
Ben Langmuir58078d02013-09-19 13:22:04 +00003601 HasSHA = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003602 } else if (Feature == "+mpx") {
3603 HasMPX = true;
3604 } else if (Feature == "+movbe") {
3605 HasMOVBE = true;
3606 } else if (Feature == "+sgx") {
3607 HasSGX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003608 } else if (Feature == "+cx16") {
Nick Lewycky50e8f482013-10-05 20:14:27 +00003609 HasCX16 = true;
Craig Toppere33f51f2015-10-16 06:22:36 +00003610 } else if (Feature == "+fxsr") {
3611 HasFXSR = true;
Craig Topperda9fe562015-10-15 05:23:38 +00003612 } else if (Feature == "+xsave") {
3613 HasXSAVE = true;
3614 } else if (Feature == "+xsaveopt") {
3615 HasXSAVEOPT = true;
3616 } else if (Feature == "+xsavec") {
3617 HasXSAVEC = true;
3618 } else if (Feature == "+xsaves") {
3619 HasXSAVES = true;
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003620 } else if (Feature == "+mwaitx") {
3621 HasMWAITX = true;
Asaf Badouha9d1e182015-12-31 14:14:07 +00003622 } else if (Feature == "+pku") {
3623 HasPKU = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003624 } else if (Feature == "+clflushopt") {
3625 HasCLFLUSHOPT = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003626 } else if (Feature == "+clwb") {
3627 HasCLWB = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003628 } else if (Feature == "+prefetchwt1") {
3629 HasPREFETCHWT1 = true;
Craig Topper45742262017-02-09 06:10:14 +00003630 } else if (Feature == "+clzero") {
3631 HasCLZERO = true;
Nick Lewycky50e8f482013-10-05 20:14:27 +00003632 }
3633
Benjamin Kramer27402c62012-03-05 15:10:44 +00003634 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003635 .Case("+avx512f", AVX512F)
3636 .Case("+avx2", AVX2)
3637 .Case("+avx", AVX)
3638 .Case("+sse4.2", SSE42)
3639 .Case("+sse4.1", SSE41)
3640 .Case("+ssse3", SSSE3)
3641 .Case("+sse3", SSE3)
3642 .Case("+sse2", SSE2)
3643 .Case("+sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00003644 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003645 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003646
Eli Friedman33465822011-07-08 23:31:17 +00003647 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00003648 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003649 .Case("+3dnowa", AMD3DNowAthlon)
3650 .Case("+3dnow", AMD3DNow)
3651 .Case("+mmx", MMX)
Eli Friedman33465822011-07-08 23:31:17 +00003652 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00003653 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003654
3655 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003656 .Case("+xop", XOP)
3657 .Case("+fma4", FMA4)
3658 .Case("+sse4a", SSE4A)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003659 .Default(NoXOP);
3660 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003661 }
Eli Friedman33465822011-07-08 23:31:17 +00003662
Rafael Espindolaeb265472013-08-21 21:59:03 +00003663 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
3664 // matches the selected sse level.
Craig Topperd945d502015-10-20 00:00:17 +00003665 if ((FPMath == FP_SSE && SSELevel < SSE1) ||
3666 (FPMath == FP_387 && SSELevel >= SSE1)) {
3667 Diags.Report(diag::err_target_unsupported_fpmath) <<
3668 (FPMath == FP_SSE ? "sse" : "387");
Rafael Espindolaeb265472013-08-21 21:59:03 +00003669 return false;
3670 }
3671
Alexey Bataev00396512015-07-02 03:40:19 +00003672 SimdDefaultAlign =
Ahmed Bougacha68bf64e2015-08-27 22:24:56 +00003673 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Rafael Espindolaeb265472013-08-21 21:59:03 +00003674 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00003675}
Chris Lattnerecd49032009-03-02 22:27:17 +00003676
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003677/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
3678/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00003679void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003680 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00003681 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00003682 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003683 Builder.defineMacro("__amd64__");
3684 Builder.defineMacro("__amd64");
3685 Builder.defineMacro("__x86_64");
3686 Builder.defineMacro("__x86_64__");
Bob Wilsona2acb1e2014-08-08 23:46:28 +00003687 if (getTriple().getArchName() == "x86_64h") {
3688 Builder.defineMacro("__x86_64h");
3689 Builder.defineMacro("__x86_64h__");
3690 }
Chris Lattnerecd49032009-03-02 22:27:17 +00003691 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003692 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00003693 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003694
Chris Lattnerecd49032009-03-02 22:27:17 +00003695 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003696 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
3697 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00003698 switch (CPU) {
3699 case CK_Generic:
3700 break;
3701 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003702 // The rest are coming from the i386 define above.
3703 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003704 break;
3705 case CK_i486:
3706 case CK_WinChipC6:
3707 case CK_WinChip2:
3708 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003709 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00003710 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003711 case CK_PentiumMMX:
3712 Builder.defineMacro("__pentium_mmx__");
3713 Builder.defineMacro("__tune_pentium_mmx__");
3714 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003715 case CK_i586:
3716 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003717 defineCPUMacros(Builder, "i586");
3718 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00003719 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003720 case CK_Pentium3:
3721 case CK_Pentium3M:
3722 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003723 Builder.defineMacro("__tune_pentium3__");
3724 // Fallthrough
3725 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00003726 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003727 Builder.defineMacro("__tune_pentium2__");
3728 // Fallthrough
3729 case CK_PentiumPro:
3730 Builder.defineMacro("__tune_i686__");
3731 Builder.defineMacro("__tune_pentiumpro__");
3732 // Fallthrough
3733 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003734 Builder.defineMacro("__i686");
3735 Builder.defineMacro("__i686__");
3736 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
3737 Builder.defineMacro("__pentiumpro");
3738 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003739 break;
3740 case CK_Pentium4:
3741 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003742 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00003743 break;
3744 case CK_Yonah:
3745 case CK_Prescott:
3746 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003747 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00003748 break;
3749 case CK_Core2:
3750 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003751 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00003752 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003753 case CK_Bonnell:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003754 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00003755 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00003756 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00003757 defineCPUMacros(Builder, "slm");
3758 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003759 case CK_Nehalem:
3760 case CK_Westmere:
3761 case CK_SandyBridge:
3762 case CK_IvyBridge:
3763 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00003764 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003765 case CK_SkylakeClient:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003766 // FIXME: Historically, we defined this legacy name, it would be nice to
3767 // remove it at some point. We've never exposed fine-grained names for
3768 // recent primary x86 CPUs, and we should keep it that way.
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003769 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00003770 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003771 case CK_SkylakeServer:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003772 defineCPUMacros(Builder, "skx");
3773 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003774 case CK_Cannonlake:
3775 break;
Craig Topper449314e2013-08-20 07:09:39 +00003776 case CK_KNL:
3777 defineCPUMacros(Builder, "knl");
3778 break;
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003779 case CK_Lakemont:
3780 Builder.defineMacro("__tune_lakemont__");
3781 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003782 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003783 Builder.defineMacro("__k6_2__");
3784 Builder.defineMacro("__tune_k6_2__");
3785 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003786 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003787 if (CPU != CK_K6_2) { // In case of fallthrough
3788 // FIXME: GCC may be enabling these in cases where some other k6
3789 // architecture is specified but -m3dnow is explicitly provided. The
3790 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003791 Builder.defineMacro("__k6_3__");
3792 Builder.defineMacro("__tune_k6_3__");
3793 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003794 // Fallthrough
3795 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003796 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00003797 break;
3798 case CK_Athlon:
3799 case CK_AthlonThunderbird:
3800 case CK_Athlon4:
3801 case CK_AthlonXP:
3802 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003803 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003804 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003805 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003806 Builder.defineMacro("__tune_athlon_sse__");
3807 }
Chandler Carruth212334f2011-09-28 08:55:37 +00003808 break;
3809 case CK_K8:
3810 case CK_K8SSE3:
3811 case CK_x86_64:
3812 case CK_Opteron:
3813 case CK_OpteronSSE3:
3814 case CK_Athlon64:
3815 case CK_Athlon64SSE3:
3816 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003817 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00003818 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00003819 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003820 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00003821 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00003822 case CK_BTVER1:
3823 defineCPUMacros(Builder, "btver1");
3824 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003825 case CK_BTVER2:
3826 defineCPUMacros(Builder, "btver2");
3827 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003828 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003829 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003830 break;
3831 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003832 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003833 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003834 case CK_BDVER3:
3835 defineCPUMacros(Builder, "bdver3");
3836 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003837 case CK_BDVER4:
3838 defineCPUMacros(Builder, "bdver4");
3839 break;
Craig Topperc45744a2017-01-10 06:02:12 +00003840 case CK_ZNVER1:
3841 defineCPUMacros(Builder, "znver1");
3842 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003843 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003844 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00003845 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003846 }
Chris Lattner96e43572009-03-02 22:40:39 +00003847
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003848 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003849 Builder.defineMacro("__REGISTER_PREFIX__", "");
3850
Chris Lattner6df41af2009-04-19 17:32:33 +00003851 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
3852 // functions in glibc header files that use FP Stack inline asm which the
3853 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003854 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003855
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003856 if (HasAES)
3857 Builder.defineMacro("__AES__");
3858
Craig Topper3f122a72012-05-31 05:18:48 +00003859 if (HasPCLMUL)
3860 Builder.defineMacro("__PCLMUL__");
3861
Craig Topper22967d42011-12-25 05:06:45 +00003862 if (HasLZCNT)
3863 Builder.defineMacro("__LZCNT__");
3864
Benjamin Kramer1e250392012-07-07 09:39:18 +00003865 if (HasRDRND)
3866 Builder.defineMacro("__RDRND__");
3867
Craig Topper8c7f2512014-11-03 06:51:41 +00003868 if (HasFSGSBASE)
3869 Builder.defineMacro("__FSGSBASE__");
3870
Craig Topper22967d42011-12-25 05:06:45 +00003871 if (HasBMI)
3872 Builder.defineMacro("__BMI__");
3873
3874 if (HasBMI2)
3875 Builder.defineMacro("__BMI2__");
3876
Craig Topper1de83482011-12-29 16:10:46 +00003877 if (HasPOPCNT)
3878 Builder.defineMacro("__POPCNT__");
3879
Michael Liao625a8752012-11-10 05:17:46 +00003880 if (HasRTM)
3881 Builder.defineMacro("__RTM__");
3882
Michael Liao74f4eaf2013-03-26 17:52:08 +00003883 if (HasPRFCHW)
3884 Builder.defineMacro("__PRFCHW__");
3885
Michael Liaoffaae352013-03-29 05:17:55 +00003886 if (HasRDSEED)
3887 Builder.defineMacro("__RDSEED__");
3888
Robert Khasanov50e6f582014-09-19 09:53:48 +00003889 if (HasADX)
3890 Builder.defineMacro("__ADX__");
3891
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003892 if (HasTBM)
3893 Builder.defineMacro("__TBM__");
3894
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003895 if (HasMWAITX)
3896 Builder.defineMacro("__MWAITX__");
3897
Rafael Espindolae62e2792013-08-20 13:44:29 +00003898 switch (XOPLevel) {
3899 case XOP:
3900 Builder.defineMacro("__XOP__");
3901 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00003902 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00003903 case SSE4A:
3904 Builder.defineMacro("__SSE4A__");
3905 case NoXOP:
3906 break;
3907 }
Craig Topperffdb46c2011-12-30 07:33:42 +00003908
Craig Topperbba778b2012-06-03 21:46:30 +00003909 if (HasFMA)
3910 Builder.defineMacro("__FMA__");
3911
Manman Rena45358c2012-10-11 00:59:55 +00003912 if (HasF16C)
3913 Builder.defineMacro("__F16C__");
3914
Craig Topper679b53a2013-08-21 05:29:10 +00003915 if (HasAVX512CD)
3916 Builder.defineMacro("__AVX512CD__");
3917 if (HasAVX512ER)
3918 Builder.defineMacro("__AVX512ER__");
3919 if (HasAVX512PF)
3920 Builder.defineMacro("__AVX512PF__");
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003921 if (HasAVX512DQ)
3922 Builder.defineMacro("__AVX512DQ__");
3923 if (HasAVX512BW)
3924 Builder.defineMacro("__AVX512BW__");
3925 if (HasAVX512VL)
3926 Builder.defineMacro("__AVX512VL__");
Craig Topperb4f83a02016-02-29 06:51:38 +00003927 if (HasAVX512VBMI)
3928 Builder.defineMacro("__AVX512VBMI__");
3929 if (HasAVX512IFMA)
3930 Builder.defineMacro("__AVX512IFMA__");
Craig Topper679b53a2013-08-21 05:29:10 +00003931
Ben Langmuir58078d02013-09-19 13:22:04 +00003932 if (HasSHA)
3933 Builder.defineMacro("__SHA__");
3934
Craig Toppere33f51f2015-10-16 06:22:36 +00003935 if (HasFXSR)
3936 Builder.defineMacro("__FXSR__");
Craig Topperda9fe562015-10-15 05:23:38 +00003937 if (HasXSAVE)
3938 Builder.defineMacro("__XSAVE__");
3939 if (HasXSAVEOPT)
3940 Builder.defineMacro("__XSAVEOPT__");
3941 if (HasXSAVEC)
3942 Builder.defineMacro("__XSAVEC__");
3943 if (HasXSAVES)
3944 Builder.defineMacro("__XSAVES__");
Asaf Badouha9d1e182015-12-31 14:14:07 +00003945 if (HasPKU)
3946 Builder.defineMacro("__PKU__");
Nick Lewycky50e8f482013-10-05 20:14:27 +00003947 if (HasCX16)
3948 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
Craig Topper78b47872017-02-08 06:48:58 +00003949 if (HasCLFLUSHOPT)
3950 Builder.defineMacro("__CLFLUSHOPT__");
Craig Topper8c708cf2017-02-08 07:36:58 +00003951 if (HasCLWB)
3952 Builder.defineMacro("__CLWB__");
Craig Topperb16cb822017-02-08 07:56:42 +00003953 if (HasMPX)
3954 Builder.defineMacro("__MPX__");
Craig Topper204ecff2017-02-08 08:23:17 +00003955 if (HasSGX)
3956 Builder.defineMacro("__SGX__");
Craig Topperd2bf7b02017-02-08 08:23:40 +00003957 if (HasPREFETCHWT1)
3958 Builder.defineMacro("__PREFETCHWT1__");
Craig Topper45742262017-02-09 06:10:14 +00003959 if (HasCLZERO)
3960 Builder.defineMacro("__CLZERO__");
Nick Lewycky50e8f482013-10-05 20:14:27 +00003961
Chris Lattner96e43572009-03-02 22:40:39 +00003962 // Each case falls through to the previous one here.
3963 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003964 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00003965 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00003966 case AVX2:
3967 Builder.defineMacro("__AVX2__");
3968 case AVX:
3969 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00003970 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003971 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00003972 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003973 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00003974 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003975 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003976 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003977 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003978 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003979 Builder.defineMacro("__SSE2__");
3980 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00003981 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003982 Builder.defineMacro("__SSE__");
3983 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00003984 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00003985 break;
3986 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003987
Derek Schuffc7dd7222012-10-11 15:52:22 +00003988 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003989 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003990 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00003991 case AVX2:
3992 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003993 case SSE42:
3994 case SSE41:
3995 case SSSE3:
3996 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003997 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003998 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003999 break;
4000 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004001 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004002 break;
4003 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004004 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004005 }
4006 }
4007
Anders Carlssone437c682010-01-27 03:47:49 +00004008 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00004009 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00004010 case AMD3DNowAthlon:
4011 Builder.defineMacro("__3dNOW_A__");
4012 case AMD3DNow:
4013 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00004014 case MMX:
4015 Builder.defineMacro("__MMX__");
4016 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00004017 break;
4018 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00004019
4020 if (CPU >= CK_i486) {
4021 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
4022 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
4023 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
4024 }
4025 if (CPU >= CK_i586)
4026 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00004027}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004028
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004029bool X86TargetInfo::hasFeature(StringRef Feature) const {
4030 return llvm::StringSwitch<bool>(Feature)
4031 .Case("aes", HasAES)
4032 .Case("avx", SSELevel >= AVX)
4033 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00004034 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00004035 .Case("avx512cd", HasAVX512CD)
4036 .Case("avx512er", HasAVX512ER)
4037 .Case("avx512pf", HasAVX512PF)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00004038 .Case("avx512dq", HasAVX512DQ)
4039 .Case("avx512bw", HasAVX512BW)
4040 .Case("avx512vl", HasAVX512VL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00004041 .Case("avx512vbmi", HasAVX512VBMI)
4042 .Case("avx512ifma", HasAVX512IFMA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004043 .Case("bmi", HasBMI)
4044 .Case("bmi2", HasBMI2)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00004045 .Case("clflushopt", HasCLFLUSHOPT)
4046 .Case("clwb", HasCLWB)
Craig Topper45742262017-02-09 06:10:14 +00004047 .Case("clzero", HasCLZERO)
Nick Lewycky50e8f482013-10-05 20:14:27 +00004048 .Case("cx16", HasCX16)
4049 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00004050 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00004051 .Case("fma4", XOPLevel >= FMA4)
Craig Topper8c7f2512014-11-03 06:51:41 +00004052 .Case("fsgsbase", HasFSGSBASE)
Craig Toppere33f51f2015-10-16 06:22:36 +00004053 .Case("fxsr", HasFXSR)
Craig Topper8dbc5842014-11-03 07:05:26 +00004054 .Case("lzcnt", HasLZCNT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004055 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
4056 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
4057 .Case("mmx", MMX3DNowLevel >= MMX)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00004058 .Case("movbe", HasMOVBE)
4059 .Case("mpx", HasMPX)
Craig Topper3f122a72012-05-31 05:18:48 +00004060 .Case("pclmul", HasPCLMUL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00004061 .Case("pku", HasPKU)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004062 .Case("popcnt", HasPOPCNT)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00004063 .Case("prefetchwt1", HasPREFETCHWT1)
Michael Liao74f4eaf2013-03-26 17:52:08 +00004064 .Case("prfchw", HasPRFCHW)
Craig Topper8dbc5842014-11-03 07:05:26 +00004065 .Case("rdrnd", HasRDRND)
Michael Liaoffaae352013-03-29 05:17:55 +00004066 .Case("rdseed", HasRDSEED)
Craig Topper8dbc5842014-11-03 07:05:26 +00004067 .Case("rtm", HasRTM)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00004068 .Case("sgx", HasSGX)
Ben Langmuir58078d02013-09-19 13:22:04 +00004069 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004070 .Case("sse", SSELevel >= SSE1)
4071 .Case("sse2", SSELevel >= SSE2)
4072 .Case("sse3", SSELevel >= SSE3)
4073 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00004074 .Case("sse4.1", SSELevel >= SSE41)
4075 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00004076 .Case("sse4a", XOPLevel >= SSE4A)
Craig Topper8dbc5842014-11-03 07:05:26 +00004077 .Case("tbm", HasTBM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004078 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00004079 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
4080 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00004081 .Case("xop", XOPLevel >= XOP)
Craig Topperda9fe562015-10-15 05:23:38 +00004082 .Case("xsave", HasXSAVE)
4083 .Case("xsavec", HasXSAVEC)
4084 .Case("xsaves", HasXSAVES)
4085 .Case("xsaveopt", HasXSAVEOPT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004086 .Default(false);
4087}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004088
Eric Christopherd9832702015-06-29 21:00:05 +00004089// We can't use a generic validation scheme for the features accepted here
4090// versus subtarget features accepted in the target attribute because the
4091// bitfield structure that's initialized in the runtime only supports the
4092// below currently rather than the full range of subtarget features. (See
4093// X86TargetInfo::hasFeature for a somewhat comprehensive list).
4094bool X86TargetInfo::validateCpuSupports(StringRef FeatureStr) const {
4095 return llvm::StringSwitch<bool>(FeatureStr)
4096 .Case("cmov", true)
4097 .Case("mmx", true)
4098 .Case("popcnt", true)
4099 .Case("sse", true)
4100 .Case("sse2", true)
4101 .Case("sse3", true)
Benjamin Kramerf4c520d2016-05-20 15:21:08 +00004102 .Case("ssse3", true)
Eric Christopherd9832702015-06-29 21:00:05 +00004103 .Case("sse4.1", true)
4104 .Case("sse4.2", true)
4105 .Case("avx", true)
4106 .Case("avx2", true)
4107 .Case("sse4a", true)
4108 .Case("fma4", true)
4109 .Case("xop", true)
4110 .Case("fma", true)
4111 .Case("avx512f", true)
4112 .Case("bmi", true)
4113 .Case("bmi2", true)
Benjamin Kramerf4c520d2016-05-20 15:21:08 +00004114 .Case("aes", true)
4115 .Case("pclmul", true)
4116 .Case("avx512vl", true)
4117 .Case("avx512bw", true)
4118 .Case("avx512dq", true)
4119 .Case("avx512cd", true)
4120 .Case("avx512er", true)
4121 .Case("avx512pf", true)
4122 .Case("avx512vbmi", true)
4123 .Case("avx512ifma", true)
Eric Christopherd9832702015-06-29 21:00:05 +00004124 .Default(false);
4125}
4126
Eli Friedman3fd920a2008-08-20 02:34:37 +00004127bool
Anders Carlsson58436352009-02-28 17:11:49 +00004128X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00004129 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00004130 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004131 default: return false;
Alexey Bataev91e58602015-07-20 12:08:00 +00004132 // Constant constraints.
4133 case 'e': // 32-bit signed integer constant for use with sign-extending x86_64
4134 // instructions.
4135 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
4136 // x86_64 instructions.
4137 case 's':
4138 Info.setRequiresImmediate();
4139 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00004140 case 'I':
4141 Info.setRequiresImmediate(0, 31);
4142 return true;
4143 case 'J':
4144 Info.setRequiresImmediate(0, 63);
4145 return true;
4146 case 'K':
4147 Info.setRequiresImmediate(-128, 127);
4148 return true;
4149 case 'L':
Alexey Bataev91e58602015-07-20 12:08:00 +00004150 Info.setRequiresImmediate({ int(0xff), int(0xffff), int(0xffffffff) });
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00004151 return true;
4152 case 'M':
4153 Info.setRequiresImmediate(0, 3);
4154 return true;
4155 case 'N':
4156 Info.setRequiresImmediate(0, 255);
4157 return true;
4158 case 'O':
4159 Info.setRequiresImmediate(0, 127);
4160 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00004161 // Register constraints.
4162 case 'Y': // 'Y' is the first character for several 2-character constraints.
4163 // Shift the pointer to the second character of the constraint.
4164 Name++;
4165 switch (*Name) {
4166 default:
4167 return false;
4168 case '0': // First SSE register.
4169 case 't': // Any SSE register, when SSE2 is enabled.
4170 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
4171 case 'm': // Any MMX register, when inter-unit moves enabled.
Michael Zuckerman849a6a52016-10-31 17:23:52 +00004172 case 'k': // AVX512 arch mask registers: k1-k7.
Alexey Bataev91e58602015-07-20 12:08:00 +00004173 Info.setAllowsRegister();
4174 return true;
4175 }
4176 case 'f': // Any x87 floating point stack register.
Akira Hatanaka88ef7282014-07-18 23:30:30 +00004177 // Constraint 'f' cannot be used for output operands.
4178 if (Info.ConstraintStr[0] == '=')
4179 return false;
Akira Hatanaka88ef7282014-07-18 23:30:30 +00004180 Info.setAllowsRegister();
4181 return true;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004182 case 'a': // eax.
4183 case 'b': // ebx.
4184 case 'c': // ecx.
4185 case 'd': // edx.
4186 case 'S': // esi.
4187 case 'D': // edi.
4188 case 'A': // edx:eax.
Alexey Bataev91e58602015-07-20 12:08:00 +00004189 case 't': // Top of floating point stack.
4190 case 'u': // Second from top of floating point stack.
Eli Friedman3fd920a2008-08-20 02:34:37 +00004191 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00004192 case 'y': // Any MMX register.
Michael Zuckerman62f516f2016-11-01 13:16:44 +00004193 case 'v': // Any {X,Y,Z}MM register (Arch & context dependent)
Anders Carlsson5f7ee682008-10-06 19:17:39 +00004194 case 'x': // Any SSE register.
Michael Zuckerman849a6a52016-10-31 17:23:52 +00004195 case 'k': // Any AVX512 mask register (same as Yk, additionaly allows k0
4196 // for intermideate k reg operations).
Eli Friedman3fd920a2008-08-20 02:34:37 +00004197 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00004198 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
4199 case 'l': // "Index" registers: any general register that can be used as an
4200 // index in a base+index memory access.
4201 Info.setAllowsRegister();
4202 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00004203 // Floating point constant constraints.
Dale Johannesen46742a42010-08-24 22:33:12 +00004204 case 'C': // SSE floating point constant.
4205 case 'G': // x87 floating point constant.
Eli Friedman3fd920a2008-08-20 02:34:37 +00004206 return true;
4207 }
4208}
4209
Akira Hatanaka974131e2014-09-18 18:17:18 +00004210bool X86TargetInfo::validateOutputSize(StringRef Constraint,
4211 unsigned Size) const {
4212 // Strip off constraint modifiers.
4213 while (Constraint[0] == '=' ||
4214 Constraint[0] == '+' ||
4215 Constraint[0] == '&')
4216 Constraint = Constraint.substr(1);
4217
4218 return validateOperandSize(Constraint, Size);
4219}
4220
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004221bool X86TargetInfo::validateInputSize(StringRef Constraint,
4222 unsigned Size) const {
Akira Hatanaka974131e2014-09-18 18:17:18 +00004223 return validateOperandSize(Constraint, Size);
4224}
4225
4226bool X86TargetInfo::validateOperandSize(StringRef Constraint,
4227 unsigned Size) const {
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004228 switch (Constraint[0]) {
4229 default: break;
Michael Zuckerman849a6a52016-10-31 17:23:52 +00004230 case 'k':
4231 // Registers k0-k7 (AVX512) size limit is 64 bit.
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004232 case 'y':
4233 return Size <= 64;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004234 case 'f':
4235 case 't':
4236 case 'u':
4237 return Size <= 128;
Michael Zuckerman62f516f2016-11-01 13:16:44 +00004238 case 'v':
Hans Wennborg3c619a42014-09-18 20:24:04 +00004239 case 'x':
Alexey Bataev91e58602015-07-20 12:08:00 +00004240 if (SSELevel >= AVX512F)
4241 // 512-bit zmm registers can be used if target supports AVX512F.
4242 return Size <= 512U;
4243 else if (SSELevel >= AVX)
4244 // 256-bit ymm registers can be used if target supports AVX.
4245 return Size <= 256U;
4246 return Size <= 128U;
4247 case 'Y':
4248 // 'Y' is the first character for several 2-character constraints.
4249 switch (Constraint[1]) {
4250 default: break;
4251 case 'm':
4252 // 'Ym' is synonymous with 'y'.
Michael Zuckerman849a6a52016-10-31 17:23:52 +00004253 case 'k':
Alexey Bataev91e58602015-07-20 12:08:00 +00004254 return Size <= 64;
4255 case 'i':
4256 case 't':
4257 // 'Yi' and 'Yt' are synonymous with 'x' when SSE2 is enabled.
4258 if (SSELevel >= AVX512F)
4259 return Size <= 512U;
4260 else if (SSELevel >= AVX)
4261 return Size <= 256U;
4262 return SSELevel >= SSE2 && Size <= 128U;
4263 }
4264
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004265 }
4266
4267 return true;
4268}
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00004269
Eli Friedman3fd920a2008-08-20 02:34:37 +00004270std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004271X86TargetInfo::convertConstraint(const char *&Constraint) const {
4272 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004273 case 'a': return std::string("{ax}");
4274 case 'b': return std::string("{bx}");
4275 case 'c': return std::string("{cx}");
4276 case 'd': return std::string("{dx}");
4277 case 'S': return std::string("{si}");
4278 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00004279 case 'p': // address
4280 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00004281 case 't': // top of floating point stack.
4282 return std::string("{st}");
4283 case 'u': // second from top of floating point stack.
4284 return std::string("{st(1)}"); // second from top of floating point stack.
Michael Zuckerman849a6a52016-10-31 17:23:52 +00004285 case 'Y':
4286 switch (Constraint[1]) {
4287 default:
4288 // Break from inner switch and fall through (copy single char),
4289 // continue parsing after copying the current constraint into
4290 // the return string.
4291 break;
4292 case 'k':
4293 // "^" hints llvm that this is a 2 letter constraint.
4294 // "Constraint++" is used to promote the string iterator
4295 // to the next constraint.
4296 return std::string("^") + std::string(Constraint++, 2);
4297 }
4298 LLVM_FALLTHROUGH;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004299 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004300 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00004301 }
4302}
Chris Lattner5ba61f02006-10-14 07:39:34 +00004303
Eli Friedman3fd920a2008-08-20 02:34:37 +00004304// X86-32 generic target
4305class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00004306public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004307 X86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4308 : X86TargetInfo(Triple, Opts) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004309 DoubleAlign = LongLongAlign = 32;
4310 LongDoubleWidth = 96;
4311 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00004312 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00004313 resetDataLayout("e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128");
Eli Friedman32ca82a2009-03-29 20:31:09 +00004314 SizeType = UnsignedInt;
4315 PtrDiffType = SignedInt;
4316 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00004317 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00004318
4319 // Use fpret for all types.
4320 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
4321 (1 << TargetInfo::Double) |
4322 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004323
4324 // x86-32 has atomics up to 8 bytes
4325 // FIXME: Check that we actually have cmpxchg8b before setting
4326 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
4327 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004328 }
Craig Topper3164f332014-03-11 03:39:26 +00004329 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004330 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004331 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004332
Craig Topper3164f332014-03-11 03:39:26 +00004333 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00004334 if (RegNo == 0) return 0;
4335 if (RegNo == 1) return 2;
4336 return -1;
4337 }
Akira Hatanaka974131e2014-09-18 18:17:18 +00004338 bool validateOperandSize(StringRef Constraint,
4339 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00004340 switch (Constraint[0]) {
4341 default: break;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004342 case 'R':
4343 case 'q':
4344 case 'Q':
Bill Wendling887b4852012-11-12 06:42:51 +00004345 case 'a':
4346 case 'b':
4347 case 'c':
4348 case 'd':
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004349 case 'S':
4350 case 'D':
Bill Wendling3c7fed82012-11-12 18:52:32 +00004351 return Size <= 32;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004352 case 'A':
4353 return Size <= 64;
Bill Wendling887b4852012-11-12 06:42:51 +00004354 }
4355
Akira Hatanaka974131e2014-09-18 18:17:18 +00004356 return X86TargetInfo::validateOperandSize(Constraint, Size);
Bill Wendling887b4852012-11-12 06:42:51 +00004357 }
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00004358 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
4359 return llvm::makeArrayRef(BuiltinInfoX86, clang::X86::LastX86CommonBuiltin -
4360 Builtin::FirstTSBuiltin + 1);
4361 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004362};
Eli Friedman3fd920a2008-08-20 02:34:37 +00004363
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004364class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
4365public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004366 NetBSDI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4367 : NetBSDTargetInfo<X86_32TargetInfo>(Triple, Opts) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004368
Craig Topper3164f332014-03-11 03:39:26 +00004369 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00004370 unsigned Major, Minor, Micro;
4371 getTriple().getOSVersion(Major, Minor, Micro);
4372 // New NetBSD uses the default rounding mode.
4373 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
4374 return X86_32TargetInfo::getFloatEvalMethod();
4375 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004376 return 1;
4377 }
4378};
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004379
Eli Friedmane3aa4542009-07-05 18:47:56 +00004380class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
4381public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004382 OpenBSDI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4383 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00004384 SizeType = UnsignedLong;
4385 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004386 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00004387 }
4388};
Eli Friedmane3aa4542009-07-05 18:47:56 +00004389
Eli Friedman9fa28852012-08-08 23:57:20 +00004390class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
4391public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004392 BitrigI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4393 : BitrigTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman9fa28852012-08-08 23:57:20 +00004394 SizeType = UnsignedLong;
4395 IntPtrType = SignedLong;
4396 PtrDiffType = SignedLong;
4397 }
4398};
Eli Friedman9fa28852012-08-08 23:57:20 +00004399
Torok Edwinb2b37c62009-06-30 17:10:35 +00004400class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004401public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004402 DarwinI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4403 : DarwinTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004404 LongDoubleWidth = 128;
4405 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004406 SuitableAlign = 128;
Tim Northover5627d392015-10-30 16:30:45 +00004407 MaxVectorAlign = 256;
4408 // The watchOS simulator uses the builtin bool type for Objective-C.
4409 llvm::Triple T = llvm::Triple(Triple);
4410 if (T.isWatchOS())
4411 UseSignedCharForObjCBool = false;
Eli Friedman32ca82a2009-03-29 20:31:09 +00004412 SizeType = UnsignedLong;
4413 IntPtrType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00004414 resetDataLayout("e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128");
Daniel Dunbarbd606522010-05-27 00:35:16 +00004415 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00004416 }
4417
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004418 bool handleTargetFeatures(std::vector<std::string> &Features,
4419 DiagnosticsEngine &Diags) override {
4420 if (!DarwinTargetInfo<X86_32TargetInfo>::handleTargetFeatures(Features,
4421 Diags))
4422 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004423 // We now know the features we have: we can decide how to align vectors.
4424 MaxVectorAlign =
4425 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004426 return true;
4427 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004428};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004429
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004430// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004431class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004432public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004433 WindowsX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4434 : WindowsTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Chris Lattner46be2e12009-06-24 17:12:15 +00004435 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00004436 DoubleAlign = LongLongAlign = 64;
Reid Kleckner7510c092015-04-01 16:45:06 +00004437 bool IsWinCOFF =
4438 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
James Y Knightb214cbc2016-03-04 19:00:41 +00004439 resetDataLayout(IsWinCOFF
4440 ? "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
4441 : "e-m:e-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32");
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004442 }
Craig Topper3164f332014-03-11 03:39:26 +00004443 void getTargetDefines(const LangOptions &Opts,
4444 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004445 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
4446 }
4447};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004448
4449// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004450class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004451public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004452 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple,
4453 const TargetOptions &Opts)
4454 : WindowsX86_32TargetInfo(Triple, Opts) {
Eli Friedman015d6282011-03-22 21:25:11 +00004455 LongDoubleWidth = LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00004456 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004457 }
Craig Topper3164f332014-03-11 03:39:26 +00004458 void getTargetDefines(const LangOptions &Opts,
4459 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004460 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
4461 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
4462 // The value of the following reflects processor type.
4463 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
4464 // We lost the original triple, so we use the default.
4465 Builder.defineMacro("_M_IX86", "600");
4466 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004467};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004468
David Majnemerae1ed0e2015-05-28 04:36:18 +00004469static void addCygMingDefines(const LangOptions &Opts, MacroBuilder &Builder) {
Eric Christopherb093d692015-10-09 18:39:59 +00004470 // Mingw and cygwin define __declspec(a) to __attribute__((a)). Clang
4471 // supports __declspec natively under -fms-extensions, but we define a no-op
4472 // __declspec macro anyway for pre-processor compatibility.
Reid Kleckner47606832014-04-21 20:58:00 +00004473 if (Opts.MicrosoftExt)
4474 Builder.defineMacro("__declspec", "__declspec");
4475 else
4476 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
4477
4478 if (!Opts.MicrosoftExt) {
4479 // Provide macros for all the calling convention keywords. Provide both
4480 // single and double underscore prefixed variants. These are available on
4481 // x64 as well as x86, even though they have no effect.
4482 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
4483 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00004484 std::string GCCSpelling = "__attribute__((__";
4485 GCCSpelling += CC;
4486 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00004487 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
4488 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
4489 }
4490 }
4491}
4492
David Majnemerae1ed0e2015-05-28 04:36:18 +00004493static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
4494 Builder.defineMacro("__MSVCRT__");
4495 Builder.defineMacro("__MINGW32__");
4496 addCygMingDefines(Opts, Builder);
4497}
4498
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004499// x86-32 MinGW target
4500class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
4501public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004502 MinGWX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4503 : WindowsX86_32TargetInfo(Triple, Opts) {}
Craig Topper3164f332014-03-11 03:39:26 +00004504 void getTargetDefines(const LangOptions &Opts,
4505 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004506 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004507 DefineStd(Builder, "WIN32", Opts);
4508 DefineStd(Builder, "WINNT", Opts);
4509 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00004510 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004511 }
4512};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004513
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004514// x86-32 Cygwin target
4515class CygwinX86_32TargetInfo : public X86_32TargetInfo {
4516public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004517 CygwinX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4518 : X86_32TargetInfo(Triple, Opts) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004519 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004520 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00004521 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 +00004522 }
Craig Topper3164f332014-03-11 03:39:26 +00004523 void getTargetDefines(const LangOptions &Opts,
4524 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004525 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00004526 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004527 Builder.defineMacro("__CYGWIN__");
4528 Builder.defineMacro("__CYGWIN32__");
David Majnemerae1ed0e2015-05-28 04:36:18 +00004529 addCygMingDefines(Opts, Builder);
Saleem Abdulrasool56027092017-02-07 19:00:06 +00004530 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00004531 if (Opts.CPlusPlus)
4532 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00004533 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004534};
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004535
Chris Lattnerb986aba2010-04-11 19:29:39 +00004536// x86-32 Haiku target
Reid Kleckner330fb172016-05-11 16:19:05 +00004537class HaikuX86_32TargetInfo : public HaikuTargetInfo<X86_32TargetInfo> {
Chris Lattnerb986aba2010-04-11 19:29:39 +00004538public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004539 HaikuX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Reid Kleckner330fb172016-05-11 16:19:05 +00004540 : HaikuTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman04831922010-08-22 01:00:03 +00004541 }
Craig Topper3164f332014-03-11 03:39:26 +00004542 void getTargetDefines(const LangOptions &Opts,
4543 MacroBuilder &Builder) const override {
Reid Kleckner330fb172016-05-11 16:19:05 +00004544 HaikuTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
Chris Lattnerb986aba2010-04-11 19:29:39 +00004545 Builder.defineMacro("__INTEL__");
Chris Lattnerb986aba2010-04-11 19:29:39 +00004546 }
4547};
Chris Lattnerb986aba2010-04-11 19:29:39 +00004548
Alexey Bataevc99b0492015-11-25 09:24:26 +00004549// X86-32 MCU target
4550class MCUX86_32TargetInfo : public X86_32TargetInfo {
4551public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004552 MCUX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4553 : X86_32TargetInfo(Triple, Opts) {
Alexey Bataevc99b0492015-11-25 09:24:26 +00004554 LongDoubleWidth = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00004555 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
James Y Knightb214cbc2016-03-04 19:00:41 +00004556 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 +00004557 WIntType = UnsignedInt;
Alexey Bataevc99b0492015-11-25 09:24:26 +00004558 }
4559
4560 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
4561 // On MCU we support only C calling convention.
4562 return CC == CC_C ? CCCR_OK : CCCR_Warning;
4563 }
4564
4565 void getTargetDefines(const LangOptions &Opts,
4566 MacroBuilder &Builder) const override {
4567 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4568 Builder.defineMacro("__iamcu");
4569 Builder.defineMacro("__iamcu__");
4570 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00004571
4572 bool allowsLargerPreferedTypeAlignment() const override {
4573 return false;
4574 }
Alexey Bataevc99b0492015-11-25 09:24:26 +00004575};
4576
Douglas Gregor9fabd852011-07-01 22:41:14 +00004577// RTEMS Target
4578template<typename Target>
4579class RTEMSTargetInfo : public OSTargetInfo<Target> {
4580protected:
Craig Topper3164f332014-03-11 03:39:26 +00004581 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4582 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004583 // RTEMS defines; list based off of gcc output
4584
Douglas Gregor9fabd852011-07-01 22:41:14 +00004585 Builder.defineMacro("__rtems__");
4586 Builder.defineMacro("__ELF__");
4587 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004588
Douglas Gregor9fabd852011-07-01 22:41:14 +00004589public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004590 RTEMSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4591 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004592 switch (Triple.getArch()) {
4593 default:
4594 case llvm::Triple::x86:
4595 // this->MCountName = ".mcount";
4596 break;
4597 case llvm::Triple::mips:
4598 case llvm::Triple::mipsel:
4599 case llvm::Triple::ppc:
4600 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00004601 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004602 // this->MCountName = "_mcount";
4603 break;
4604 case llvm::Triple::arm:
4605 // this->MCountName = "__mcount";
4606 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004607 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004608 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00004609};
4610
Douglas Gregor9fabd852011-07-01 22:41:14 +00004611// x86-32 RTEMS target
4612class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
4613public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004614 RTEMSX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4615 : X86_32TargetInfo(Triple, Opts) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004616 SizeType = UnsignedLong;
4617 IntPtrType = SignedLong;
4618 PtrDiffType = SignedLong;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004619 }
Craig Topper3164f332014-03-11 03:39:26 +00004620 void getTargetDefines(const LangOptions &Opts,
4621 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004622 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4623 Builder.defineMacro("__INTEL__");
4624 Builder.defineMacro("__rtems__");
4625 }
4626};
Douglas Gregor9fabd852011-07-01 22:41:14 +00004627
Eli Friedman3fd920a2008-08-20 02:34:37 +00004628// x86-64 generic target
4629class X86_64TargetInfo : public X86TargetInfo {
4630public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004631 X86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4632 : X86TargetInfo(Triple, Opts) {
David Blaikie40f842d2014-07-10 18:46:15 +00004633 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
David Majnemer8fa8c382015-03-17 23:55:00 +00004634 bool IsWinCOFF =
4635 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Zinovy Nis1db95732014-07-10 15:27:19 +00004636 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00004637 LongDoubleWidth = 128;
4638 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00004639 LargeArrayMinWidth = 128;
4640 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004641 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00004642 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
4643 PtrDiffType = IsX32 ? SignedInt : SignedLong;
4644 IntPtrType = IsX32 ? SignedInt : SignedLong;
4645 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00004646 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00004647 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00004648
Eric Christopher917e9522014-11-18 22:36:15 +00004649 // Pointers are 32-bit in x32.
Eric Christopherf6ee1f32017-02-10 04:35:21 +00004650 resetDataLayout(IsX32
4651 ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128"
4652 : IsWinCOFF ? "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
4653 : "e-m:e-i64:64-f80:128-n8:16:32:64-S128");
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00004654
4655 // Use fpret only for long double.
4656 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004657
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00004658 // Use fp2ret for _Complex long double.
4659 ComplexLongDoubleUsesFP2Ret = true;
4660
Charles Davisc7d5c942015-09-17 20:55:33 +00004661 // Make __builtin_ms_va_list available.
4662 HasBuiltinMSVaList = true;
4663
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004664 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004665 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00004666 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00004667 }
Craig Topper3164f332014-03-11 03:39:26 +00004668 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004669 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00004670 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004671
Craig Topper3164f332014-03-11 03:39:26 +00004672 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00004673 if (RegNo == 0) return 0;
4674 if (RegNo == 1) return 1;
4675 return -1;
4676 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004677
Craig Topper3164f332014-03-11 03:39:26 +00004678 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00004679 switch (CC) {
4680 case CC_C:
4681 case CC_Swift:
4682 case CC_X86VectorCall:
4683 case CC_IntelOclBicc:
4684 case CC_X86_64Win64:
Roman Levenstein35aa5ce2016-03-16 18:00:46 +00004685 case CC_PreserveMost:
4686 case CC_PreserveAll:
Erich Keane757d3172016-11-02 18:29:35 +00004687 case CC_X86RegCall:
John McCall477f2bb2016-03-03 06:39:32 +00004688 return CCCR_OK;
4689 default:
4690 return CCCR_Warning;
4691 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004692 }
4693
Craig Topper3164f332014-03-11 03:39:26 +00004694 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00004695 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004696 }
4697
Pavel Chupinfd223e12014-08-04 12:39:43 +00004698 // for x32 we need it here explicitly
4699 bool hasInt128Type() const override { return true; }
Reid Klecknerf27e7522016-02-01 18:58:24 +00004700 unsigned getUnwindWordWidth() const override { return 64; }
4701 unsigned getRegisterWidth() const override { return 64; }
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00004702
4703 bool validateGlobalRegisterVariable(StringRef RegName,
4704 unsigned RegSize,
4705 bool &HasSizeMismatch) const override {
4706 // rsp and rbp are the only 64-bit registers the x86 backend can currently
4707 // handle.
4708 if (RegName.equals("rsp") || RegName.equals("rbp")) {
4709 // Check that the register size is 64-bit.
4710 HasSizeMismatch = RegSize != 64;
4711 return true;
4712 }
4713
4714 // Check if the register is a 32-bit register the backend can handle.
4715 return X86TargetInfo::validateGlobalRegisterVariable(RegName, RegSize,
4716 HasSizeMismatch);
4717 }
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00004718 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
4719 return llvm::makeArrayRef(BuiltinInfoX86,
4720 X86::LastTSBuiltin - Builtin::FirstTSBuiltin);
4721 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004722};
Eli Friedman3fd920a2008-08-20 02:34:37 +00004723
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004724// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004725class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004726public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004727 WindowsX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4728 : WindowsTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004729 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00004730 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004731 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004732 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004733 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00004734 SizeType = UnsignedLongLong;
4735 PtrDiffType = SignedLongLong;
4736 IntPtrType = SignedLongLong;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004737 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004738
Craig Topper3164f332014-03-11 03:39:26 +00004739 void getTargetDefines(const LangOptions &Opts,
4740 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004741 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004742 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004743 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004744
Craig Topper3164f332014-03-11 03:39:26 +00004745 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004746 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00004747 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004748
Craig Topper3164f332014-03-11 03:39:26 +00004749 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004750 switch (CC) {
4751 case CC_X86StdCall:
4752 case CC_X86ThisCall:
4753 case CC_X86FastCall:
4754 return CCCR_Ignore;
4755 case CC_C:
4756 case CC_X86VectorCall:
4757 case CC_IntelOclBicc:
4758 case CC_X86_64SysV:
Arnold Schwaighofer4fc955e2016-10-12 18:59:24 +00004759 case CC_Swift:
Erich Keane757d3172016-11-02 18:29:35 +00004760 case CC_X86RegCall:
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004761 return CCCR_OK;
4762 default:
4763 return CCCR_Warning;
4764 }
Charles Davisb5a214e2013-08-30 04:39:01 +00004765 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004766};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004767
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004768// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004769class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004770public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004771 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple,
4772 const TargetOptions &Opts)
4773 : WindowsX86_64TargetInfo(Triple, Opts) {
Eli Friedman015d6282011-03-22 21:25:11 +00004774 LongDoubleWidth = LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00004775 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004776 }
Craig Topper3164f332014-03-11 03:39:26 +00004777 void getTargetDefines(const LangOptions &Opts,
4778 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004779 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
4780 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
David Majnemerb856e8f2015-07-26 23:17:29 +00004781 Builder.defineMacro("_M_X64", "100");
4782 Builder.defineMacro("_M_AMD64", "100");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004783 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004784};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004785
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004786// x86-64 MinGW target
4787class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
4788public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004789 MinGWX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4790 : WindowsX86_64TargetInfo(Triple, Opts) {
Reid Kleckner11a17192015-10-28 22:29:52 +00004791 // Mingw64 rounds long double size and alignment up to 16 bytes, but sticks
4792 // with x86 FP ops. Weird.
4793 LongDoubleWidth = LongDoubleAlign = 128;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00004794 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended();
Reid Kleckner11a17192015-10-28 22:29:52 +00004795 }
4796
Craig Topper3164f332014-03-11 03:39:26 +00004797 void getTargetDefines(const LangOptions &Opts,
4798 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004799 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004800 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004801 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00004802 addMinGWDefines(Opts, Builder);
Reid Klecknere070b992014-11-14 02:01:10 +00004803
4804 // GCC defines this macro when it is using __gxx_personality_seh0.
4805 if (!Opts.SjLjExceptions)
4806 Builder.defineMacro("__SEH__");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004807 }
4808};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004809
Yaron Kerend030d112015-07-22 17:38:19 +00004810// x86-64 Cygwin target
4811class CygwinX86_64TargetInfo : public X86_64TargetInfo {
4812public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004813 CygwinX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4814 : X86_64TargetInfo(Triple, Opts) {
Yaron Kerend030d112015-07-22 17:38:19 +00004815 TLSSupported = false;
4816 WCharType = UnsignedShort;
4817 }
4818 void getTargetDefines(const LangOptions &Opts,
4819 MacroBuilder &Builder) const override {
4820 X86_64TargetInfo::getTargetDefines(Opts, Builder);
4821 Builder.defineMacro("__x86_64__");
4822 Builder.defineMacro("__CYGWIN__");
4823 Builder.defineMacro("__CYGWIN64__");
4824 addCygMingDefines(Opts, Builder);
Saleem Abdulrasool56027092017-02-07 19:00:06 +00004825 DefineStd(Builder, "unix", Opts);
Yaron Kerend030d112015-07-22 17:38:19 +00004826 if (Opts.CPlusPlus)
4827 Builder.defineMacro("_GNU_SOURCE");
4828
4829 // GCC defines this macro when it is using __gxx_personality_seh0.
4830 if (!Opts.SjLjExceptions)
4831 Builder.defineMacro("__SEH__");
4832 }
4833};
4834
Eli Friedman2857ccb2009-07-01 03:36:11 +00004835class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
4836public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004837 DarwinX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4838 : DarwinTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00004839 Int64Type = SignedLongLong;
Tim Northovera2ee4332014-03-29 15:09:45 +00004840 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
4841 llvm::Triple T = llvm::Triple(Triple);
Bob Wilson946c04c2014-10-19 02:19:27 +00004842 if (T.isiOS())
Tim Northovera2ee4332014-03-29 15:09:45 +00004843 UseSignedCharForObjCBool = false;
James Y Knightb214cbc2016-03-04 19:00:41 +00004844 resetDataLayout("e-m:o-i64:64-f80:128-n8:16:32:64-S128");
Eli Friedman2857ccb2009-07-01 03:36:11 +00004845 }
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004846
4847 bool handleTargetFeatures(std::vector<std::string> &Features,
4848 DiagnosticsEngine &Diags) override {
4849 if (!DarwinTargetInfo<X86_64TargetInfo>::handleTargetFeatures(Features,
4850 Diags))
4851 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004852 // We now know the features we have: we can decide how to align vectors.
4853 MaxVectorAlign =
4854 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004855 return true;
4856 }
Eli Friedman2857ccb2009-07-01 03:36:11 +00004857};
Eli Friedman2857ccb2009-07-01 03:36:11 +00004858
Eli Friedman245f2292009-07-05 22:31:18 +00004859class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
4860public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004861 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4862 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Eli Friedman245f2292009-07-05 22:31:18 +00004863 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004864 Int64Type = SignedLongLong;
4865 }
4866};
Eli Friedman245f2292009-07-05 22:31:18 +00004867
Eli Friedman9fa28852012-08-08 23:57:20 +00004868class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
4869public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004870 BitrigX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4871 : BitrigTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004872 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004873 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00004874 }
4875};
Tim Northover9bb857a2013-01-31 12:13:10 +00004876
Eli Friedmanf05b7722008-08-20 07:44:10 +00004877class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004878 // Possible FPU choices.
4879 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004880 VFP2FPU = (1 << 0),
4881 VFP3FPU = (1 << 1),
4882 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00004883 NeonFPU = (1 << 3),
4884 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004885 };
4886
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004887 // Possible HWDiv features.
4888 enum HWDivMode {
4889 HWDivThumb = (1 << 0),
4890 HWDivARM = (1 << 1)
4891 };
4892
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004893 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004894 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004895 }
4896
4897 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4898 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004899
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004900 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004901
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004902 StringRef CPUProfile;
4903 StringRef CPUAttr;
4904
Rafael Espindolaeb265472013-08-21 21:59:03 +00004905 enum {
4906 FP_Default,
4907 FP_VFP,
4908 FP_Neon
4909 } FPMath;
4910
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004911 unsigned ArchISA;
Renato Goline84b0002015-10-08 16:43:26 +00004912 unsigned ArchKind = llvm::ARM::AK_ARMV4T;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004913 unsigned ArchProfile;
4914 unsigned ArchVersion;
4915
Bernard Ogdenda13af32013-10-24 18:32:51 +00004916 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004917
Logan Chien57086ce2012-10-10 06:56:20 +00004918 unsigned IsAAPCS : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004919 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004920
4921 // Initialized via features.
4922 unsigned SoftFloat : 1;
4923 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004924
Bernard Ogden18b57012013-10-29 09:47:51 +00004925 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00004926 unsigned Crypto : 1;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004927 unsigned DSP : 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004928 unsigned Unaligned : 1;
4929
4930 enum {
4931 LDREX_B = (1 << 0), /// byte (8-bit)
4932 LDREX_H = (1 << 1), /// half (16-bit)
4933 LDREX_W = (1 << 2), /// word (32-bit)
4934 LDREX_D = (1 << 3), /// double (64-bit)
4935 };
4936
4937 uint32_t LDREX;
Bernard Ogden18b57012013-10-29 09:47:51 +00004938
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004939 // ACLE 6.5.1 Hardware floating point
4940 enum {
4941 HW_FP_HP = (1 << 1), /// half (16-bit)
4942 HW_FP_SP = (1 << 2), /// single (32-bit)
4943 HW_FP_DP = (1 << 3), /// double (64-bit)
4944 };
4945 uint32_t HW_FP;
4946
Chris Lattner5cc15e02010-03-03 19:03:45 +00004947 static const Builtin::Info BuiltinInfo[];
4948
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004949 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004950 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004951
4952 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00004953 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004954
Renato Golin0201a9e2016-09-22 19:28:20 +00004955 // size_t is unsigned long on MachO-derived environments, NetBSD,
4956 // OpenBSD and Bitrig.
Renato Golin9ba39232015-02-27 16:35:48 +00004957 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD ||
Renato Golin0201a9e2016-09-22 19:28:20 +00004958 T.getOS() == llvm::Triple::OpenBSD ||
Renato Golin9ba39232015-02-27 16:35:48 +00004959 T.getOS() == llvm::Triple::Bitrig)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004960 SizeType = UnsignedLong;
4961 else
4962 SizeType = UnsignedInt;
4963
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004964 switch (T.getOS()) {
4965 case llvm::Triple::NetBSD:
Renato Golin0201a9e2016-09-22 19:28:20 +00004966 case llvm::Triple::OpenBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004967 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004968 break;
4969 case llvm::Triple::Win32:
4970 WCharType = UnsignedShort;
4971 break;
4972 case llvm::Triple::Linux:
4973 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004974 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
4975 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004976 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004977 }
4978
4979 UseBitFieldTypeAlignment = true;
4980
4981 ZeroLengthBitfieldBoundary = 0;
4982
Tim Northover147cd2f2014-10-14 22:12:21 +00004983 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
4984 // so set preferred for small types to 32.
4985 if (T.isOSBinFormatMachO()) {
James Y Knightb214cbc2016-03-04 19:00:41 +00004986 resetDataLayout(BigEndian
4987 ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4988 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Tim Northover147cd2f2014-10-14 22:12:21 +00004989 } else if (T.isOSWindows()) {
Tim Northover147cd2f2014-10-14 22:12:21 +00004990 assert(!BigEndian && "Windows on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004991 resetDataLayout("e"
4992 "-m:w"
4993 "-p:32:32"
4994 "-i64:64"
4995 "-v128:64:128"
4996 "-a:0:32"
4997 "-n32"
4998 "-S64");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00004999 } else if (T.isOSNaCl()) {
5000 assert(!BigEndian && "NaCl on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00005001 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00005002 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00005003 resetDataLayout(BigEndian
5004 ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
5005 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00005006 }
5007
5008 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00005009 }
5010
Tim Northover5627d392015-10-30 16:30:45 +00005011 void setABIAPCS(bool IsAAPCS16) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00005012 const llvm::Triple &T = getTriple();
5013
Rafael Espindolaafa854c2013-12-18 20:24:51 +00005014 IsAAPCS = false;
5015
Tim Northover5627d392015-10-30 16:30:45 +00005016 if (IsAAPCS16)
5017 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
5018 else
5019 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00005020
Rafael Espindolad6c2b722013-12-18 19:47:32 +00005021 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00005022 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00005023 SizeType = UnsignedInt;
5024 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00005025 SizeType = UnsignedLong;
5026
5027 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
5028 WCharType = SignedInt;
5029
5030 // Do not respect the alignment of bit-field types when laying out
5031 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
5032 UseBitFieldTypeAlignment = false;
5033
5034 /// gcc forces the alignment to 4 bytes, regardless of the type of the
5035 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
5036 /// gcc.
5037 ZeroLengthBitfieldBoundary = 32;
5038
Tim Northover5627d392015-10-30 16:30:45 +00005039 if (T.isOSBinFormatMachO() && IsAAPCS16) {
5040 assert(!BigEndian && "AAPCS16 does not support big-endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00005041 resetDataLayout("e-m:o-p:32:32-i64:64-a:0:32-n32-S128");
Tim Northover5627d392015-10-30 16:30:45 +00005042 } else if (T.isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00005043 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00005044 BigEndian
5045 ? "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 +00005046 : "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 +00005047 else
James Y Knightb214cbc2016-03-04 19:00:41 +00005048 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00005049 BigEndian
5050 ? "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 +00005051 : "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 +00005052
5053 // FIXME: Override "preferred align" for double and long long.
5054 }
5055
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005056 void setArchInfo() {
5057 StringRef ArchName = getTriple().getArchName();
5058
Renato Goline84b0002015-10-08 16:43:26 +00005059 ArchISA = llvm::ARM::parseArchISA(ArchName);
5060 CPU = llvm::ARM::getDefaultCPU(ArchName);
5061 unsigned AK = llvm::ARM::parseArch(ArchName);
5062 if (AK != llvm::ARM::AK_INVALID)
5063 ArchKind = AK;
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005064 setArchInfo(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005065 }
5066
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005067 void setArchInfo(unsigned Kind) {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005068 StringRef SubArch;
5069
5070 // cache TargetParser info
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005071 ArchKind = Kind;
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00005072 SubArch = llvm::ARM::getSubArch(ArchKind);
5073 ArchProfile = llvm::ARM::parseArchProfile(SubArch);
5074 ArchVersion = llvm::ARM::parseArchVersion(SubArch);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005075
5076 // cache CPU related strings
5077 CPUAttr = getCPUAttr();
5078 CPUProfile = getCPUProfile();
5079 }
5080
5081 void setAtomic() {
Eric Christopherb093d692015-10-09 18:39:59 +00005082 // when triple does not specify a sub arch,
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005083 // then we are not using inline atomics
Renato Goline84b0002015-10-08 16:43:26 +00005084 bool ShouldUseInlineAtomic =
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005085 (ArchISA == llvm::ARM::IK_ARM && ArchVersion >= 6) ||
5086 (ArchISA == llvm::ARM::IK_THUMB && ArchVersion >= 7);
Eric Christopherb093d692015-10-09 18:39:59 +00005087 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005088 if (ArchProfile == llvm::ARM::PK_M) {
5089 MaxAtomicPromoteWidth = 32;
5090 if (ShouldUseInlineAtomic)
5091 MaxAtomicInlineWidth = 32;
5092 }
5093 else {
5094 MaxAtomicPromoteWidth = 64;
5095 if (ShouldUseInlineAtomic)
5096 MaxAtomicInlineWidth = 64;
Eric Christopherb093d692015-10-09 18:39:59 +00005097 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005098 }
5099
5100 bool isThumb() const {
5101 return (ArchISA == llvm::ARM::IK_THUMB);
5102 }
5103
5104 bool supportsThumb() const {
5105 return CPUAttr.count('T') || ArchVersion >= 6;
5106 }
5107
5108 bool supportsThumb2() const {
Bradley Smithf4affc12016-03-03 13:52:22 +00005109 return CPUAttr.equals("6T2") ||
5110 (ArchVersion >= 7 && !CPUAttr.equals("8M_BASE"));
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005111 }
5112
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005113 StringRef getCPUAttr() const {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005114 // For most sub-arches, the build attribute CPU name is enough.
5115 // For Cortex variants, it's slightly different.
5116 switch(ArchKind) {
5117 default:
Chandler Carruthd96f37a2015-08-30 07:51:18 +00005118 return llvm::ARM::getCPUAttr(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005119 case llvm::ARM::AK_ARMV6M:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005120 return "6M";
Tim Northover525c73c2015-07-21 21:47:33 +00005121 case llvm::ARM::AK_ARMV7S:
5122 return "7S";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005123 case llvm::ARM::AK_ARMV7A:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005124 return "7A";
5125 case llvm::ARM::AK_ARMV7R:
5126 return "7R";
5127 case llvm::ARM::AK_ARMV7M:
5128 return "7M";
5129 case llvm::ARM::AK_ARMV7EM:
5130 return "7EM";
George Burgess IVfc970562017-02-09 23:30:10 +00005131 case llvm::ARM::AK_ARMV7VE:
5132 return "7VE";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005133 case llvm::ARM::AK_ARMV8A:
5134 return "8A";
5135 case llvm::ARM::AK_ARMV8_1A:
5136 return "8_1A";
Oliver Stannard3086c042016-02-11 16:05:52 +00005137 case llvm::ARM::AK_ARMV8_2A:
5138 return "8_2A";
Bradley Smithf4affc12016-03-03 13:52:22 +00005139 case llvm::ARM::AK_ARMV8MBaseline:
5140 return "8M_BASE";
5141 case llvm::ARM::AK_ARMV8MMainline:
5142 return "8M_MAIN";
Javed Absar00b74442016-10-07 12:08:41 +00005143 case llvm::ARM::AK_ARMV8R:
5144 return "8R";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005145 }
5146 }
5147
5148 StringRef getCPUProfile() const {
5149 switch(ArchProfile) {
5150 case llvm::ARM::PK_A:
5151 return "A";
5152 case llvm::ARM::PK_R:
5153 return "R";
5154 case llvm::ARM::PK_M:
5155 return "M";
5156 default:
5157 return "";
5158 }
5159 }
5160
Chris Lattner17df24e2008-04-21 18:56:49 +00005161public:
Matt Arsenaultf333de32016-09-07 07:08:02 +00005162 ARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005163 : TargetInfo(Triple), FPMath(FP_Default), IsAAPCS(true), LDREX(0),
5164 HW_FP(0) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005165
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00005166 switch (getTriple().getOS()) {
5167 case llvm::Triple::NetBSD:
Renato Golin0201a9e2016-09-22 19:28:20 +00005168 case llvm::Triple::OpenBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00005169 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00005170 break;
5171 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00005172 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00005173 break;
5174 }
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00005175
Renato Goline84b0002015-10-08 16:43:26 +00005176 // Cache arch related info.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005177 setArchInfo();
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00005178
Chris Lattner1a8f3942010-04-23 16:29:58 +00005179 // {} in inline assembly are neon specifiers, not assembly variant
5180 // specifiers.
5181 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005182
Eric Christopher0e261882014-12-05 01:06:59 +00005183 // FIXME: This duplicates code from the driver that sets the -target-abi
5184 // option - this code is used if -target-abi isn't passed and should
5185 // be unified in some way.
5186 if (Triple.isOSBinFormatMachO()) {
5187 // The backend is hardwired to assume AAPCS for M-class processors, ensure
5188 // the frontend matches that.
5189 if (Triple.getEnvironment() == llvm::Triple::EABI ||
5190 Triple.getOS() == llvm::Triple::UnknownOS ||
Zijiao Ma56a83722016-08-17 02:13:33 +00005191 ArchProfile == llvm::ARM::PK_M) {
Eric Christopher0e261882014-12-05 01:06:59 +00005192 setABI("aapcs");
Tim Northoverd88ecb32016-01-27 19:32:40 +00005193 } else if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00005194 setABI("aapcs16");
Eric Christopher0e261882014-12-05 01:06:59 +00005195 } else {
5196 setABI("apcs-gnu");
5197 }
5198 } else if (Triple.isOSWindows()) {
5199 // FIXME: this is invalid for WindowsCE
5200 setABI("aapcs");
5201 } else {
5202 // Select the default based on the platform.
5203 switch (Triple.getEnvironment()) {
5204 case llvm::Triple::Android:
5205 case llvm::Triple::GNUEABI:
5206 case llvm::Triple::GNUEABIHF:
Rafael Espindola0fa66802016-06-24 21:35:06 +00005207 case llvm::Triple::MuslEABI:
5208 case llvm::Triple::MuslEABIHF:
Eric Christopher0e261882014-12-05 01:06:59 +00005209 setABI("aapcs-linux");
5210 break;
5211 case llvm::Triple::EABIHF:
5212 case llvm::Triple::EABI:
5213 setABI("aapcs");
5214 break;
Eric Christopher560cc4f2014-12-18 02:08:55 +00005215 case llvm::Triple::GNU:
Renato Goline84b0002015-10-08 16:43:26 +00005216 setABI("apcs-gnu");
5217 break;
Eric Christopher0e261882014-12-05 01:06:59 +00005218 default:
5219 if (Triple.getOS() == llvm::Triple::NetBSD)
5220 setABI("apcs-gnu");
Brad Smith3d648b32017-02-28 03:20:26 +00005221 else if (Triple.getOS() == llvm::Triple::OpenBSD)
5222 setABI("aapcs-linux");
Eric Christopher0e261882014-12-05 01:06:59 +00005223 else
5224 setABI("aapcs");
5225 break;
5226 }
5227 }
John McCall86353412010-08-21 22:46:04 +00005228
5229 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00005230 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005231
Renato Golin15b86152015-07-03 16:41:13 +00005232 // ARM has atomics up to 8 bytes
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005233 setAtomic();
Rafael Espindola5ab8e2e2015-07-02 15:14:10 +00005234
James Molloya7139222012-03-12 09:14:10 +00005235 // Do force alignment of members that follow zero length bitfields. If
Eric Christopher917e9522014-11-18 22:36:15 +00005236 // the alignment of the zero-length bitfield is greater than the member
5237 // that follows it, `bar', `bar' will be aligned as the type of the
James Molloya7139222012-03-12 09:14:10 +00005238 // zero length bitfield.
5239 UseZeroLengthBitfieldAlignment = true;
Saleem Abdulrasool9b5ba542016-04-10 03:19:47 +00005240
5241 if (Triple.getOS() == llvm::Triple::Linux ||
5242 Triple.getOS() == llvm::Triple::UnknownOS)
5243 this->MCountName =
5244 Opts.EABIVersion == "gnu" ? "\01__gnu_mcount_nc" : "\01mcount";
Eli Friedmanb5366062008-05-20 14:21:01 +00005245 }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00005246
Alp Toker4925ba72014-06-07 23:30:42 +00005247 StringRef getABI() const override { return ABI; }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00005248
Craig Topper3164f332014-03-11 03:39:26 +00005249 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00005250 ABI = Name;
5251
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00005252 // The defaults (above) are for AAPCS, check if we need to change them.
5253 //
5254 // FIXME: We need support for -meabi... we could just mangle it into the
5255 // name.
Tim Northover756447a2015-10-30 16:30:36 +00005256 if (Name == "apcs-gnu" || Name == "aapcs16") {
Tim Northover5627d392015-10-30 16:30:45 +00005257 setABIAPCS(Name == "aapcs16");
Rafael Espindolad6c2b722013-12-18 19:47:32 +00005258 return true;
5259 }
5260 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
5261 setABIAAPCS();
5262 return true;
5263 }
5264 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00005265 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00005266
Renato Golinf5c4dec2015-05-27 13:33:00 +00005267 // FIXME: This should be based on Arch attributes, not CPU names.
Eric Christopher8c47b422015-10-09 18:39:55 +00005268 bool
5269 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
5270 StringRef CPU,
5271 const std::vector<std::string> &FeaturesVec) const override {
5272
Mehdi Aminia0016ec2016-10-07 08:37:29 +00005273 std::vector<StringRef> TargetFeatures;
Bradley Smithb3501962015-11-16 11:16:36 +00005274 unsigned Arch = llvm::ARM::parseArch(getTriple().getArchName());
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005275
5276 // get default FPU features
Bradley Smithb3501962015-11-16 11:16:36 +00005277 unsigned FPUKind = llvm::ARM::getDefaultFPU(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005278 llvm::ARM::getFPUFeatures(FPUKind, TargetFeatures);
5279
5280 // get default Extension features
Bradley Smithb3501962015-11-16 11:16:36 +00005281 unsigned Extensions = llvm::ARM::getDefaultExtensions(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005282 llvm::ARM::getExtensionFeatures(Extensions, TargetFeatures);
5283
Mehdi Aminia0016ec2016-10-07 08:37:29 +00005284 for (auto Feature : TargetFeatures)
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005285 if (Feature[0] == '+')
Mehdi Aminia0016ec2016-10-07 08:37:29 +00005286 Features[Feature.drop_front(1)] = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005287
Eric Christopher007b0a02015-08-28 22:32:01 +00005288 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005289 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005290
Craig Topper3164f332014-03-11 03:39:26 +00005291 bool handleTargetFeatures(std::vector<std::string> &Features,
5292 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005293 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00005294 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00005295 Crypto = 0;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005296 DSP = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005297 Unaligned = 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005298 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005299 HWDiv = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005300
Ranjeet Singhac08e532015-06-24 23:39:25 +00005301 // This does not diagnose illegal cases like having both
5302 // "+vfpv2" and "+vfpv3" or having "+neon" and "+fp-only-sp".
5303 uint32_t HW_FP_remove = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005304 for (const auto &Feature : Features) {
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005305 if (Feature == "+soft-float") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00005306 SoftFloat = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005307 } else if (Feature == "+soft-float-abi") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00005308 SoftFloatABI = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005309 } else if (Feature == "+vfp2") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005310 FPU |= VFP2FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005311 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005312 } else if (Feature == "+vfp3") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005313 FPU |= VFP3FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005314 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005315 } else if (Feature == "+vfp4") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005316 FPU |= VFP4FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005317 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005318 } else if (Feature == "+fp-armv8") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00005319 FPU |= FPARMV8;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005320 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005321 } else if (Feature == "+neon") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005322 FPU |= NeonFPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005323 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005324 } else if (Feature == "+hwdiv") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005325 HWDiv |= HWDivThumb;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005326 } else if (Feature == "+hwdiv-arm") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005327 HWDiv |= HWDivARM;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005328 } else if (Feature == "+crc") {
Bernard Ogden18b57012013-10-29 09:47:51 +00005329 CRC = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005330 } else if (Feature == "+crypto") {
Tim Northover02e38602014-02-03 17:28:04 +00005331 Crypto = 1;
Artyom Skrobov05d85ae2015-10-23 17:19:02 +00005332 } else if (Feature == "+dsp") {
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005333 DSP = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005334 } else if (Feature == "+fp-only-sp") {
Matt Arsenault250024f2016-06-08 01:56:42 +00005335 HW_FP_remove |= HW_FP_DP;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005336 } else if (Feature == "+strict-align") {
5337 Unaligned = 0;
5338 } else if (Feature == "+fp16") {
5339 HW_FP |= HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005340 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00005341 }
Ranjeet Singhac08e532015-06-24 23:39:25 +00005342 HW_FP &= ~HW_FP_remove;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005343
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005344 switch (ArchVersion) {
5345 case 6:
5346 if (ArchProfile == llvm::ARM::PK_M)
5347 LDREX = 0;
5348 else if (ArchKind == llvm::ARM::AK_ARMV6K)
5349 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5350 else
5351 LDREX = LDREX_W;
5352 break;
5353 case 7:
5354 if (ArchProfile == llvm::ARM::PK_M)
5355 LDREX = LDREX_W | LDREX_H | LDREX_B ;
5356 else
5357 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5358 break;
5359 case 8:
5360 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5361 }
5362
Rafael Espindolaeb265472013-08-21 21:59:03 +00005363 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
5364 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
5365 return false;
5366 }
5367
5368 if (FPMath == FP_Neon)
5369 Features.push_back("+neonfp");
5370 else if (FPMath == FP_VFP)
5371 Features.push_back("-neonfp");
5372
Daniel Dunbar893d4752009-12-19 04:15:38 +00005373 // Remove front-end specific options which the backend handles differently.
Eric Christopher9e172d22015-05-12 01:26:21 +00005374 auto Feature =
5375 std::find(Features.begin(), Features.end(), "+soft-float-abi");
5376 if (Feature != Features.end())
5377 Features.erase(Feature);
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005378
Rafael Espindolaeb265472013-08-21 21:59:03 +00005379 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005380 }
5381
Craig Topper3164f332014-03-11 03:39:26 +00005382 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005383 return llvm::StringSwitch<bool>(Feature)
5384 .Case("arm", true)
Ben Langmuir587aeaf2015-08-07 01:59:56 +00005385 .Case("aarch32", true)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005386 .Case("softfloat", SoftFloat)
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005387 .Case("thumb", isThumb())
Amara Emerson8c3de542013-09-16 18:07:35 +00005388 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005389 .Case("hwdiv", HWDiv & HWDivThumb)
5390 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005391 .Default(false);
5392 }
Renato Golin15b86152015-07-03 16:41:13 +00005393
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005394 bool setCPU(const std::string &Name) override {
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005395 if (Name != "generic")
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00005396 setArchInfo(llvm::ARM::parseCPUArch(Name));
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005397
Renato Golin15b86152015-07-03 16:41:13 +00005398 if (ArchKind == llvm::ARM::AK_INVALID)
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005399 return false;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005400 setAtomic();
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005401 CPU = Name;
5402 return true;
5403 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005404
Craig Topper3164f332014-03-11 03:39:26 +00005405 bool setFPMath(StringRef Name) override;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005406
Craig Topper3164f332014-03-11 03:39:26 +00005407 void getTargetDefines(const LangOptions &Opts,
5408 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00005409 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005410 Builder.defineMacro("__arm");
5411 Builder.defineMacro("__arm__");
Weiming Zhaob0613132016-04-18 16:25:46 +00005412 // For bare-metal none-eabi.
5413 if (getTriple().getOS() == llvm::Triple::UnknownOS &&
5414 getTriple().getEnvironment() == llvm::Triple::EABI)
5415 Builder.defineMacro("__ELF__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00005416
Chris Lattnerecd49032009-03-02 22:27:17 +00005417 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005418 Builder.defineMacro("__REGISTER_PREFIX__", "");
Tim Northover5627d392015-10-30 16:30:45 +00005419
5420 // Unfortunately, __ARM_ARCH_7K__ is now more of an ABI descriptor. The CPU
5421 // happens to be Cortex-A7 though, so it should still get __ARM_ARCH_7A__.
Tim Northoverd88ecb32016-01-27 19:32:40 +00005422 if (getTriple().isWatchABI())
Tim Northover5627d392015-10-30 16:30:45 +00005423 Builder.defineMacro("__ARM_ARCH_7K__", "2");
5424
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005425 if (!CPUAttr.empty())
5426 Builder.defineMacro("__ARM_ARCH_" + CPUAttr + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005427
5428 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005429 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
Benjamin Kramerb42d9a52015-12-24 10:07:37 +00005430 Builder.defineMacro("__ARM_ARCH", Twine(ArchVersion));
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005431
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005432 if (ArchVersion >= 8) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005433 // ACLE 6.5.7 Crypto Extension
5434 if (Crypto)
5435 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
5436 // ACLE 6.5.8 CRC32 Extension
5437 if (CRC)
5438 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
5439 // ACLE 6.5.10 Numeric Maximum and Minimum
5440 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
5441 // ACLE 6.5.9 Directed Rounding
5442 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
James Molloy0ffb0932014-09-15 11:25:38 +00005443 }
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005444
5445 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
5446 // is not defined for the M-profile.
Bradley Smithf4affc12016-03-03 13:52:22 +00005447 // NOTE that the default profile is assumed to be 'A'
5448 if (CPUProfile.empty() || ArchProfile != llvm::ARM::PK_M)
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005449 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
5450
Bradley Smithf4affc12016-03-03 13:52:22 +00005451 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supports the original
5452 // Thumb ISA (including v6-M and v8-M Baseline). It is set to 2 if the
5453 // core supports the Thumb-2 ISA as found in the v6T2 architecture and all
5454 // v7 and v8 architectures excluding v8-M Baseline.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005455 if (supportsThumb2())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005456 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005457 else if (supportsThumb())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005458 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
5459
5460 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
5461 // instruction set such as ARM or Thumb.
5462 Builder.defineMacro("__ARM_32BIT_STATE", "1");
5463
5464 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
5465
5466 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005467 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005468 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00005469
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005470 // ACLE 6.4.3 Unaligned access supported in hardware
Eric Christopherb093d692015-10-09 18:39:59 +00005471 if (Unaligned)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005472 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Eric Christopherb093d692015-10-09 18:39:59 +00005473
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005474 // ACLE 6.4.4 LDREX/STREX
5475 if (LDREX)
5476 Builder.defineMacro("__ARM_FEATURE_LDREX", "0x" + llvm::utohexstr(LDREX));
5477
5478 // ACLE 6.4.5 CLZ
Eric Christopherb093d692015-10-09 18:39:59 +00005479 if (ArchVersion == 5 ||
5480 (ArchVersion == 6 && CPUProfile != "M") ||
5481 ArchVersion > 6)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005482 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
5483
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005484 // ACLE 6.5.1 Hardware Floating Point
5485 if (HW_FP)
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +00005486 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005487
Yi Konga44c4d72014-06-27 21:25:42 +00005488 // ACLE predefines.
5489 Builder.defineMacro("__ARM_ACLE", "200");
5490
Oliver Stannarddc2854c2015-09-03 12:40:58 +00005491 // FP16 support (we currently only support IEEE format).
5492 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
5493 Builder.defineMacro("__ARM_FP16_ARGS", "1");
5494
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005495 // ACLE 6.5.3 Fused multiply-accumulate (FMA)
Silviu Baranga632fdc52016-04-28 11:29:08 +00005496 if (ArchVersion >= 7 && (FPU & VFP4FPU))
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005497 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
5498
Mike Stump9d54bd72009-04-08 02:07:04 +00005499 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005500
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005501 // FIXME: It's more complicated than this and we don't really support
5502 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005503 // Windows on ARM does not "support" interworking
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005504 if (5 <= ArchVersion && ArchVersion <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005505 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005506
David Tweed8f676532012-10-25 13:33:01 +00005507 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00005508 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005509 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
Tim Northover862eaf82016-05-13 21:26:45 +00005510 if (!getTriple().isOSBinFormatMachO() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00005511 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005512 Builder.defineMacro("__ARM_PCS", "1");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005513 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005514
Tim Northover28fc0e12016-04-28 13:59:55 +00005515 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp" ||
5516 ABI == "aapcs16")
5517 Builder.defineMacro("__ARM_PCS_VFP", "1");
5518
Daniel Dunbar893d4752009-12-19 04:15:38 +00005519 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005520 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005521
Zijiao Ma56a83722016-08-17 02:13:33 +00005522 if (ArchKind == llvm::ARM::AK_XSCALE)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005523 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005524
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005525 if (isThumb()) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005526 Builder.defineMacro("__THUMBEL__");
5527 Builder.defineMacro("__thumb__");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005528 if (supportsThumb2())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005529 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005530 }
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005531
5532 // ACLE 6.4.9 32-bit SIMD instructions
5533 if (ArchVersion >= 6 && (CPUProfile != "M" || CPUAttr == "7EM"))
5534 Builder.defineMacro("__ARM_FEATURE_SIMD32", "1");
5535
5536 // ACLE 6.4.10 Hardware Integer Divide
Eric Christopherb093d692015-10-09 18:39:59 +00005537 if (((HWDiv & HWDivThumb) && isThumb()) ||
5538 ((HWDiv & HWDivARM) && !isThumb())) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005539 Builder.defineMacro("__ARM_FEATURE_IDIV", "1");
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005540 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005541 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005542
5543 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005544 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005545
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005546 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005547 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005548 if (FPU & VFP2FPU)
5549 Builder.defineMacro("__ARM_VFPV2__");
5550 if (FPU & VFP3FPU)
5551 Builder.defineMacro("__ARM_VFPV3__");
5552 if (FPU & VFP4FPU)
5553 Builder.defineMacro("__ARM_VFPV4__");
Tim Northoverc67803f2016-12-21 20:49:43 +00005554 if (FPU & FPARMV8)
5555 Builder.defineMacro("__ARM_FPV5__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005556 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00005557
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005558 // This only gets set when Neon instructions are actually available, unlike
5559 // the VFP define, hence the soft float and arch check. This is subtly
5560 // different from gcc, we follow the intent which was that it should be set
5561 // when Neon instructions are actually available.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005562 if ((FPU & NeonFPU) && !SoftFloat && ArchVersion >= 7) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005563 Builder.defineMacro("__ARM_NEON", "1");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005564 Builder.defineMacro("__ARM_NEON__");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005565 // current AArch32 NEON implementations do not support double-precision
5566 // floating-point even when it is present in VFP.
Eric Christopherb093d692015-10-09 18:39:59 +00005567 Builder.defineMacro("__ARM_NEON_FP",
5568 "0x" + llvm::utohexstr(HW_FP & ~HW_FP_DP));
Tim Northover5bb34ca2013-11-21 12:36:34 +00005569 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00005570
Bradley Smith0f28f0c2014-01-20 10:52:00 +00005571 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
5572 Opts.ShortWChar ? "2" : "4");
5573
5574 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5575 Opts.ShortEnums ? "1" : "4");
5576
Bradley Smithf4affc12016-03-03 13:52:22 +00005577 if (ArchVersion >= 6 && CPUAttr != "6M" && CPUAttr != "8M_BASE") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00005578 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5579 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5580 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5581 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
5582 }
Sergey Dmitrouk745f5302014-11-25 08:57:36 +00005583
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005584 // ACLE 6.4.7 DSP instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005585 if (DSP) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005586 Builder.defineMacro("__ARM_FEATURE_DSP", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005587 }
5588
5589 // ACLE 6.4.8 Saturation instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005590 bool SAT = false;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005591 if ((ArchVersion == 6 && CPUProfile != "M") || ArchVersion > 6 ) {
5592 Builder.defineMacro("__ARM_FEATURE_SAT", "1");
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005593 SAT = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005594 }
5595
5596 // ACLE 6.4.6 Q (saturation) flag
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005597 if (DSP || SAT)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005598 Builder.defineMacro("__ARM_FEATURE_QBIT", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005599
5600 if (Opts.UnsafeFPMath)
5601 Builder.defineMacro("__ARM_FP_FAST", "1");
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005602
5603 if (ArchKind == llvm::ARM::AK_ARMV8_1A)
5604 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
Chris Lattner17df24e2008-04-21 18:56:49 +00005605 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005606
Craig Topper6c03a542015-10-19 04:51:35 +00005607 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5608 return llvm::makeArrayRef(BuiltinInfo,
5609 clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner17df24e2008-04-21 18:56:49 +00005610 }
Craig Topper3164f332014-03-11 03:39:26 +00005611 bool isCLZForZeroUndef() const override { return false; }
5612 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northover5627d392015-10-30 16:30:45 +00005613 return IsAAPCS
5614 ? AAPCSABIBuiltinVaList
Tim Northoverd88ecb32016-01-27 19:32:40 +00005615 : (getTriple().isWatchABI() ? TargetInfo::CharPtrBuiltinVaList
5616 : TargetInfo::VoidPtrBuiltinVaList);
Chris Lattner17df24e2008-04-21 18:56:49 +00005617 }
Craig Topperf054e3a2015-10-19 03:52:27 +00005618 ArrayRef<const char *> getGCCRegNames() const override;
5619 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00005620 bool validateAsmConstraint(const char *&Name,
5621 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00005622 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00005623 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00005624 case 'l': // r0-r7
5625 case 'h': // r8-r15
JF Bastien750caef2016-02-19 06:54:45 +00005626 case 't': // VFP Floating point register single precision
5627 case 'w': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00005628 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00005629 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005630 case 'I':
5631 case 'J':
5632 case 'K':
5633 case 'L':
5634 case 'M':
5635 // FIXME
5636 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00005637 case 'Q': // A memory address that is a single base register.
5638 Info.setAllowsMemory();
5639 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005640 case 'U': // a memory reference...
5641 switch (Name[1]) {
5642 case 'q': // ...ARMV4 ldrsb
5643 case 'v': // ...VFP load/store (reg+constant offset)
5644 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00005645 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00005646 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00005647 case 'n': // valid address for Neon doubleword vector load/store
5648 case 'm': // valid address for Neon element and structure load/store
5649 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00005650 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005651 Info.setAllowsMemory();
5652 Name++;
5653 return true;
5654 }
Nate Begeman2908fa02008-04-22 05:03:19 +00005655 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005656 return false;
5657 }
Craig Topper3164f332014-03-11 03:39:26 +00005658 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005659 std::string R;
5660 switch (*Constraint) {
5661 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00005662 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005663 Constraint++;
5664 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00005665 case 'p': // 'p' should be translated to 'r' by default.
5666 R = std::string("r");
5667 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005668 default:
5669 return std::string(1, *Constraint);
5670 }
5671 return R;
5672 }
Akira Hatanaka987f1862014-08-22 06:05:21 +00005673 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005674 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005675 std::string &SuggestedModifier) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00005676 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00005677 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00005678
Bill Wendling9d1ee112012-10-25 23:28:48 +00005679 // Strip off constraint modifiers.
5680 while (Constraint[0] == '=' ||
5681 Constraint[0] == '+' ||
5682 Constraint[0] == '&')
5683 Constraint = Constraint.substr(1);
5684
5685 switch (Constraint[0]) {
5686 default: break;
5687 case 'r': {
5688 switch (Modifier) {
5689 default:
Tim Northover8f24b172013-12-08 15:24:55 +00005690 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00005691 case 'q':
5692 // A register of size 32 cannot fit a vector type.
5693 return false;
5694 }
5695 }
5696 }
5697
5698 return true;
5699 }
Craig Topper3164f332014-03-11 03:39:26 +00005700 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00005701 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00005702 return "";
5703 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005704
Craig Topper3164f332014-03-11 03:39:26 +00005705 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00005706 switch (CC) {
5707 case CC_AAPCS:
5708 case CC_AAPCS_VFP:
5709 case CC_Swift:
5710 return CCCR_OK;
5711 default:
5712 return CCCR_Warning;
5713 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005714 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00005715
Craig Topper3164f332014-03-11 03:39:26 +00005716 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00005717 if (RegNo == 0) return 0;
5718 if (RegNo == 1) return 1;
5719 return -1;
5720 }
Matthias Braund1e2fad2015-07-17 00:15:22 +00005721
5722 bool hasSjLjLowering() const override {
5723 return true;
5724 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005725};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005726
Rafael Espindolaeb265472013-08-21 21:59:03 +00005727bool ARMTargetInfo::setFPMath(StringRef Name) {
5728 if (Name == "neon") {
5729 FPMath = FP_Neon;
5730 return true;
5731 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
5732 Name == "vfp4") {
5733 FPMath = FP_VFP;
5734 return true;
5735 }
5736 return false;
5737}
5738
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005739const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005740 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005741 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005742 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
5743
5744 // Float registers
5745 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
5746 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
5747 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005748 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005749
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005750 // Double registers
5751 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
5752 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005753 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
5754 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005755
5756 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005757 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
5758 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005759};
5760
Craig Topperf054e3a2015-10-19 03:52:27 +00005761ArrayRef<const char *> ARMTargetInfo::getGCCRegNames() const {
5762 return llvm::makeArrayRef(GCCRegNames);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005763}
5764
5765const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005766 { { "a1" }, "r0" },
5767 { { "a2" }, "r1" },
5768 { { "a3" }, "r2" },
5769 { { "a4" }, "r3" },
5770 { { "v1" }, "r4" },
5771 { { "v2" }, "r5" },
5772 { { "v3" }, "r6" },
5773 { { "v4" }, "r7" },
5774 { { "v5" }, "r8" },
5775 { { "v6", "rfp" }, "r9" },
5776 { { "sl" }, "r10" },
5777 { { "fp" }, "r11" },
5778 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00005779 { { "r13" }, "sp" },
5780 { { "r14" }, "lr" },
5781 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005782 // The S, D and Q registers overlap, but aren't really aliases; we
5783 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005784};
5785
Craig Topperf054e3a2015-10-19 03:52:27 +00005786ArrayRef<TargetInfo::GCCRegAlias> ARMTargetInfo::getGCCRegAliases() const {
5787 return llvm::makeArrayRef(GCCRegAliases);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005788}
Chris Lattner5cc15e02010-03-03 19:03:45 +00005789
5790const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00005791#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005792 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005793#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5794 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00005795#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00005796
Craig Topper07d3b622015-08-07 05:14:44 +00005797#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005798 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005799#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005800 { #ID, TYPE, ATTRS, nullptr, LANG, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005801#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5802 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Albert Gutowski2a0621e2016-10-12 22:01:05 +00005803#define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANGS, FEATURE) \
5804 { #ID, TYPE, ATTRS, HEADER, LANGS, FEATURE },
Chris Lattner5cc15e02010-03-03 19:03:45 +00005805#include "clang/Basic/BuiltinsARM.def"
5806};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005807
5808class ARMleTargetInfo : public ARMTargetInfo {
5809public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005810 ARMleTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Matt Arsenaultf333de32016-09-07 07:08:02 +00005811 : ARMTargetInfo(Triple, Opts) {}
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005812 void getTargetDefines(const LangOptions &Opts,
5813 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005814 Builder.defineMacro("__ARMEL__");
5815 ARMTargetInfo::getTargetDefines(Opts, Builder);
5816 }
5817};
5818
5819class ARMbeTargetInfo : public ARMTargetInfo {
5820public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005821 ARMbeTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Matt Arsenaultf333de32016-09-07 07:08:02 +00005822 : ARMTargetInfo(Triple, Opts) {}
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005823 void getTargetDefines(const LangOptions &Opts,
5824 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005825 Builder.defineMacro("__ARMEB__");
5826 Builder.defineMacro("__ARM_BIG_ENDIAN");
5827 ARMTargetInfo::getTargetDefines(Opts, Builder);
5828 }
5829};
Chris Lattner17df24e2008-04-21 18:56:49 +00005830
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005831class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
5832 const llvm::Triple Triple;
5833public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005834 WindowsARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5835 : WindowsTargetInfo<ARMleTargetInfo>(Triple, Opts), Triple(Triple) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005836 WCharType = UnsignedShort;
5837 SizeType = UnsignedInt;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005838 }
5839 void getVisualStudioDefines(const LangOptions &Opts,
5840 MacroBuilder &Builder) const {
5841 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
5842
5843 // FIXME: this is invalid for WindowsCE
5844 Builder.defineMacro("_M_ARM_NT", "1");
5845 Builder.defineMacro("_M_ARMT", "_M_ARM");
5846 Builder.defineMacro("_M_THUMB", "_M_ARM");
5847
5848 assert((Triple.getArch() == llvm::Triple::arm ||
5849 Triple.getArch() == llvm::Triple::thumb) &&
5850 "invalid architecture for Windows ARM target info");
5851 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
5852 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
5853
5854 // TODO map the complete set of values
5855 // 31: VFPv3 40: VFPv4
5856 Builder.defineMacro("_M_ARM_FP", "31");
5857 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00005858 BuiltinVaListKind getBuiltinVaListKind() const override {
5859 return TargetInfo::CharPtrBuiltinVaList;
5860 }
Martell Malone7ccda3c2015-08-14 18:00:09 +00005861 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5862 switch (CC) {
5863 case CC_X86StdCall:
5864 case CC_X86ThisCall:
5865 case CC_X86FastCall:
5866 case CC_X86VectorCall:
5867 return CCCR_Ignore;
5868 case CC_C:
5869 return CCCR_OK;
5870 default:
5871 return CCCR_Warning;
5872 }
5873 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005874};
5875
5876// Windows ARM + Itanium C++ ABI Target
5877class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
5878public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005879 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple,
5880 const TargetOptions &Opts)
5881 : WindowsARMTargetInfo(Triple, Opts) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005882 TheCXXABI.set(TargetCXXABI::GenericARM);
5883 }
5884
5885 void getTargetDefines(const LangOptions &Opts,
5886 MacroBuilder &Builder) const override {
5887 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5888
5889 if (Opts.MSVCCompat)
5890 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5891 }
5892};
5893
5894// Windows ARM, MS (C++) ABI
5895class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
5896public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005897 MicrosoftARMleTargetInfo(const llvm::Triple &Triple,
5898 const TargetOptions &Opts)
5899 : WindowsARMTargetInfo(Triple, Opts) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005900 TheCXXABI.set(TargetCXXABI::Microsoft);
5901 }
5902
5903 void getTargetDefines(const LangOptions &Opts,
5904 MacroBuilder &Builder) const override {
5905 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5906 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5907 }
5908};
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005909
Yaron Keren321249c2015-07-15 13:32:23 +00005910// ARM MinGW target
5911class MinGWARMTargetInfo : public WindowsARMTargetInfo {
5912public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005913 MinGWARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5914 : WindowsARMTargetInfo(Triple, Opts) {
Yaron Keren321249c2015-07-15 13:32:23 +00005915 TheCXXABI.set(TargetCXXABI::GenericARM);
5916 }
5917
5918 void getTargetDefines(const LangOptions &Opts,
5919 MacroBuilder &Builder) const override {
5920 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5921 DefineStd(Builder, "WIN32", Opts);
5922 DefineStd(Builder, "WINNT", Opts);
5923 Builder.defineMacro("_ARM_");
5924 addMinGWDefines(Opts, Builder);
5925 }
5926};
5927
5928// ARM Cygwin target
5929class CygwinARMTargetInfo : public ARMleTargetInfo {
5930public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005931 CygwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5932 : ARMleTargetInfo(Triple, Opts) {
Yaron Keren321249c2015-07-15 13:32:23 +00005933 TLSSupported = false;
5934 WCharType = UnsignedShort;
5935 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00005936 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Yaron Keren321249c2015-07-15 13:32:23 +00005937 }
5938 void getTargetDefines(const LangOptions &Opts,
5939 MacroBuilder &Builder) const override {
5940 ARMleTargetInfo::getTargetDefines(Opts, Builder);
5941 Builder.defineMacro("_ARM_");
5942 Builder.defineMacro("__CYGWIN__");
5943 Builder.defineMacro("__CYGWIN32__");
Saleem Abdulrasool56027092017-02-07 19:00:06 +00005944 DefineStd(Builder, "unix", Opts);
Yaron Keren321249c2015-07-15 13:32:23 +00005945 if (Opts.CPlusPlus)
5946 Builder.defineMacro("_GNU_SOURCE");
5947 }
5948};
5949
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005950class DarwinARMTargetInfo : public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00005951protected:
Craig Topper3164f332014-03-11 03:39:26 +00005952 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5953 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00005954 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00005955 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005956
Torok Edwinb2b37c62009-06-30 17:10:35 +00005957public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005958 DarwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5959 : DarwinTargetInfo<ARMleTargetInfo>(Triple, Opts) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005960 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005961 // iOS always has 64-bit atomic instructions.
Eric Christopher917e9522014-11-18 22:36:15 +00005962 // FIXME: This should be based off of the target features in
5963 // ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005964 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00005965
Tim Northoverd88ecb32016-01-27 19:32:40 +00005966 if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00005967 // Darwin on iOS uses a variant of the ARM C++ ABI.
5968 TheCXXABI.set(TargetCXXABI::WatchOS);
5969
5970 // The 32-bit ABI is silent on what ptrdiff_t should be, but given that
5971 // size_t is long, it's a bit weird for it to be int.
5972 PtrDiffType = SignedLong;
5973
5974 // BOOL should be a real boolean on the new ABI
5975 UseSignedCharForObjCBool = false;
5976 } else
5977 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005978 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005979};
Eli Friedmanf05b7722008-08-20 07:44:10 +00005980
Tim Northover573cbee2014-05-24 12:52:07 +00005981class AArch64TargetInfo : public TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00005982 virtual void setDataLayout() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00005983 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5984 static const char *const GCCRegNames[];
5985
James Molloy75f5f9e2014-04-16 15:33:48 +00005986 enum FPUModeEnum {
5987 FPUMode,
5988 NeonMode
5989 };
5990
5991 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00005992 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00005993 unsigned Crypto;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005994 unsigned Unaligned;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005995 unsigned V8_1A;
James Molloy75f5f9e2014-04-16 15:33:48 +00005996
Tim Northovera2ee4332014-03-29 15:09:45 +00005997 static const Builtin::Info BuiltinInfo[];
5998
5999 std::string ABI;
6000
6001public:
Saleem Abdulrasool9b5ba542016-04-10 03:19:47 +00006002 AArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Tim Northovera2ee4332014-03-29 15:09:45 +00006003 : TargetInfo(Triple), ABI("aapcs") {
Brad Smith9aa2bf22017-02-21 23:13:09 +00006004 if (getTriple().getOS() == llvm::Triple::NetBSD ||
6005 getTriple().getOS() == llvm::Triple::OpenBSD) {
Tim Northover25e8a672014-05-24 12:51:25 +00006006 WCharType = SignedInt;
6007
6008 // NetBSD apparently prefers consistency across ARM targets to consistency
6009 // across 64-bit targets.
6010 Int64Type = SignedLongLong;
6011 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00006012 } else {
6013 WCharType = UnsignedInt;
6014 Int64Type = SignedLong;
6015 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00006016 }
6017
Tim Northovera2ee4332014-03-29 15:09:45 +00006018 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00006019 MaxVectorAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00006020 MaxAtomicInlineWidth = 128;
6021 MaxAtomicPromoteWidth = 128;
6022
Tim Northovera6a19f12015-02-06 01:25:07 +00006023 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 128;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00006024 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Tim Northovera2ee4332014-03-29 15:09:45 +00006025
Tim Northovera2ee4332014-03-29 15:09:45 +00006026 // {} in inline assembly are neon specifiers, not assembly variant
6027 // specifiers.
6028 NoAsmVariants = true;
6029
Tim Northover7ad87af2015-01-16 18:44:04 +00006030 // AAPCS gives rules for bitfields. 7.1.7 says: "The container type
6031 // contributes to the alignment of the containing aggregate in the same way
6032 // a plain (non bit-field) member of that type would, without exception for
6033 // zero-sized or anonymous bit-fields."
Tim Northover5627d392015-10-30 16:30:45 +00006034 assert(UseBitFieldTypeAlignment && "bitfields affect type alignment");
Tim Northover7ad87af2015-01-16 18:44:04 +00006035 UseZeroLengthBitfieldAlignment = true;
6036
Tim Northover573cbee2014-05-24 12:52:07 +00006037 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00006038 TheCXXABI.set(TargetCXXABI::GenericAArch64);
Saleem Abdulrasoolc066d9c2016-04-12 03:05:03 +00006039
Eric Christopherfb834a82017-02-28 17:22:05 +00006040 if (Triple.getOS() == llvm::Triple::Linux)
6041 this->MCountName = "\01_mcount";
6042 else if (Triple.getOS() == llvm::Triple::UnknownOS)
Saleem Abdulrasoolc066d9c2016-04-12 03:05:03 +00006043 this->MCountName = Opts.EABIVersion == "gnu" ? "\01_mcount" : "mcount";
Tim Northovera2ee4332014-03-29 15:09:45 +00006044 }
6045
Alp Toker4925ba72014-06-07 23:30:42 +00006046 StringRef getABI() const override { return ABI; }
David Blaikie1cbb9712014-11-14 19:09:44 +00006047 bool setABI(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006048 if (Name != "aapcs" && Name != "darwinpcs")
6049 return false;
6050
6051 ABI = Name;
6052 return true;
6053 }
6054
David Blaikie1cbb9712014-11-14 19:09:44 +00006055 bool setCPU(const std::string &Name) override {
Zijiao Ma33e95212016-07-28 06:24:48 +00006056 return Name == "generic" ||
6057 llvm::AArch64::parseCPUArch(Name) !=
6058 static_cast<unsigned>(llvm::AArch64::ArchKind::AK_INVALID);
Tim Northovera2ee4332014-03-29 15:09:45 +00006059 }
6060
Alexander Kornienko34eb2072015-04-11 02:00:23 +00006061 void getTargetDefines(const LangOptions &Opts,
6062 MacroBuilder &Builder) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006063 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00006064 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00006065
6066 // Target properties.
6067 Builder.defineMacro("_LP64");
6068 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00006069
6070 // ACLE predefines. Many can only have one possible value on v8 AArch64.
6071 Builder.defineMacro("__ARM_ACLE", "200");
6072 Builder.defineMacro("__ARM_ARCH", "8");
6073 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
6074
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006075 Builder.defineMacro("__ARM_64BIT_STATE", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00006076 Builder.defineMacro("__ARM_PCS_AAPCS64", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006077 Builder.defineMacro("__ARM_ARCH_ISA_A64", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00006078
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006079 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
6080 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
6081 Builder.defineMacro("__ARM_FEATURE_LDREX", "0xF");
6082 Builder.defineMacro("__ARM_FEATURE_IDIV", "1"); // As specified in ACLE
James Molloy0ffb0932014-09-15 11:25:38 +00006083 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006084 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
6085 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00006086
6087 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
6088
6089 // 0xe implies support for half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006090 Builder.defineMacro("__ARM_FP", "0xE");
Tim Northovera2ee4332014-03-29 15:09:45 +00006091
6092 // PCS specifies this for SysV variants, which is all we support. Other ABIs
6093 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006094 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
6095 Builder.defineMacro("__ARM_FP16_ARGS", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00006096
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00006097 if (Opts.UnsafeFPMath)
6098 Builder.defineMacro("__ARM_FP_FAST", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00006099
6100 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
6101
6102 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
6103 Opts.ShortEnums ? "1" : "4");
6104
James Molloy75f5f9e2014-04-16 15:33:48 +00006105 if (FPU == NeonMode) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006106 Builder.defineMacro("__ARM_NEON", "1");
James Molloy75f5f9e2014-04-16 15:33:48 +00006107 // 64-bit NEON supports half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006108 Builder.defineMacro("__ARM_NEON_FP", "0xE");
James Molloy75f5f9e2014-04-16 15:33:48 +00006109 }
Tim Northovera2ee4332014-03-29 15:09:45 +00006110
Bradley Smith418c5932014-05-02 15:17:51 +00006111 if (CRC)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006112 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
Bradley Smith418c5932014-05-02 15:17:51 +00006113
James Molloy75f5f9e2014-04-16 15:33:48 +00006114 if (Crypto)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006115 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
6116
6117 if (Unaligned)
6118 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Reid Klecknerd167d422015-05-06 15:31:46 +00006119
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00006120 if (V8_1A)
6121 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
6122
Reid Klecknerd167d422015-05-06 15:31:46 +00006123 // All of the __sync_(bool|val)_compare_and_swap_(1|2|4|8) builtins work.
6124 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
6125 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
6126 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
6127 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Tim Northovera2ee4332014-03-29 15:09:45 +00006128 }
6129
Craig Topper6c03a542015-10-19 04:51:35 +00006130 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6131 return llvm::makeArrayRef(BuiltinInfo,
6132 clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin);
Tim Northovera2ee4332014-03-29 15:09:45 +00006133 }
6134
David Blaikie1cbb9712014-11-14 19:09:44 +00006135 bool hasFeature(StringRef Feature) const override {
James Molloy75f5f9e2014-04-16 15:33:48 +00006136 return Feature == "aarch64" ||
6137 Feature == "arm64" ||
Ben Langmuir587aeaf2015-08-07 01:59:56 +00006138 Feature == "arm" ||
James Molloy75f5f9e2014-04-16 15:33:48 +00006139 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00006140 }
6141
James Molloy5e73df52014-04-16 15:06:20 +00006142 bool handleTargetFeatures(std::vector<std::string> &Features,
6143 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00006144 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00006145 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00006146 Crypto = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006147 Unaligned = 1;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00006148 V8_1A = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006149
Eric Christopher610fe112015-08-26 08:21:55 +00006150 for (const auto &Feature : Features) {
6151 if (Feature == "+neon")
James Molloy75f5f9e2014-04-16 15:33:48 +00006152 FPU = NeonMode;
Eric Christopher610fe112015-08-26 08:21:55 +00006153 if (Feature == "+crc")
Bradley Smith418c5932014-05-02 15:17:51 +00006154 CRC = 1;
Eric Christopher610fe112015-08-26 08:21:55 +00006155 if (Feature == "+crypto")
James Molloy75f5f9e2014-04-16 15:33:48 +00006156 Crypto = 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006157 if (Feature == "+strict-align")
6158 Unaligned = 0;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00006159 if (Feature == "+v8.1a")
6160 V8_1A = 1;
James Molloy75f5f9e2014-04-16 15:33:48 +00006161 }
6162
James Y Knightb214cbc2016-03-04 19:00:41 +00006163 setDataLayout();
James Molloy5e73df52014-04-16 15:06:20 +00006164
6165 return true;
6166 }
6167
John McCall477f2bb2016-03-03 06:39:32 +00006168 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
6169 switch (CC) {
6170 case CC_C:
6171 case CC_Swift:
Roman Levenstein35aa5ce2016-03-16 18:00:46 +00006172 case CC_PreserveMost:
6173 case CC_PreserveAll:
John McCall477f2bb2016-03-03 06:39:32 +00006174 return CCCR_OK;
6175 default:
6176 return CCCR_Warning;
6177 }
6178 }
6179
David Blaikie1cbb9712014-11-14 19:09:44 +00006180 bool isCLZForZeroUndef() const override { return false; }
Tim Northovera2ee4332014-03-29 15:09:45 +00006181
David Blaikie1cbb9712014-11-14 19:09:44 +00006182 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006183 return TargetInfo::AArch64ABIBuiltinVaList;
6184 }
6185
Craig Topperf054e3a2015-10-19 03:52:27 +00006186 ArrayRef<const char *> getGCCRegNames() const override;
6187 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00006188
Alexander Kornienko34eb2072015-04-11 02:00:23 +00006189 bool validateAsmConstraint(const char *&Name,
6190 TargetInfo::ConstraintInfo &Info) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006191 switch (*Name) {
6192 default:
6193 return false;
6194 case 'w': // Floating point and SIMD registers (V0-V31)
6195 Info.setAllowsRegister();
6196 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00006197 case 'I': // Constant that can be used with an ADD instruction
6198 case 'J': // Constant that can be used with a SUB instruction
6199 case 'K': // Constant that can be used with a 32-bit logical instruction
6200 case 'L': // Constant that can be used with a 64-bit logical instruction
6201 case 'M': // Constant that can be used as a 32-bit MOV immediate
6202 case 'N': // Constant that can be used as a 64-bit MOV immediate
6203 case 'Y': // Floating point constant zero
6204 case 'Z': // Integer constant zero
6205 return true;
6206 case 'Q': // A memory reference with base register and no offset
6207 Info.setAllowsMemory();
6208 return true;
6209 case 'S': // A symbolic address
6210 Info.setAllowsRegister();
6211 return true;
6212 case 'U':
Eric Christopher917e9522014-11-18 22:36:15 +00006213 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
6214 // Utf: A memory address suitable for ldp/stp in TF mode.
6215 // Usa: An absolute symbolic address.
6216 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
6217 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
Tim Northovera2ee4332014-03-29 15:09:45 +00006218 case 'z': // Zero register, wzr or xzr
6219 Info.setAllowsRegister();
6220 return true;
6221 case 'x': // Floating point and SIMD registers (V0-V15)
6222 Info.setAllowsRegister();
6223 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00006224 }
6225 return false;
6226 }
6227
Akira Hatanaka987f1862014-08-22 06:05:21 +00006228 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00006229 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00006230 std::string &SuggestedModifier) const override {
James Molloy8a157bf2014-07-25 10:19:47 +00006231 // Strip off constraint modifiers.
6232 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
6233 Constraint = Constraint.substr(1);
6234
6235 switch (Constraint[0]) {
6236 default:
6237 return true;
6238 case 'z':
6239 case 'r': {
6240 switch (Modifier) {
6241 case 'x':
6242 case 'w':
6243 // For now assume that the person knows what they're
6244 // doing with the modifier.
6245 return true;
6246 default:
6247 // By default an 'r' constraint will be in the 'x'
6248 // registers.
Akira Hatanaka987f1862014-08-22 06:05:21 +00006249 if (Size == 64)
6250 return true;
6251
6252 SuggestedModifier = "w";
6253 return false;
James Molloy8a157bf2014-07-25 10:19:47 +00006254 }
6255 }
6256 }
6257 }
6258
David Blaikie1cbb9712014-11-14 19:09:44 +00006259 const char *getClobbers() const override { return ""; }
Tim Northovera2ee4332014-03-29 15:09:45 +00006260
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00006261 int getEHDataRegisterNumber(unsigned RegNo) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006262 if (RegNo == 0)
6263 return 0;
6264 if (RegNo == 1)
6265 return 1;
6266 return -1;
6267 }
6268};
6269
Tim Northover573cbee2014-05-24 12:52:07 +00006270const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00006271 // 32-bit Integer registers
6272 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
6273 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
6274 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
6275
6276 // 64-bit Integer registers
6277 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
6278 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
6279 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
6280
6281 // 32-bit floating point regsisters
6282 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
6283 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
6284 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
6285
6286 // 64-bit floating point regsisters
6287 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
6288 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
6289 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
6290
6291 // Vector registers
6292 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
6293 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
6294 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
6295};
6296
Craig Topperf054e3a2015-10-19 03:52:27 +00006297ArrayRef<const char *> AArch64TargetInfo::getGCCRegNames() const {
6298 return llvm::makeArrayRef(GCCRegNames);
Tim Northovera2ee4332014-03-29 15:09:45 +00006299}
6300
Tim Northover573cbee2014-05-24 12:52:07 +00006301const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00006302 { { "w31" }, "wsp" },
6303 { { "x29" }, "fp" },
6304 { { "x30" }, "lr" },
6305 { { "x31" }, "sp" },
6306 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
6307 // don't want to substitute one of these for a different-sized one.
6308};
6309
Craig Topperf054e3a2015-10-19 03:52:27 +00006310ArrayRef<TargetInfo::GCCRegAlias> AArch64TargetInfo::getGCCRegAliases() const {
6311 return llvm::makeArrayRef(GCCRegAliases);
Tim Northovera2ee4332014-03-29 15:09:45 +00006312}
6313
Tim Northover573cbee2014-05-24 12:52:07 +00006314const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00006315#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006316 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00006317#include "clang/Basic/BuiltinsNEON.def"
6318
6319#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006320 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northover573cbee2014-05-24 12:52:07 +00006321#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00006322};
James Molloy5e73df52014-04-16 15:06:20 +00006323
Tim Northover573cbee2014-05-24 12:52:07 +00006324class AArch64leTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00006325 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00006326 if (getTriple().isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00006327 resetDataLayout("e-m:o-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006328 else
Chad Rosier4c077aa2016-07-07 20:02:25 +00006329 resetDataLayout("e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006330 }
6331
6332public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006333 AArch64leTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6334 : AArch64TargetInfo(Triple, Opts) {
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006335 }
James Molloy5e73df52014-04-16 15:06:20 +00006336 void getTargetDefines(const LangOptions &Opts,
6337 MacroBuilder &Builder) const override {
6338 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00006339 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00006340 }
6341};
6342
Tim Northover573cbee2014-05-24 12:52:07 +00006343class AArch64beTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00006344 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00006345 assert(!getTriple().isOSBinFormatMachO());
Chad Rosier4c077aa2016-07-07 20:02:25 +00006346 resetDataLayout("E-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006347 }
6348
6349public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006350 AArch64beTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6351 : AArch64TargetInfo(Triple, Opts) {}
James Molloy5e73df52014-04-16 15:06:20 +00006352 void getTargetDefines(const LangOptions &Opts,
6353 MacroBuilder &Builder) const override {
6354 Builder.defineMacro("__AARCH64EB__");
6355 Builder.defineMacro("__AARCH_BIG_ENDIAN");
6356 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00006357 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00006358 }
6359};
Tim Northovera2ee4332014-03-29 15:09:45 +00006360
Tim Northover573cbee2014-05-24 12:52:07 +00006361class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00006362protected:
6363 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
6364 MacroBuilder &Builder) const override {
6365 Builder.defineMacro("__AARCH64_SIMD__");
6366 Builder.defineMacro("__ARM64_ARCH_8__");
6367 Builder.defineMacro("__ARM_NEON__");
6368 Builder.defineMacro("__LITTLE_ENDIAN__");
6369 Builder.defineMacro("__REGISTER_PREFIX__", "");
6370 Builder.defineMacro("__arm64", "1");
6371 Builder.defineMacro("__arm64__", "1");
6372
6373 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
6374 }
6375
Tim Northovera2ee4332014-03-29 15:09:45 +00006376public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006377 DarwinAArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6378 : DarwinTargetInfo<AArch64leTargetInfo>(Triple, Opts) {
Tim Northovera2ee4332014-03-29 15:09:45 +00006379 Int64Type = SignedLongLong;
6380 WCharType = SignedInt;
6381 UseSignedCharForObjCBool = false;
6382
Tim Northovera6a19f12015-02-06 01:25:07 +00006383 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00006384 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Tim Northovera2ee4332014-03-29 15:09:45 +00006385
6386 TheCXXABI.set(TargetCXXABI::iOS64);
6387 }
6388
David Blaikie1cbb9712014-11-14 19:09:44 +00006389 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006390 return TargetInfo::CharPtrBuiltinVaList;
6391 }
6392};
Tim Northovera2ee4332014-03-29 15:09:45 +00006393
Tony Linthicum76329bf2011-12-12 21:14:55 +00006394// Hexagon abstract base class
6395class HexagonTargetInfo : public TargetInfo {
6396 static const Builtin::Info BuiltinInfo[];
6397 static const char * const GCCRegNames[];
6398 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6399 std::string CPU;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006400 bool HasHVX, HasHVXDouble;
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006401 bool UseLongCalls;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006402
Tony Linthicum76329bf2011-12-12 21:14:55 +00006403public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006404 HexagonTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6405 : TargetInfo(Triple) {
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00006406 // Specify the vector alignment explicitly. For v512x1, the calculated
6407 // alignment would be 512*alignment(i1), which is 512 bytes, instead of
6408 // the required minimum of 64 bytes.
James Y Knightb214cbc2016-03-04 19:00:41 +00006409 resetDataLayout("e-m:e-p:32:32:32-a:0-n16:32-"
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00006410 "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 +00006411 "v32:32:32-v64:64:64-v512:512:512-v1024:1024:1024-v2048:2048:2048");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006412 SizeType = UnsignedInt;
6413 PtrDiffType = SignedInt;
6414 IntPtrType = SignedInt;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006415
6416 // {} in inline assembly are packet specifiers, not assembly variant
6417 // specifiers.
6418 NoAsmVariants = true;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006419
6420 LargeArrayMinWidth = 64;
6421 LargeArrayAlign = 64;
6422 UseBitFieldTypeAlignment = true;
6423 ZeroLengthBitfieldBoundary = 32;
6424 HasHVX = HasHVXDouble = false;
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006425 UseLongCalls = false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006426 }
6427
Craig Topper6c03a542015-10-19 04:51:35 +00006428 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6429 return llvm::makeArrayRef(BuiltinInfo,
6430 clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006431 }
6432
Craig Topper3164f332014-03-11 03:39:26 +00006433 bool validateAsmConstraint(const char *&Name,
6434 TargetInfo::ConstraintInfo &Info) const override {
Krzysztof Parzyszeke0026e42016-05-18 14:56:14 +00006435 switch (*Name) {
6436 case 'v':
6437 case 'q':
6438 if (HasHVX) {
6439 Info.setAllowsRegister();
6440 return true;
6441 }
6442 break;
Krzysztof Parzyszek89fb4412016-05-20 13:50:32 +00006443 case 's':
6444 // Relocatable constant.
6445 return true;
Krzysztof Parzyszeke0026e42016-05-18 14:56:14 +00006446 }
6447 return false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006448 }
6449
Craig Topper3164f332014-03-11 03:39:26 +00006450 void getTargetDefines(const LangOptions &Opts,
6451 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006452
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006453 bool isCLZForZeroUndef() const override { return false; }
6454
Craig Topper3164f332014-03-11 03:39:26 +00006455 bool hasFeature(StringRef Feature) const override {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006456 return llvm::StringSwitch<bool>(Feature)
6457 .Case("hexagon", true)
6458 .Case("hvx", HasHVX)
6459 .Case("hvx-double", HasHVXDouble)
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006460 .Case("long-calls", UseLongCalls)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006461 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006462 }
Craig Topper3164f332014-03-11 03:39:26 +00006463
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006464 bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6465 StringRef CPU, const std::vector<std::string> &FeaturesVec)
6466 const override;
6467
6468 bool handleTargetFeatures(std::vector<std::string> &Features,
6469 DiagnosticsEngine &Diags) override;
6470
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006471 void setFeatureEnabled(llvm::StringMap<bool> &Features, StringRef Name,
6472 bool Enabled) const override;
6473
Craig Topper3164f332014-03-11 03:39:26 +00006474 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006475 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006476 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006477 ArrayRef<const char *> getGCCRegNames() const override;
6478 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00006479 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006480 return "";
6481 }
Sebastian Pop86500282012-01-13 20:37:10 +00006482
6483 static const char *getHexagonCPUSuffix(StringRef Name) {
6484 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00006485 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006486 .Case("hexagonv5", "5")
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006487 .Case("hexagonv55", "55")
6488 .Case("hexagonv60", "60")
Krzysztof Parzyszekff7f6672017-03-14 20:29:23 +00006489 .Case("hexagonv62", "62")
Craig Topperf1186c52014-05-08 06:41:40 +00006490 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00006491 }
6492
Craig Topper3164f332014-03-11 03:39:26 +00006493 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00006494 if (!getHexagonCPUSuffix(Name))
6495 return false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006496 CPU = Name;
6497 return true;
6498 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006499
6500 int getEHDataRegisterNumber(unsigned RegNo) const override {
6501 return RegNo < 2 ? RegNo : -1;
6502 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006503};
6504
6505void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006506 MacroBuilder &Builder) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006507 Builder.defineMacro("__qdsp6__", "1");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006508 Builder.defineMacro("__hexagon__", "1");
6509
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006510 if (CPU == "hexagonv4") {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006511 Builder.defineMacro("__HEXAGON_V4__");
6512 Builder.defineMacro("__HEXAGON_ARCH__", "4");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006513 if (Opts.HexagonQdsp6Compat) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006514 Builder.defineMacro("__QDSP6_V4__");
6515 Builder.defineMacro("__QDSP6_ARCH__", "4");
6516 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006517 } else if (CPU == "hexagonv5") {
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006518 Builder.defineMacro("__HEXAGON_V5__");
6519 Builder.defineMacro("__HEXAGON_ARCH__", "5");
6520 if(Opts.HexagonQdsp6Compat) {
6521 Builder.defineMacro("__QDSP6_V5__");
6522 Builder.defineMacro("__QDSP6_ARCH__", "5");
6523 }
Krzysztof Parzyszeka58ff512016-04-21 14:30:04 +00006524 } else if (CPU == "hexagonv55") {
6525 Builder.defineMacro("__HEXAGON_V55__");
6526 Builder.defineMacro("__HEXAGON_ARCH__", "55");
6527 Builder.defineMacro("__QDSP6_V55__");
6528 Builder.defineMacro("__QDSP6_ARCH__", "55");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006529 } else if (CPU == "hexagonv60") {
6530 Builder.defineMacro("__HEXAGON_V60__");
6531 Builder.defineMacro("__HEXAGON_ARCH__", "60");
6532 Builder.defineMacro("__QDSP6_V60__");
6533 Builder.defineMacro("__QDSP6_ARCH__", "60");
Krzysztof Parzyszekff7f6672017-03-14 20:29:23 +00006534 } else if (CPU == "hexagonv62") {
6535 Builder.defineMacro("__HEXAGON_V62__");
6536 Builder.defineMacro("__HEXAGON_ARCH__", "62");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006537 }
Krzysztof Parzyszek7f0756c2016-04-18 18:38:11 +00006538
6539 if (hasFeature("hvx")) {
6540 Builder.defineMacro("__HVX__");
6541 if (hasFeature("hvx-double"))
6542 Builder.defineMacro("__HVXDBL__");
6543 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006544}
6545
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006546bool HexagonTargetInfo::initFeatureMap(llvm::StringMap<bool> &Features,
6547 DiagnosticsEngine &Diags, StringRef CPU,
6548 const std::vector<std::string> &FeaturesVec) const {
6549 // Default for v60: -hvx, -hvx-double.
6550 Features["hvx"] = false;
6551 Features["hvx-double"] = false;
6552 Features["long-calls"] = false;
6553
6554 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
6555}
6556
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006557bool HexagonTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
6558 DiagnosticsEngine &Diags) {
6559 for (auto &F : Features) {
6560 if (F == "+hvx")
6561 HasHVX = true;
6562 else if (F == "-hvx")
6563 HasHVX = HasHVXDouble = false;
6564 else if (F == "+hvx-double")
6565 HasHVX = HasHVXDouble = true;
6566 else if (F == "-hvx-double")
6567 HasHVXDouble = false;
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006568
6569 if (F == "+long-calls")
6570 UseLongCalls = true;
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006571 else if (F == "-long-calls")
6572 UseLongCalls = false;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006573 }
6574 return true;
6575}
6576
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006577void HexagonTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
6578 StringRef Name, bool Enabled) const {
6579 if (Enabled) {
6580 if (Name == "hvx-double")
6581 Features["hvx"] = true;
6582 } else {
6583 if (Name == "hvx")
6584 Features["hvx-double"] = false;
6585 }
6586 Features[Name] = Enabled;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006587}
6588
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006589const char *const HexagonTargetInfo::GCCRegNames[] = {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006590 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6591 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6592 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6593 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
6594 "p0", "p1", "p2", "p3",
6595 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
6596};
6597
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006598ArrayRef<const char*> HexagonTargetInfo::getGCCRegNames() const {
Craig Topperf054e3a2015-10-19 03:52:27 +00006599 return llvm::makeArrayRef(GCCRegNames);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006600}
6601
Tony Linthicum76329bf2011-12-12 21:14:55 +00006602const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
6603 { { "sp" }, "r29" },
6604 { { "fp" }, "r30" },
6605 { { "lr" }, "r31" },
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006606};
Tony Linthicum76329bf2011-12-12 21:14:55 +00006607
Craig Topperf054e3a2015-10-19 03:52:27 +00006608ArrayRef<TargetInfo::GCCRegAlias> HexagonTargetInfo::getGCCRegAliases() const {
6609 return llvm::makeArrayRef(GCCRegAliases);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006610}
6611
6612
6613const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00006614#define BUILTIN(ID, TYPE, ATTRS) \
6615 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
6616#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
6617 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tony Linthicum76329bf2011-12-12 21:14:55 +00006618#include "clang/Basic/BuiltinsHexagon.def"
6619};
Tony Linthicum76329bf2011-12-12 21:14:55 +00006620
Jacques Pienaard964cc22016-03-28 21:02:54 +00006621class LanaiTargetInfo : public TargetInfo {
6622 // Class for Lanai (32-bit).
6623 // The CPU profiles supported by the Lanai backend
6624 enum CPUKind {
6625 CK_NONE,
6626 CK_V11,
6627 } CPU;
6628
6629 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6630 static const char *const GCCRegNames[];
6631
6632public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006633 LanaiTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6634 : TargetInfo(Triple) {
Jacques Pienaard964cc22016-03-28 21:02:54 +00006635 // Description string has to be kept in sync with backend.
6636 resetDataLayout("E" // Big endian
6637 "-m:e" // ELF name manging
6638 "-p:32:32" // 32 bit pointers, 32 bit aligned
6639 "-i64:64" // 64 bit integers, 64 bit aligned
6640 "-a:0:32" // 32 bit alignment of objects of aggregate type
6641 "-n32" // 32 bit native integer width
6642 "-S64" // 64 bit natural stack alignment
6643 );
6644
6645 // Setting RegParmMax equal to what mregparm was set to in the old
6646 // toolchain
6647 RegParmMax = 4;
6648
6649 // Set the default CPU to V11
6650 CPU = CK_V11;
6651
6652 // Temporary approach to make everything at least word-aligned and allow for
6653 // safely casting between pointers with different alignment requirements.
6654 // TODO: Remove this when there are no more cast align warnings on the
6655 // firmware.
6656 MinGlobalAlign = 32;
6657 }
6658
6659 void getTargetDefines(const LangOptions &Opts,
6660 MacroBuilder &Builder) const override {
6661 // Define __lanai__ when building for target lanai.
6662 Builder.defineMacro("__lanai__");
6663
6664 // Set define for the CPU specified.
6665 switch (CPU) {
6666 case CK_V11:
6667 Builder.defineMacro("__LANAI_V11__");
6668 break;
6669 case CK_NONE:
6670 llvm_unreachable("Unhandled target CPU");
6671 }
6672 }
6673
6674 bool setCPU(const std::string &Name) override {
6675 CPU = llvm::StringSwitch<CPUKind>(Name)
6676 .Case("v11", CK_V11)
6677 .Default(CK_NONE);
6678
6679 return CPU != CK_NONE;
6680 }
6681
6682 bool hasFeature(StringRef Feature) const override {
6683 return llvm::StringSwitch<bool>(Feature).Case("lanai", true).Default(false);
6684 }
6685
6686 ArrayRef<const char *> getGCCRegNames() const override;
6687
6688 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
6689
6690 BuiltinVaListKind getBuiltinVaListKind() const override {
6691 return TargetInfo::VoidPtrBuiltinVaList;
6692 }
6693
6694 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
6695
6696 bool validateAsmConstraint(const char *&Name,
6697 TargetInfo::ConstraintInfo &info) const override {
6698 return false;
6699 }
6700
6701 const char *getClobbers() const override { return ""; }
6702};
6703
6704const char *const LanaiTargetInfo::GCCRegNames[] = {
6705 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10",
6706 "r11", "r12", "r13", "r14", "r15", "r16", "r17", "r18", "r19", "r20", "r21",
6707 "r22", "r23", "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"};
6708
6709ArrayRef<const char *> LanaiTargetInfo::getGCCRegNames() const {
6710 return llvm::makeArrayRef(GCCRegNames);
6711}
6712
6713const TargetInfo::GCCRegAlias LanaiTargetInfo::GCCRegAliases[] = {
6714 {{"pc"}, "r2"},
6715 {{"sp"}, "r4"},
6716 {{"fp"}, "r5"},
6717 {{"rv"}, "r8"},
6718 {{"rr1"}, "r10"},
6719 {{"rr2"}, "r11"},
6720 {{"rca"}, "r15"},
6721};
6722
6723ArrayRef<TargetInfo::GCCRegAlias> LanaiTargetInfo::getGCCRegAliases() const {
6724 return llvm::makeArrayRef(GCCRegAliases);
6725}
6726
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006727// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
6728class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00006729 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6730 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006731 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00006732public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006733 SparcTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
James Y Knighta3518ad2016-01-27 01:04:51 +00006734 : TargetInfo(Triple), SoftFloat(false) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006735
Joerg Sonnenbergerd0be8dc2016-03-07 17:19:15 +00006736 int getEHDataRegisterNumber(unsigned RegNo) const override {
6737 if (RegNo == 0) return 24;
6738 if (RegNo == 1) return 25;
6739 return -1;
6740 }
6741
Craig Topper3164f332014-03-11 03:39:26 +00006742 bool handleTargetFeatures(std::vector<std::string> &Features,
6743 DiagnosticsEngine &Diags) override {
Jacob Baungard Hansen13a49372016-05-24 08:30:08 +00006744 // Check if software floating point is enabled
Eric Christopherfb481a42015-04-29 23:32:17 +00006745 auto Feature = std::find(Features.begin(), Features.end(), "+soft-float");
6746 if (Feature != Features.end()) {
6747 SoftFloat = true;
Eric Christopherfb481a42015-04-29 23:32:17 +00006748 }
Rafael Espindolaeb265472013-08-21 21:59:03 +00006749 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006750 }
Craig Topper3164f332014-03-11 03:39:26 +00006751 void getTargetDefines(const LangOptions &Opts,
6752 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006753 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006754 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006755
6756 if (SoftFloat)
6757 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00006758 }
Craig Topper3164f332014-03-11 03:39:26 +00006759
6760 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006761 return llvm::StringSwitch<bool>(Feature)
6762 .Case("softfloat", SoftFloat)
6763 .Case("sparc", true)
6764 .Default(false);
6765 }
Craig Topper3164f332014-03-11 03:39:26 +00006766
Chris Dewhurst0381cd72016-06-15 12:44:47 +00006767 bool hasSjLjLowering() const override {
6768 return true;
6769 }
6770
Craig Topper6c03a542015-10-19 04:51:35 +00006771 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006772 // FIXME: Implement!
Craig Topper6c03a542015-10-19 04:51:35 +00006773 return None;
Gabor Greif49991682008-02-21 16:29:08 +00006774 }
Craig Topper3164f332014-03-11 03:39:26 +00006775 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006776 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00006777 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006778 ArrayRef<const char *> getGCCRegNames() const override;
6779 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00006780 bool validateAsmConstraint(const char *&Name,
6781 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006782 // FIXME: Implement!
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00006783 switch (*Name) {
6784 case 'I': // Signed 13-bit constant
6785 case 'J': // Zero
6786 case 'K': // 32-bit constant with the low 12 bits clear
6787 case 'L': // A constant in the range supported by movcc (11-bit signed imm)
6788 case 'M': // A constant in the range supported by movrcc (19-bit signed imm)
6789 case 'N': // Same as 'K' but zext (required for SIMode)
6790 case 'O': // The constant 4096
6791 return true;
6792 }
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006793 return false;
Gabor Greif49991682008-02-21 16:29:08 +00006794 }
Craig Topper3164f332014-03-11 03:39:26 +00006795 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006796 // FIXME: Implement!
6797 return "";
Gabor Greif49991682008-02-21 16:29:08 +00006798 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006799
6800 // No Sparc V7 for now, the backend doesn't support it anyway.
6801 enum CPUKind {
6802 CK_GENERIC,
6803 CK_V8,
6804 CK_SUPERSPARC,
6805 CK_SPARCLITE,
6806 CK_F934,
6807 CK_HYPERSPARC,
6808 CK_SPARCLITE86X,
6809 CK_SPARCLET,
6810 CK_TSC701,
6811 CK_V9,
6812 CK_ULTRASPARC,
6813 CK_ULTRASPARC3,
6814 CK_NIAGARA,
6815 CK_NIAGARA2,
6816 CK_NIAGARA3,
Douglas Katzman6871afc2016-03-15 22:34:02 +00006817 CK_NIAGARA4,
Douglas Katzman87da5f42016-07-25 16:36:02 +00006818 CK_MYRIAD2100,
6819 CK_MYRIAD2150,
6820 CK_MYRIAD2450,
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006821 CK_LEON2,
6822 CK_LEON2_AT697E,
6823 CK_LEON2_AT697F,
6824 CK_LEON3,
6825 CK_LEON3_UT699,
6826 CK_LEON3_GR712RC,
6827 CK_LEON4,
6828 CK_LEON4_GR740
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006829 } CPU = CK_GENERIC;
6830
6831 enum CPUGeneration {
6832 CG_V8,
6833 CG_V9,
6834 };
6835
6836 CPUGeneration getCPUGeneration(CPUKind Kind) const {
6837 switch (Kind) {
6838 case CK_GENERIC:
6839 case CK_V8:
6840 case CK_SUPERSPARC:
6841 case CK_SPARCLITE:
6842 case CK_F934:
6843 case CK_HYPERSPARC:
6844 case CK_SPARCLITE86X:
6845 case CK_SPARCLET:
6846 case CK_TSC701:
Douglas Katzman87da5f42016-07-25 16:36:02 +00006847 case CK_MYRIAD2100:
6848 case CK_MYRIAD2150:
6849 case CK_MYRIAD2450:
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006850 case CK_LEON2:
6851 case CK_LEON2_AT697E:
6852 case CK_LEON2_AT697F:
6853 case CK_LEON3:
6854 case CK_LEON3_UT699:
6855 case CK_LEON3_GR712RC:
6856 case CK_LEON4:
6857 case CK_LEON4_GR740:
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006858 return CG_V8;
6859 case CK_V9:
6860 case CK_ULTRASPARC:
6861 case CK_ULTRASPARC3:
6862 case CK_NIAGARA:
6863 case CK_NIAGARA2:
6864 case CK_NIAGARA3:
6865 case CK_NIAGARA4:
6866 return CG_V9;
6867 }
Aaron Ballmana9a72852015-11-11 13:42:02 +00006868 llvm_unreachable("Unexpected CPU kind");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006869 }
6870
6871 CPUKind getCPUKind(StringRef Name) const {
6872 return llvm::StringSwitch<CPUKind>(Name)
6873 .Case("v8", CK_V8)
6874 .Case("supersparc", CK_SUPERSPARC)
6875 .Case("sparclite", CK_SPARCLITE)
6876 .Case("f934", CK_F934)
6877 .Case("hypersparc", CK_HYPERSPARC)
6878 .Case("sparclite86x", CK_SPARCLITE86X)
6879 .Case("sparclet", CK_SPARCLET)
6880 .Case("tsc701", CK_TSC701)
6881 .Case("v9", CK_V9)
6882 .Case("ultrasparc", CK_ULTRASPARC)
6883 .Case("ultrasparc3", CK_ULTRASPARC3)
6884 .Case("niagara", CK_NIAGARA)
6885 .Case("niagara2", CK_NIAGARA2)
6886 .Case("niagara3", CK_NIAGARA3)
6887 .Case("niagara4", CK_NIAGARA4)
Douglas Katzman87da5f42016-07-25 16:36:02 +00006888 .Case("ma2100", CK_MYRIAD2100)
6889 .Case("ma2150", CK_MYRIAD2150)
6890 .Case("ma2450", CK_MYRIAD2450)
6891 // FIXME: the myriad2[.n] spellings are obsolete,
6892 // but a grace period is needed to allow updating dependent builds.
6893 .Case("myriad2", CK_MYRIAD2100)
6894 .Case("myriad2.1", CK_MYRIAD2100)
6895 .Case("myriad2.2", CK_MYRIAD2150)
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006896 .Case("leon2", CK_LEON2)
6897 .Case("at697e", CK_LEON2_AT697E)
6898 .Case("at697f", CK_LEON2_AT697F)
6899 .Case("leon3", CK_LEON3)
6900 .Case("ut699", CK_LEON3_UT699)
6901 .Case("gr712rc", CK_LEON3_GR712RC)
6902 .Case("leon4", CK_LEON4)
6903 .Case("gr740", CK_LEON4_GR740)
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006904 .Default(CK_GENERIC);
6905 }
6906
6907 bool setCPU(const std::string &Name) override {
6908 CPU = getCPUKind(Name);
6909 return CPU != CK_GENERIC;
6910 }
Gabor Greif49991682008-02-21 16:29:08 +00006911};
6912
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006913const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00006914 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6915 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6916 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6917 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
6918};
6919
Craig Topperf054e3a2015-10-19 03:52:27 +00006920ArrayRef<const char *> SparcTargetInfo::getGCCRegNames() const {
6921 return llvm::makeArrayRef(GCCRegNames);
Chris Lattner9b415d62009-01-27 01:58:38 +00006922}
6923
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006924const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00006925 { { "g0" }, "r0" },
6926 { { "g1" }, "r1" },
6927 { { "g2" }, "r2" },
6928 { { "g3" }, "r3" },
6929 { { "g4" }, "r4" },
6930 { { "g5" }, "r5" },
6931 { { "g6" }, "r6" },
6932 { { "g7" }, "r7" },
6933 { { "o0" }, "r8" },
6934 { { "o1" }, "r9" },
6935 { { "o2" }, "r10" },
6936 { { "o3" }, "r11" },
6937 { { "o4" }, "r12" },
6938 { { "o5" }, "r13" },
6939 { { "o6", "sp" }, "r14" },
6940 { { "o7" }, "r15" },
6941 { { "l0" }, "r16" },
6942 { { "l1" }, "r17" },
6943 { { "l2" }, "r18" },
6944 { { "l3" }, "r19" },
6945 { { "l4" }, "r20" },
6946 { { "l5" }, "r21" },
6947 { { "l6" }, "r22" },
6948 { { "l7" }, "r23" },
6949 { { "i0" }, "r24" },
6950 { { "i1" }, "r25" },
6951 { { "i2" }, "r26" },
6952 { { "i3" }, "r27" },
6953 { { "i4" }, "r28" },
6954 { { "i5" }, "r29" },
6955 { { "i6", "fp" }, "r30" },
6956 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00006957};
6958
Craig Topperf054e3a2015-10-19 03:52:27 +00006959ArrayRef<TargetInfo::GCCRegAlias> SparcTargetInfo::getGCCRegAliases() const {
6960 return llvm::makeArrayRef(GCCRegAliases);
Chris Lattner9b415d62009-01-27 01:58:38 +00006961}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006962
6963// SPARC v8 is the 32-bit mode selected by Triple::sparc.
6964class SparcV8TargetInfo : public SparcTargetInfo {
6965public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006966 SparcV8TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6967 : SparcTargetInfo(Triple, Opts) {
James Y Knightb214cbc2016-03-04 19:00:41 +00006968 resetDataLayout("E-m:e-p:32:32-i64:64-f128:64-n32-S64");
Brad Smith73859112015-08-13 21:45:57 +00006969 // NetBSD / OpenBSD use long (same as llvm default); everyone else uses int.
6970 switch (getTriple().getOS()) {
6971 default:
James Y Knight4b4d19e2015-06-04 15:36:29 +00006972 SizeType = UnsignedInt;
6973 IntPtrType = SignedInt;
6974 PtrDiffType = SignedInt;
Brad Smith73859112015-08-13 21:45:57 +00006975 break;
6976 case llvm::Triple::NetBSD:
6977 case llvm::Triple::OpenBSD:
6978 SizeType = UnsignedLong;
6979 IntPtrType = SignedLong;
6980 PtrDiffType = SignedLong;
6981 break;
Brad Smith56495d52015-08-13 22:00:53 +00006982 }
Douglas Katzman13f4a912016-11-09 15:43:51 +00006983 // Up to 32 bits are lock-free atomic, but we're willing to do atomic ops
6984 // on up to 64 bits.
6985 MaxAtomicPromoteWidth = 64;
6986 MaxAtomicInlineWidth = 32;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006987 }
6988
Craig Topper3164f332014-03-11 03:39:26 +00006989 void getTargetDefines(const LangOptions &Opts,
6990 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006991 SparcTargetInfo::getTargetDefines(Opts, Builder);
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006992 switch (getCPUGeneration(CPU)) {
6993 case CG_V8:
6994 Builder.defineMacro("__sparcv8");
6995 if (getTriple().getOS() != llvm::Triple::Solaris)
6996 Builder.defineMacro("__sparcv8__");
6997 break;
6998 case CG_V9:
6999 Builder.defineMacro("__sparcv9");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00007000 if (getTriple().getOS() != llvm::Triple::Solaris) {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00007001 Builder.defineMacro("__sparcv9__");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00007002 Builder.defineMacro("__sparc_v9__");
7003 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00007004 break;
7005 }
Douglas Katzman6871afc2016-03-15 22:34:02 +00007006 if (getTriple().getVendor() == llvm::Triple::Myriad) {
Douglas Katzman87da5f42016-07-25 16:36:02 +00007007 std::string MyriadArchValue, Myriad2Value;
7008 Builder.defineMacro("__sparc_v8__");
7009 Builder.defineMacro("__leon__");
Douglas Katzman6871afc2016-03-15 22:34:02 +00007010 switch (CPU) {
Douglas Katzman87da5f42016-07-25 16:36:02 +00007011 case CK_MYRIAD2150:
7012 MyriadArchValue = "__ma2150";
7013 Myriad2Value = "2";
Douglas Katzman6871afc2016-03-15 22:34:02 +00007014 break;
Douglas Katzman87da5f42016-07-25 16:36:02 +00007015 case CK_MYRIAD2450:
7016 MyriadArchValue = "__ma2450";
7017 Myriad2Value = "2";
Douglas Katzman6871afc2016-03-15 22:34:02 +00007018 break;
7019 default:
Douglas Katzman87da5f42016-07-25 16:36:02 +00007020 MyriadArchValue = "__ma2100";
7021 Myriad2Value = "1";
Douglas Katzman6871afc2016-03-15 22:34:02 +00007022 break;
7023 }
Douglas Katzman87da5f42016-07-25 16:36:02 +00007024 Builder.defineMacro(MyriadArchValue, "1");
7025 Builder.defineMacro(MyriadArchValue+"__", "1");
7026 Builder.defineMacro("__myriad2__", Myriad2Value);
7027 Builder.defineMacro("__myriad2", Myriad2Value);
Douglas Katzman6871afc2016-03-15 22:34:02 +00007028 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007029 }
Chris Dewhurst69fa1922016-05-04 09:33:30 +00007030
7031 bool hasSjLjLowering() const override {
7032 return true;
7033 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007034};
7035
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007036// SPARCV8el is the 32-bit little-endian mode selected by Triple::sparcel.
7037class SparcV8elTargetInfo : public SparcV8TargetInfo {
7038 public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007039 SparcV8elTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7040 : SparcV8TargetInfo(Triple, Opts) {
7041 resetDataLayout("e-m:e-p:32:32-i64:64-f128:64-n32-S64");
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007042 }
7043};
7044
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007045// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
7046class SparcV9TargetInfo : public SparcTargetInfo {
7047public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007048 SparcV9TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7049 : SparcTargetInfo(Triple, Opts) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007050 // FIXME: Support Sparc quad-precision long double?
James Y Knightb214cbc2016-03-04 19:00:41 +00007051 resetDataLayout("E-m:e-i64:64-n32:64-S128");
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00007052 // This is an LP64 platform.
7053 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00007054
7055 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00007056 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00007057 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00007058 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00007059 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00007060 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00007061
7062 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
7063 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
7064 LongDoubleWidth = 128;
7065 LongDoubleAlign = 128;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007066 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00007067 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007068 }
7069
Craig Topper3164f332014-03-11 03:39:26 +00007070 void getTargetDefines(const LangOptions &Opts,
7071 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007072 SparcTargetInfo::getTargetDefines(Opts, Builder);
7073 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00007074 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00007075 // Solaris doesn't need these variants, but the BSDs do.
7076 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00007077 Builder.defineMacro("__sparc64__");
7078 Builder.defineMacro("__sparc_v9__");
7079 Builder.defineMacro("__sparcv9__");
7080 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007081 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00007082
Craig Topper3164f332014-03-11 03:39:26 +00007083 bool setCPU(const std::string &Name) override {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00007084 if (!SparcTargetInfo::setCPU(Name))
7085 return false;
7086 return getCPUGeneration(CPU) == CG_V9;
Roman Divackyb1ae3d42014-02-25 18:35:30 +00007087 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007088};
7089
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007090class SystemZTargetInfo : public TargetInfo {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007091 static const Builtin::Info BuiltinInfo[];
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007092 static const char *const GCCRegNames[];
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007093 std::string CPU;
7094 bool HasTransactionalExecution;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007095 bool HasVector;
Ulrich Weigand47445072013-05-06 16:26:41 +00007096
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007097public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007098 SystemZTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Eric Christopherb093d692015-10-09 18:39:59 +00007099 : TargetInfo(Triple), CPU("z10"), HasTransactionalExecution(false),
7100 HasVector(false) {
Ulrich Weigand881497a2015-03-30 13:50:21 +00007101 IntMaxType = SignedLong;
7102 Int64Type = SignedLong;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007103 TLSSupported = true;
7104 IntWidth = IntAlign = 32;
7105 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
7106 PointerWidth = PointerAlign = 64;
7107 LongDoubleWidth = 128;
7108 LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007109 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Ulrich Weigandca3cb7f2015-04-21 17:29:35 +00007110 DefaultAlignForAttributeAligned = 64;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007111 MinGlobalAlign = 16;
James Y Knightb214cbc2016-03-04 19:00:41 +00007112 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 +00007113 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
7114 }
7115 void getTargetDefines(const LangOptions &Opts,
7116 MacroBuilder &Builder) const override {
7117 Builder.defineMacro("__s390__");
7118 Builder.defineMacro("__s390x__");
7119 Builder.defineMacro("__zarch__");
7120 Builder.defineMacro("__LONG_DOUBLE_128__");
Ulrich Weigandb038a522016-02-05 21:34:28 +00007121
Ulrich Weigand82a86cb2017-02-06 17:04:22 +00007122 const std::string ISARev = llvm::StringSwitch<std::string>(CPU)
7123 .Cases("arch8", "z10", "8")
7124 .Cases("arch9", "z196", "9")
7125 .Cases("arch10", "zEC12", "10")
7126 .Cases("arch11", "z13", "11")
7127 .Default("");
7128 if (!ISARev.empty())
7129 Builder.defineMacro("__ARCH__", ISARev);
7130
Ulrich Weigandb038a522016-02-05 21:34:28 +00007131 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
7132 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
7133 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
7134 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
7135
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007136 if (HasTransactionalExecution)
7137 Builder.defineMacro("__HTM__");
Ulrich Weigand82a86cb2017-02-06 17:04:22 +00007138 if (HasVector)
7139 Builder.defineMacro("__VX__");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00007140 if (Opts.ZVector)
7141 Builder.defineMacro("__VEC__", "10301");
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007142 }
Craig Topper6c03a542015-10-19 04:51:35 +00007143 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7144 return llvm::makeArrayRef(BuiltinInfo,
7145 clang::SystemZ::LastTSBuiltin-Builtin::FirstTSBuiltin);
Ulrich Weigand47445072013-05-06 16:26:41 +00007146 }
7147
Craig Topperf054e3a2015-10-19 03:52:27 +00007148 ArrayRef<const char *> getGCCRegNames() const override;
7149 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007150 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00007151 return None;
Ulrich Weigand47445072013-05-06 16:26:41 +00007152 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007153 bool validateAsmConstraint(const char *&Name,
7154 TargetInfo::ConstraintInfo &info) const override;
7155 const char *getClobbers() const override {
7156 // FIXME: Is this really right?
7157 return "";
7158 }
7159 BuiltinVaListKind getBuiltinVaListKind() const override {
7160 return TargetInfo::SystemZBuiltinVaList;
7161 }
7162 bool setCPU(const std::string &Name) override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007163 CPU = Name;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007164 bool CPUKnown = llvm::StringSwitch<bool>(Name)
7165 .Case("z10", true)
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007166 .Case("arch8", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007167 .Case("z196", true)
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007168 .Case("arch9", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007169 .Case("zEC12", true)
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007170 .Case("arch10", true)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007171 .Case("z13", true)
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007172 .Case("arch11", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007173 .Default(false);
7174
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007175 return CPUKnown;
7176 }
Eric Christopher8c47b422015-10-09 18:39:55 +00007177 bool
7178 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7179 StringRef CPU,
7180 const std::vector<std::string> &FeaturesVec) const override {
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007181 if (CPU == "zEC12" || CPU == "arch10")
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007182 Features["transactional-execution"] = true;
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007183 if (CPU == "z13" || CPU == "arch11") {
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007184 Features["transactional-execution"] = true;
7185 Features["vector"] = true;
7186 }
Eric Christopher007b0a02015-08-28 22:32:01 +00007187 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007188 }
7189
7190 bool handleTargetFeatures(std::vector<std::string> &Features,
7191 DiagnosticsEngine &Diags) override {
7192 HasTransactionalExecution = false;
Eric Christopher610fe112015-08-26 08:21:55 +00007193 for (const auto &Feature : Features) {
7194 if (Feature == "+transactional-execution")
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007195 HasTransactionalExecution = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007196 else if (Feature == "+vector")
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007197 HasVector = true;
7198 }
7199 // If we use the vector ABI, vector types are 64-bit aligned.
7200 if (HasVector) {
7201 MaxVectorAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00007202 resetDataLayout("E-m:e-i1:8:16-i8:8:16-i64:64-f128:64"
7203 "-v128:64-a:8:16-n32:64");
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007204 }
7205 return true;
7206 }
7207
7208 bool hasFeature(StringRef Feature) const override {
7209 return llvm::StringSwitch<bool>(Feature)
Ulrich Weigandcc673442015-04-01 14:15:35 +00007210 .Case("systemz", true)
7211 .Case("htm", HasTransactionalExecution)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007212 .Case("vx", HasVector)
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007213 .Default(false);
7214 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007215
Bryan Chane3f1ed52016-04-28 13:56:43 +00007216 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
7217 switch (CC) {
7218 case CC_C:
7219 case CC_Swift:
7220 return CCCR_OK;
7221 default:
7222 return CCCR_Warning;
7223 }
7224 }
7225
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007226 StringRef getABI() const override {
7227 if (HasVector)
7228 return "vector";
7229 return "";
7230 }
Ulrich Weigand47fd2532015-06-16 15:21:47 +00007231
7232 bool useFloat128ManglingForLongDouble() const override {
7233 return true;
7234 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007235};
7236
7237const Builtin::Info SystemZTargetInfo::BuiltinInfo[] = {
7238#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00007239 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Jonas Paulsson3ace74a2016-03-30 15:51:24 +00007240#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
7241 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007242#include "clang/Basic/BuiltinsSystemZ.def"
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007243};
7244
7245const char *const SystemZTargetInfo::GCCRegNames[] = {
7246 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
7247 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
7248 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
7249 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
7250};
7251
Craig Topperf054e3a2015-10-19 03:52:27 +00007252ArrayRef<const char *> SystemZTargetInfo::getGCCRegNames() const {
7253 return llvm::makeArrayRef(GCCRegNames);
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007254}
7255
7256bool SystemZTargetInfo::
7257validateAsmConstraint(const char *&Name,
7258 TargetInfo::ConstraintInfo &Info) const {
7259 switch (*Name) {
7260 default:
7261 return false;
7262
7263 case 'a': // Address register
7264 case 'd': // Data register (equivalent to 'r')
7265 case 'f': // Floating-point register
7266 Info.setAllowsRegister();
7267 return true;
7268
7269 case 'I': // Unsigned 8-bit constant
7270 case 'J': // Unsigned 12-bit constant
7271 case 'K': // Signed 16-bit constant
7272 case 'L': // Signed 20-bit displacement (on all targets we support)
7273 case 'M': // 0x7fffffff
7274 return true;
7275
7276 case 'Q': // Memory with base and unsigned 12-bit displacement
7277 case 'R': // Likewise, plus an index
7278 case 'S': // Memory with base and signed 20-bit displacement
7279 case 'T': // Likewise, plus an index
7280 Info.setAllowsMemory();
7281 return true;
7282 }
7283}
Ulrich Weigand47445072013-05-06 16:26:41 +00007284
Eric Christopherc48497a2015-09-18 21:26:24 +00007285class MSP430TargetInfo : public TargetInfo {
7286 static const char *const GCCRegNames[];
Anton Korobeynikova0f54372009-05-03 13:43:08 +00007287
Eric Christopherc48497a2015-09-18 21:26:24 +00007288public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007289 MSP430TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7290 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007291 TLSSupported = false;
7292 IntWidth = 16;
7293 IntAlign = 16;
7294 LongWidth = 32;
7295 LongLongWidth = 64;
7296 LongAlign = LongLongAlign = 16;
7297 PointerWidth = 16;
7298 PointerAlign = 16;
7299 SuitableAlign = 16;
7300 SizeType = UnsignedInt;
7301 IntMaxType = SignedLongLong;
7302 IntPtrType = SignedInt;
7303 PtrDiffType = SignedInt;
7304 SigAtomicType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00007305 resetDataLayout("e-m:e-p:16:16-i32:16:32-a:16-n8:16");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00007306 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007307 void getTargetDefines(const LangOptions &Opts,
7308 MacroBuilder &Builder) const override {
7309 Builder.defineMacro("MSP430");
7310 Builder.defineMacro("__MSP430__");
7311 // FIXME: defines for different 'flavours' of MCU
7312 }
Craig Topper6c03a542015-10-19 04:51:35 +00007313 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00007314 // FIXME: Implement.
Craig Topper6c03a542015-10-19 04:51:35 +00007315 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00007316 }
7317 bool hasFeature(StringRef Feature) const override {
7318 return Feature == "msp430";
7319 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007320 ArrayRef<const char *> getGCCRegNames() const override;
7321 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00007322 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00007323 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00007324 }
7325 bool validateAsmConstraint(const char *&Name,
7326 TargetInfo::ConstraintInfo &info) const override {
7327 // FIXME: implement
7328 switch (*Name) {
7329 case 'K': // the constant 1
7330 case 'L': // constant -1^20 .. 1^19
7331 case 'M': // constant 1-4:
Eli Friedmana9c3d712009-08-19 20:47:07 +00007332 return true;
7333 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007334 // No target constraints for now.
7335 return false;
7336 }
7337 const char *getClobbers() const override {
7338 // FIXME: Is this really right?
7339 return "";
7340 }
7341 BuiltinVaListKind getBuiltinVaListKind() const override {
7342 // FIXME: implement
7343 return TargetInfo::CharPtrBuiltinVaList;
7344 }
7345};
7346
7347const char *const MSP430TargetInfo::GCCRegNames[] = {
7348 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
7349 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"};
7350
Craig Topperf054e3a2015-10-19 03:52:27 +00007351ArrayRef<const char *> MSP430TargetInfo::getGCCRegNames() const {
7352 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00007353}
7354
7355// LLVM and Clang cannot be used directly to output native binaries for
7356// target, but is used to compile C code to llvm bitcode with correct
7357// type and alignment information.
7358//
7359// TCE uses the llvm bitcode as input and uses it for generating customized
7360// target processor and program binary. TCE co-design environment is
7361// publicly available in http://tce.cs.tut.fi
7362
7363static const unsigned TCEOpenCLAddrSpaceMap[] = {
7364 3, // opencl_global
7365 4, // opencl_local
7366 5, // opencl_constant
7367 // FIXME: generic has to be added to the target
7368 0, // opencl_generic
7369 0, // cuda_device
7370 0, // cuda_constant
7371 0 // cuda_shared
7372};
7373
7374class TCETargetInfo : public TargetInfo {
7375public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007376 TCETargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7377 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007378 TLSSupported = false;
7379 IntWidth = 32;
7380 LongWidth = LongLongWidth = 32;
7381 PointerWidth = 32;
7382 IntAlign = 32;
7383 LongAlign = LongLongAlign = 32;
7384 PointerAlign = 32;
7385 SuitableAlign = 32;
7386 SizeType = UnsignedInt;
7387 IntMaxType = SignedLong;
7388 IntPtrType = SignedInt;
7389 PtrDiffType = SignedInt;
7390 FloatWidth = 32;
7391 FloatAlign = 32;
7392 DoubleWidth = 32;
7393 DoubleAlign = 32;
7394 LongDoubleWidth = 32;
7395 LongDoubleAlign = 32;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007396 FloatFormat = &llvm::APFloat::IEEEsingle();
7397 DoubleFormat = &llvm::APFloat::IEEEsingle();
7398 LongDoubleFormat = &llvm::APFloat::IEEEsingle();
Pekka Jaaskelainen67354482016-11-16 15:22:31 +00007399 resetDataLayout("E-p:32:32:32-i1:8:8-i8:8:32-"
7400 "i16:16:32-i32:32:32-i64:32:32-"
7401 "f32:32:32-f64:32:32-v64:32:32-"
7402 "v128:32:32-v256:32:32-v512:32:32-"
7403 "v1024:32:32-a0:0:32-n32");
Eric Christopherc48497a2015-09-18 21:26:24 +00007404 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
7405 UseAddrSpaceMapMangling = true;
7406 }
7407
7408 void getTargetDefines(const LangOptions &Opts,
7409 MacroBuilder &Builder) const override {
7410 DefineStd(Builder, "tce", Opts);
7411 Builder.defineMacro("__TCE__");
7412 Builder.defineMacro("__TCE_V1__");
7413 }
7414 bool hasFeature(StringRef Feature) const override { return Feature == "tce"; }
7415
Craig Topper6c03a542015-10-19 04:51:35 +00007416 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007417 const char *getClobbers() const override { return ""; }
7418 BuiltinVaListKind getBuiltinVaListKind() const override {
7419 return TargetInfo::VoidPtrBuiltinVaList;
7420 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007421 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007422 bool validateAsmConstraint(const char *&Name,
7423 TargetInfo::ConstraintInfo &info) const override {
7424 return true;
7425 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007426 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7427 return None;
7428 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007429};
Eli Friedmana9c3d712009-08-19 20:47:07 +00007430
Pekka Jaaskelainen67354482016-11-16 15:22:31 +00007431class TCELETargetInfo : public TCETargetInfo {
7432public:
7433 TCELETargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7434 : TCETargetInfo(Triple, Opts) {
7435 BigEndian = false;
7436
7437 resetDataLayout("e-p:32:32:32-i1:8:8-i8:8:32-"
7438 "i16:16:32-i32:32:32-i64:32:32-"
7439 "f32:32:32-f64:32:32-v64:32:32-"
7440 "v128:32:32-v256:32:32-v512:32:32-"
7441 "v1024:32:32-a0:0:32-n32");
7442
7443 }
7444
7445 virtual void getTargetDefines(const LangOptions &Opts,
7446 MacroBuilder &Builder) const {
7447 DefineStd(Builder, "tcele", Opts);
7448 Builder.defineMacro("__TCE__");
7449 Builder.defineMacro("__TCE_V1__");
7450 Builder.defineMacro("__TCELE__");
7451 Builder.defineMacro("__TCELE_V1__");
7452 }
7453
7454};
7455
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007456class BPFTargetInfo : public TargetInfo {
7457public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007458 BPFTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7459 : TargetInfo(Triple) {
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007460 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
7461 SizeType = UnsignedLong;
7462 PtrDiffType = SignedLong;
7463 IntPtrType = SignedLong;
7464 IntMaxType = SignedLong;
7465 Int64Type = SignedLong;
7466 RegParmMax = 5;
7467 if (Triple.getArch() == llvm::Triple::bpfeb) {
James Y Knightb214cbc2016-03-04 19:00:41 +00007468 resetDataLayout("E-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007469 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00007470 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007471 }
7472 MaxAtomicPromoteWidth = 64;
7473 MaxAtomicInlineWidth = 64;
7474 TLSSupported = false;
7475 }
7476 void getTargetDefines(const LangOptions &Opts,
7477 MacroBuilder &Builder) const override {
7478 DefineStd(Builder, "bpf", Opts);
7479 Builder.defineMacro("__BPF__");
7480 }
7481 bool hasFeature(StringRef Feature) const override {
7482 return Feature == "bpf";
7483 }
7484
Craig Topper6c03a542015-10-19 04:51:35 +00007485 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007486 const char *getClobbers() const override {
7487 return "";
7488 }
7489 BuiltinVaListKind getBuiltinVaListKind() const override {
7490 return TargetInfo::VoidPtrBuiltinVaList;
7491 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007492 ArrayRef<const char *> getGCCRegNames() const override {
7493 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007494 }
7495 bool validateAsmConstraint(const char *&Name,
7496 TargetInfo::ConstraintInfo &info) const override {
7497 return true;
7498 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007499 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7500 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007501 }
7502};
7503
Daniel Sanders4672af62016-05-27 11:51:02 +00007504class MipsTargetInfo : public TargetInfo {
7505 void setDataLayout() {
Daniel Sanders55e40692016-06-03 10:11:01 +00007506 StringRef Layout;
7507
7508 if (ABI == "o32")
7509 Layout = "m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
7510 else if (ABI == "n32")
Daniel Sanders6a738832016-07-19 10:49:03 +00007511 Layout = "m:e-p:32:32-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Daniel Sanders55e40692016-06-03 10:11:01 +00007512 else if (ABI == "n64")
Daniel Sanders6a738832016-07-19 10:49:03 +00007513 Layout = "m:e-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Daniel Sanders55e40692016-06-03 10:11:01 +00007514 else
7515 llvm_unreachable("Invalid ABI");
7516
7517 if (BigEndian)
7518 resetDataLayout(("E-" + Layout).str());
7519 else
7520 resetDataLayout(("e-" + Layout).str());
Daniel Sanders4672af62016-05-27 11:51:02 +00007521 }
7522
Akira Hatanaka9064e362013-10-29 18:30:33 +00007523
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00007524 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007525 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00007526 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00007527 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007528 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00007529 bool IsSingleFloat;
Simon Dardisdf827a72017-02-21 16:01:00 +00007530 bool IsNoABICalls;
7531 bool CanUseBSDABICalls;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007532 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00007533 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007534 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007535 enum DspRevEnum {
7536 NoDSP, DSP1, DSP2
7537 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00007538 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007539
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007540protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00007541 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007542 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007543
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007544public:
Daniel Sanders4672af62016-05-27 11:51:02 +00007545 MipsTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007546 : TargetInfo(Triple), IsMips16(false), IsMicromips(false),
Simon Dardisdf827a72017-02-21 16:01:00 +00007547 IsNan2008(false), IsSingleFloat(false), IsNoABICalls(false),
7548 CanUseBSDABICalls(false), FloatABI(HardFloat), DspRev(NoDSP),
7549 HasMSA(false), HasFP64(false) {
Zoran Jovanovic26a12162015-02-18 15:21:35 +00007550 TheCXXABI.set(TargetCXXABI::GenericMIPS);
Daniel Sanders4672af62016-05-27 11:51:02 +00007551
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007552 setABI((getTriple().getArch() == llvm::Triple::mips ||
7553 getTriple().getArch() == llvm::Triple::mipsel)
7554 ? "o32"
7555 : "n64");
7556
7557 CPU = ABI == "o32" ? "mips32r2" : "mips64r2";
Simon Dardisdf827a72017-02-21 16:01:00 +00007558
7559 CanUseBSDABICalls = Triple.getOS() == llvm::Triple::FreeBSD ||
7560 Triple.getOS() == llvm::Triple::OpenBSD;
Zoran Jovanovic26a12162015-02-18 15:21:35 +00007561 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007562
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007563 bool isNaN2008Default() const {
7564 return CPU == "mips32r6" || CPU == "mips64r6";
7565 }
7566
7567 bool isFP64Default() const {
7568 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
7569 }
7570
Petar Jovanovicd55ae6b2015-02-26 18:19:22 +00007571 bool isNan2008() const override {
7572 return IsNan2008;
7573 }
7574
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007575 bool processorSupportsGPR64() const {
7576 return llvm::StringSwitch<bool>(CPU)
7577 .Case("mips3", true)
7578 .Case("mips4", true)
7579 .Case("mips5", true)
7580 .Case("mips64", true)
7581 .Case("mips64r2", true)
7582 .Case("mips64r3", true)
7583 .Case("mips64r5", true)
7584 .Case("mips64r6", true)
7585 .Case("octeon", true)
7586 .Default(false);
7587 return false;
7588 }
7589
Alp Toker4925ba72014-06-07 23:30:42 +00007590 StringRef getABI() const override { return ABI; }
Daniel Sanders4672af62016-05-27 11:51:02 +00007591 bool setABI(const std::string &Name) override {
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007592 if (Name == "o32") {
7593 setO32ABITypes();
7594 ABI = Name;
7595 return true;
Daniel Sanders4672af62016-05-27 11:51:02 +00007596 }
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007597
7598 if (Name == "n32") {
7599 setN32ABITypes();
7600 ABI = Name;
7601 return true;
7602 }
7603 if (Name == "n64") {
7604 setN64ABITypes();
7605 ABI = Name;
7606 return true;
Daniel Sanders4672af62016-05-27 11:51:02 +00007607 }
7608 return false;
7609 }
7610
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007611 void setO32ABITypes() {
7612 Int64Type = SignedLongLong;
7613 IntMaxType = Int64Type;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007614 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007615 LongDoubleWidth = LongDoubleAlign = 64;
7616 LongWidth = LongAlign = 32;
7617 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
7618 PointerWidth = PointerAlign = 32;
7619 PtrDiffType = SignedInt;
7620 SizeType = UnsignedInt;
7621 SuitableAlign = 64;
7622 }
7623
7624 void setN32N64ABITypes() {
7625 LongDoubleWidth = LongDoubleAlign = 128;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007626 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007627 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
7628 LongDoubleWidth = LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007629 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007630 }
7631 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
7632 SuitableAlign = 128;
7633 }
7634
Daniel Sanders4672af62016-05-27 11:51:02 +00007635 void setN64ABITypes() {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007636 setN32N64ABITypes();
Brad Smith8e55bd52017-03-06 23:48:31 +00007637 if (getTriple().getOS() == llvm::Triple::OpenBSD) {
7638 Int64Type = SignedLongLong;
7639 } else {
7640 Int64Type = SignedLong;
7641 }
Daniel Sanders4672af62016-05-27 11:51:02 +00007642 IntMaxType = Int64Type;
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007643 LongWidth = LongAlign = 64;
7644 PointerWidth = PointerAlign = 64;
7645 PtrDiffType = SignedLong;
7646 SizeType = UnsignedLong;
Daniel Sanders4672af62016-05-27 11:51:02 +00007647 }
7648
7649 void setN32ABITypes() {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007650 setN32N64ABITypes();
Daniel Sanders4672af62016-05-27 11:51:02 +00007651 Int64Type = SignedLongLong;
7652 IntMaxType = Int64Type;
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007653 LongWidth = LongAlign = 32;
7654 PointerWidth = PointerAlign = 32;
7655 PtrDiffType = SignedInt;
7656 SizeType = UnsignedInt;
Daniel Sanders4672af62016-05-27 11:51:02 +00007657 }
7658
Craig Topper3164f332014-03-11 03:39:26 +00007659 bool setCPU(const std::string &Name) override {
Eric Christopher0b26a612010-03-02 02:41:08 +00007660 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007661 return llvm::StringSwitch<bool>(Name)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007662 .Case("mips1", true)
7663 .Case("mips2", true)
Simon Atanasyan26610c52014-07-04 12:36:56 +00007664 .Case("mips3", true)
7665 .Case("mips4", true)
7666 .Case("mips5", true)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007667 .Case("mips32", true)
7668 .Case("mips32r2", true)
7669 .Case("mips32r3", true)
7670 .Case("mips32r5", true)
7671 .Case("mips32r6", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007672 .Case("mips64", true)
7673 .Case("mips64r2", true)
Simon Atanasyan162feb52015-02-20 23:37:40 +00007674 .Case("mips64r3", true)
7675 .Case("mips64r5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007676 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00007677 .Case("octeon", true)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007678 .Case("p5600", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007679 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00007680 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00007681 const std::string& getCPU() const { return CPU; }
Eric Christopher8c47b422015-10-09 18:39:55 +00007682 bool
7683 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7684 StringRef CPU,
7685 const std::vector<std::string> &FeaturesVec) const override {
Bhushan D. Attardebacb988732016-03-04 06:56:29 +00007686 if (CPU.empty())
7687 CPU = getCPU();
Simon Atanasyan4e16a422014-07-04 12:37:04 +00007688 if (CPU == "octeon")
7689 Features["mips64r2"] = Features["cnmips"] = true;
7690 else
7691 Features[CPU] = true;
Eric Christopher007b0a02015-08-28 22:32:01 +00007692 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Eric Christopher0b26a612010-03-02 02:41:08 +00007693 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007694
Craig Topper3164f332014-03-11 03:39:26 +00007695 void getTargetDefines(const LangOptions &Opts,
7696 MacroBuilder &Builder) const override {
Daniel Sanders4672af62016-05-27 11:51:02 +00007697 if (BigEndian) {
7698 DefineStd(Builder, "MIPSEB", Opts);
7699 Builder.defineMacro("_MIPSEB");
7700 } else {
7701 DefineStd(Builder, "MIPSEL", Opts);
7702 Builder.defineMacro("_MIPSEL");
7703 }
7704
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007705 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00007706 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007707 if (Opts.GNUMode)
7708 Builder.defineMacro("mips");
7709
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007710 if (ABI == "o32") {
Daniel Sanders4672af62016-05-27 11:51:02 +00007711 Builder.defineMacro("__mips", "32");
7712 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
7713 } else {
7714 Builder.defineMacro("__mips", "64");
7715 Builder.defineMacro("__mips64");
7716 Builder.defineMacro("__mips64__");
7717 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
7718 }
7719
7720 const std::string ISARev = llvm::StringSwitch<std::string>(getCPU())
7721 .Cases("mips32", "mips64", "1")
7722 .Cases("mips32r2", "mips64r2", "2")
7723 .Cases("mips32r3", "mips64r3", "3")
7724 .Cases("mips32r5", "mips64r5", "5")
7725 .Cases("mips32r6", "mips64r6", "6")
7726 .Default("");
7727 if (!ISARev.empty())
7728 Builder.defineMacro("__mips_isa_rev", ISARev);
7729
7730 if (ABI == "o32") {
7731 Builder.defineMacro("__mips_o32");
7732 Builder.defineMacro("_ABIO32", "1");
7733 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
Daniel Sanders07c86542016-05-27 14:30:23 +00007734 } else if (ABI == "n32") {
Daniel Sanders4672af62016-05-27 11:51:02 +00007735 Builder.defineMacro("__mips_n32");
7736 Builder.defineMacro("_ABIN32", "2");
7737 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
7738 } else if (ABI == "n64") {
7739 Builder.defineMacro("__mips_n64");
7740 Builder.defineMacro("_ABI64", "3");
7741 Builder.defineMacro("_MIPS_SIM", "_ABI64");
7742 } else
7743 llvm_unreachable("Invalid ABI.");
7744
Simon Dardisdf827a72017-02-21 16:01:00 +00007745 if (!IsNoABICalls) {
7746 Builder.defineMacro("__mips_abicalls");
7747 if (CanUseBSDABICalls)
7748 Builder.defineMacro("__ABICALLS__");
7749 }
7750
Simon Atanasyan683535b2012-08-29 19:14:58 +00007751 Builder.defineMacro("__REGISTER_PREFIX__", "");
7752
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007753 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007754 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00007755 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007756 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007757 case SoftFloat:
7758 Builder.defineMacro("__mips_soft_float", Twine(1));
7759 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00007760 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00007761
Simon Atanasyan16071912013-04-14 14:07:30 +00007762 if (IsSingleFloat)
7763 Builder.defineMacro("__mips_single_float", Twine(1));
7764
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007765 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
7766 Builder.defineMacro("_MIPS_FPSET",
7767 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
7768
Simon Atanasyan72244b62012-07-05 16:06:06 +00007769 if (IsMips16)
7770 Builder.defineMacro("__mips16", Twine(1));
7771
Simon Atanasyan60777612013-04-14 14:07:51 +00007772 if (IsMicromips)
7773 Builder.defineMacro("__mips_micromips", Twine(1));
7774
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007775 if (IsNan2008)
7776 Builder.defineMacro("__mips_nan2008", Twine(1));
7777
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007778 switch (DspRev) {
7779 default:
7780 break;
7781 case DSP1:
7782 Builder.defineMacro("__mips_dsp_rev", Twine(1));
7783 Builder.defineMacro("__mips_dsp", Twine(1));
7784 break;
7785 case DSP2:
7786 Builder.defineMacro("__mips_dsp_rev", Twine(2));
7787 Builder.defineMacro("__mips_dspr2", Twine(1));
7788 Builder.defineMacro("__mips_dsp", Twine(1));
7789 break;
7790 }
7791
Jack Carter44ff1e52013-08-12 17:20:29 +00007792 if (HasMSA)
7793 Builder.defineMacro("__mips_msa", Twine(1));
7794
Simon Atanasyan26f19672012-04-05 19:28:31 +00007795 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
7796 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
7797 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00007798
7799 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
7800 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Daniel Sanders5176f7e2015-12-22 12:59:30 +00007801
7802 // These shouldn't be defined for MIPS-I but there's no need to check
7803 // for that since MIPS-I isn't supported.
7804 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
7805 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
7806 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007807
7808 // 32-bit MIPS processors don't have the necessary lld/scd instructions
7809 // found in 64-bit processors. In the case of O32 on a 64-bit processor,
7810 // the instructions exist but using them violates the ABI since they
7811 // require 64-bit GPRs and O32 only supports 32-bit GPRs.
7812 if (ABI == "n32" || ABI == "n64")
Daniel Sanders4672af62016-05-27 11:51:02 +00007813 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007814 }
7815
Craig Topper6c03a542015-10-19 04:51:35 +00007816 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7817 return llvm::makeArrayRef(BuiltinInfo,
7818 clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin);
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007819 }
Craig Topper3164f332014-03-11 03:39:26 +00007820 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00007821 return llvm::StringSwitch<bool>(Feature)
7822 .Case("mips", true)
7823 .Case("fp64", HasFP64)
7824 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00007825 }
Craig Topper3164f332014-03-11 03:39:26 +00007826 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00007827 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007828 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007829 ArrayRef<const char *> getGCCRegNames() const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00007830 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00007831 // CPU register names
7832 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007833 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
7834 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
7835 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00007836 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
7837 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007838 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
7839 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
7840 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
7841 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00007842 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007843 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Hrvoje Varga14c42ee2016-03-29 12:46:16 +00007844 "$fcc5","$fcc6","$fcc7","$ac1hi","$ac1lo","$ac2hi","$ac2lo",
7845 "$ac3hi","$ac3lo",
Daniel Sanders8b59af12013-11-12 12:56:01 +00007846 // MSA register names
7847 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
7848 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
7849 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
7850 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
7851 // MSA control register names
7852 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
7853 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007854 };
Craig Topperf054e3a2015-10-19 03:52:27 +00007855 return llvm::makeArrayRef(GCCRegNames);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007856 }
Craig Topper3164f332014-03-11 03:39:26 +00007857 bool validateAsmConstraint(const char *&Name,
7858 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007859 switch (*Name) {
7860 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00007861 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007862 case 'r': // CPU registers.
7863 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00007864 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007865 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00007866 case 'c': // $25 for indirect jumps
7867 case 'l': // lo register
7868 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007869 Info.setAllowsRegister();
7870 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00007871 case 'I': // Signed 16-bit constant
7872 case 'J': // Integer 0
7873 case 'K': // Unsigned 16-bit constant
7874 case 'L': // Signed 32-bit constant, lower 16-bit zeros (for lui)
7875 case 'M': // Constants not loadable via lui, addiu, or ori
7876 case 'N': // Constant -1 to -65535
7877 case 'O': // A signed 15-bit constant
7878 case 'P': // A constant between 1 go 65535
7879 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00007880 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00007881 Info.setAllowsMemory();
7882 return true;
Daniel Sanders48fa39e2015-03-30 13:47:23 +00007883 case 'Z':
7884 if (Name[1] == 'C') { // An address usable by ll, and sc.
7885 Info.setAllowsMemory();
7886 Name++; // Skip over 'Z'.
7887 return true;
7888 }
7889 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007890 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007891 }
7892
Daniel Sanders48fa39e2015-03-30 13:47:23 +00007893 std::string convertConstraint(const char *&Constraint) const override {
7894 std::string R;
7895 switch (*Constraint) {
7896 case 'Z': // Two-character constraint; add "^" hint for later parsing.
7897 if (Constraint[1] == 'C') {
7898 R = std::string("^") + std::string(Constraint, 2);
7899 Constraint++;
7900 return R;
7901 }
7902 break;
7903 }
7904 return TargetInfo::convertConstraint(Constraint);
7905 }
7906
Craig Topper3164f332014-03-11 03:39:26 +00007907 const char *getClobbers() const override {
Toma Tabacucfab40f2015-01-12 14:41:30 +00007908 // In GCC, $1 is not widely used in generated code (it's used only in a few
7909 // specific situations), so there is no real need for users to add it to
7910 // the clobbers list if they want to use it in their inline assembly code.
7911 //
7912 // In LLVM, $1 is treated as a normal GPR and is always allocatable during
7913 // code generation, so using it in inline assembly without adding it to the
7914 // clobbers list can cause conflicts between the inline assembly code and
7915 // the surrounding generated code.
7916 //
7917 // Another problem is that LLVM is allowed to choose $1 for inline assembly
7918 // operands, which will conflict with the ".set at" assembler option (which
7919 // we use only for inline assembly, in order to maintain compatibility with
7920 // GCC) and will also conflict with the user's usage of $1.
7921 //
7922 // The easiest way to avoid these conflicts and keep $1 as an allocatable
7923 // register for generated code is to automatically clobber $1 for all inline
7924 // assembly code.
7925 //
7926 // FIXME: We should automatically clobber $1 only for inline assembly code
7927 // which actually uses it. This would allow LLVM to use $1 for inline
7928 // assembly operands if the user's assembly code doesn't use it.
Toma Tabacu99411952014-12-17 12:02:58 +00007929 return "~{$1}";
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007930 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007931
Craig Topper3164f332014-03-11 03:39:26 +00007932 bool handleTargetFeatures(std::vector<std::string> &Features,
7933 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00007934 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00007935 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007936 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00007937 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007938 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007939 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007940 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007941
Eric Christopher610fe112015-08-26 08:21:55 +00007942 for (const auto &Feature : Features) {
7943 if (Feature == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00007944 IsSingleFloat = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007945 else if (Feature == "+soft-float")
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007946 FloatABI = SoftFloat;
Eric Christopher610fe112015-08-26 08:21:55 +00007947 else if (Feature == "+mips16")
Simon Atanasyan72244b62012-07-05 16:06:06 +00007948 IsMips16 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007949 else if (Feature == "+micromips")
Simon Atanasyan60777612013-04-14 14:07:51 +00007950 IsMicromips = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007951 else if (Feature == "+dsp")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007952 DspRev = std::max(DspRev, DSP1);
Eric Christopher610fe112015-08-26 08:21:55 +00007953 else if (Feature == "+dspr2")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007954 DspRev = std::max(DspRev, DSP2);
Eric Christopher610fe112015-08-26 08:21:55 +00007955 else if (Feature == "+msa")
Jack Carter44ff1e52013-08-12 17:20:29 +00007956 HasMSA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007957 else if (Feature == "+fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007958 HasFP64 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007959 else if (Feature == "-fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007960 HasFP64 = false;
Eric Christopher610fe112015-08-26 08:21:55 +00007961 else if (Feature == "+nan2008")
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007962 IsNan2008 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007963 else if (Feature == "-nan2008")
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007964 IsNan2008 = false;
Simon Dardisdf827a72017-02-21 16:01:00 +00007965 else if (Feature == "+noabicalls")
7966 IsNoABICalls = true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007967 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007968
James Y Knightb214cbc2016-03-04 19:00:41 +00007969 setDataLayout();
Akira Hatanaka9064e362013-10-29 18:30:33 +00007970
Rafael Espindolaeb265472013-08-21 21:59:03 +00007971 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007972 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00007973
Craig Topper3164f332014-03-11 03:39:26 +00007974 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00007975 if (RegNo == 0) return 4;
7976 if (RegNo == 1) return 5;
7977 return -1;
7978 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00007979
7980 bool isCLZForZeroUndef() const override { return false; }
Daniel Sanders4672af62016-05-27 11:51:02 +00007981
7982 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7983 static const TargetInfo::GCCRegAlias O32RegAliases[] = {
7984 {{"at"}, "$1"}, {{"v0"}, "$2"}, {{"v1"}, "$3"},
7985 {{"a0"}, "$4"}, {{"a1"}, "$5"}, {{"a2"}, "$6"},
7986 {{"a3"}, "$7"}, {{"t0"}, "$8"}, {{"t1"}, "$9"},
7987 {{"t2"}, "$10"}, {{"t3"}, "$11"}, {{"t4"}, "$12"},
7988 {{"t5"}, "$13"}, {{"t6"}, "$14"}, {{"t7"}, "$15"},
7989 {{"s0"}, "$16"}, {{"s1"}, "$17"}, {{"s2"}, "$18"},
7990 {{"s3"}, "$19"}, {{"s4"}, "$20"}, {{"s5"}, "$21"},
7991 {{"s6"}, "$22"}, {{"s7"}, "$23"}, {{"t8"}, "$24"},
7992 {{"t9"}, "$25"}, {{"k0"}, "$26"}, {{"k1"}, "$27"},
7993 {{"gp"}, "$28"}, {{"sp", "$sp"}, "$29"}, {{"fp", "$fp"}, "$30"},
7994 {{"ra"}, "$31"}};
7995 static const TargetInfo::GCCRegAlias NewABIRegAliases[] = {
7996 {{"at"}, "$1"}, {{"v0"}, "$2"}, {{"v1"}, "$3"},
7997 {{"a0"}, "$4"}, {{"a1"}, "$5"}, {{"a2"}, "$6"},
7998 {{"a3"}, "$7"}, {{"a4"}, "$8"}, {{"a5"}, "$9"},
7999 {{"a6"}, "$10"}, {{"a7"}, "$11"}, {{"t0"}, "$12"},
8000 {{"t1"}, "$13"}, {{"t2"}, "$14"}, {{"t3"}, "$15"},
8001 {{"s0"}, "$16"}, {{"s1"}, "$17"}, {{"s2"}, "$18"},
8002 {{"s3"}, "$19"}, {{"s4"}, "$20"}, {{"s5"}, "$21"},
8003 {{"s6"}, "$22"}, {{"s7"}, "$23"}, {{"t8"}, "$24"},
8004 {{"t9"}, "$25"}, {{"k0"}, "$26"}, {{"k1"}, "$27"},
8005 {{"gp"}, "$28"}, {{"sp", "$sp"}, "$29"}, {{"fp", "$fp"}, "$30"},
8006 {{"ra"}, "$31"}};
Daniel Sanders26a56ad2016-06-06 09:07:08 +00008007 if (ABI == "o32")
Daniel Sanders4672af62016-05-27 11:51:02 +00008008 return llvm::makeArrayRef(O32RegAliases);
8009 return llvm::makeArrayRef(NewABIRegAliases);
8010 }
8011
8012 bool hasInt128Type() const override {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00008013 return ABI == "n32" || ABI == "n64";
Daniel Sanders4672af62016-05-27 11:51:02 +00008014 }
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00008015
8016 bool validateTarget(DiagnosticsEngine &Diags) const override {
8017 // FIXME: It's valid to use O32 on a 64-bit CPU but the backend can't handle
8018 // this yet. It's better to fail here than on the backend assertion.
8019 if (processorSupportsGPR64() && ABI == "o32") {
8020 Diags.Report(diag::err_target_unsupported_abi) << ABI << CPU;
8021 return false;
8022 }
8023
8024 // 64-bit ABI's require 64-bit CPU's.
8025 if (!processorSupportsGPR64() && (ABI == "n32" || ABI == "n64")) {
8026 Diags.Report(diag::err_target_unsupported_abi) << ABI << CPU;
8027 return false;
8028 }
8029
8030 // FIXME: It's valid to use O32 on a mips64/mips64el triple but the backend
8031 // can't handle this yet. It's better to fail here than on the
8032 // backend assertion.
8033 if ((getTriple().getArch() == llvm::Triple::mips64 ||
8034 getTriple().getArch() == llvm::Triple::mips64el) &&
8035 ABI == "o32") {
8036 Diags.Report(diag::err_target_unsupported_abi_for_triple)
8037 << ABI << getTriple().str();
8038 return false;
8039 }
8040
8041 // FIXME: It's valid to use N32/N64 on a mips/mipsel triple but the backend
8042 // can't handle this yet. It's better to fail here than on the
8043 // backend assertion.
8044 if ((getTriple().getArch() == llvm::Triple::mips ||
8045 getTriple().getArch() == llvm::Triple::mipsel) &&
8046 (ABI == "n32" || ABI == "n64")) {
8047 Diags.Report(diag::err_target_unsupported_abi_for_triple)
8048 << ABI << getTriple().str();
8049 return false;
8050 }
8051
8052 return true;
8053 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008054};
8055
Daniel Sanders4672af62016-05-27 11:51:02 +00008056const Builtin::Info MipsTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00008057#define BUILTIN(ID, TYPE, ATTRS) \
8058 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
8059#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
8060 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00008061#include "clang/Basic/BuiltinsMips.def"
8062};
8063
Ivan Krasindd7403e2011-08-24 20:22:22 +00008064class PNaClTargetInfo : public TargetInfo {
8065public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008066 PNaClTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8067 : TargetInfo(Triple) {
Ivan Krasindd7403e2011-08-24 20:22:22 +00008068 this->LongAlign = 32;
8069 this->LongWidth = 32;
8070 this->PointerAlign = 32;
8071 this->PointerWidth = 32;
8072 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00008073 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00008074 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00008075 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00008076 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00008077 this->SizeType = TargetInfo::UnsignedInt;
8078 this->PtrDiffType = TargetInfo::SignedInt;
8079 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00008080 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00008081 }
8082
Craig Toppere6f17d02014-03-11 04:07:52 +00008083 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00008084 Builder.defineMacro("__le32__");
8085 Builder.defineMacro("__pnacl__");
8086 }
Craig Topper3164f332014-03-11 03:39:26 +00008087 void getTargetDefines(const LangOptions &Opts,
8088 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00008089 getArchDefines(Opts, Builder);
8090 }
Craig Topper3164f332014-03-11 03:39:26 +00008091 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00008092 return Feature == "pnacl";
8093 }
Craig Topper6c03a542015-10-19 04:51:35 +00008094 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Craig Topper3164f332014-03-11 03:39:26 +00008095 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00008096 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00008097 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008098 ArrayRef<const char *> getGCCRegNames() const override;
8099 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00008100 bool validateAsmConstraint(const char *&Name,
8101 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00008102 return false;
8103 }
8104
Craig Topper3164f332014-03-11 03:39:26 +00008105 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00008106 return "";
8107 }
8108};
8109
Craig Topperf054e3a2015-10-19 03:52:27 +00008110ArrayRef<const char *> PNaClTargetInfo::getGCCRegNames() const {
8111 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00008112}
8113
Craig Topperf054e3a2015-10-19 03:52:27 +00008114ArrayRef<TargetInfo::GCCRegAlias> PNaClTargetInfo::getGCCRegAliases() const {
8115 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00008116}
Ivan Krasindd7403e2011-08-24 20:22:22 +00008117
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008118// We attempt to use PNaCl (le32) frontend and Mips32EL backend.
Daniel Sanders4672af62016-05-27 11:51:02 +00008119class NaClMips32TargetInfo : public MipsTargetInfo {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008120public:
Daniel Sanders4672af62016-05-27 11:51:02 +00008121 NaClMips32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8122 : MipsTargetInfo(Triple, Opts) {}
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008123
8124 BuiltinVaListKind getBuiltinVaListKind() const override {
8125 return TargetInfo::PNaClABIBuiltinVaList;
8126 }
8127};
8128
JF Bastien643817d2014-09-12 17:52:47 +00008129class Le64TargetInfo : public TargetInfo {
8130 static const Builtin::Info BuiltinInfo[];
8131
8132public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008133 Le64TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
8134 : TargetInfo(Triple) {
JF Bastien643817d2014-09-12 17:52:47 +00008135 NoAsmVariants = true;
8136 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
8137 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00008138 resetDataLayout("e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128");
JF Bastien643817d2014-09-12 17:52:47 +00008139 }
8140
8141 void getTargetDefines(const LangOptions &Opts,
8142 MacroBuilder &Builder) const override {
Saleem Abdulrasool56027092017-02-07 19:00:06 +00008143 DefineStd(Builder, "unix", Opts);
JF Bastien643817d2014-09-12 17:52:47 +00008144 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
8145 Builder.defineMacro("__ELF__");
8146 }
Craig Topper6c03a542015-10-19 04:51:35 +00008147 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
8148 return llvm::makeArrayRef(BuiltinInfo,
8149 clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin);
JF Bastien643817d2014-09-12 17:52:47 +00008150 }
8151 BuiltinVaListKind getBuiltinVaListKind() const override {
8152 return TargetInfo::PNaClABIBuiltinVaList;
8153 }
8154 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00008155 ArrayRef<const char *> getGCCRegNames() const override {
8156 return None;
JF Bastien643817d2014-09-12 17:52:47 +00008157 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008158 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8159 return None;
JF Bastien643817d2014-09-12 17:52:47 +00008160 }
8161 bool validateAsmConstraint(const char *&Name,
8162 TargetInfo::ConstraintInfo &Info) const override {
8163 return false;
8164 }
8165
8166 bool hasProtectedVisibility() const override { return false; }
JF Bastien643817d2014-09-12 17:52:47 +00008167};
Dan Gohmanc2853072015-09-03 22:51:53 +00008168
8169class WebAssemblyTargetInfo : public TargetInfo {
8170 static const Builtin::Info BuiltinInfo[];
8171
8172 enum SIMDEnum {
8173 NoSIMD,
8174 SIMD128,
8175 } SIMDLevel;
8176
8177public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008178 explicit WebAssemblyTargetInfo(const llvm::Triple &T, const TargetOptions &)
Dan Gohmanc2853072015-09-03 22:51:53 +00008179 : TargetInfo(T), SIMDLevel(NoSIMD) {
Dan Gohmanc2853072015-09-03 22:51:53 +00008180 NoAsmVariants = true;
8181 SuitableAlign = 128;
8182 LargeArrayMinWidth = 128;
8183 LargeArrayAlign = 128;
8184 SimdDefaultAlign = 128;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00008185 SigAtomicType = SignedLong;
Dan Gohman6db46402015-11-10 21:01:46 +00008186 LongDoubleWidth = LongDoubleAlign = 128;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00008187 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Derek Schuffacdc8e62016-09-01 22:38:37 +00008188 SizeType = UnsignedInt;
8189 PtrDiffType = SignedInt;
8190 IntPtrType = SignedInt;
Dan Gohmanc2853072015-09-03 22:51:53 +00008191 }
8192
8193protected:
8194 void getTargetDefines(const LangOptions &Opts,
8195 MacroBuilder &Builder) const override {
8196 defineCPUMacros(Builder, "wasm", /*Tuning=*/false);
8197 if (SIMDLevel >= SIMD128)
8198 Builder.defineMacro("__wasm_simd128__");
8199 }
8200
8201private:
Eric Christopher8c47b422015-10-09 18:39:55 +00008202 bool
8203 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
8204 StringRef CPU,
8205 const std::vector<std::string> &FeaturesVec) const override {
Dan Gohmanc2853072015-09-03 22:51:53 +00008206 if (CPU == "bleeding-edge")
8207 Features["simd128"] = true;
8208 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
8209 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00008210 bool hasFeature(StringRef Feature) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00008211 return llvm::StringSwitch<bool>(Feature)
8212 .Case("simd128", SIMDLevel >= SIMD128)
8213 .Default(false);
8214 }
8215 bool handleTargetFeatures(std::vector<std::string> &Features,
Hans Wennborg7eb54642015-09-10 17:07:54 +00008216 DiagnosticsEngine &Diags) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00008217 for (const auto &Feature : Features) {
8218 if (Feature == "+simd128") {
8219 SIMDLevel = std::max(SIMDLevel, SIMD128);
8220 continue;
8221 }
8222 if (Feature == "-simd128") {
8223 SIMDLevel = std::min(SIMDLevel, SIMDEnum(SIMD128 - 1));
8224 continue;
8225 }
8226
8227 Diags.Report(diag::err_opt_not_valid_with_opt) << Feature
8228 << "-target-feature";
8229 return false;
8230 }
8231 return true;
8232 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00008233 bool setCPU(const std::string &Name) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00008234 return llvm::StringSwitch<bool>(Name)
8235 .Case("mvp", true)
8236 .Case("bleeding-edge", true)
8237 .Case("generic", true)
8238 .Default(false);
8239 }
Craig Topper6c03a542015-10-19 04:51:35 +00008240 ArrayRef<Builtin::Info> getTargetBuiltins() const final {
8241 return llvm::makeArrayRef(BuiltinInfo,
8242 clang::WebAssembly::LastTSBuiltin - Builtin::FirstTSBuiltin);
Dan Gohmanc2853072015-09-03 22:51:53 +00008243 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00008244 BuiltinVaListKind getBuiltinVaListKind() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00008245 return VoidPtrBuiltinVaList;
8246 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008247 ArrayRef<const char *> getGCCRegNames() const final {
8248 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00008249 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008250 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const final {
8251 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00008252 }
8253 bool
8254 validateAsmConstraint(const char *&Name,
Hans Wennborg7eb54642015-09-10 17:07:54 +00008255 TargetInfo::ConstraintInfo &Info) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00008256 return false;
8257 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00008258 const char *getClobbers() const final { return ""; }
8259 bool isCLZForZeroUndef() const final { return false; }
8260 bool hasInt128Type() const final { return true; }
Dan Gohmanab0e31f2015-09-14 21:49:41 +00008261 IntType getIntTypeByWidth(unsigned BitWidth,
8262 bool IsSigned) const final {
8263 // WebAssembly prefers long long for explicitly 64-bit integers.
8264 return BitWidth == 64 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
8265 : TargetInfo::getIntTypeByWidth(BitWidth, IsSigned);
8266 }
8267 IntType getLeastIntTypeByWidth(unsigned BitWidth,
8268 bool IsSigned) const final {
8269 // WebAssembly uses long long for int_least64_t and int_fast64_t.
8270 return BitWidth == 64
8271 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
8272 : TargetInfo::getLeastIntTypeByWidth(BitWidth, IsSigned);
8273 }
Dan Gohmanc2853072015-09-03 22:51:53 +00008274};
8275
8276const Builtin::Info WebAssemblyTargetInfo::BuiltinInfo[] = {
8277#define BUILTIN(ID, TYPE, ATTRS) \
8278 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
8279#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
8280 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
8281#include "clang/Basic/BuiltinsWebAssembly.def"
8282};
8283
8284class WebAssembly32TargetInfo : public WebAssemblyTargetInfo {
8285public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008286 explicit WebAssembly32TargetInfo(const llvm::Triple &T,
8287 const TargetOptions &Opts)
8288 : WebAssemblyTargetInfo(T, Opts) {
Dan Gohmanf1c34e62015-09-14 21:56:37 +00008289 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
James Y Knightb214cbc2016-03-04 19:00:41 +00008290 resetDataLayout("e-m:e-p:32:32-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00008291 }
8292
8293protected:
8294 void getTargetDefines(const LangOptions &Opts,
8295 MacroBuilder &Builder) const override {
8296 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
8297 defineCPUMacros(Builder, "wasm32", /*Tuning=*/false);
8298 }
8299};
8300
8301class WebAssembly64TargetInfo : public WebAssemblyTargetInfo {
8302public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008303 explicit WebAssembly64TargetInfo(const llvm::Triple &T,
8304 const TargetOptions &Opts)
8305 : WebAssemblyTargetInfo(T, Opts) {
Dan Gohmanc2853072015-09-03 22:51:53 +00008306 LongAlign = LongWidth = 64;
8307 PointerAlign = PointerWidth = 64;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00008308 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Derek Schuffacdc8e62016-09-01 22:38:37 +00008309 SizeType = UnsignedLong;
8310 PtrDiffType = SignedLong;
8311 IntPtrType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00008312 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00008313 }
8314
8315protected:
8316 void getTargetDefines(const LangOptions &Opts,
8317 MacroBuilder &Builder) const override {
8318 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
8319 defineCPUMacros(Builder, "wasm64", /*Tuning=*/false);
8320 }
8321};
8322
JF Bastien643817d2014-09-12 17:52:47 +00008323const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
8324#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00008325 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
JF Bastien643817d2014-09-12 17:52:47 +00008326#include "clang/Basic/BuiltinsLe64.def"
8327};
8328
Eric Christopherc48497a2015-09-18 21:26:24 +00008329static const unsigned SPIRAddrSpaceMap[] = {
8330 1, // opencl_global
8331 3, // opencl_local
8332 2, // opencl_constant
8333 4, // opencl_generic
8334 0, // cuda_device
8335 0, // cuda_constant
8336 0 // cuda_shared
8337};
8338class SPIRTargetInfo : public TargetInfo {
8339public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008340 SPIRTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
8341 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00008342 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
8343 "SPIR target must use unknown OS");
8344 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
8345 "SPIR target must use unknown environment type");
Eric Christopherc48497a2015-09-18 21:26:24 +00008346 TLSSupported = false;
8347 LongWidth = LongAlign = 64;
8348 AddrSpaceMap = &SPIRAddrSpaceMap;
8349 UseAddrSpaceMapMangling = true;
8350 // Define available target features
8351 // These must be defined in sorted order!
8352 NoAsmVariants = true;
8353 }
8354 void getTargetDefines(const LangOptions &Opts,
8355 MacroBuilder &Builder) const override {
8356 DefineStd(Builder, "SPIR", Opts);
8357 }
8358 bool hasFeature(StringRef Feature) const override {
8359 return Feature == "spir";
8360 }
Craig Topper3164f332014-03-11 03:39:26 +00008361
Craig Topper6c03a542015-10-19 04:51:35 +00008362 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00008363 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00008364 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00008365 bool validateAsmConstraint(const char *&Name,
8366 TargetInfo::ConstraintInfo &info) const override {
8367 return true;
8368 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008369 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8370 return None;
8371 }
Eric Christopherc48497a2015-09-18 21:26:24 +00008372 BuiltinVaListKind getBuiltinVaListKind() const override {
8373 return TargetInfo::VoidPtrBuiltinVaList;
8374 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00008375
Eric Christopherc48497a2015-09-18 21:26:24 +00008376 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Nikolay Haustov8c6538b2016-06-30 09:06:33 +00008377 return (CC == CC_SpirFunction || CC == CC_OpenCLKernel) ? CCCR_OK
8378 : CCCR_Warning;
Eric Christopherc48497a2015-09-18 21:26:24 +00008379 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00008380
Eric Christopherc48497a2015-09-18 21:26:24 +00008381 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
8382 return CC_SpirFunction;
8383 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00008384
8385 void setSupportedOpenCLOpts() override {
8386 // Assume all OpenCL extensions and optional core features are supported
8387 // for SPIR since it is a generic target.
Yaxun Liu5b746652016-12-18 05:18:55 +00008388 getSupportedOpenCLOpts().supportAll();
Yaxun Liu39cf40f2016-05-16 17:06:34 +00008389 }
Eric Christopherc48497a2015-09-18 21:26:24 +00008390};
Guy Benyeib798fc92012-12-11 21:38:14 +00008391
Eric Christopherc48497a2015-09-18 21:26:24 +00008392class SPIR32TargetInfo : public SPIRTargetInfo {
8393public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008394 SPIR32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8395 : SPIRTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00008396 PointerWidth = PointerAlign = 32;
8397 SizeType = TargetInfo::UnsignedInt;
8398 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +00008399 resetDataLayout("e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
8400 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00008401 }
8402 void getTargetDefines(const LangOptions &Opts,
8403 MacroBuilder &Builder) const override {
8404 DefineStd(Builder, "SPIR32", Opts);
8405 }
8406};
Guy Benyeib798fc92012-12-11 21:38:14 +00008407
Eric Christopherc48497a2015-09-18 21:26:24 +00008408class SPIR64TargetInfo : public SPIRTargetInfo {
8409public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008410 SPIR64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8411 : SPIRTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00008412 PointerWidth = PointerAlign = 64;
8413 SizeType = TargetInfo::UnsignedLong;
8414 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00008415 resetDataLayout("e-i64:64-v16:16-v24:32-v32:32-v48:64-"
8416 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00008417 }
8418 void getTargetDefines(const LangOptions &Opts,
8419 MacroBuilder &Builder) const override {
8420 DefineStd(Builder, "SPIR64", Opts);
8421 }
8422};
Guy Benyeib798fc92012-12-11 21:38:14 +00008423
Robert Lytton0e076492013-08-13 09:43:10 +00008424class XCoreTargetInfo : public TargetInfo {
8425 static const Builtin::Info BuiltinInfo[];
8426public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008427 XCoreTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
8428 : TargetInfo(Triple) {
Robert Lytton0e076492013-08-13 09:43:10 +00008429 NoAsmVariants = true;
8430 LongLongAlign = 32;
8431 SuitableAlign = 32;
8432 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00008433 SizeType = UnsignedInt;
8434 PtrDiffType = SignedInt;
8435 IntPtrType = SignedInt;
8436 WCharType = UnsignedChar;
8437 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00008438 UseZeroLengthBitfieldAlignment = true;
James Y Knightb214cbc2016-03-04 19:00:41 +00008439 resetDataLayout("e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32"
8440 "-f64:32-a:0:32-n32");
Robert Lytton0e076492013-08-13 09:43:10 +00008441 }
Craig Topper3164f332014-03-11 03:39:26 +00008442 void getTargetDefines(const LangOptions &Opts,
8443 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008444 Builder.defineMacro("__XS1B__");
8445 }
Craig Topper6c03a542015-10-19 04:51:35 +00008446 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
8447 return llvm::makeArrayRef(BuiltinInfo,
8448 clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin);
Robert Lytton0e076492013-08-13 09:43:10 +00008449 }
Craig Topper3164f332014-03-11 03:39:26 +00008450 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008451 return TargetInfo::VoidPtrBuiltinVaList;
8452 }
Craig Topper3164f332014-03-11 03:39:26 +00008453 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008454 return "";
8455 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008456 ArrayRef<const char *> getGCCRegNames() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008457 static const char * const GCCRegNames[] = {
8458 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
8459 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
8460 };
Craig Topperf054e3a2015-10-19 03:52:27 +00008461 return llvm::makeArrayRef(GCCRegNames);
Robert Lytton0e076492013-08-13 09:43:10 +00008462 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008463 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8464 return None;
Robert Lytton0e076492013-08-13 09:43:10 +00008465 }
Craig Topper3164f332014-03-11 03:39:26 +00008466 bool validateAsmConstraint(const char *&Name,
8467 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008468 return false;
8469 }
Craig Topper3164f332014-03-11 03:39:26 +00008470 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00008471 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
8472 return (RegNo < 2)? RegNo : -1;
8473 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00008474 bool allowsLargerPreferedTypeAlignment() const override {
8475 return false;
8476 }
Robert Lytton0e076492013-08-13 09:43:10 +00008477};
8478
8479const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00008480#define BUILTIN(ID, TYPE, ATTRS) \
8481 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
8482#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
8483 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Robert Lytton0e076492013-08-13 09:43:10 +00008484#include "clang/Basic/BuiltinsXCore.def"
8485};
Robert Lytton0e076492013-08-13 09:43:10 +00008486
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008487// x86_32 Android target
8488class AndroidX86_32TargetInfo : public LinuxTargetInfo<X86_32TargetInfo> {
8489public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008490 AndroidX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8491 : LinuxTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008492 SuitableAlign = 32;
8493 LongDoubleWidth = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00008494 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008495 }
8496};
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008497
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008498// x86_64 Android target
8499class AndroidX86_64TargetInfo : public LinuxTargetInfo<X86_64TargetInfo> {
8500public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008501 AndroidX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8502 : LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Stephan Bergmann17c7f702016-12-14 11:57:17 +00008503 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008504 }
Chih-Hung Hsieh0b0eeaa2015-07-24 18:12:54 +00008505
8506 bool useFloat128ManglingForLongDouble() const override {
8507 return true;
8508 }
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008509};
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008510
8511// 32-bit RenderScript is armv7 with width and align of 'long' set to 8-bytes
8512class RenderScript32TargetInfo : public ARMleTargetInfo {
8513public:
8514 RenderScript32TargetInfo(const llvm::Triple &Triple,
8515 const TargetOptions &Opts)
8516 : ARMleTargetInfo(llvm::Triple("armv7", Triple.getVendorName(),
8517 Triple.getOSName(),
8518 Triple.getEnvironmentName()),
8519 Opts) {
Pirama Arumuga Nainarbb846a32016-07-27 19:01:51 +00008520 IsRenderScriptTarget = true;
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008521 LongWidth = LongAlign = 64;
8522 }
8523 void getTargetDefines(const LangOptions &Opts,
8524 MacroBuilder &Builder) const override {
8525 Builder.defineMacro("__RENDERSCRIPT__");
8526 ARMleTargetInfo::getTargetDefines(Opts, Builder);
8527 }
8528};
8529
8530// 64-bit RenderScript is aarch64
8531class RenderScript64TargetInfo : public AArch64leTargetInfo {
8532public:
8533 RenderScript64TargetInfo(const llvm::Triple &Triple,
8534 const TargetOptions &Opts)
8535 : AArch64leTargetInfo(llvm::Triple("aarch64", Triple.getVendorName(),
8536 Triple.getOSName(),
8537 Triple.getEnvironmentName()),
Pirama Arumuga Nainarbb846a32016-07-27 19:01:51 +00008538 Opts) {
8539 IsRenderScriptTarget = true;
8540 }
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008541
8542 void getTargetDefines(const LangOptions &Opts,
8543 MacroBuilder &Builder) const override {
8544 Builder.defineMacro("__RENDERSCRIPT__");
8545 AArch64leTargetInfo::getTargetDefines(Opts, Builder);
8546 }
8547};
8548
Dylan McKayecb6e7b2017-02-07 06:04:18 +00008549/// Information about a specific microcontroller.
8550struct MCUInfo {
8551 const char *Name;
8552 const char *DefineName;
8553};
8554
8555// This list should be kept up-to-date with AVRDevices.td in LLVM.
8556static ArrayRef<MCUInfo> AVRMcus = {
8557 { "at90s1200", "__AVR_AT90S1200__" },
Dylan McKay315edb02017-02-11 21:06:07 +00008558 { "attiny11", "__AVR_ATtiny11__" },
8559 { "attiny12", "__AVR_ATtiny12__" },
8560 { "attiny15", "__AVR_ATtiny15__" },
8561 { "attiny28", "__AVR_ATtiny28__" },
8562 { "at90s2313", "__AVR_AT90S2313__" },
8563 { "at90s2323", "__AVR_AT90S2323__" },
8564 { "at90s2333", "__AVR_AT90S2333__" },
8565 { "at90s2343", "__AVR_AT90S2343__" },
8566 { "attiny22", "__AVR_ATtiny22__" },
8567 { "attiny26", "__AVR_ATtiny26__" },
8568 { "at86rf401", "__AVR_AT86RF401__" },
8569 { "at90s4414", "__AVR_AT90S4414__" },
8570 { "at90s4433", "__AVR_AT90S4433__" },
8571 { "at90s4434", "__AVR_AT90S4434__" },
8572 { "at90s8515", "__AVR_AT90S8515__" },
8573 { "at90c8534", "__AVR_AT90c8534__" },
8574 { "at90s8535", "__AVR_AT90S8535__" },
8575 { "ata5272", "__AVR_ATA5272__" },
8576 { "attiny13", "__AVR_ATtiny13__" },
8577 { "attiny13a", "__AVR_ATtiny13A__" },
8578 { "attiny2313", "__AVR_ATtiny2313__" },
8579 { "attiny2313a", "__AVR_ATtiny2313A__" },
8580 { "attiny24", "__AVR_ATtiny24__" },
8581 { "attiny24a", "__AVR_ATtiny24A__" },
8582 { "attiny4313", "__AVR_ATtiny4313__" },
8583 { "attiny44", "__AVR_ATtiny44__" },
8584 { "attiny44a", "__AVR_ATtiny44A__" },
8585 { "attiny84", "__AVR_ATtiny84__" },
8586 { "attiny84a", "__AVR_ATtiny84A__" },
8587 { "attiny25", "__AVR_ATtiny25__" },
8588 { "attiny45", "__AVR_ATtiny45__" },
8589 { "attiny85", "__AVR_ATtiny85__" },
8590 { "attiny261", "__AVR_ATtiny261__" },
8591 { "attiny261a", "__AVR_ATtiny261A__" },
8592 { "attiny461", "__AVR_ATtiny461__" },
8593 { "attiny461a", "__AVR_ATtiny461A__" },
8594 { "attiny861", "__AVR_ATtiny861__" },
8595 { "attiny861a", "__AVR_ATtiny861A__" },
8596 { "attiny87", "__AVR_ATtiny87__" },
8597 { "attiny43u", "__AVR_ATtiny43U__" },
8598 { "attiny48", "__AVR_ATtiny48__" },
8599 { "attiny88", "__AVR_ATtiny88__" },
8600 { "attiny828", "__AVR_ATtiny828__" },
8601 { "at43usb355", "__AVR_AT43USB355__" },
8602 { "at76c711", "__AVR_AT76C711__" },
8603 { "atmega103", "__AVR_ATmega103__" },
8604 { "at43usb320", "__AVR_AT43USB320__" },
8605 { "attiny167", "__AVR_ATtiny167__" },
8606 { "at90usb82", "__AVR_AT90USB82__" },
8607 { "at90usb162", "__AVR_AT90USB162__" },
8608 { "ata5505", "__AVR_ATA5505__" },
8609 { "atmega8u2", "__AVR_ATmega8U2__" },
8610 { "atmega16u2", "__AVR_ATmega16U2__" },
8611 { "atmega32u2", "__AVR_ATmega32U2__" },
8612 { "attiny1634", "__AVR_ATtiny1634__" },
8613 { "atmega8", "__AVR_ATmega8__" },
8614 { "ata6289", "__AVR_ATA6289__" },
8615 { "atmega8a", "__AVR_ATmega8A__" },
8616 { "ata6285", "__AVR_ATA6285__" },
8617 { "ata6286", "__AVR_ATA6286__" },
8618 { "atmega48", "__AVR_ATmega48__" },
8619 { "atmega48a", "__AVR_ATmega48A__" },
8620 { "atmega48pa", "__AVR_ATmega48PA__" },
8621 { "atmega48p", "__AVR_ATmega48P__" },
8622 { "atmega88", "__AVR_ATmega88__" },
8623 { "atmega88a", "__AVR_ATmega88A__" },
8624 { "atmega88p", "__AVR_ATmega88P__" },
8625 { "atmega88pa", "__AVR_ATmega88PA__" },
8626 { "atmega8515", "__AVR_ATmega8515__" },
8627 { "atmega8535", "__AVR_ATmega8535__" },
8628 { "atmega8hva", "__AVR_ATmega8HVA__" },
8629 { "at90pwm1", "__AVR_AT90PWM1__" },
8630 { "at90pwm2", "__AVR_AT90PWM2__" },
8631 { "at90pwm2b", "__AVR_AT90PWM2B__" },
8632 { "at90pwm3", "__AVR_AT90PWM3__" },
8633 { "at90pwm3b", "__AVR_AT90PWM3B__" },
8634 { "at90pwm81", "__AVR_AT90PWM81__" },
8635 { "ata5790", "__AVR_ATA5790__" },
8636 { "ata5795", "__AVR_ATA5795__" },
8637 { "atmega16", "__AVR_ATmega16__" },
8638 { "atmega16a", "__AVR_ATmega16A__" },
8639 { "atmega161", "__AVR_ATmega161__" },
8640 { "atmega162", "__AVR_ATmega162__" },
8641 { "atmega163", "__AVR_ATmega163__" },
8642 { "atmega164a", "__AVR_ATmega164A__" },
8643 { "atmega164p", "__AVR_ATmega164P__" },
8644 { "atmega164pa", "__AVR_ATmega164PA__" },
8645 { "atmega165", "__AVR_ATmega165__" },
8646 { "atmega165a", "__AVR_ATmega165A__" },
8647 { "atmega165p", "__AVR_ATmega165P__" },
8648 { "atmega165pa", "__AVR_ATmega165PA__" },
8649 { "atmega168", "__AVR_ATmega168__" },
8650 { "atmega168a", "__AVR_ATmega168A__" },
8651 { "atmega168p", "__AVR_ATmega168P__" },
8652 { "atmega168pa", "__AVR_ATmega168PA__" },
8653 { "atmega169", "__AVR_ATmega169__" },
8654 { "atmega169a", "__AVR_ATmega169A__" },
8655 { "atmega169p", "__AVR_ATmega169P__" },
8656 { "atmega169pa", "__AVR_ATmega169PA__" },
8657 { "atmega32", "__AVR_ATmega32__" },
8658 { "atmega32a", "__AVR_ATmega32A__" },
8659 { "atmega323", "__AVR_ATmega323__" },
8660 { "atmega324a", "__AVR_ATmega324A__" },
8661 { "atmega324p", "__AVR_ATmega324P__" },
8662 { "atmega324pa", "__AVR_ATmega324PA__" },
8663 { "atmega325", "__AVR_ATmega325__" },
8664 { "atmega325a", "__AVR_ATmega325A__" },
8665 { "atmega325p", "__AVR_ATmega325P__" },
8666 { "atmega325pa", "__AVR_ATmega325PA__" },
8667 { "atmega3250", "__AVR_ATmega3250__" },
8668 { "atmega3250a", "__AVR_ATmega3250A__" },
8669 { "atmega3250p", "__AVR_ATmega3250P__" },
8670 { "atmega3250pa", "__AVR_ATmega3250PA__" },
8671 { "atmega328", "__AVR_ATmega328__" },
8672 { "atmega328p", "__AVR_ATmega328P__" },
8673 { "atmega329", "__AVR_ATmega329__" },
8674 { "atmega329a", "__AVR_ATmega329A__" },
8675 { "atmega329p", "__AVR_ATmega329P__" },
8676 { "atmega329pa", "__AVR_ATmega329PA__" },
8677 { "atmega3290", "__AVR_ATmega3290__" },
8678 { "atmega3290a", "__AVR_ATmega3290A__" },
8679 { "atmega3290p", "__AVR_ATmega3290P__" },
8680 { "atmega3290pa", "__AVR_ATmega3290PA__" },
8681 { "atmega406", "__AVR_ATmega406__" },
8682 { "atmega64", "__AVR_ATmega64__" },
8683 { "atmega64a", "__AVR_ATmega64A__" },
8684 { "atmega640", "__AVR_ATmega640__" },
8685 { "atmega644", "__AVR_ATmega644__" },
8686 { "atmega644a", "__AVR_ATmega644A__" },
8687 { "atmega644p", "__AVR_ATmega644P__" },
8688 { "atmega644pa", "__AVR_ATmega644PA__" },
8689 { "atmega645", "__AVR_ATmega645__" },
8690 { "atmega645a", "__AVR_ATmega645A__" },
8691 { "atmega645p", "__AVR_ATmega645P__" },
8692 { "atmega649", "__AVR_ATmega649__" },
8693 { "atmega649a", "__AVR_ATmega649A__" },
8694 { "atmega649p", "__AVR_ATmega649P__" },
8695 { "atmega6450", "__AVR_ATmega6450__" },
8696 { "atmega6450a", "__AVR_ATmega6450A__" },
8697 { "atmega6450p", "__AVR_ATmega6450P__" },
8698 { "atmega6490", "__AVR_ATmega6490__" },
8699 { "atmega6490a", "__AVR_ATmega6490A__" },
8700 { "atmega6490p", "__AVR_ATmega6490P__" },
8701 { "atmega64rfr2", "__AVR_ATmega64RFR2__" },
8702 { "atmega644rfr2", "__AVR_ATmega644RFR2__" },
8703 { "atmega16hva", "__AVR_ATmega16HVA__" },
8704 { "atmega16hva2", "__AVR_ATmega16HVA2__" },
8705 { "atmega16hvb", "__AVR_ATmega16HVB__" },
8706 { "atmega16hvbrevb", "__AVR_ATmega16HVBREVB__" },
8707 { "atmega32hvb", "__AVR_ATmega32HVB__" },
8708 { "atmega32hvbrevb", "__AVR_ATmega32HVBREVB__" },
8709 { "atmega64hve", "__AVR_ATmega64HVE__" },
8710 { "at90can32", "__AVR_AT90CAN32__" },
8711 { "at90can64", "__AVR_AT90CAN64__" },
8712 { "at90pwm161", "__AVR_AT90PWM161__" },
8713 { "at90pwm216", "__AVR_AT90PWM216__" },
8714 { "at90pwm316", "__AVR_AT90PWM316__" },
8715 { "atmega32c1", "__AVR_ATmega32C1__" },
8716 { "atmega64c1", "__AVR_ATmega64C1__" },
8717 { "atmega16m1", "__AVR_ATmega16M1__" },
8718 { "atmega32m1", "__AVR_ATmega32M1__" },
8719 { "atmega64m1", "__AVR_ATmega64M1__" },
8720 { "atmega16u4", "__AVR_ATmega16U4__" },
8721 { "atmega32u4", "__AVR_ATmega32U4__" },
8722 { "atmega32u6", "__AVR_ATmega32U6__" },
8723 { "at90usb646", "__AVR_AT90USB646__" },
8724 { "at90usb647", "__AVR_AT90USB647__" },
8725 { "at90scr100", "__AVR_AT90SCR100__" },
8726 { "at94k", "__AVR_AT94K__" },
8727 { "m3000", "__AVR_AT000__" },
8728 { "atmega128", "__AVR_ATmega128__" },
8729 { "atmega128a", "__AVR_ATmega128A__" },
8730 { "atmega1280", "__AVR_ATmega1280__" },
8731 { "atmega1281", "__AVR_ATmega1281__" },
8732 { "atmega1284", "__AVR_ATmega1284__" },
8733 { "atmega1284p", "__AVR_ATmega1284P__" },
8734 { "atmega128rfa1", "__AVR_ATmega128RFA1__" },
8735 { "atmega128rfr2", "__AVR_ATmega128RFR2__" },
8736 { "atmega1284rfr2", "__AVR_ATmega1284RFR2__" },
8737 { "at90can128", "__AVR_AT90CAN128__" },
8738 { "at90usb1286", "__AVR_AT90USB1286__" },
8739 { "at90usb1287", "__AVR_AT90USB1287__" },
8740 { "atmega2560", "__AVR_ATmega2560__" },
8741 { "atmega2561", "__AVR_ATmega2561__" },
8742 { "atmega256rfr2", "__AVR_ATmega256RFR2__" },
8743 { "atmega2564rfr2", "__AVR_ATmega2564RFR2__" },
8744 { "atxmega16a4", "__AVR_ATxmega16A4__" },
8745 { "atxmega16a4u", "__AVR_ATxmega16a4U__" },
8746 { "atxmega16c4", "__AVR_ATxmega16C4__" },
8747 { "atxmega16d4", "__AVR_ATxmega16D4__" },
8748 { "atxmega32a4", "__AVR_ATxmega32A4__" },
8749 { "atxmega32a4u", "__AVR_ATxmega32A4U__" },
8750 { "atxmega32c4", "__AVR_ATxmega32C4__" },
8751 { "atxmega32d4", "__AVR_ATxmega32D4__" },
8752 { "atxmega32e5", "__AVR_ATxmega32E5__" },
8753 { "atxmega16e5", "__AVR_ATxmega16E5__" },
8754 { "atxmega8e5", "__AVR_ATxmega8E5__" },
8755 { "atxmega32x1", "__AVR_ATxmega32X1__" },
8756 { "atxmega64a3", "__AVR_ATxmega64A3__" },
8757 { "atxmega64a3u", "__AVR_ATxmega64A3U__" },
8758 { "atxmega64a4u", "__AVR_ATxmega64A4U__" },
8759 { "atxmega64b1", "__AVR_ATxmega64B1__" },
8760 { "atxmega64b3", "__AVR_ATxmega64B3__" },
8761 { "atxmega64c3", "__AVR_ATxmega64C3__" },
8762 { "atxmega64d3", "__AVR_ATxmega64D3__" },
8763 { "atxmega64d4", "__AVR_ATxmega64D4__" },
8764 { "atxmega64a1", "__AVR_ATxmega64A1__" },
8765 { "atxmega64a1u", "__AVR_ATxmega64A1U__" },
8766 { "atxmega128a3", "__AVR_ATxmega128A3__" },
8767 { "atxmega128a3u", "__AVR_ATxmega128A3U__" },
8768 { "atxmega128b1", "__AVR_ATxmega128B1__" },
8769 { "atxmega128b3", "__AVR_ATxmega128B3__" },
8770 { "atxmega128c3", "__AVR_ATxmega128C3__" },
8771 { "atxmega128d3", "__AVR_ATxmega128D3__" },
8772 { "atxmega128d4", "__AVR_ATxmega128D4__" },
8773 { "atxmega192a3", "__AVR_ATxmega192A3__" },
8774 { "atxmega192a3u", "__AVR_ATxmega192A3U__" },
8775 { "atxmega192c3", "__AVR_ATxmega192C3__" },
8776 { "atxmega192d3", "__AVR_ATxmega192D3__" },
8777 { "atxmega256a3", "__AVR_ATxmega256A3__" },
8778 { "atxmega256a3u", "__AVR_ATxmega256A3U__" },
8779 { "atxmega256a3b", "__AVR_ATxmega256A3B__" },
8780 { "atxmega256a3bu", "__AVR_ATxmega256A3BU__" },
8781 { "atxmega256c3", "__AVR_ATxmega256C3__" },
8782 { "atxmega256d3", "__AVR_ATxmega256D3__" },
8783 { "atxmega384c3", "__AVR_ATxmega384C3__" },
8784 { "atxmega384d3", "__AVR_ATxmega384D3__" },
8785 { "atxmega128a1", "__AVR_ATxmega128A1__" },
8786 { "atxmega128a1u", "__AVR_ATxmega128A1U__" },
8787 { "atxmega128a4u", "__AVR_ATxmega128a4U__" },
8788 { "attiny4", "__AVR_ATtiny4__" },
8789 { "attiny5", "__AVR_ATtiny5__" },
8790 { "attiny9", "__AVR_ATtiny9__" },
8791 { "attiny10", "__AVR_ATtiny10__" },
8792 { "attiny20", "__AVR_ATtiny20__" },
8793 { "attiny40", "__AVR_ATtiny40__" },
8794 { "attiny102", "__AVR_ATtiny102__" },
8795 { "attiny104", "__AVR_ATtiny104__" },
Dylan McKayecb6e7b2017-02-07 06:04:18 +00008796};
Dylan McKay924fa3a2017-01-05 05:20:27 +00008797
8798// AVR Target
8799class AVRTargetInfo : public TargetInfo {
8800public:
8801 AVRTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
8802 : TargetInfo(Triple) {
8803 TLSSupported = false;
8804 PointerWidth = 16;
8805 PointerAlign = 8;
8806 IntWidth = 16;
8807 IntAlign = 8;
8808 LongWidth = 32;
8809 LongAlign = 8;
8810 LongLongWidth = 64;
8811 LongLongAlign = 8;
8812 SuitableAlign = 8;
8813 DefaultAlignForAttributeAligned = 8;
8814 HalfWidth = 16;
8815 HalfAlign = 8;
8816 FloatWidth = 32;
8817 FloatAlign = 8;
8818 DoubleWidth = 32;
8819 DoubleAlign = 8;
8820 DoubleFormat = &llvm::APFloat::IEEEsingle();
8821 LongDoubleWidth = 32;
8822 LongDoubleAlign = 8;
8823 LongDoubleFormat = &llvm::APFloat::IEEEsingle();
8824 SizeType = UnsignedInt;
8825 PtrDiffType = SignedInt;
8826 IntPtrType = SignedInt;
8827 Char16Type = UnsignedInt;
8828 WCharType = SignedInt;
8829 WIntType = SignedInt;
8830 Char32Type = UnsignedLong;
8831 SigAtomicType = SignedChar;
8832 resetDataLayout("e-p:16:16:16-i8:8:8-i16:16:16-i32:32:32-i64:64:64"
8833 "-f32:32:32-f64:64:64-n8");
8834 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008835
Dylan McKay924fa3a2017-01-05 05:20:27 +00008836 void getTargetDefines(const LangOptions &Opts,
8837 MacroBuilder &Builder) const override {
Dylan McKayecb6e7b2017-02-07 06:04:18 +00008838 Builder.defineMacro("AVR");
8839 Builder.defineMacro("__AVR");
Dylan McKay924fa3a2017-01-05 05:20:27 +00008840 Builder.defineMacro("__AVR__");
Dylan McKayecb6e7b2017-02-07 06:04:18 +00008841
8842 if (!this->CPU.empty()) {
8843 auto It = std::find_if(AVRMcus.begin(), AVRMcus.end(),
8844 [&](const MCUInfo &Info) { return Info.Name == this->CPU; });
8845
8846 if (It != AVRMcus.end())
8847 Builder.defineMacro(It->DefineName);
8848 }
Dylan McKay924fa3a2017-01-05 05:20:27 +00008849 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008850
Dylan McKay924fa3a2017-01-05 05:20:27 +00008851 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
8852 return None;
8853 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008854
Dylan McKay924fa3a2017-01-05 05:20:27 +00008855 BuiltinVaListKind getBuiltinVaListKind() const override {
8856 return TargetInfo::VoidPtrBuiltinVaList;
8857 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008858
Dylan McKay924fa3a2017-01-05 05:20:27 +00008859 const char *getClobbers() const override {
8860 return "";
8861 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008862
Dylan McKay924fa3a2017-01-05 05:20:27 +00008863 ArrayRef<const char *> getGCCRegNames() const override {
8864 static const char * const GCCRegNames[] = {
8865 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
8866 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
8867 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
Dylan McKay95aa2652017-01-05 07:17:46 +00008868 "r24", "r25", "X", "Y", "Z", "SP"
Dylan McKay924fa3a2017-01-05 05:20:27 +00008869 };
8870 return llvm::makeArrayRef(GCCRegNames);
8871 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008872
Dylan McKay924fa3a2017-01-05 05:20:27 +00008873 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8874 return None;
8875 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008876
Dylan McKay924fa3a2017-01-05 05:20:27 +00008877 ArrayRef<TargetInfo::AddlRegName> getGCCAddlRegNames() const override {
8878 static const TargetInfo::AddlRegName AddlRegNames[] = {
8879 { { "r26", "r27"}, 26 },
8880 { { "r28", "r29"}, 27 },
8881 { { "r30", "r31"}, 28 },
8882 { { "SPL", "SPH"}, 29 },
8883 };
8884 return llvm::makeArrayRef(AddlRegNames);
8885 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008886
Dylan McKay924fa3a2017-01-05 05:20:27 +00008887 bool validateAsmConstraint(const char *&Name,
8888 TargetInfo::ConstraintInfo &Info) const override {
Dylan McKayd31534c2017-02-06 09:01:59 +00008889 // There aren't any multi-character AVR specific constraints.
8890 if (StringRef(Name).size() > 1) return false;
8891
8892 switch (*Name) {
8893 default: return false;
8894 case 'a': // Simple upper registers
8895 case 'b': // Base pointer registers pairs
8896 case 'd': // Upper register
8897 case 'l': // Lower registers
8898 case 'e': // Pointer register pairs
8899 case 'q': // Stack pointer register
8900 case 'r': // Any register
8901 case 'w': // Special upper register pairs
8902 case 't': // Temporary register
8903 case 'x': case 'X': // Pointer register pair X
8904 case 'y': case 'Y': // Pointer register pair Y
8905 case 'z': case 'Z': // Pointer register pair Z
8906 Info.setAllowsRegister();
8907 return true;
8908 case 'I': // 6-bit positive integer constant
8909 Info.setRequiresImmediate(0, 63);
8910 return true;
8911 case 'J': // 6-bit negative integer constant
8912 Info.setRequiresImmediate(-63, 0);
8913 return true;
8914 case 'K': // Integer constant (Range: 2)
8915 Info.setRequiresImmediate(2);
8916 return true;
8917 case 'L': // Integer constant (Range: 0)
8918 Info.setRequiresImmediate(0);
8919 return true;
8920 case 'M': // 8-bit integer constant
8921 Info.setRequiresImmediate(0, 0xff);
8922 return true;
8923 case 'N': // Integer constant (Range: -1)
8924 Info.setRequiresImmediate(-1);
8925 return true;
8926 case 'O': // Integer constant (Range: 8, 16, 24)
8927 Info.setRequiresImmediate({8, 16, 24});
8928 return true;
8929 case 'P': // Integer constant (Range: 1)
8930 Info.setRequiresImmediate(1);
8931 return true;
8932 case 'R': // Integer constant (Range: -6 to 5)
8933 Info.setRequiresImmediate(-6, 5);
8934 return true;
8935 case 'G': // Floating point constant
8936 case 'Q': // A memory address based on Y or Z pointer with displacement.
8937 return true;
8938 }
8939
Dylan McKay924fa3a2017-01-05 05:20:27 +00008940 return false;
8941 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008942
Dylan McKay924fa3a2017-01-05 05:20:27 +00008943 IntType getIntTypeByWidth(unsigned BitWidth,
8944 bool IsSigned) const final {
8945 // AVR prefers int for 16-bit integers.
8946 return BitWidth == 16 ? (IsSigned ? SignedInt : UnsignedInt)
8947 : TargetInfo::getIntTypeByWidth(BitWidth, IsSigned);
8948 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008949
Dylan McKay924fa3a2017-01-05 05:20:27 +00008950 IntType getLeastIntTypeByWidth(unsigned BitWidth,
8951 bool IsSigned) const final {
8952 // AVR uses int for int_least16_t and int_fast16_t.
8953 return BitWidth == 16
8954 ? (IsSigned ? SignedInt : UnsignedInt)
8955 : TargetInfo::getLeastIntTypeByWidth(BitWidth, IsSigned);
8956 }
Dylan McKayecb6e7b2017-02-07 06:04:18 +00008957
8958 bool setCPU(const std::string &Name) override {
8959 bool IsFamily = llvm::StringSwitch<bool>(Name)
8960 .Case("avr1", true)
8961 .Case("avr2", true)
8962 .Case("avr25", true)
8963 .Case("avr3", true)
8964 .Case("avr31", true)
8965 .Case("avr35", true)
8966 .Case("avr4", true)
8967 .Case("avr5", true)
8968 .Case("avr51", true)
8969 .Case("avr6", true)
8970 .Case("avrxmega1", true)
8971 .Case("avrxmega2", true)
8972 .Case("avrxmega3", true)
8973 .Case("avrxmega4", true)
8974 .Case("avrxmega5", true)
8975 .Case("avrxmega6", true)
8976 .Case("avrxmega7", true)
8977 .Case("avrtiny", true)
8978 .Default(false);
8979
8980 if (IsFamily) this->CPU = Name;
8981
8982 bool IsMCU = std::find_if(AVRMcus.begin(), AVRMcus.end(),
8983 [&](const MCUInfo &Info) { return Info.Name == Name; }) != AVRMcus.end();
8984
8985 if (IsMCU) this->CPU = Name;
8986
8987 return IsFamily || IsMCU;
8988 }
8989
8990protected:
8991 std::string CPU;
Dylan McKay924fa3a2017-01-05 05:20:27 +00008992};
8993
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008994} // end anonymous namespace
8995
Chris Lattner5ba61f02006-10-14 07:39:34 +00008996//===----------------------------------------------------------------------===//
8997// Driver code
8998//===----------------------------------------------------------------------===//
8999
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009000static TargetInfo *AllocateTarget(const llvm::Triple &Triple,
9001 const TargetOptions &Opts) {
Daniel Dunbar52322032009-08-18 05:47:58 +00009002 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00009003
Daniel Dunbar52322032009-08-18 05:47:58 +00009004 switch (Triple.getArch()) {
9005 default:
Craig Topperf1186c52014-05-08 06:41:40 +00009006 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00009007
Tim Northover2a0783d2014-05-30 14:14:07 +00009008 case llvm::Triple::xcore:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009009 return new XCoreTargetInfo(Triple, Opts);
Tim Northover2a0783d2014-05-30 14:14:07 +00009010
9011 case llvm::Triple::hexagon:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009012 return new HexagonTargetInfo(Triple, Opts);
Tim Northover2a0783d2014-05-30 14:14:07 +00009013
Jacques Pienaard964cc22016-03-28 21:02:54 +00009014 case llvm::Triple::lanai:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009015 return new LanaiTargetInfo(Triple, Opts);
Jacques Pienaard964cc22016-03-28 21:02:54 +00009016
Tim Northover2a0783d2014-05-30 14:14:07 +00009017 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00009018 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009019 return new DarwinAArch64TargetInfo(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00009020
9021 switch (os) {
Ed Schoutenea9448e2015-10-15 15:07:07 +00009022 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009023 return new CloudABITargetInfo<AArch64leTargetInfo>(Triple, Opts);
Ed Maste6a9eda52014-11-13 16:55:42 +00009024 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009025 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Petr Hosek9834fcd2016-10-24 22:55:57 +00009026 case llvm::Triple::Fuchsia:
9027 return new FuchsiaTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00009028 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009029 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple, Opts);
James Molloy5e73df52014-04-16 15:06:20 +00009030 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009031 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Brad Smith9aa2bf22017-02-21 23:13:09 +00009032 case llvm::Triple::OpenBSD:
9033 return new OpenBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00009034 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009035 return new AArch64leTargetInfo(Triple, Opts);
James Molloy5e73df52014-04-16 15:06:20 +00009036 }
9037
Christian Pirker9b019ae2014-02-25 13:51:00 +00009038 case llvm::Triple::aarch64_be:
9039 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00009040 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009041 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Petr Hosek9834fcd2016-10-24 22:55:57 +00009042 case llvm::Triple::Fuchsia:
9043 return new FuchsiaTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00009044 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009045 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00009046 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009047 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00009048 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009049 return new AArch64beTargetInfo(Triple, Opts);
Tim Northover9bb857a2013-01-31 12:13:10 +00009050 }
9051
Daniel Dunbar52322032009-08-18 05:47:58 +00009052 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00009053 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00009054 if (Triple.isOSBinFormatMachO())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009055 return new DarwinARMTargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00009056
Daniel Dunbar52322032009-08-18 05:47:58 +00009057 switch (os) {
Ed Schoutenc6d1a732016-09-05 18:38:34 +00009058 case llvm::Triple::CloudABI:
9059 return new CloudABITargetInfo<ARMleTargetInfo>(Triple, Opts);
Rafael Espindolaad8fed52010-06-10 00:46:51 +00009060 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009061 return new LinuxTargetInfo<ARMleTargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009062 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009063 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009064 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009065 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00009066 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009067 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00009068 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009069 return new BitrigTargetInfo<ARMleTargetInfo>(Triple, Opts);
Douglas Gregor9fabd852011-07-01 22:41:14 +00009070 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009071 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00009072 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009073 return new NaClTargetInfo<ARMleTargetInfo>(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00009074 case llvm::Triple::Win32:
9075 switch (Triple.getEnvironment()) {
Yaron Keren321249c2015-07-15 13:32:23 +00009076 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009077 return new CygwinARMTargetInfo(Triple, Opts);
Yaron Keren321249c2015-07-15 13:32:23 +00009078 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009079 return new MinGWARMTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00009080 case llvm::Triple::Itanium:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009081 return new ItaniumWindowsARMleTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00009082 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00009083 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009084 return new MicrosoftARMleTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00009085 }
Daniel Dunbar52322032009-08-18 05:47:58 +00009086 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009087 return new ARMleTargetInfo(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009088 }
9089
9090 case llvm::Triple::armeb:
9091 case llvm::Triple::thumbeb:
9092 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009093 return new DarwinARMTargetInfo(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009094
9095 switch (os) {
9096 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009097 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009098 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009099 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009100 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009101 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009102 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009103 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009104 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009105 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009106 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009107 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009108 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009109 return new NaClTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009110 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009111 return new ARMbeTargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009112 }
Eli Friedmanb5366062008-05-20 14:21:01 +00009113
Dylan McKay924fa3a2017-01-05 05:20:27 +00009114 case llvm::Triple::avr:
9115 return new AVRTargetInfo(Triple, Opts);
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00009116 case llvm::Triple::bpfeb:
9117 case llvm::Triple::bpfel:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009118 return new BPFTargetInfo(Triple, Opts);
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00009119
Daniel Dunbar52322032009-08-18 05:47:58 +00009120 case llvm::Triple::msp430:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009121 return new MSP430TargetInfo(Triple, Opts);
Eli Friedmanb5366062008-05-20 14:21:01 +00009122
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00009123 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009124 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009125 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00009126 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009127 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00009128 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009129 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009130 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009131 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009132 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009133 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00009134 return new MipsTargetInfo(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009135 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00009136
9137 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009138 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009139 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00009140 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009141 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00009142 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009143 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009144 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009145 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009146 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00009147 case llvm::Triple::NaCl:
Daniel Sanders4672af62016-05-27 11:51:02 +00009148 return new NaClTargetInfo<NaClMips32TargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009149 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00009150 return new MipsTargetInfo(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009151 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00009152
Akira Hatanakabef17452011-09-20 19:21:49 +00009153 case llvm::Triple::mips64:
9154 switch (os) {
9155 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00009156 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009157 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00009158 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009159 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009160 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009161 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009162 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00009163 case llvm::Triple::OpenBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009164 return new OpenBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009165 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00009166 return new MipsTargetInfo(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009167 }
9168
9169 case llvm::Triple::mips64el:
9170 switch (os) {
9171 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00009172 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009173 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00009174 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009175 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009176 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009177 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009178 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00009179 case llvm::Triple::OpenBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009180 return new OpenBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009181 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00009182 return new MipsTargetInfo(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009183 }
9184
Ivan Krasindd7403e2011-08-24 20:22:22 +00009185 case llvm::Triple::le32:
9186 switch (os) {
Douglas Katzman78d7c542015-05-12 21:18:10 +00009187 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009188 return new NaClTargetInfo<PNaClTargetInfo>(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00009189 default:
9190 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00009191 }
9192
JF Bastien643817d2014-09-12 17:52:47 +00009193 case llvm::Triple::le64:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009194 return new Le64TargetInfo(Triple, Opts);
JF Bastien643817d2014-09-12 17:52:47 +00009195
Daniel Dunbar52322032009-08-18 05:47:58 +00009196 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00009197 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009198 return new DarwinPPC32TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009199 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00009200 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009201 return new LinuxTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009202 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009203 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009204 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009205 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00009206 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009207 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009208 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009209 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009210 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009211 return new PPC32TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009212 }
Daniel Dunbar52322032009-08-18 05:47:58 +00009213
9214 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00009215 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009216 return new DarwinPPC64TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009217 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00009218 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009219 return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009220 case llvm::Triple::Lv2:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009221 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009222 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009223 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009224 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009225 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009226 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009227 return new PPC64TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009228 }
Daniel Dunbar52322032009-08-18 05:47:58 +00009229
Bill Schmidt778d3872013-07-26 01:36:11 +00009230 case llvm::Triple::ppc64le:
9231 switch (os) {
9232 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009233 return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger22a2d992015-04-10 20:53:48 +00009234 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009235 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Bill Schmidt778d3872013-07-26 01:36:11 +00009236 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009237 return new PPC64TargetInfo(Triple, Opts);
Bill Schmidt778d3872013-07-26 01:36:11 +00009238 }
9239
Peter Collingbournec947aae2012-05-20 23:28:41 +00009240 case llvm::Triple::nvptx:
Justin Lebarb6626592017-01-05 16:53:21 +00009241 return new NVPTXTargetInfo(Triple, Opts, /*TargetPointerWidth=*/32);
Peter Collingbournec947aae2012-05-20 23:28:41 +00009242 case llvm::Triple::nvptx64:
Justin Lebarb6626592017-01-05 16:53:21 +00009243 return new NVPTXTargetInfo(Triple, Opts, /*TargetPointerWidth=*/64);
Peter Collingbournec947aae2012-05-20 23:28:41 +00009244
Tom Stellardd8e38a32015-01-06 20:34:47 +00009245 case llvm::Triple::amdgcn:
Eli Friedmand13b41e2012-10-12 23:32:00 +00009246 case llvm::Triple::r600:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009247 return new AMDGPUTargetInfo(Triple, Opts);
Eli Friedmand13b41e2012-10-12 23:32:00 +00009248
Daniel Dunbar52322032009-08-18 05:47:58 +00009249 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009250 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00009251 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009252 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009253 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009254 return new SolarisTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009255 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009256 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00009257 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009258 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009259 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009260 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009261 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009262 return new SparcV8TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009263 }
Daniel Dunbar52322032009-08-18 05:47:58 +00009264
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009265 // The 'sparcel' architecture copies all the above cases except for Solaris.
9266 case llvm::Triple::sparcel:
9267 switch (os) {
9268 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009269 return new LinuxTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009270 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009271 return new NetBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009272 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009273 return new OpenBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009274 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009275 return new RTEMSTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009276 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009277 return new SparcV8elTargetInfo(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009278 }
9279
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009280 case llvm::Triple::sparcv9:
9281 switch (os) {
9282 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009283 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009284 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009285 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009286 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009287 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009288 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009289 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009290 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009291 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009292 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009293 return new SparcV9TargetInfo(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009294 }
9295
Ulrich Weigand47445072013-05-06 16:26:41 +00009296 case llvm::Triple::systemz:
9297 switch (os) {
9298 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009299 return new LinuxTargetInfo<SystemZTargetInfo>(Triple, Opts);
Ulrich Weigand47445072013-05-06 16:26:41 +00009300 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009301 return new SystemZTargetInfo(Triple, Opts);
Ulrich Weigand47445072013-05-06 16:26:41 +00009302 }
9303
Eli Friedmana9c3d712009-08-19 20:47:07 +00009304 case llvm::Triple::tce:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009305 return new TCETargetInfo(Triple, Opts);
Eli Friedmana9c3d712009-08-19 20:47:07 +00009306
Pekka Jaaskelainen67354482016-11-16 15:22:31 +00009307 case llvm::Triple::tcele:
9308 return new TCELETargetInfo(Triple, Opts);
9309
Daniel Dunbar52322032009-08-18 05:47:58 +00009310 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00009311 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009312 return new DarwinI386TargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00009313
Daniel Dunbar52322032009-08-18 05:47:58 +00009314 switch (os) {
Ed Schouten7893e682015-06-13 21:33:49 +00009315 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009316 return new CloudABITargetInfo<X86_32TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009317 case llvm::Triple::Linux: {
9318 switch (Triple.getEnvironment()) {
9319 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009320 return new LinuxTargetInfo<X86_32TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009321 case llvm::Triple::Android:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009322 return new AndroidX86_32TargetInfo(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009323 }
9324 }
Daniel Dunbar52322032009-08-18 05:47:58 +00009325 case llvm::Triple::DragonFly:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009326 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009327 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009328 return new NetBSDI386TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009329 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009330 return new OpenBSDI386TargetInfo(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00009331 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009332 return new BitrigI386TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009333 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009334 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00009335 case llvm::Triple::KFreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009336 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009337 case llvm::Triple::Minix:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009338 return new MinixTargetInfo<X86_32TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009339 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009340 return new SolarisTargetInfo<X86_32TargetInfo>(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009341 case llvm::Triple::Win32: {
9342 switch (Triple.getEnvironment()) {
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009343 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009344 return new CygwinX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009345 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009346 return new MinGWX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00009347 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009348 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00009349 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009350 return new MicrosoftX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009351 }
9352 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00009353 case llvm::Triple::Haiku:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009354 return new HaikuX86_32TargetInfo(Triple, Opts);
Douglas Gregor9fabd852011-07-01 22:41:14 +00009355 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009356 return new RTEMSX86_32TargetInfo(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00009357 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009358 return new NaClTargetInfo<X86_32TargetInfo>(Triple, Opts);
Alexey Bataevc99b0492015-11-25 09:24:26 +00009359 case llvm::Triple::ELFIAMCU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009360 return new MCUX86_32TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009361 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009362 return new X86_32TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009363 }
9364
9365 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009366 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009367 return new DarwinX86_64TargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00009368
Daniel Dunbar52322032009-08-18 05:47:58 +00009369 switch (os) {
Ed Schoutenf33c6072015-03-11 08:42:46 +00009370 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009371 return new CloudABITargetInfo<X86_64TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009372 case llvm::Triple::Linux: {
9373 switch (Triple.getEnvironment()) {
9374 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009375 return new LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009376 case llvm::Triple::Android:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009377 return new AndroidX86_64TargetInfo(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009378 }
9379 }
Chris Lattner002ba6b2010-01-09 05:41:14 +00009380 case llvm::Triple::DragonFly:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009381 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009382 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009383 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009384 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009385 return new OpenBSDX86_64TargetInfo(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00009386 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009387 return new BitrigX86_64TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009388 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009389 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Petr Hosek9834fcd2016-10-24 22:55:57 +00009390 case llvm::Triple::Fuchsia:
9391 return new FuchsiaTargetInfo<X86_64TargetInfo>(Triple, Opts);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00009392 case llvm::Triple::KFreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009393 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009394 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009395 return new SolarisTargetInfo<X86_64TargetInfo>(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009396 case llvm::Triple::Win32: {
9397 switch (Triple.getEnvironment()) {
Yaron Kerend030d112015-07-22 17:38:19 +00009398 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009399 return new CygwinX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009400 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009401 return new MinGWX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009402 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00009403 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009404 return new MicrosoftX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009405 }
9406 }
Reid Kleckner330fb172016-05-11 16:19:05 +00009407 case llvm::Triple::Haiku:
9408 return new HaikuTargetInfo<X86_64TargetInfo>(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00009409 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009410 return new NaClTargetInfo<X86_64TargetInfo>(Triple, Opts);
Alex Rosenberg12207fa2015-01-27 14:47:44 +00009411 case llvm::Triple::PS4:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009412 return new PS4OSTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009413 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009414 return new X86_64TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009415 }
Guy Benyeib798fc92012-12-11 21:38:14 +00009416
Douglas Katzman78d7c542015-05-12 21:18:10 +00009417 case llvm::Triple::spir: {
9418 if (Triple.getOS() != llvm::Triple::UnknownOS ||
9419 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
9420 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009421 return new SPIR32TargetInfo(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00009422 }
9423 case llvm::Triple::spir64: {
9424 if (Triple.getOS() != llvm::Triple::UnknownOS ||
9425 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
9426 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009427 return new SPIR64TargetInfo(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00009428 }
Dan Gohmanc2853072015-09-03 22:51:53 +00009429 case llvm::Triple::wasm32:
Dan Gohman839f2152017-01-17 21:46:38 +00009430 if (Triple.getSubArch() != llvm::Triple::NoSubArch ||
9431 Triple.getVendor() != llvm::Triple::UnknownVendor ||
9432 Triple.getOS() != llvm::Triple::UnknownOS ||
9433 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment ||
9434 !(Triple.isOSBinFormatELF() || Triple.isOSBinFormatWasm()))
Dan Gohmanc2853072015-09-03 22:51:53 +00009435 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009436 return new WebAssemblyOSTargetInfo<WebAssembly32TargetInfo>(Triple, Opts);
Dan Gohmanc2853072015-09-03 22:51:53 +00009437 case llvm::Triple::wasm64:
Dan Gohman839f2152017-01-17 21:46:38 +00009438 if (Triple.getSubArch() != llvm::Triple::NoSubArch ||
9439 Triple.getVendor() != llvm::Triple::UnknownVendor ||
9440 Triple.getOS() != llvm::Triple::UnknownOS ||
9441 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment ||
9442 !(Triple.isOSBinFormatELF() || Triple.isOSBinFormatWasm()))
Dan Gohmanc2853072015-09-03 22:51:53 +00009443 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009444 return new WebAssemblyOSTargetInfo<WebAssembly64TargetInfo>(Triple, Opts);
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00009445
9446 case llvm::Triple::renderscript32:
9447 return new LinuxTargetInfo<RenderScript32TargetInfo>(Triple, Opts);
9448 case llvm::Triple::renderscript64:
9449 return new LinuxTargetInfo<RenderScript64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009450 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00009451}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009452
9453/// CreateTargetInfo - Return the target info object for the specified target
Eric Christophere4f73b32015-08-07 19:07:08 +00009454/// options.
Alp Toker80758082014-07-06 05:26:44 +00009455TargetInfo *
9456TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
Saleem Abdulrasool10a49722016-04-08 16:52:00 +00009457 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00009458 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009459
9460 // Construct the target
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009461 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple, *Opts));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009462 if (!Target) {
9463 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00009464 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009465 }
Alp Toker80758082014-07-06 05:26:44 +00009466 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009467
Daniel Dunbaracde99e2009-12-18 18:42:37 +00009468 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00009469 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
9470 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00009471 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00009472 }
9473
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009474 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00009475 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
9476 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00009477 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009478 }
9479
Rafael Espindolaeb265472013-08-21 21:59:03 +00009480 // Set the fp math unit.
9481 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
9482 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00009483 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00009484 }
9485
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009486 // Compute the default target features, we need the target to handle this
9487 // because features may have dependencies on one another.
9488 llvm::StringMap<bool> Features;
Eric Christopher007b0a02015-08-28 22:32:01 +00009489 if (!Target->initFeatureMap(Features, Diags, Opts->CPU,
9490 Opts->FeaturesAsWritten))
Eric Christopher6b454372015-08-25 13:45:24 +00009491 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009492
9493 // Add the features to the compile options.
Douglas Gregorf8715de2012-11-16 04:24:59 +00009494 Opts->Features.clear();
Aaron Ballmanb226d3d2015-08-12 13:38:59 +00009495 for (const auto &F : Features)
9496 Opts->Features.push_back((F.getValue() ? "+" : "-") + F.getKey().str());
9497
Eric Christopher3ff21b32013-10-16 21:26:26 +00009498 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00009499 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009500
Yaxun Liu39cf40f2016-05-16 17:06:34 +00009501 Target->setSupportedOpenCLOpts();
Alexey Bader0ea07532016-11-01 15:50:52 +00009502 Target->setOpenCLExtensionOpts();
Yaxun Liu39cf40f2016-05-16 17:06:34 +00009503
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00009504 if (!Target->validateTarget(Diags))
9505 return nullptr;
9506
Ahmed Charles9a16beb2014-03-07 19:33:25 +00009507 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009508}