blob: 22105184586c307958423ec7b8b28cddea5609cb [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.
Hal Finkel6b984f02012-07-03 16:51:04 +00001253 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
1254 .Case("440", ArchDefineName)
1255 .Case("450", ArchDefineName | ArchDefine440)
1256 .Case("601", ArchDefineName)
1257 .Case("602", ArchDefineName | ArchDefinePpcgr)
1258 .Case("603", ArchDefineName | ArchDefinePpcgr)
1259 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1260 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1261 .Case("604", ArchDefineName | ArchDefinePpcgr)
1262 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
1263 .Case("620", ArchDefineName | ArchDefinePpcgr)
Bill Schmidt38378a02013-02-01 20:23:10 +00001264 .Case("630", ArchDefineName | ArchDefinePpcgr)
Hal Finkel6b984f02012-07-03 16:51:04 +00001265 .Case("7400", ArchDefineName | ArchDefinePpcgr)
1266 .Case("7450", ArchDefineName | ArchDefinePpcgr)
1267 .Case("750", ArchDefineName | ArchDefinePpcgr)
1268 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1269 | ArchDefinePpcsq)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001270 .Case("a2", ArchDefineA2)
1271 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
Bill Schmidt38378a02013-02-01 20:23:10 +00001272 .Case("pwr3", ArchDefinePpcgr)
1273 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
1274 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1275 | ArchDefinePpcsq)
1276 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4
1277 | ArchDefinePpcgr | ArchDefinePpcsq)
1278 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5
1279 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1280 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x
1281 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1282 | ArchDefinePpcsq)
1283 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6
1284 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001285 | ArchDefinePpcgr | ArchDefinePpcsq)
1286 .Case("pwr8", ArchDefineName | ArchDefinePwr7 | ArchDefinePwr6x
1287 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1288 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001289 .Case("pwr9", ArchDefineName | ArchDefinePwr8 | ArchDefinePwr7
1290 | ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1291 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1292 | ArchDefinePpcsq)
Bill Schmidt38378a02013-02-01 20:23:10 +00001293 .Case("power3", ArchDefinePpcgr)
1294 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1295 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1296 | ArchDefinePpcsq)
1297 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1298 | ArchDefinePpcgr | ArchDefinePpcsq)
1299 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1300 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1301 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1302 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1303 | ArchDefinePpcsq)
1304 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6
1305 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001306 | ArchDefinePpcgr | ArchDefinePpcsq)
1307 .Case("power8", ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr6x
1308 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1309 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001310 .Case("power9", ArchDefinePwr9 | ArchDefinePwr8 | ArchDefinePwr7
1311 | ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1312 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1313 | ArchDefinePpcsq)
Hal Finkel6b984f02012-07-03 16:51:04 +00001314 .Default(ArchDefineNone);
1315
1316 if (defs & ArchDefineName)
1317 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
1318 if (defs & ArchDefinePpcgr)
1319 Builder.defineMacro("_ARCH_PPCGR");
1320 if (defs & ArchDefinePpcsq)
1321 Builder.defineMacro("_ARCH_PPCSQ");
1322 if (defs & ArchDefine440)
Hal Finkel8eb59282012-06-11 22:35:19 +00001323 Builder.defineMacro("_ARCH_440");
Hal Finkel6b984f02012-07-03 16:51:04 +00001324 if (defs & ArchDefine603)
1325 Builder.defineMacro("_ARCH_603");
1326 if (defs & ArchDefine604)
1327 Builder.defineMacro("_ARCH_604");
Bill Schmidt38378a02013-02-01 20:23:10 +00001328 if (defs & ArchDefinePwr4)
Hal Finkel6b984f02012-07-03 16:51:04 +00001329 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt38378a02013-02-01 20:23:10 +00001330 if (defs & ArchDefinePwr5)
Hal Finkel6b984f02012-07-03 16:51:04 +00001331 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt38378a02013-02-01 20:23:10 +00001332 if (defs & ArchDefinePwr5x)
1333 Builder.defineMacro("_ARCH_PWR5X");
1334 if (defs & ArchDefinePwr6)
Hal Finkel8eb59282012-06-11 22:35:19 +00001335 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt38378a02013-02-01 20:23:10 +00001336 if (defs & ArchDefinePwr6x)
1337 Builder.defineMacro("_ARCH_PWR6X");
1338 if (defs & ArchDefinePwr7)
1339 Builder.defineMacro("_ARCH_PWR7");
Will Schmidtf0487512014-06-26 13:34:10 +00001340 if (defs & ArchDefinePwr8)
1341 Builder.defineMacro("_ARCH_PWR8");
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001342 if (defs & ArchDefinePwr9)
1343 Builder.defineMacro("_ARCH_PWR9");
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001344 if (defs & ArchDefineA2)
1345 Builder.defineMacro("_ARCH_A2");
1346 if (defs & ArchDefineA2q) {
1347 Builder.defineMacro("_ARCH_A2Q");
1348 Builder.defineMacro("_ARCH_QP");
1349 }
1350
1351 if (getTriple().getVendor() == llvm::Triple::BGQ) {
1352 Builder.defineMacro("__bg__");
1353 Builder.defineMacro("__THW_BLUEGENE__");
1354 Builder.defineMacro("__bgq__");
1355 Builder.defineMacro("__TOS_BGQ__");
1356 }
Bill Schmidt38378a02013-02-01 20:23:10 +00001357
Eric Christopher758aad72017-03-21 22:06:18 +00001358 if (HasAltivec) {
1359 Builder.defineMacro("__VEC__", "10206");
1360 Builder.defineMacro("__ALTIVEC__");
1361 }
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001362 if (HasVSX)
1363 Builder.defineMacro("__VSX__");
Bill Schmidt8c184e32014-10-10 17:21:23 +00001364 if (HasP8Vector)
Bill Schmidt59eb7672014-10-10 15:09:43 +00001365 Builder.defineMacro("__POWER8_VECTOR__");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001366 if (HasP8Crypto)
1367 Builder.defineMacro("__CRYPTO__");
Kit Barton8246f282015-03-25 19:41:41 +00001368 if (HasHTM)
1369 Builder.defineMacro("__HTM__");
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001370 if (HasFloat128)
1371 Builder.defineMacro("__FLOAT128__");
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001372 if (HasP9Vector)
1373 Builder.defineMacro("__POWER9_VECTOR__");
Hal Finkela57b8902015-10-01 13:39:49 +00001374
1375 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
1376 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
1377 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
1378 if (PointerWidth == 64)
1379 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001380
Bill Schmidt38378a02013-02-01 20:23:10 +00001381 // FIXME: The following are not yet generated here by Clang, but are
1382 // generated by GCC:
1383 //
1384 // _SOFT_FLOAT_
1385 // __RECIP_PRECISION__
1386 // __APPLE_ALTIVEC__
Bill Schmidt38378a02013-02-01 20:23:10 +00001387 // __RECIP__
1388 // __RECIPF__
1389 // __RSQRTE__
1390 // __RSQRTEF__
1391 // _SOFT_DOUBLE_
1392 // __NO_LWSYNC__
1393 // __HAVE_BSWAP__
1394 // __LONGDOUBLE128
1395 // __CMODEL_MEDIUM__
1396 // __CMODEL_LARGE__
1397 // _CALL_SYSV
1398 // _CALL_DARWIN
1399 // __NO_FPRS__
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001400}
1401
Eric Christophera8a14c32015-08-31 18:39:16 +00001402// Handle explicit options being passed to the compiler here: if we've
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001403// explicitly turned off vsx and turned on any of:
1404// - power8-vector
1405// - direct-move
1406// - float128
1407// - power9-vector
1408// then go ahead and error since the customer has expressed an incompatible
Eric Christophera8a14c32015-08-31 18:39:16 +00001409// set of options.
1410static bool ppcUserFeaturesCheck(DiagnosticsEngine &Diags,
Eric Christopher8c47b422015-10-09 18:39:55 +00001411 const std::vector<std::string> &FeaturesVec) {
Eric Christophera8a14c32015-08-31 18:39:16 +00001412
1413 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "-vsx") !=
1414 FeaturesVec.end()) {
1415 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+power8-vector") !=
1416 FeaturesVec.end()) {
1417 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mpower8-vector"
1418 << "-mno-vsx";
1419 return false;
1420 }
1421
1422 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+direct-move") !=
1423 FeaturesVec.end()) {
1424 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mdirect-move"
1425 << "-mno-vsx";
1426 return false;
1427 }
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001428
1429 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+float128") !=
1430 FeaturesVec.end()) {
1431 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mfloat128"
1432 << "-mno-vsx";
1433 return false;
1434 }
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001435
1436 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+power9-vector") !=
1437 FeaturesVec.end()) {
1438 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mpower9-vector"
1439 << "-mno-vsx";
1440 return false;
1441 }
Eric Christophera8a14c32015-08-31 18:39:16 +00001442 }
1443
1444 return true;
1445}
1446
Eric Christopher8c47b422015-10-09 18:39:55 +00001447bool PPCTargetInfo::initFeatureMap(
1448 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
1449 const std::vector<std::string> &FeaturesVec) const {
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001450 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1451 .Case("7400", true)
1452 .Case("g4", true)
1453 .Case("7450", true)
1454 .Case("g4+", true)
1455 .Case("970", true)
1456 .Case("g5", true)
1457 .Case("pwr6", true)
1458 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +00001459 .Case("pwr8", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001460 .Case("pwr9", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001461 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +00001462 .Case("ppc64le", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001463 .Default(false);
Hal Finkelb58ce852013-02-01 18:44:19 +00001464
1465 Features["qpx"] = (CPU == "a2q");
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001466 Features["power9-vector"] = (CPU == "pwr9");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001467 Features["crypto"] = llvm::StringSwitch<bool>(CPU)
1468 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001469 .Case("pwr9", true)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001470 .Case("pwr8", true)
1471 .Default(false);
1472 Features["power8-vector"] = llvm::StringSwitch<bool>(CPU)
1473 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001474 .Case("pwr9", true)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001475 .Case("pwr8", true)
1476 .Default(false);
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001477 Features["bpermd"] = llvm::StringSwitch<bool>(CPU)
1478 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001479 .Case("pwr9", true)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001480 .Case("pwr8", true)
1481 .Case("pwr7", true)
1482 .Default(false);
1483 Features["extdiv"] = llvm::StringSwitch<bool>(CPU)
1484 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001485 .Case("pwr9", true)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001486 .Case("pwr8", true)
1487 .Case("pwr7", true)
1488 .Default(false);
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001489 Features["direct-move"] = llvm::StringSwitch<bool>(CPU)
1490 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001491 .Case("pwr9", true)
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001492 .Case("pwr8", true)
1493 .Default(false);
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001494 Features["vsx"] = llvm::StringSwitch<bool>(CPU)
1495 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001496 .Case("pwr9", true)
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001497 .Case("pwr8", true)
1498 .Case("pwr7", true)
1499 .Default(false);
Eric Christopher74fa24f2017-03-20 21:12:53 +00001500 Features["htm"] = llvm::StringSwitch<bool>(CPU)
1501 .Case("ppc64le", true)
1502 .Case("pwr9", true)
1503 .Case("pwr8", true)
1504 .Default(false);
Eric Christopheref1e2952015-08-28 02:13:58 +00001505
Eric Christophera8a14c32015-08-31 18:39:16 +00001506 if (!ppcUserFeaturesCheck(Diags, FeaturesVec))
1507 return false;
Eric Christopher007b0a02015-08-28 22:32:01 +00001508
Eric Christopher007b0a02015-08-28 22:32:01 +00001509 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001510}
1511
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001512bool PPCTargetInfo::hasFeature(StringRef Feature) const {
Bill Schmidte6e9d152014-11-02 14:56:41 +00001513 return llvm::StringSwitch<bool>(Feature)
Eric Christopher758aad72017-03-21 22:06:18 +00001514 .Case("powerpc", true)
1515 .Case("altivec", HasAltivec)
1516 .Case("vsx", HasVSX)
1517 .Case("power8-vector", HasP8Vector)
1518 .Case("crypto", HasP8Crypto)
1519 .Case("direct-move", HasDirectMove)
1520 .Case("qpx", HasQPX)
1521 .Case("htm", HasHTM)
1522 .Case("bpermd", HasBPERMD)
1523 .Case("extdiv", HasExtDiv)
1524 .Case("float128", HasFloat128)
1525 .Case("power9-vector", HasP9Vector)
1526 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001527}
Chris Lattner17df24e2008-04-21 18:56:49 +00001528
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001529void PPCTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
1530 StringRef Name, bool Enabled) const {
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001531 // If we're enabling direct-move or power8-vector go ahead and enable vsx
1532 // as well. Do the inverse if we're disabling vsx. We'll diagnose any user
1533 // incompatible options.
1534 if (Enabled) {
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001535 if (Name == "direct-move" ||
1536 Name == "power8-vector" ||
1537 Name == "float128" ||
1538 Name == "power9-vector") {
1539 // power9-vector is really a superset of power8-vector so encode that.
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001540 Features[Name] = Features["vsx"] = true;
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001541 if (Name == "power9-vector")
1542 Features["power8-vector"] = true;
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001543 } else {
1544 Features[Name] = true;
1545 }
1546 } else {
1547 if (Name == "vsx") {
1548 Features[Name] = Features["direct-move"] = Features["power8-vector"] =
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001549 Features["float128"] = Features["power9-vector"] = false;
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001550 } else {
1551 Features[Name] = false;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001552 }
1553 }
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001554}
1555
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001556const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001557 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1558 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1559 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1560 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1561 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1562 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1563 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1564 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001565 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001566 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001567 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001568 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1569 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1570 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1571 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001572 "vrsave", "vscr",
1573 "spe_acc", "spefscr",
1574 "sfp"
1575};
Chris Lattner10a5b382007-01-29 05:24:35 +00001576
Craig Topperf054e3a2015-10-19 03:52:27 +00001577ArrayRef<const char*> PPCTargetInfo::getGCCRegNames() const {
1578 return llvm::makeArrayRef(GCCRegNames);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001579}
Chris Lattner5ba61f02006-10-14 07:39:34 +00001580
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001581const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1582 // While some of these aliases do map to different registers
1583 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001584 { { "0" }, "r0" },
1585 { { "1"}, "r1" },
1586 { { "2" }, "r2" },
1587 { { "3" }, "r3" },
1588 { { "4" }, "r4" },
1589 { { "5" }, "r5" },
1590 { { "6" }, "r6" },
1591 { { "7" }, "r7" },
1592 { { "8" }, "r8" },
1593 { { "9" }, "r9" },
1594 { { "10" }, "r10" },
1595 { { "11" }, "r11" },
1596 { { "12" }, "r12" },
1597 { { "13" }, "r13" },
1598 { { "14" }, "r14" },
1599 { { "15" }, "r15" },
1600 { { "16" }, "r16" },
1601 { { "17" }, "r17" },
1602 { { "18" }, "r18" },
1603 { { "19" }, "r19" },
1604 { { "20" }, "r20" },
1605 { { "21" }, "r21" },
1606 { { "22" }, "r22" },
1607 { { "23" }, "r23" },
1608 { { "24" }, "r24" },
1609 { { "25" }, "r25" },
1610 { { "26" }, "r26" },
1611 { { "27" }, "r27" },
1612 { { "28" }, "r28" },
1613 { { "29" }, "r29" },
1614 { { "30" }, "r30" },
1615 { { "31" }, "r31" },
1616 { { "fr0" }, "f0" },
1617 { { "fr1" }, "f1" },
1618 { { "fr2" }, "f2" },
1619 { { "fr3" }, "f3" },
1620 { { "fr4" }, "f4" },
1621 { { "fr5" }, "f5" },
1622 { { "fr6" }, "f6" },
1623 { { "fr7" }, "f7" },
1624 { { "fr8" }, "f8" },
1625 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +00001626 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001627 { { "fr11" }, "f11" },
1628 { { "fr12" }, "f12" },
1629 { { "fr13" }, "f13" },
1630 { { "fr14" }, "f14" },
1631 { { "fr15" }, "f15" },
1632 { { "fr16" }, "f16" },
1633 { { "fr17" }, "f17" },
1634 { { "fr18" }, "f18" },
1635 { { "fr19" }, "f19" },
1636 { { "fr20" }, "f20" },
1637 { { "fr21" }, "f21" },
1638 { { "fr22" }, "f22" },
1639 { { "fr23" }, "f23" },
1640 { { "fr24" }, "f24" },
1641 { { "fr25" }, "f25" },
1642 { { "fr26" }, "f26" },
1643 { { "fr27" }, "f27" },
1644 { { "fr28" }, "f28" },
1645 { { "fr29" }, "f29" },
1646 { { "fr30" }, "f30" },
1647 { { "fr31" }, "f31" },
1648 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001649};
1650
Craig Topperf054e3a2015-10-19 03:52:27 +00001651ArrayRef<TargetInfo::GCCRegAlias> PPCTargetInfo::getGCCRegAliases() const {
1652 return llvm::makeArrayRef(GCCRegAliases);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001653}
Chris Lattner02dffbd2006-10-14 07:50:21 +00001654
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001655class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001656public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001657 PPC32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1658 : PPCTargetInfo(Triple, Opts) {
James Y Knightb214cbc2016-03-04 19:00:41 +00001659 resetDataLayout("E-m:e-p:32:32-i64:64-n32");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001660
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001661 switch (getTriple().getOS()) {
Nico Weber3435ede2012-01-31 02:07:33 +00001662 case llvm::Triple::Linux:
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001663 case llvm::Triple::FreeBSD:
1664 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001665 SizeType = UnsignedInt;
Hal Finkel26908382012-03-02 20:54:36 +00001666 PtrDiffType = SignedInt;
1667 IntPtrType = SignedInt;
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001668 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +00001669 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001670 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001671 }
Roman Divacky816dcd12012-03-13 16:53:54 +00001672
Roman Divacky3ffe7462012-03-13 19:20:17 +00001673 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1674 LongDoubleWidth = LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00001675 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Roman Divacky3ffe7462012-03-13 19:20:17 +00001676 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001677
1678 // PPC32 supports atomics up to 4 bytes.
1679 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divacky965b0b72011-01-06 08:27:10 +00001680 }
1681
Craig Topper3164f332014-03-11 03:39:26 +00001682 BuiltinVaListKind getBuiltinVaListKind() const override {
Roman Divacky965b0b72011-01-06 08:27:10 +00001683 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Inge5d3fb222012-06-16 03:34:49 +00001684 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman873f65a2008-08-21 00:13:15 +00001685 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001686};
Chris Lattner5ba61f02006-10-14 07:39:34 +00001687
Bill Schmidt778d3872013-07-26 01:36:11 +00001688// Note: ABI differences may eventually require us to have a separate
1689// TargetInfo for little endian.
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001690class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001691public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001692 PPC64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1693 : PPCTargetInfo(Triple, Opts) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001694 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001695 IntMaxType = SignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001696 Int64Type = SignedLong;
Roman Divacky816dcd12012-03-13 16:53:54 +00001697
Eric Christopherf6ee1f32017-02-10 04:35:21 +00001698 if ((Triple.getArch() == llvm::Triple::ppc64le)) {
1699 resetDataLayout("e-m:e-i64:64-n32:64");
Eric Christopher4855ba82017-02-10 03:32:34 +00001700 ABI = "elfv2";
Eric Christopherf6ee1f32017-02-10 04:35:21 +00001701 } else {
1702 resetDataLayout("E-m:e-i64:64-n32:64");
Eric Christopher4855ba82017-02-10 03:32:34 +00001703 ABI = "elfv1";
Eric Christopherf6ee1f32017-02-10 04:35:21 +00001704 }
Eric Christopher4855ba82017-02-10 03:32:34 +00001705
Eric Christopherf6ee1f32017-02-10 04:35:21 +00001706 switch (getTriple().getOS()) {
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001707 case llvm::Triple::FreeBSD:
Roman Divacky3ffe7462012-03-13 19:20:17 +00001708 LongDoubleWidth = LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00001709 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001710 break;
Joerg Sonnenbergeraac82c42014-10-15 19:52:03 +00001711 case llvm::Triple::NetBSD:
1712 IntMaxType = SignedLongLong;
1713 Int64Type = SignedLongLong;
1714 break;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001715 default:
1716 break;
Ulrich Weigand8afad612014-07-28 13:17:52 +00001717 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001718
1719 // PPC64 supports atomics up to 8 bytes.
1720 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001721 }
Craig Topper3164f332014-03-11 03:39:26 +00001722 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001723 return TargetInfo::CharPtrBuiltinVaList;
Roman Divacky965b0b72011-01-06 08:27:10 +00001724 }
Eric Christophere6b7cf42015-07-10 18:25:52 +00001725 // PPC64 Linux-specific ABI options.
Ulrich Weigand8afad612014-07-28 13:17:52 +00001726 bool setABI(const std::string &Name) override {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001727 if (Name == "elfv1" || Name == "elfv1-qpx" || Name == "elfv2") {
Ulrich Weigand8afad612014-07-28 13:17:52 +00001728 ABI = Name;
1729 return true;
1730 }
1731 return false;
1732 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001733};
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001734
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001735class DarwinPPC32TargetInfo : public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001736public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001737 DarwinPPC32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1738 : DarwinTargetInfo<PPC32TargetInfo>(Triple, Opts) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001739 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +00001740 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Eric Christopher917e9522014-11-18 22:36:15 +00001741 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev68d773c2012-01-17 22:40:00 +00001742 LongLongAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001743 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00001744 resetDataLayout("E-m:o-p:32:32-f64:32:64-n32");
Roman Divacky965b0b72011-01-06 08:27:10 +00001745 }
Craig Topper3164f332014-03-11 03:39:26 +00001746 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001747 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001748 }
1749};
1750
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001751class DarwinPPC64TargetInfo : public DarwinTargetInfo<PPC64TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001752public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001753 DarwinPPC64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1754 : DarwinTargetInfo<PPC64TargetInfo>(Triple, Opts) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001755 HasAlignMac68kSupport = true;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001756 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00001757 resetDataLayout("E-m:o-i64:64-n32:64");
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001758 }
1759};
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001760
Eric Christopherc48497a2015-09-18 21:26:24 +00001761static const unsigned NVPTXAddrSpaceMap[] = {
1762 1, // opencl_global
1763 3, // opencl_local
1764 4, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00001765 // FIXME: generic has to be added to the target
Eric Christopherc48497a2015-09-18 21:26:24 +00001766 0, // opencl_generic
1767 1, // cuda_device
1768 4, // cuda_constant
1769 3, // cuda_shared
1770};
1771
1772class NVPTXTargetInfo : public TargetInfo {
1773 static const char *const GCCRegNames[];
1774 static const Builtin::Info BuiltinInfo[];
Justin Lebar62907612016-07-06 21:21:39 +00001775 CudaArch GPU;
Justin Lebarb6626592017-01-05 16:53:21 +00001776 std::unique_ptr<TargetInfo> HostTarget;
Reid Klecknerbbc01782014-12-03 21:53:36 +00001777
Eric Christopherc48497a2015-09-18 21:26:24 +00001778public:
Justin Lebarb6626592017-01-05 16:53:21 +00001779 NVPTXTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts,
1780 unsigned TargetPointerWidth)
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001781 : TargetInfo(Triple) {
Justin Lebarb6626592017-01-05 16:53:21 +00001782 assert((TargetPointerWidth == 32 || TargetPointerWidth == 64) &&
1783 "NVPTX only supports 32- and 64-bit modes.");
1784
Eric Christopherc48497a2015-09-18 21:26:24 +00001785 TLSSupported = false;
Eric Christopherc48497a2015-09-18 21:26:24 +00001786 AddrSpaceMap = &NVPTXAddrSpaceMap;
1787 UseAddrSpaceMapMangling = true;
Justin Lebarb6626592017-01-05 16:53:21 +00001788
Eric Christopherc48497a2015-09-18 21:26:24 +00001789 // Define available target features
1790 // These must be defined in sorted order!
1791 NoAsmVariants = true;
Justin Lebar62907612016-07-06 21:21:39 +00001792 GPU = CudaArch::SM_20;
Justin Lebar76945b22016-04-29 23:05:19 +00001793
Justin Lebarb6626592017-01-05 16:53:21 +00001794 if (TargetPointerWidth == 32)
1795 resetDataLayout("e-p:32:32-i64:64-v16:16-v32:32-n16:32:64");
1796 else
1797 resetDataLayout("e-i64:64-v16:16-v32:32-n16:32:64");
1798
Justin Lebar76945b22016-04-29 23:05:19 +00001799 // If possible, get a TargetInfo for our host triple, so we can match its
1800 // types.
1801 llvm::Triple HostTriple(Opts.HostTriple);
Justin Lebarb6626592017-01-05 16:53:21 +00001802 if (!HostTriple.isNVPTX())
1803 HostTarget.reset(AllocateTarget(llvm::Triple(Opts.HostTriple), Opts));
1804
1805 // If no host target, make some guesses about the data layout and return.
Justin Lebar76945b22016-04-29 23:05:19 +00001806 if (!HostTarget) {
Justin Lebarb6626592017-01-05 16:53:21 +00001807 LongWidth = LongAlign = TargetPointerWidth;
1808 PointerWidth = PointerAlign = TargetPointerWidth;
1809 switch (TargetPointerWidth) {
1810 case 32:
1811 SizeType = TargetInfo::UnsignedInt;
1812 PtrDiffType = TargetInfo::SignedInt;
1813 IntPtrType = TargetInfo::SignedInt;
1814 break;
1815 case 64:
1816 SizeType = TargetInfo::UnsignedLong;
1817 PtrDiffType = TargetInfo::SignedLong;
1818 IntPtrType = TargetInfo::SignedLong;
1819 break;
1820 default:
1821 llvm_unreachable("TargetPointerWidth must be 32 or 64");
1822 }
Justin Lebar76945b22016-04-29 23:05:19 +00001823 return;
1824 }
1825
Justin Lebarb6626592017-01-05 16:53:21 +00001826 // Copy properties from host target.
Justin Lebar76945b22016-04-29 23:05:19 +00001827 PointerWidth = HostTarget->getPointerWidth(/* AddrSpace = */ 0);
1828 PointerAlign = HostTarget->getPointerAlign(/* AddrSpace = */ 0);
1829 BoolWidth = HostTarget->getBoolWidth();
1830 BoolAlign = HostTarget->getBoolAlign();
1831 IntWidth = HostTarget->getIntWidth();
1832 IntAlign = HostTarget->getIntAlign();
1833 HalfWidth = HostTarget->getHalfWidth();
1834 HalfAlign = HostTarget->getHalfAlign();
1835 FloatWidth = HostTarget->getFloatWidth();
1836 FloatAlign = HostTarget->getFloatAlign();
1837 DoubleWidth = HostTarget->getDoubleWidth();
1838 DoubleAlign = HostTarget->getDoubleAlign();
1839 LongWidth = HostTarget->getLongWidth();
1840 LongAlign = HostTarget->getLongAlign();
1841 LongLongWidth = HostTarget->getLongLongWidth();
1842 LongLongAlign = HostTarget->getLongLongAlign();
1843 MinGlobalAlign = HostTarget->getMinGlobalAlign();
Richard Smith59139022016-09-30 22:41:36 +00001844 NewAlign = HostTarget->getNewAlign();
Justin Lebar76945b22016-04-29 23:05:19 +00001845 DefaultAlignForAttributeAligned =
1846 HostTarget->getDefaultAlignForAttributeAligned();
1847 SizeType = HostTarget->getSizeType();
1848 IntMaxType = HostTarget->getIntMaxType();
1849 PtrDiffType = HostTarget->getPtrDiffType(/* AddrSpace = */ 0);
1850 IntPtrType = HostTarget->getIntPtrType();
1851 WCharType = HostTarget->getWCharType();
1852 WIntType = HostTarget->getWIntType();
1853 Char16Type = HostTarget->getChar16Type();
1854 Char32Type = HostTarget->getChar32Type();
1855 Int64Type = HostTarget->getInt64Type();
1856 SigAtomicType = HostTarget->getSigAtomicType();
1857 ProcessIDType = HostTarget->getProcessIDType();
1858
1859 UseBitFieldTypeAlignment = HostTarget->useBitFieldTypeAlignment();
1860 UseZeroLengthBitfieldAlignment =
1861 HostTarget->useZeroLengthBitfieldAlignment();
1862 UseExplicitBitFieldAlignment = HostTarget->useExplicitBitFieldAlignment();
1863 ZeroLengthBitfieldBoundary = HostTarget->getZeroLengthBitfieldBoundary();
1864
Justin Lebar5057f172016-09-09 20:35:43 +00001865 // This is a bit of a lie, but it controls __GCC_ATOMIC_XXX_LOCK_FREE, and
1866 // we need those macros to be identical on host and device, because (among
1867 // other things) they affect which standard library classes are defined, and
1868 // we need all classes to be defined on both the host and device.
1869 MaxAtomicInlineWidth = HostTarget->getMaxAtomicInlineWidth();
1870
Justin Lebar76945b22016-04-29 23:05:19 +00001871 // Properties intentionally not copied from host:
1872 // - LargeArrayMinWidth, LargeArrayAlign: Not visible across the
1873 // host/device boundary.
1874 // - SuitableAlign: Not visible across the host/device boundary, and may
1875 // correctly be different on host/device, e.g. if host has wider vector
1876 // types than device.
1877 // - LongDoubleWidth, LongDoubleAlign: nvptx's long double type is the same
1878 // as its double type, but that's not necessarily true on the host.
1879 // TODO: nvcc emits a warning when using long double on device; we should
1880 // do the same.
Eric Christopherc48497a2015-09-18 21:26:24 +00001881 }
1882 void getTargetDefines(const LangOptions &Opts,
1883 MacroBuilder &Builder) const override {
1884 Builder.defineMacro("__PTX__");
1885 Builder.defineMacro("__NVPTX__");
1886 if (Opts.CUDAIsDevice) {
1887 // Set __CUDA_ARCH__ for the GPU specified.
Justin Lebaref1aaac2016-07-06 21:21:14 +00001888 std::string CUDAArchCode = [this] {
1889 switch (GPU) {
Simon Pilgrim13dff572016-07-07 22:32:26 +00001890 case CudaArch::UNKNOWN:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001891 assert(false && "No GPU arch when compiling CUDA device code.");
1892 return "";
Justin Lebar62907612016-07-06 21:21:39 +00001893 case CudaArch::SM_20:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001894 return "200";
Justin Lebar62907612016-07-06 21:21:39 +00001895 case CudaArch::SM_21:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001896 return "210";
Justin Lebar62907612016-07-06 21:21:39 +00001897 case CudaArch::SM_30:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001898 return "300";
Justin Lebar62907612016-07-06 21:21:39 +00001899 case CudaArch::SM_32:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001900 return "320";
Justin Lebar62907612016-07-06 21:21:39 +00001901 case CudaArch::SM_35:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001902 return "350";
Justin Lebar62907612016-07-06 21:21:39 +00001903 case CudaArch::SM_37:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001904 return "370";
Justin Lebar62907612016-07-06 21:21:39 +00001905 case CudaArch::SM_50:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001906 return "500";
Justin Lebar62907612016-07-06 21:21:39 +00001907 case CudaArch::SM_52:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001908 return "520";
Justin Lebar62907612016-07-06 21:21:39 +00001909 case CudaArch::SM_53:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001910 return "530";
Justin Lebar62907612016-07-06 21:21:39 +00001911 case CudaArch::SM_60:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001912 return "600";
Justin Lebar62907612016-07-06 21:21:39 +00001913 case CudaArch::SM_61:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001914 return "610";
Justin Lebar62907612016-07-06 21:21:39 +00001915 case CudaArch::SM_62:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001916 return "620";
1917 }
Simon Pilgrim13dff572016-07-07 22:32:26 +00001918 llvm_unreachable("unhandled CudaArch");
Justin Lebaref1aaac2016-07-06 21:21:14 +00001919 }();
Eric Christopherc48497a2015-09-18 21:26:24 +00001920 Builder.defineMacro("__CUDA_ARCH__", CUDAArchCode);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001921 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001922 }
Craig Topper6c03a542015-10-19 04:51:35 +00001923 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
1924 return llvm::makeArrayRef(BuiltinInfo,
1925 clang::NVPTX::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eric Christopherc48497a2015-09-18 21:26:24 +00001926 }
Artem Belevichfda99052016-09-28 17:47:35 +00001927 bool
1928 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
1929 StringRef CPU,
1930 const std::vector<std::string> &FeaturesVec) const override {
1931 Features["satom"] = GPU >= CudaArch::SM_60;
1932 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
1933 }
1934
Eric Christopherc48497a2015-09-18 21:26:24 +00001935 bool hasFeature(StringRef Feature) const override {
Artem Belevichfda99052016-09-28 17:47:35 +00001936 return llvm::StringSwitch<bool>(Feature)
1937 .Cases("ptx", "nvptx", true)
1938 .Case("satom", GPU >= CudaArch::SM_60) // Atomics w/ scope.
1939 .Default(false);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001940 }
1941
Craig Topperf054e3a2015-10-19 03:52:27 +00001942 ArrayRef<const char *> getGCCRegNames() const override;
1943 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00001944 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00001945 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00001946 }
1947 bool validateAsmConstraint(const char *&Name,
1948 TargetInfo::ConstraintInfo &Info) const override {
1949 switch (*Name) {
1950 default:
1951 return false;
1952 case 'c':
1953 case 'h':
1954 case 'r':
1955 case 'l':
1956 case 'f':
1957 case 'd':
1958 Info.setAllowsRegister();
1959 return true;
Eli Bendersky13467172015-04-01 20:29:18 +00001960 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001961 }
1962 const char *getClobbers() const override {
1963 // FIXME: Is this really right?
1964 return "";
1965 }
1966 BuiltinVaListKind getBuiltinVaListKind() const override {
1967 // FIXME: implement
1968 return TargetInfo::CharPtrBuiltinVaList;
1969 }
1970 bool setCPU(const std::string &Name) override {
Justin Lebar62907612016-07-06 21:21:39 +00001971 GPU = StringToCudaArch(Name);
1972 return GPU != CudaArch::UNKNOWN;
Eric Christopherc48497a2015-09-18 21:26:24 +00001973 }
Jan Vesely9674bd42016-06-17 19:02:14 +00001974 void setSupportedOpenCLOpts() override {
1975 auto &Opts = getSupportedOpenCLOpts();
Yaxun Liu5b746652016-12-18 05:18:55 +00001976 Opts.support("cl_clang_storage_class_specifiers");
1977 Opts.support("cl_khr_gl_sharing");
1978 Opts.support("cl_khr_icd");
Jan Vesely9674bd42016-06-17 19:02:14 +00001979
Yaxun Liu5b746652016-12-18 05:18:55 +00001980 Opts.support("cl_khr_fp64");
1981 Opts.support("cl_khr_byte_addressable_store");
1982 Opts.support("cl_khr_global_int32_base_atomics");
1983 Opts.support("cl_khr_global_int32_extended_atomics");
1984 Opts.support("cl_khr_local_int32_base_atomics");
1985 Opts.support("cl_khr_local_int32_extended_atomics");
Jan Vesely9674bd42016-06-17 19:02:14 +00001986 }
Justin Lebar86c4e632017-01-05 16:53:38 +00001987
1988 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
1989 // CUDA compilations support all of the host's calling conventions.
1990 //
1991 // TODO: We should warn if you apply a non-default CC to anything other than
1992 // a host function.
1993 if (HostTarget)
1994 return HostTarget->checkCallingConvention(CC);
1995 return CCCR_Warning;
1996 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001997};
1998
1999const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
2000#define BUILTIN(ID, TYPE, ATTRS) \
2001 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
2002#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
2003 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Artem Belevichfda99052016-09-28 17:47:35 +00002004#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
2005 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Eric Christopherc48497a2015-09-18 21:26:24 +00002006#include "clang/Basic/BuiltinsNVPTX.def"
2007};
2008
2009const char *const NVPTXTargetInfo::GCCRegNames[] = {"r0"};
2010
Craig Topperf054e3a2015-10-19 03:52:27 +00002011ArrayRef<const char *> NVPTXTargetInfo::getGCCRegNames() const {
2012 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00002013}
2014
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002015static const unsigned AMDGPUAddrSpaceMap[] = {
Eli Friedmand13b41e2012-10-12 23:32:00 +00002016 1, // opencl_global
2017 3, // opencl_local
2018 2, // opencl_constant
Matt Arsenaultbfe25b22014-12-01 16:46:03 +00002019 4, // opencl_generic
Eli Friedmand13b41e2012-10-12 23:32:00 +00002020 1, // cuda_device
2021 2, // cuda_constant
2022 3 // cuda_shared
2023};
2024
Tom Stellarda96344b2014-08-21 13:58:40 +00002025// If you edit the description strings, make sure you update
2026// getPointerWidthV().
2027
Craig Topper273dbc62015-10-18 05:29:26 +00002028static const char *const DataLayoutStringR600 =
Rafael Espindola29db13a2014-01-03 18:13:17 +00002029 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
2030 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00002031
Craig Topper273dbc62015-10-18 05:29:26 +00002032static const char *const DataLayoutStringSI =
Matt Arsenault6dc455f2016-05-31 16:58:18 +00002033 "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 +00002034 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
2035 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00002036
Matt Arsenault250024f2016-06-08 01:56:42 +00002037class AMDGPUTargetInfo final : public TargetInfo {
Matt Arsenault56f008d2014-06-24 20:45:01 +00002038 static const Builtin::Info BuiltinInfo[];
Tom Stellard7b1059b2015-04-14 14:36:56 +00002039 static const char * const GCCRegNames[];
Matt Arsenault56f008d2014-06-24 20:45:01 +00002040
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002041 /// \brief The GPU profiles supported by the AMDGPU target.
Tom Stellardc74b1e02013-03-04 17:40:53 +00002042 enum GPUKind {
2043 GK_NONE,
2044 GK_R600,
2045 GK_R600_DOUBLE_OPS,
2046 GK_R700,
2047 GK_R700_DOUBLE_OPS,
2048 GK_EVERGREEN,
2049 GK_EVERGREEN_DOUBLE_OPS,
2050 GK_NORTHERN_ISLANDS,
2051 GK_CAYMAN,
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002052 GK_GFX6,
2053 GK_GFX7,
Matt Arsenaulteb952fd2017-02-18 19:02:41 +00002054 GK_GFX8,
2055 GK_GFX9
Tom Stellardc74b1e02013-03-04 17:40:53 +00002056 } GPU;
2057
Jan Veselyeebeaea2015-05-04 19:53:36 +00002058 bool hasFP64:1;
2059 bool hasFMAF:1;
2060 bool hasLDEXPF:1;
Yaxun Liud3e85b92016-09-13 17:37:09 +00002061 bool hasFullSpeedFP32Denorms:1;
Jan Veselya3abd6d2015-05-01 17:38:13 +00002062
Matt Arsenault250024f2016-06-08 01:56:42 +00002063 static bool isAMDGCN(const llvm::Triple &TT) {
2064 return TT.getArch() == llvm::Triple::amdgcn;
2065 }
2066
Eli Friedmand13b41e2012-10-12 23:32:00 +00002067public:
Yaxun Liu2c17e822016-08-09 19:43:38 +00002068 AMDGPUTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Matt Arsenault250024f2016-06-08 01:56:42 +00002069 : TargetInfo(Triple) ,
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002070 GPU(isAMDGCN(Triple) ? GK_GFX6 : GK_R600),
Matt Arsenault250024f2016-06-08 01:56:42 +00002071 hasFP64(false),
2072 hasFMAF(false),
Yaxun Liu2c17e822016-08-09 19:43:38 +00002073 hasLDEXPF(false),
Yaxun Liud3e85b92016-09-13 17:37:09 +00002074 hasFullSpeedFP32Denorms(false){
Matt Arsenault250024f2016-06-08 01:56:42 +00002075 if (getTriple().getArch() == llvm::Triple::amdgcn) {
Jan Veselya3abd6d2015-05-01 17:38:13 +00002076 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00002077 hasFMAF = true;
2078 hasLDEXPF = true;
Tom Stellardd99fb952015-01-28 15:38:44 +00002079 }
Matt Arsenault250024f2016-06-08 01:56:42 +00002080
2081 resetDataLayout(getTriple().getArch() == llvm::Triple::amdgcn ?
2082 DataLayoutStringSI : DataLayoutStringR600);
2083
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002084 AddrSpaceMap = &AMDGPUAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00002085 UseAddrSpaceMapMangling = true;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002086 }
2087
Tom Stellarda96344b2014-08-21 13:58:40 +00002088 uint64_t getPointerWidthV(unsigned AddrSpace) const override {
2089 if (GPU <= GK_CAYMAN)
2090 return 32;
2091
2092 switch(AddrSpace) {
2093 default:
2094 return 64;
2095 case 0:
2096 case 3:
2097 case 5:
2098 return 32;
2099 }
2100 }
2101
Yaxun Liu26f75662016-08-19 05:17:25 +00002102 uint64_t getMaxPointerWidth() const override {
2103 return getTriple().getArch() == llvm::Triple::amdgcn ? 64 : 32;
2104 }
2105
Craig Topper3164f332014-03-11 03:39:26 +00002106 const char * getClobbers() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00002107 return "";
2108 }
2109
Craig Topperf054e3a2015-10-19 03:52:27 +00002110 ArrayRef<const char *> getGCCRegNames() const override;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002111
Craig Topperf054e3a2015-10-19 03:52:27 +00002112 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
2113 return None;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002114 }
2115
Craig Topper3164f332014-03-11 03:39:26 +00002116 bool validateAsmConstraint(const char *&Name,
Tom Stellardd097e942015-11-19 22:11:58 +00002117 TargetInfo::ConstraintInfo &Info) const override {
2118 switch (*Name) {
2119 default: break;
2120 case 'v': // vgpr
2121 case 's': // sgpr
2122 Info.setAllowsRegister();
2123 return true;
2124 }
2125 return false;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002126 }
2127
Matt Arsenault250024f2016-06-08 01:56:42 +00002128 bool initFeatureMap(llvm::StringMap<bool> &Features,
2129 DiagnosticsEngine &Diags, StringRef CPU,
2130 const std::vector<std::string> &FeatureVec) const override;
2131
Yaxun Liu2c17e822016-08-09 19:43:38 +00002132 void adjustTargetOptions(const CodeGenOptions &CGOpts,
2133 TargetOptions &TargetOpts) const override {
Yaxun Liu2c17e822016-08-09 19:43:38 +00002134 bool hasFP32Denormals = false;
2135 bool hasFP64Denormals = false;
2136 for (auto &I : TargetOpts.FeaturesAsWritten) {
2137 if (I == "+fp32-denormals" || I == "-fp32-denormals")
2138 hasFP32Denormals = true;
Matt Arsenault09cca092017-01-23 22:31:14 +00002139 if (I == "+fp64-fp16-denormals" || I == "-fp64-fp16-denormals")
Yaxun Liu2c17e822016-08-09 19:43:38 +00002140 hasFP64Denormals = true;
2141 }
2142 if (!hasFP32Denormals)
Yaxun Liud3e85b92016-09-13 17:37:09 +00002143 TargetOpts.Features.push_back((Twine(hasFullSpeedFP32Denorms &&
2144 !CGOpts.FlushDenorm ? '+' : '-') + Twine("fp32-denormals")).str());
Matt Arsenault09cca092017-01-23 22:31:14 +00002145 // Always do not flush fp64 or fp16 denorms.
Yaxun Liu2c17e822016-08-09 19:43:38 +00002146 if (!hasFP64Denormals && hasFP64)
Matt Arsenault09cca092017-01-23 22:31:14 +00002147 TargetOpts.Features.push_back("+fp64-fp16-denormals");
Yaxun Liu2c17e822016-08-09 19:43:38 +00002148 }
2149
Craig Topper6c03a542015-10-19 04:51:35 +00002150 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
2151 return llvm::makeArrayRef(BuiltinInfo,
2152 clang::AMDGPU::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eli Friedmand13b41e2012-10-12 23:32:00 +00002153 }
2154
Craig Topper3164f332014-03-11 03:39:26 +00002155 void getTargetDefines(const LangOptions &Opts,
2156 MacroBuilder &Builder) const override {
Matt Arsenault5e020b22016-02-27 09:06:26 +00002157 if (getTriple().getArch() == llvm::Triple::amdgcn)
2158 Builder.defineMacro("__AMDGCN__");
2159 else
2160 Builder.defineMacro("__R600__");
2161
Jan Veselyeebeaea2015-05-04 19:53:36 +00002162 if (hasFMAF)
2163 Builder.defineMacro("__HAS_FMAF__");
2164 if (hasLDEXPF)
2165 Builder.defineMacro("__HAS_LDEXPF__");
Jan Vesely211ba782016-06-17 02:25:03 +00002166 if (hasFP64)
2167 Builder.defineMacro("__HAS_FP64__");
Eli Friedmand13b41e2012-10-12 23:32:00 +00002168 }
2169
Craig Topper3164f332014-03-11 03:39:26 +00002170 BuiltinVaListKind getBuiltinVaListKind() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00002171 return TargetInfo::CharPtrBuiltinVaList;
2172 }
2173
Matt Arsenault250024f2016-06-08 01:56:42 +00002174 static GPUKind parseR600Name(StringRef Name) {
2175 return llvm::StringSwitch<GPUKind>(Name)
Tom Stellardc74b1e02013-03-04 17:40:53 +00002176 .Case("r600" , GK_R600)
2177 .Case("rv610", GK_R600)
2178 .Case("rv620", GK_R600)
2179 .Case("rv630", GK_R600)
2180 .Case("rv635", GK_R600)
2181 .Case("rs780", GK_R600)
2182 .Case("rs880", GK_R600)
2183 .Case("rv670", GK_R600_DOUBLE_OPS)
2184 .Case("rv710", GK_R700)
2185 .Case("rv730", GK_R700)
2186 .Case("rv740", GK_R700_DOUBLE_OPS)
2187 .Case("rv770", GK_R700_DOUBLE_OPS)
2188 .Case("palm", GK_EVERGREEN)
2189 .Case("cedar", GK_EVERGREEN)
2190 .Case("sumo", GK_EVERGREEN)
2191 .Case("sumo2", GK_EVERGREEN)
2192 .Case("redwood", GK_EVERGREEN)
2193 .Case("juniper", GK_EVERGREEN)
2194 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
2195 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
2196 .Case("barts", GK_NORTHERN_ISLANDS)
2197 .Case("turks", GK_NORTHERN_ISLANDS)
2198 .Case("caicos", GK_NORTHERN_ISLANDS)
2199 .Case("cayman", GK_CAYMAN)
2200 .Case("aruba", GK_CAYMAN)
Matt Arsenault250024f2016-06-08 01:56:42 +00002201 .Default(GK_NONE);
2202 }
2203
2204 static GPUKind parseAMDGCNName(StringRef Name) {
2205 return llvm::StringSwitch<GPUKind>(Name)
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002206 .Case("tahiti", GK_GFX6)
2207 .Case("pitcairn", GK_GFX6)
2208 .Case("verde", GK_GFX6)
2209 .Case("oland", GK_GFX6)
2210 .Case("hainan", GK_GFX6)
2211 .Case("bonaire", GK_GFX7)
2212 .Case("kabini", GK_GFX7)
2213 .Case("kaveri", GK_GFX7)
2214 .Case("hawaii", GK_GFX7)
2215 .Case("mullins", GK_GFX7)
Yaxun Liue59a0bc2016-10-26 16:40:21 +00002216 .Case("gfx700", GK_GFX7)
2217 .Case("gfx701", GK_GFX7)
2218 .Case("gfx702", GK_GFX7)
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002219 .Case("tonga", GK_GFX8)
2220 .Case("iceland", GK_GFX8)
2221 .Case("carrizo", GK_GFX8)
2222 .Case("fiji", GK_GFX8)
2223 .Case("stoney", GK_GFX8)
2224 .Case("polaris10", GK_GFX8)
2225 .Case("polaris11", GK_GFX8)
Yaxun Liue59a0bc2016-10-26 16:40:21 +00002226 .Case("gfx800", GK_GFX8)
2227 .Case("gfx801", GK_GFX8)
2228 .Case("gfx802", GK_GFX8)
2229 .Case("gfx803", GK_GFX8)
2230 .Case("gfx804", GK_GFX8)
2231 .Case("gfx810", GK_GFX8)
Matt Arsenaulteb952fd2017-02-18 19:02:41 +00002232 .Case("gfx900", GK_GFX9)
2233 .Case("gfx901", GK_GFX9)
Tom Stellardc74b1e02013-03-04 17:40:53 +00002234 .Default(GK_NONE);
Matt Arsenault250024f2016-06-08 01:56:42 +00002235 }
Tom Stellardc74b1e02013-03-04 17:40:53 +00002236
Matt Arsenault250024f2016-06-08 01:56:42 +00002237 bool setCPU(const std::string &Name) override {
2238 if (getTriple().getArch() == llvm::Triple::amdgcn)
2239 GPU = parseAMDGCNName(Name);
2240 else
2241 GPU = parseR600Name(Name);
Tom Stellardc74b1e02013-03-04 17:40:53 +00002242
Matt Arsenault250024f2016-06-08 01:56:42 +00002243 return GPU != GK_NONE;
Tom Stellardc74b1e02013-03-04 17:40:53 +00002244 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002245
Jan Vesely211ba782016-06-17 02:25:03 +00002246 void setSupportedOpenCLOpts() override {
2247 auto &Opts = getSupportedOpenCLOpts();
Yaxun Liu5b746652016-12-18 05:18:55 +00002248 Opts.support("cl_clang_storage_class_specifiers");
2249 Opts.support("cl_khr_icd");
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002250
Jan Vesely211ba782016-06-17 02:25:03 +00002251 if (hasFP64)
Yaxun Liu5b746652016-12-18 05:18:55 +00002252 Opts.support("cl_khr_fp64");
Jan Vesely211ba782016-06-17 02:25:03 +00002253 if (GPU >= GK_EVERGREEN) {
Yaxun Liu5b746652016-12-18 05:18:55 +00002254 Opts.support("cl_khr_byte_addressable_store");
2255 Opts.support("cl_khr_global_int32_base_atomics");
2256 Opts.support("cl_khr_global_int32_extended_atomics");
2257 Opts.support("cl_khr_local_int32_base_atomics");
2258 Opts.support("cl_khr_local_int32_extended_atomics");
Jan Vesely211ba782016-06-17 02:25:03 +00002259 }
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002260 if (GPU >= GK_GFX6) {
Yaxun Liu5b746652016-12-18 05:18:55 +00002261 Opts.support("cl_khr_fp16");
2262 Opts.support("cl_khr_int64_base_atomics");
2263 Opts.support("cl_khr_int64_extended_atomics");
2264 Opts.support("cl_khr_mipmap_image");
2265 Opts.support("cl_khr_subgroups");
2266 Opts.support("cl_khr_3d_image_writes");
2267 Opts.support("cl_amd_media_ops");
2268 Opts.support("cl_amd_media_ops2");
Jan Vesely211ba782016-06-17 02:25:03 +00002269 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002270 }
Nikolay Haustov8c6538b2016-06-30 09:06:33 +00002271
Yaxun Liu99444cb2016-08-03 20:38:06 +00002272 LangAS::ID getOpenCLImageAddrSpace() const override {
2273 return LangAS::opencl_constant;
2274 }
2275
Konstantin Zhuravlyovd1ba16e2017-03-08 23:56:48 +00002276 /// \returns Target specific vtbl ptr address space.
2277 unsigned getVtblPtrAddressSpace() const override {
2278 // \todo: We currently have address spaces defined in AMDGPU Backend. It
2279 // would be nice if we could use it here instead of using bare numbers (same
2280 // applies to getDWARFAddressSpace).
2281 return 2; // constant.
2282 }
2283
2284 /// \returns If a target requires an address within a target specific address
2285 /// space \p AddressSpace to be converted in order to be used, then return the
2286 /// corresponding target specific DWARF address space.
2287 ///
2288 /// \returns Otherwise return None and no conversion will be emitted in the
2289 /// DWARF.
2290 Optional<unsigned> getDWARFAddressSpace(
2291 unsigned AddressSpace) const override {
2292 switch (AddressSpace) {
2293 case 0: // LLVM Private.
2294 return 1; // DWARF Private.
2295 case 3: // LLVM Local.
2296 return 2; // DWARF Local.
2297 default:
2298 return None;
2299 }
2300 }
2301
Nikolay Haustov8c6538b2016-06-30 09:06:33 +00002302 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
2303 switch (CC) {
2304 default:
2305 return CCCR_Warning;
2306 case CC_C:
2307 case CC_OpenCLKernel:
2308 return CCCR_OK;
2309 }
2310 }
Yaxun Liu402804b2016-12-15 08:09:08 +00002311
2312 // In amdgcn target the null pointer in global, constant, and generic
2313 // address space has value 0 but in private and local address space has
2314 // value ~0.
2315 uint64_t getNullPointerValue(unsigned AS) const override {
Matt Arsenaultbf5e3e42017-03-13 19:47:53 +00002316 return AS == LangAS::opencl_local ? ~0 : 0;
Yaxun Liu402804b2016-12-15 08:09:08 +00002317 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00002318};
2319
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002320const Builtin::Info AMDGPUTargetInfo::BuiltinInfo[] = {
Matt Arsenault56f008d2014-06-24 20:45:01 +00002321#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00002322 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Matt Arsenault250024f2016-06-08 01:56:42 +00002323#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
2324 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002325#include "clang/Basic/BuiltinsAMDGPU.def"
Matt Arsenault56f008d2014-06-24 20:45:01 +00002326};
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002327const char * const AMDGPUTargetInfo::GCCRegNames[] = {
Tom Stellard7b1059b2015-04-14 14:36:56 +00002328 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
2329 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
2330 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
2331 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
2332 "v32", "v33", "v34", "v35", "v36", "v37", "v38", "v39",
2333 "v40", "v41", "v42", "v43", "v44", "v45", "v46", "v47",
2334 "v48", "v49", "v50", "v51", "v52", "v53", "v54", "v55",
2335 "v56", "v57", "v58", "v59", "v60", "v61", "v62", "v63",
2336 "v64", "v65", "v66", "v67", "v68", "v69", "v70", "v71",
2337 "v72", "v73", "v74", "v75", "v76", "v77", "v78", "v79",
2338 "v80", "v81", "v82", "v83", "v84", "v85", "v86", "v87",
2339 "v88", "v89", "v90", "v91", "v92", "v93", "v94", "v95",
2340 "v96", "v97", "v98", "v99", "v100", "v101", "v102", "v103",
2341 "v104", "v105", "v106", "v107", "v108", "v109", "v110", "v111",
2342 "v112", "v113", "v114", "v115", "v116", "v117", "v118", "v119",
2343 "v120", "v121", "v122", "v123", "v124", "v125", "v126", "v127",
2344 "v128", "v129", "v130", "v131", "v132", "v133", "v134", "v135",
2345 "v136", "v137", "v138", "v139", "v140", "v141", "v142", "v143",
2346 "v144", "v145", "v146", "v147", "v148", "v149", "v150", "v151",
2347 "v152", "v153", "v154", "v155", "v156", "v157", "v158", "v159",
2348 "v160", "v161", "v162", "v163", "v164", "v165", "v166", "v167",
2349 "v168", "v169", "v170", "v171", "v172", "v173", "v174", "v175",
2350 "v176", "v177", "v178", "v179", "v180", "v181", "v182", "v183",
2351 "v184", "v185", "v186", "v187", "v188", "v189", "v190", "v191",
2352 "v192", "v193", "v194", "v195", "v196", "v197", "v198", "v199",
2353 "v200", "v201", "v202", "v203", "v204", "v205", "v206", "v207",
2354 "v208", "v209", "v210", "v211", "v212", "v213", "v214", "v215",
2355 "v216", "v217", "v218", "v219", "v220", "v221", "v222", "v223",
2356 "v224", "v225", "v226", "v227", "v228", "v229", "v230", "v231",
2357 "v232", "v233", "v234", "v235", "v236", "v237", "v238", "v239",
2358 "v240", "v241", "v242", "v243", "v244", "v245", "v246", "v247",
2359 "v248", "v249", "v250", "v251", "v252", "v253", "v254", "v255",
2360 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
2361 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
2362 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
2363 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
2364 "s32", "s33", "s34", "s35", "s36", "s37", "s38", "s39",
2365 "s40", "s41", "s42", "s43", "s44", "s45", "s46", "s47",
2366 "s48", "s49", "s50", "s51", "s52", "s53", "s54", "s55",
2367 "s56", "s57", "s58", "s59", "s60", "s61", "s62", "s63",
2368 "s64", "s65", "s66", "s67", "s68", "s69", "s70", "s71",
2369 "s72", "s73", "s74", "s75", "s76", "s77", "s78", "s79",
2370 "s80", "s81", "s82", "s83", "s84", "s85", "s86", "s87",
2371 "s88", "s89", "s90", "s91", "s92", "s93", "s94", "s95",
2372 "s96", "s97", "s98", "s99", "s100", "s101", "s102", "s103",
2373 "s104", "s105", "s106", "s107", "s108", "s109", "s110", "s111",
2374 "s112", "s113", "s114", "s115", "s116", "s117", "s118", "s119",
Etienne Bergerone8ae26f2016-03-24 18:29:24 +00002375 "s120", "s121", "s122", "s123", "s124", "s125", "s126", "s127",
Matt Arsenaultb015d622016-02-27 09:06:22 +00002376 "exec", "vcc", "scc", "m0", "flat_scratch", "exec_lo", "exec_hi",
2377 "vcc_lo", "vcc_hi", "flat_scratch_lo", "flat_scratch_hi"
Tom Stellard7b1059b2015-04-14 14:36:56 +00002378};
2379
Craig Topperf054e3a2015-10-19 03:52:27 +00002380ArrayRef<const char *> AMDGPUTargetInfo::getGCCRegNames() const {
2381 return llvm::makeArrayRef(GCCRegNames);
Tom Stellard7b1059b2015-04-14 14:36:56 +00002382}
Matt Arsenault56f008d2014-06-24 20:45:01 +00002383
Matt Arsenault250024f2016-06-08 01:56:42 +00002384bool AMDGPUTargetInfo::initFeatureMap(
2385 llvm::StringMap<bool> &Features,
2386 DiagnosticsEngine &Diags, StringRef CPU,
2387 const std::vector<std::string> &FeatureVec) const {
2388
2389 // XXX - What does the member GPU mean if device name string passed here?
2390 if (getTriple().getArch() == llvm::Triple::amdgcn) {
2391 if (CPU.empty())
2392 CPU = "tahiti";
2393
2394 switch (parseAMDGCNName(CPU)) {
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002395 case GK_GFX6:
2396 case GK_GFX7:
Matt Arsenault250024f2016-06-08 01:56:42 +00002397 break;
2398
Matt Arsenaulta0c6dca2017-02-22 20:55:59 +00002399 case GK_GFX9:
2400 Features["gfx9-insts"] = true;
2401 LLVM_FALLTHROUGH;
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002402 case GK_GFX8:
Matt Arsenault250024f2016-06-08 01:56:42 +00002403 Features["s-memrealtime"] = true;
2404 Features["16-bit-insts"] = true;
Yaxun Liu4d867992017-03-10 01:30:46 +00002405 Features["dpp"] = true;
Matt Arsenault250024f2016-06-08 01:56:42 +00002406 break;
2407
2408 case GK_NONE:
2409 return false;
2410 default:
2411 llvm_unreachable("unhandled subtarget");
2412 }
2413 } else {
2414 if (CPU.empty())
2415 CPU = "r600";
2416
2417 switch (parseR600Name(CPU)) {
2418 case GK_R600:
2419 case GK_R700:
2420 case GK_EVERGREEN:
2421 case GK_NORTHERN_ISLANDS:
2422 break;
2423 case GK_R600_DOUBLE_OPS:
2424 case GK_R700_DOUBLE_OPS:
2425 case GK_EVERGREEN_DOUBLE_OPS:
2426 case GK_CAYMAN:
2427 Features["fp64"] = true;
2428 break;
2429 case GK_NONE:
2430 return false;
2431 default:
2432 llvm_unreachable("unhandled subtarget");
2433 }
2434 }
2435
2436 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeatureVec);
2437}
2438
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00002439const Builtin::Info BuiltinInfoX86[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00002440#define BUILTIN(ID, TYPE, ATTRS) \
2441 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002442#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
Craig Topper07d3b622015-08-07 05:14:44 +00002443 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Albert Gutowski727ab8a2016-09-14 21:19:43 +00002444#define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANGS, FEATURE) \
2445 { #ID, TYPE, ATTRS, HEADER, LANGS, FEATURE },
Chris Lattner5abdec72009-06-14 01:05:48 +00002446#include "clang/Basic/BuiltinsX86.def"
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00002447
2448#define BUILTIN(ID, TYPE, ATTRS) \
2449 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Albert Gutowski0fd6e962016-10-12 17:28:44 +00002450#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
2451 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00002452#define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANGS, FEATURE) \
2453 { #ID, TYPE, ATTRS, HEADER, LANGS, FEATURE },
2454#include "clang/Basic/BuiltinsX86_64.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00002455};
Eli Friedmanb5366062008-05-20 14:21:01 +00002456
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00002457
Nuno Lopescfca1f02009-12-23 17:49:57 +00002458static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002459 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
2460 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00002461 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002462 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
2463 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
2464 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00002465 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00002466 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
2467 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Marina Yatsina41c45fa2016-02-03 11:32:08 +00002468 "xmm16", "xmm17", "xmm18", "xmm19", "xmm20", "xmm21", "xmm22", "xmm23",
2469 "xmm24", "xmm25", "xmm26", "xmm27", "xmm28", "xmm29", "xmm30", "xmm31",
2470 "ymm16", "ymm17", "ymm18", "ymm19", "ymm20", "ymm21", "ymm22", "ymm23",
2471 "ymm24", "ymm25", "ymm26", "ymm27", "ymm28", "ymm29", "ymm30", "ymm31",
2472 "zmm0", "zmm1", "zmm2", "zmm3", "zmm4", "zmm5", "zmm6", "zmm7",
2473 "zmm8", "zmm9", "zmm10", "zmm11", "zmm12", "zmm13", "zmm14", "zmm15",
2474 "zmm16", "zmm17", "zmm18", "zmm19", "zmm20", "zmm21", "zmm22", "zmm23",
2475 "zmm24", "zmm25", "zmm26", "zmm27", "zmm28", "zmm29", "zmm30", "zmm31",
Michael Zuckerman15604b92016-10-31 14:16:57 +00002476 "k0", "k1", "k2", "k3", "k4", "k5", "k6", "k7",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002477};
2478
Eric Christophercdd36352011-06-21 00:05:20 +00002479const TargetInfo::AddlRegName AddlRegNames[] = {
2480 { { "al", "ah", "eax", "rax" }, 0 },
2481 { { "bl", "bh", "ebx", "rbx" }, 3 },
2482 { { "cl", "ch", "ecx", "rcx" }, 2 },
2483 { { "dl", "dh", "edx", "rdx" }, 1 },
2484 { { "esi", "rsi" }, 4 },
2485 { { "edi", "rdi" }, 5 },
2486 { { "esp", "rsp" }, 7 },
2487 { { "ebp", "rbp" }, 6 },
Alexey Bataeva7ab1b42015-09-04 03:42:23 +00002488 { { "r8d", "r8w", "r8b" }, 38 },
2489 { { "r9d", "r9w", "r9b" }, 39 },
2490 { { "r10d", "r10w", "r10b" }, 40 },
2491 { { "r11d", "r11w", "r11b" }, 41 },
2492 { { "r12d", "r12w", "r12b" }, 42 },
2493 { { "r13d", "r13w", "r13b" }, 43 },
2494 { { "r14d", "r14w", "r14b" }, 44 },
2495 { { "r15d", "r15w", "r15b" }, 45 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00002496};
2497
2498// X86 target abstract base class; x86-32 and x86-64 are very close, so
2499// most of the implementation can be shared.
2500class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00002501 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002502 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Craig Topper543f3bd2015-10-14 23:47:57 +00002503 } SSELevel = NoSSE;
Eli Friedman33465822011-07-08 23:31:17 +00002504 enum MMX3DNowEnum {
2505 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
Craig Topper543f3bd2015-10-14 23:47:57 +00002506 } MMX3DNowLevel = NoMMX3DNow;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002507 enum XOPEnum {
2508 NoXOP,
2509 SSE4A,
2510 FMA4,
2511 XOP
Craig Topper543f3bd2015-10-14 23:47:57 +00002512 } XOPLevel = NoXOP;
Anders Carlssone437c682010-01-27 03:47:49 +00002513
Craig Topper543f3bd2015-10-14 23:47:57 +00002514 bool HasAES = false;
2515 bool HasPCLMUL = false;
2516 bool HasLZCNT = false;
2517 bool HasRDRND = false;
2518 bool HasFSGSBASE = false;
2519 bool HasBMI = false;
2520 bool HasBMI2 = false;
2521 bool HasPOPCNT = false;
2522 bool HasRTM = false;
2523 bool HasPRFCHW = false;
2524 bool HasRDSEED = false;
2525 bool HasADX = false;
2526 bool HasTBM = false;
2527 bool HasFMA = false;
2528 bool HasF16C = false;
2529 bool HasAVX512CD = false;
2530 bool HasAVX512ER = false;
2531 bool HasAVX512PF = false;
2532 bool HasAVX512DQ = false;
2533 bool HasAVX512BW = false;
2534 bool HasAVX512VL = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002535 bool HasAVX512VBMI = false;
2536 bool HasAVX512IFMA = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002537 bool HasSHA = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002538 bool HasMPX = false;
2539 bool HasSGX = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002540 bool HasCX16 = false;
Craig Toppere33f51f2015-10-16 06:22:36 +00002541 bool HasFXSR = false;
Craig Topperda9fe562015-10-15 05:23:38 +00002542 bool HasXSAVE = false;
2543 bool HasXSAVEOPT = false;
2544 bool HasXSAVEC = false;
2545 bool HasXSAVES = false;
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00002546 bool HasMWAITX = false;
Craig Topper45742262017-02-09 06:10:14 +00002547 bool HasCLZERO = false;
Asaf Badouha9d1e182015-12-31 14:14:07 +00002548 bool HasPKU = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002549 bool HasCLFLUSHOPT = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002550 bool HasCLWB = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002551 bool HasMOVBE = false;
2552 bool HasPREFETCHWT1 = false;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00002553
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002554 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
2555 ///
2556 /// Each enumeration represents a particular CPU supported by Clang. These
2557 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
2558 enum CPUKind {
2559 CK_Generic,
2560
2561 /// \name i386
2562 /// i386-generation processors.
2563 //@{
2564 CK_i386,
2565 //@}
2566
2567 /// \name i486
2568 /// i486-generation processors.
2569 //@{
2570 CK_i486,
2571 CK_WinChipC6,
2572 CK_WinChip2,
2573 CK_C3,
2574 //@}
2575
2576 /// \name i586
2577 /// i586-generation processors, P5 microarchitecture based.
2578 //@{
2579 CK_i586,
2580 CK_Pentium,
2581 CK_PentiumMMX,
2582 //@}
2583
2584 /// \name i686
2585 /// i686-generation processors, P6 / Pentium M microarchitecture based.
2586 //@{
2587 CK_i686,
2588 CK_PentiumPro,
2589 CK_Pentium2,
2590 CK_Pentium3,
2591 CK_Pentium3M,
2592 CK_PentiumM,
2593 CK_C3_2,
2594
2595 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
2596 /// Clang however has some logic to suport this.
2597 // FIXME: Warn, deprecate, and potentially remove this.
2598 CK_Yonah,
2599 //@}
2600
2601 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00002602 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002603 //@{
2604 CK_Pentium4,
2605 CK_Pentium4M,
2606 CK_Prescott,
2607 CK_Nocona,
2608 //@}
2609
2610 /// \name Core
2611 /// Core microarchitecture based processors.
2612 //@{
2613 CK_Core2,
2614
2615 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
2616 /// codename which GCC no longer accepts as an option to -march, but Clang
2617 /// has some logic for recognizing it.
2618 // FIXME: Warn, deprecate, and potentially remove this.
2619 CK_Penryn,
2620 //@}
2621
2622 /// \name Atom
2623 /// Atom processors
2624 //@{
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002625 CK_Bonnell,
Preston Gurda3c58c02013-09-13 19:27:17 +00002626 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002627 //@}
2628
2629 /// \name Nehalem
2630 /// Nehalem microarchitecture based processors.
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002631 CK_Nehalem,
2632
2633 /// \name Westmere
2634 /// Westmere microarchitecture based processors.
2635 CK_Westmere,
2636
2637 /// \name Sandy Bridge
2638 /// Sandy Bridge microarchitecture based processors.
2639 CK_SandyBridge,
2640
2641 /// \name Ivy Bridge
2642 /// Ivy Bridge microarchitecture based processors.
2643 CK_IvyBridge,
2644
2645 /// \name Haswell
2646 /// Haswell microarchitecture based processors.
2647 CK_Haswell,
2648
2649 /// \name Broadwell
2650 /// Broadwell microarchitecture based processors.
Robert Khasanov50e6f582014-09-19 09:53:48 +00002651 CK_Broadwell,
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002652
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002653 /// \name Skylake Client
2654 /// Skylake client microarchitecture based processors.
2655 CK_SkylakeClient,
2656
2657 /// \name Skylake Server
2658 /// Skylake server microarchitecture based processors.
2659 CK_SkylakeServer,
2660
2661 /// \name Cannonlake Client
2662 /// Cannonlake client microarchitecture based processors.
2663 CK_Cannonlake,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002664
Craig Topper449314e2013-08-20 07:09:39 +00002665 /// \name Knights Landing
2666 /// Knights Landing processor.
2667 CK_KNL,
2668
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002669 /// \name Lakemont
2670 /// Lakemont microarchitecture based processors.
2671 CK_Lakemont,
2672
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002673 /// \name K6
2674 /// K6 architecture processors.
2675 //@{
2676 CK_K6,
2677 CK_K6_2,
2678 CK_K6_3,
2679 //@}
2680
2681 /// \name K7
2682 /// K7 architecture processors.
2683 //@{
2684 CK_Athlon,
2685 CK_AthlonThunderbird,
2686 CK_Athlon4,
2687 CK_AthlonXP,
2688 CK_AthlonMP,
2689 //@}
2690
2691 /// \name K8
2692 /// K8 architecture processors.
2693 //@{
2694 CK_Athlon64,
2695 CK_Athlon64SSE3,
2696 CK_AthlonFX,
2697 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00002698 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002699 CK_Opteron,
2700 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00002701 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002702 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002703
Benjamin Kramer569f2152012-01-10 11:50:18 +00002704 /// \name Bobcat
2705 /// Bobcat architecture processors.
2706 //@{
2707 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002708 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002709 //@}
2710
2711 /// \name Bulldozer
2712 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002713 //@{
2714 CK_BDVER1,
2715 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002716 CK_BDVER3,
Benjamin Kramer56c58222014-05-02 15:47:51 +00002717 CK_BDVER4,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002718 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002719
Craig Topperc45744a2017-01-10 06:02:12 +00002720 /// \name zen
2721 /// Zen architecture processors.
2722 //@{
2723 CK_ZNVER1,
2724 //@}
2725
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002726 /// This specification is deprecated and will be removed in the future.
2727 /// Users should prefer \see CK_K8.
2728 // FIXME: Warn on this when the CPU is set to it.
Saleem Abdulrasoolcb29c1a2014-11-17 18:40:15 +00002729 //@{
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002730 CK_x86_64,
2731 //@}
2732
2733 /// \name Geode
2734 /// Geode processors.
2735 //@{
2736 CK_Geode
2737 //@}
Craig Topper543f3bd2015-10-14 23:47:57 +00002738 } CPU = CK_Generic;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002739
Eric Christopherc50738f2015-08-27 00:05:50 +00002740 CPUKind getCPUKind(StringRef CPU) const {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002741 return llvm::StringSwitch<CPUKind>(CPU)
2742 .Case("i386", CK_i386)
2743 .Case("i486", CK_i486)
2744 .Case("winchip-c6", CK_WinChipC6)
2745 .Case("winchip2", CK_WinChip2)
2746 .Case("c3", CK_C3)
2747 .Case("i586", CK_i586)
2748 .Case("pentium", CK_Pentium)
2749 .Case("pentium-mmx", CK_PentiumMMX)
2750 .Case("i686", CK_i686)
2751 .Case("pentiumpro", CK_PentiumPro)
2752 .Case("pentium2", CK_Pentium2)
2753 .Case("pentium3", CK_Pentium3)
2754 .Case("pentium3m", CK_Pentium3M)
2755 .Case("pentium-m", CK_PentiumM)
2756 .Case("c3-2", CK_C3_2)
2757 .Case("yonah", CK_Yonah)
2758 .Case("pentium4", CK_Pentium4)
2759 .Case("pentium4m", CK_Pentium4M)
2760 .Case("prescott", CK_Prescott)
2761 .Case("nocona", CK_Nocona)
2762 .Case("core2", CK_Core2)
2763 .Case("penryn", CK_Penryn)
2764 .Case("bonnell", CK_Bonnell)
2765 .Case("atom", CK_Bonnell) // Legacy name.
2766 .Case("silvermont", CK_Silvermont)
2767 .Case("slm", CK_Silvermont) // Legacy name.
2768 .Case("nehalem", CK_Nehalem)
2769 .Case("corei7", CK_Nehalem) // Legacy name.
2770 .Case("westmere", CK_Westmere)
2771 .Case("sandybridge", CK_SandyBridge)
2772 .Case("corei7-avx", CK_SandyBridge) // Legacy name.
2773 .Case("ivybridge", CK_IvyBridge)
2774 .Case("core-avx-i", CK_IvyBridge) // Legacy name.
2775 .Case("haswell", CK_Haswell)
2776 .Case("core-avx2", CK_Haswell) // Legacy name.
2777 .Case("broadwell", CK_Broadwell)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002778 .Case("skylake", CK_SkylakeClient)
2779 .Case("skylake-avx512", CK_SkylakeServer)
2780 .Case("skx", CK_SkylakeServer) // Legacy name.
2781 .Case("cannonlake", CK_Cannonlake)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002782 .Case("knl", CK_KNL)
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002783 .Case("lakemont", CK_Lakemont)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002784 .Case("k6", CK_K6)
2785 .Case("k6-2", CK_K6_2)
2786 .Case("k6-3", CK_K6_3)
2787 .Case("athlon", CK_Athlon)
2788 .Case("athlon-tbird", CK_AthlonThunderbird)
2789 .Case("athlon-4", CK_Athlon4)
2790 .Case("athlon-xp", CK_AthlonXP)
2791 .Case("athlon-mp", CK_AthlonMP)
2792 .Case("athlon64", CK_Athlon64)
2793 .Case("athlon64-sse3", CK_Athlon64SSE3)
2794 .Case("athlon-fx", CK_AthlonFX)
2795 .Case("k8", CK_K8)
2796 .Case("k8-sse3", CK_K8SSE3)
2797 .Case("opteron", CK_Opteron)
2798 .Case("opteron-sse3", CK_OpteronSSE3)
2799 .Case("barcelona", CK_AMDFAM10)
2800 .Case("amdfam10", CK_AMDFAM10)
2801 .Case("btver1", CK_BTVER1)
2802 .Case("btver2", CK_BTVER2)
2803 .Case("bdver1", CK_BDVER1)
2804 .Case("bdver2", CK_BDVER2)
2805 .Case("bdver3", CK_BDVER3)
2806 .Case("bdver4", CK_BDVER4)
Craig Topperc45744a2017-01-10 06:02:12 +00002807 .Case("znver1", CK_ZNVER1)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002808 .Case("x86-64", CK_x86_64)
2809 .Case("geode", CK_Geode)
2810 .Default(CK_Generic);
2811 }
2812
Rafael Espindolaeb265472013-08-21 21:59:03 +00002813 enum FPMathKind {
2814 FP_Default,
2815 FP_SSE,
2816 FP_387
Craig Topper543f3bd2015-10-14 23:47:57 +00002817 } FPMath = FP_Default;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002818
Eli Friedman3fd920a2008-08-20 02:34:37 +00002819public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00002820 X86TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
2821 : TargetInfo(Triple) {
Stephan Bergmann17c7f702016-12-14 11:57:17 +00002822 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended();
Chris Lattner1f5ad112006-10-14 18:32:12 +00002823 }
Craig Topper3164f332014-03-11 03:39:26 +00002824 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00002825 // X87 evaluates with 80 bits "long double" precision.
2826 return SSELevel == NoSSE ? 2 : 0;
2827 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002828 ArrayRef<const char *> getGCCRegNames() const override {
2829 return llvm::makeArrayRef(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00002830 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002831 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
2832 return None;
Eric Christophercdd36352011-06-21 00:05:20 +00002833 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002834 ArrayRef<TargetInfo::AddlRegName> getGCCAddlRegNames() const override {
2835 return llvm::makeArrayRef(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00002836 }
Eric Christopherd9832702015-06-29 21:00:05 +00002837 bool validateCpuSupports(StringRef Name) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002838 bool validateAsmConstraint(const char *&Name,
Eric Christopher917e9522014-11-18 22:36:15 +00002839 TargetInfo::ConstraintInfo &info) const override;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002840
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00002841 bool validateGlobalRegisterVariable(StringRef RegName,
2842 unsigned RegSize,
2843 bool &HasSizeMismatch) const override {
2844 // esp and ebp are the only 32-bit registers the x86 backend can currently
2845 // handle.
2846 if (RegName.equals("esp") || RegName.equals("ebp")) {
2847 // Check that the register size is 32-bit.
2848 HasSizeMismatch = RegSize != 32;
2849 return true;
2850 }
2851
2852 return false;
2853 }
2854
Akira Hatanaka974131e2014-09-18 18:17:18 +00002855 bool validateOutputSize(StringRef Constraint, unsigned Size) const override;
2856
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002857 bool validateInputSize(StringRef Constraint, unsigned Size) const override;
2858
Akira Hatanaka974131e2014-09-18 18:17:18 +00002859 virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const;
2860
Craig Topper3164f332014-03-11 03:39:26 +00002861 std::string convertConstraint(const char *&Constraint) const override;
2862 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002863 return "~{dirflag},~{fpsr},~{flags}";
2864 }
Marina Yatsinac42fd032016-12-26 12:23:42 +00002865
2866 StringRef getConstraintRegister(const StringRef &Constraint,
2867 const StringRef &Expression) const override {
2868 StringRef::iterator I, E;
2869 for (I = Constraint.begin(), E = Constraint.end(); I != E; ++I) {
2870 if (isalpha(*I))
2871 break;
2872 }
2873 if (I == E)
2874 return "";
2875 switch (*I) {
2876 // For the register constraints, return the matching register name
2877 case 'a':
2878 return "ax";
2879 case 'b':
2880 return "bx";
2881 case 'c':
2882 return "cx";
2883 case 'd':
2884 return "dx";
2885 case 'S':
2886 return "si";
2887 case 'D':
2888 return "di";
2889 // In case the constraint is 'r' we need to return Expression
2890 case 'r':
2891 return Expression;
2892 default:
2893 // Default value if there is no constraint for the register
2894 return "";
2895 }
2896 return "";
2897 }
2898
Craig Topper3164f332014-03-11 03:39:26 +00002899 void getTargetDefines(const LangOptions &Opts,
2900 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00002901 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
2902 bool Enabled);
2903 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
2904 bool Enabled);
2905 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
2906 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002907 void setFeatureEnabled(llvm::StringMap<bool> &Features,
2908 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00002909 setFeatureEnabledImpl(Features, Name, Enabled);
2910 }
2911 // This exists purely to cut down on the number of virtual calls in
Eric Christopheref1e2952015-08-28 02:13:58 +00002912 // initFeatureMap which calls this repeatedly.
Craig Topper86d79ef2013-09-17 04:51:29 +00002913 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2914 StringRef Name, bool Enabled);
Eric Christopher8c47b422015-10-09 18:39:55 +00002915 bool
2916 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
2917 StringRef CPU,
2918 const std::vector<std::string> &FeaturesVec) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002919 bool hasFeature(StringRef Feature) const override;
2920 bool handleTargetFeatures(std::vector<std::string> &Features,
2921 DiagnosticsEngine &Diags) override;
Alp Toker4925ba72014-06-07 23:30:42 +00002922 StringRef getABI() const override {
Ahmed Bougacha0b938282015-06-22 21:31:43 +00002923 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX512F)
2924 return "avx512";
Craig Topperd945d502015-10-20 00:00:17 +00002925 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002926 return "avx";
Craig Topperd945d502015-10-20 00:00:17 +00002927 if (getTriple().getArch() == llvm::Triple::x86 &&
Derek Schuffc7dd7222012-10-11 15:52:22 +00002928 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002929 return "no-mmx";
2930 return "";
Eli Friedman33465822011-07-08 23:31:17 +00002931 }
Craig Topper3164f332014-03-11 03:39:26 +00002932 bool setCPU(const std::string &Name) override {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002933 CPU = getCPUKind(Name);
Chandler Carruth212334f2011-09-28 08:55:37 +00002934
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002935 // Perform any per-CPU checks necessary to determine if this CPU is
2936 // acceptable.
2937 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
2938 // invalid without explaining *why*.
2939 switch (CPU) {
2940 case CK_Generic:
2941 // No processor selected!
2942 return false;
2943
2944 case CK_i386:
2945 case CK_i486:
2946 case CK_WinChipC6:
2947 case CK_WinChip2:
2948 case CK_C3:
2949 case CK_i586:
2950 case CK_Pentium:
2951 case CK_PentiumMMX:
2952 case CK_i686:
2953 case CK_PentiumPro:
2954 case CK_Pentium2:
2955 case CK_Pentium3:
2956 case CK_Pentium3M:
2957 case CK_PentiumM:
2958 case CK_Yonah:
2959 case CK_C3_2:
2960 case CK_Pentium4:
2961 case CK_Pentium4M:
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002962 case CK_Lakemont:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002963 case CK_Prescott:
2964 case CK_K6:
2965 case CK_K6_2:
2966 case CK_K6_3:
2967 case CK_Athlon:
2968 case CK_AthlonThunderbird:
2969 case CK_Athlon4:
2970 case CK_AthlonXP:
2971 case CK_AthlonMP:
2972 case CK_Geode:
2973 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002974 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002975 return false;
2976
2977 // Fallthrough
2978 case CK_Nocona:
2979 case CK_Core2:
2980 case CK_Penryn:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002981 case CK_Bonnell:
Preston Gurda3c58c02013-09-13 19:27:17 +00002982 case CK_Silvermont:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002983 case CK_Nehalem:
2984 case CK_Westmere:
2985 case CK_SandyBridge:
2986 case CK_IvyBridge:
2987 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002988 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002989 case CK_SkylakeClient:
2990 case CK_SkylakeServer:
2991 case CK_Cannonlake:
Craig Topper449314e2013-08-20 07:09:39 +00002992 case CK_KNL:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002993 case CK_Athlon64:
2994 case CK_Athlon64SSE3:
2995 case CK_AthlonFX:
2996 case CK_K8:
2997 case CK_K8SSE3:
2998 case CK_Opteron:
2999 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00003000 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00003001 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003002 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003003 case CK_BDVER1:
3004 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003005 case CK_BDVER3:
Benjamin Kramer56c58222014-05-02 15:47:51 +00003006 case CK_BDVER4:
Craig Topperc45744a2017-01-10 06:02:12 +00003007 case CK_ZNVER1:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00003008 case CK_x86_64:
3009 return true;
3010 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00003011 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003012 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003013
Craig Topper3164f332014-03-11 03:39:26 +00003014 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00003015
Craig Topper3164f332014-03-11 03:39:26 +00003016 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00003017 // Most of the non-ARM calling conventions are i386 conventions.
3018 switch (CC) {
3019 case CC_X86ThisCall:
3020 case CC_X86FastCall:
3021 case CC_X86StdCall:
3022 case CC_X86VectorCall:
Erich Keane757d3172016-11-02 18:29:35 +00003023 case CC_X86RegCall:
John McCall477f2bb2016-03-03 06:39:32 +00003024 case CC_C:
3025 case CC_Swift:
3026 case CC_X86Pascal:
3027 case CC_IntelOclBicc:
3028 return CCCR_OK;
3029 default:
3030 return CCCR_Warning;
3031 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003032 }
3033
Craig Topper3164f332014-03-11 03:39:26 +00003034 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00003035 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003036 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00003037
3038 bool hasSjLjLowering() const override {
3039 return true;
3040 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00003041
3042 void setSupportedOpenCLOpts() override {
Yaxun Liu5b746652016-12-18 05:18:55 +00003043 getSupportedOpenCLOpts().supportAll();
Yaxun Liu39cf40f2016-05-16 17:06:34 +00003044 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00003045};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00003046
Rafael Espindolaeb265472013-08-21 21:59:03 +00003047bool X86TargetInfo::setFPMath(StringRef Name) {
3048 if (Name == "387") {
3049 FPMath = FP_387;
3050 return true;
3051 }
3052 if (Name == "sse") {
3053 FPMath = FP_SSE;
3054 return true;
3055 }
3056 return false;
3057}
3058
Eric Christopher007b0a02015-08-28 22:32:01 +00003059bool X86TargetInfo::initFeatureMap(
3060 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
Eric Christopher8c47b422015-10-09 18:39:55 +00003061 const std::vector<std::string> &FeaturesVec) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003062 // FIXME: This *really* should not be here.
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003063 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00003064 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00003065 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003066
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003067 const CPUKind Kind = getCPUKind(CPU);
Andrey Turetskiy5f1cf5f2016-03-23 11:15:10 +00003068
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003069 // Enable X87 for all X86 processors but Lakemont.
3070 if (Kind != CK_Lakemont)
3071 setFeatureEnabledImpl(Features, "x87", true);
3072
3073 switch (Kind) {
Chandler Carruth212334f2011-09-28 08:55:37 +00003074 case CK_Generic:
3075 case CK_i386:
3076 case CK_i486:
3077 case CK_i586:
3078 case CK_Pentium:
3079 case CK_i686:
3080 case CK_PentiumPro:
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003081 case CK_Lakemont:
Chandler Carruth212334f2011-09-28 08:55:37 +00003082 break;
3083 case CK_PentiumMMX:
3084 case CK_Pentium2:
Craig Topperdb4dc082014-11-06 05:52:19 +00003085 case CK_K6:
3086 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00003087 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003088 break;
3089 case CK_Pentium3:
3090 case CK_Pentium3M:
Craig Topperdb4dc082014-11-06 05:52:19 +00003091 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00003092 setFeatureEnabledImpl(Features, "sse", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003093 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003094 break;
3095 case CK_PentiumM:
3096 case CK_Pentium4:
3097 case CK_Pentium4M:
3098 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00003099 setFeatureEnabledImpl(Features, "sse2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003100 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003101 break;
3102 case CK_Yonah:
3103 case CK_Prescott:
3104 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00003105 setFeatureEnabledImpl(Features, "sse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003106 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003107 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003108 break;
3109 case CK_Core2:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003110 case CK_Bonnell:
Craig Topper86d79ef2013-09-17 04:51:29 +00003111 setFeatureEnabledImpl(Features, "ssse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003112 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003113 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003114 break;
3115 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00003116 setFeatureEnabledImpl(Features, "sse4.1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003117 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003118 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003119 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003120 case CK_Cannonlake:
3121 setFeatureEnabledImpl(Features, "avx512ifma", true);
3122 setFeatureEnabledImpl(Features, "avx512vbmi", true);
3123 setFeatureEnabledImpl(Features, "sha", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003124 LLVM_FALLTHROUGH;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003125 case CK_SkylakeServer:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003126 setFeatureEnabledImpl(Features, "avx512f", true);
3127 setFeatureEnabledImpl(Features, "avx512cd", true);
3128 setFeatureEnabledImpl(Features, "avx512dq", true);
3129 setFeatureEnabledImpl(Features, "avx512bw", true);
3130 setFeatureEnabledImpl(Features, "avx512vl", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003131 setFeatureEnabledImpl(Features, "pku", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003132 setFeatureEnabledImpl(Features, "clwb", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003133 LLVM_FALLTHROUGH;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003134 case CK_SkylakeClient:
Craig Topperda9fe562015-10-15 05:23:38 +00003135 setFeatureEnabledImpl(Features, "xsavec", true);
3136 setFeatureEnabledImpl(Features, "xsaves", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003137 setFeatureEnabledImpl(Features, "mpx", true);
3138 setFeatureEnabledImpl(Features, "sgx", true);
3139 setFeatureEnabledImpl(Features, "clflushopt", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003140 LLVM_FALLTHROUGH;
Craig Topperdb4dc082014-11-06 05:52:19 +00003141 case CK_Broadwell:
3142 setFeatureEnabledImpl(Features, "rdseed", true);
3143 setFeatureEnabledImpl(Features, "adx", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003144 LLVM_FALLTHROUGH;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003145 case CK_Haswell:
Craig Topperdb4dc082014-11-06 05:52:19 +00003146 setFeatureEnabledImpl(Features, "avx2", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003147 setFeatureEnabledImpl(Features, "lzcnt", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003148 setFeatureEnabledImpl(Features, "bmi", true);
3149 setFeatureEnabledImpl(Features, "bmi2", true);
3150 setFeatureEnabledImpl(Features, "rtm", true);
3151 setFeatureEnabledImpl(Features, "fma", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003152 setFeatureEnabledImpl(Features, "movbe", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003153 LLVM_FALLTHROUGH;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003154 case CK_IvyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00003155 setFeatureEnabledImpl(Features, "rdrnd", true);
3156 setFeatureEnabledImpl(Features, "f16c", true);
3157 setFeatureEnabledImpl(Features, "fsgsbase", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003158 LLVM_FALLTHROUGH;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003159 case CK_SandyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00003160 setFeatureEnabledImpl(Features, "avx", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003161 setFeatureEnabledImpl(Features, "xsave", true);
3162 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003163 LLVM_FALLTHROUGH;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003164 case CK_Westmere:
Craig Topperdb4dc082014-11-06 05:52:19 +00003165 case CK_Silvermont:
3166 setFeatureEnabledImpl(Features, "aes", true);
3167 setFeatureEnabledImpl(Features, "pclmul", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003168 LLVM_FALLTHROUGH;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003169 case CK_Nehalem:
Craig Topperdb4dc082014-11-06 05:52:19 +00003170 setFeatureEnabledImpl(Features, "sse4.2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003171 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00003172 setFeatureEnabledImpl(Features, "cx16", true);
3173 break;
3174 case CK_KNL:
3175 setFeatureEnabledImpl(Features, "avx512f", true);
3176 setFeatureEnabledImpl(Features, "avx512cd", true);
3177 setFeatureEnabledImpl(Features, "avx512er", true);
3178 setFeatureEnabledImpl(Features, "avx512pf", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003179 setFeatureEnabledImpl(Features, "prefetchwt1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003180 setFeatureEnabledImpl(Features, "fxsr", true);
Robert Khasanov50e6f582014-09-19 09:53:48 +00003181 setFeatureEnabledImpl(Features, "rdseed", true);
3182 setFeatureEnabledImpl(Features, "adx", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00003183 setFeatureEnabledImpl(Features, "lzcnt", true);
3184 setFeatureEnabledImpl(Features, "bmi", true);
3185 setFeatureEnabledImpl(Features, "bmi2", true);
3186 setFeatureEnabledImpl(Features, "rtm", true);
3187 setFeatureEnabledImpl(Features, "fma", true);
3188 setFeatureEnabledImpl(Features, "rdrnd", true);
3189 setFeatureEnabledImpl(Features, "f16c", true);
3190 setFeatureEnabledImpl(Features, "fsgsbase", true);
3191 setFeatureEnabledImpl(Features, "aes", true);
3192 setFeatureEnabledImpl(Features, "pclmul", true);
3193 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003194 setFeatureEnabledImpl(Features, "xsaveopt", true);
3195 setFeatureEnabledImpl(Features, "xsave", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003196 setFeatureEnabledImpl(Features, "movbe", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003197 break;
3198 case CK_K6_2:
3199 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00003200 case CK_WinChip2:
3201 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00003202 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003203 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00003204 case CK_Athlon:
3205 case CK_AthlonThunderbird:
3206 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00003207 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00003208 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003209 case CK_Athlon4:
3210 case CK_AthlonXP:
3211 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00003212 setFeatureEnabledImpl(Features, "sse", true);
3213 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003214 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003215 break;
3216 case CK_K8:
3217 case CK_Opteron:
3218 case CK_Athlon64:
3219 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00003220 setFeatureEnabledImpl(Features, "sse2", true);
3221 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003222 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003223 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00003224 case CK_AMDFAM10:
3225 setFeatureEnabledImpl(Features, "sse4a", true);
3226 setFeatureEnabledImpl(Features, "lzcnt", true);
3227 setFeatureEnabledImpl(Features, "popcnt", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003228 LLVM_FALLTHROUGH;
Chandler Carruth212334f2011-09-28 08:55:37 +00003229 case CK_K8SSE3:
3230 case CK_OpteronSSE3:
3231 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00003232 setFeatureEnabledImpl(Features, "sse3", true);
3233 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003234 setFeatureEnabledImpl(Features, "fxsr", true);
Roman Divackyce253d82011-10-30 13:47:56 +00003235 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00003236 case CK_BTVER2:
3237 setFeatureEnabledImpl(Features, "avx", true);
3238 setFeatureEnabledImpl(Features, "aes", true);
3239 setFeatureEnabledImpl(Features, "pclmul", true);
3240 setFeatureEnabledImpl(Features, "bmi", true);
3241 setFeatureEnabledImpl(Features, "f16c", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003242 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003243 LLVM_FALLTHROUGH;
Benjamin Kramer569f2152012-01-10 11:50:18 +00003244 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00003245 setFeatureEnabledImpl(Features, "ssse3", true);
3246 setFeatureEnabledImpl(Features, "sse4a", true);
3247 setFeatureEnabledImpl(Features, "lzcnt", true);
3248 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00003249 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003250 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003251 setFeatureEnabledImpl(Features, "fxsr", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003252 break;
Craig Topperc45744a2017-01-10 06:02:12 +00003253 case CK_ZNVER1:
3254 setFeatureEnabledImpl(Features, "adx", true);
3255 setFeatureEnabledImpl(Features, "aes", true);
3256 setFeatureEnabledImpl(Features, "avx2", true);
3257 setFeatureEnabledImpl(Features, "bmi", true);
3258 setFeatureEnabledImpl(Features, "bmi2", true);
3259 setFeatureEnabledImpl(Features, "clflushopt", true);
Craig Topper45742262017-02-09 06:10:14 +00003260 setFeatureEnabledImpl(Features, "clzero", true);
Craig Topperc45744a2017-01-10 06:02:12 +00003261 setFeatureEnabledImpl(Features, "cx16", true);
3262 setFeatureEnabledImpl(Features, "f16c", true);
3263 setFeatureEnabledImpl(Features, "fma", true);
3264 setFeatureEnabledImpl(Features, "fsgsbase", true);
3265 setFeatureEnabledImpl(Features, "fxsr", true);
3266 setFeatureEnabledImpl(Features, "lzcnt", true);
3267 setFeatureEnabledImpl(Features, "mwaitx", true);
3268 setFeatureEnabledImpl(Features, "movbe", true);
3269 setFeatureEnabledImpl(Features, "pclmul", true);
3270 setFeatureEnabledImpl(Features, "popcnt", true);
3271 setFeatureEnabledImpl(Features, "prfchw", true);
3272 setFeatureEnabledImpl(Features, "rdrnd", true);
3273 setFeatureEnabledImpl(Features, "rdseed", true);
3274 setFeatureEnabledImpl(Features, "sha", true);
3275 setFeatureEnabledImpl(Features, "sse4a", true);
3276 setFeatureEnabledImpl(Features, "xsave", true);
3277 setFeatureEnabledImpl(Features, "xsavec", true);
3278 setFeatureEnabledImpl(Features, "xsaveopt", true);
3279 setFeatureEnabledImpl(Features, "xsaves", true);
3280 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003281 case CK_BDVER4:
3282 setFeatureEnabledImpl(Features, "avx2", true);
3283 setFeatureEnabledImpl(Features, "bmi2", true);
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003284 setFeatureEnabledImpl(Features, "mwaitx", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003285 LLVM_FALLTHROUGH;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003286 case CK_BDVER3:
Craig Topper8c7f2512014-11-03 06:51:41 +00003287 setFeatureEnabledImpl(Features, "fsgsbase", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003288 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003289 LLVM_FALLTHROUGH;
Craig Topper8c7f2512014-11-03 06:51:41 +00003290 case CK_BDVER2:
Andrea Di Biagio9760a442014-11-06 12:08:57 +00003291 setFeatureEnabledImpl(Features, "bmi", true);
3292 setFeatureEnabledImpl(Features, "fma", true);
3293 setFeatureEnabledImpl(Features, "f16c", true);
3294 setFeatureEnabledImpl(Features, "tbm", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003295 LLVM_FALLTHROUGH;
Andrea Di Biagio9760a442014-11-06 12:08:57 +00003296 case CK_BDVER1:
3297 // xop implies avx, sse4a and fma4.
Craig Topper86d79ef2013-09-17 04:51:29 +00003298 setFeatureEnabledImpl(Features, "xop", true);
3299 setFeatureEnabledImpl(Features, "lzcnt", true);
3300 setFeatureEnabledImpl(Features, "aes", true);
3301 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00003302 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003303 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003304 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003305 setFeatureEnabledImpl(Features, "xsave", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003306 break;
Eli Friedman33465822011-07-08 23:31:17 +00003307 }
Eric Christopherbbd746d2015-10-08 20:10:14 +00003308 if (!TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec))
3309 return false;
3310
3311 // Can't do this earlier because we need to be able to explicitly enable
3312 // or disable these features and the things that they depend upon.
3313
3314 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
3315 auto I = Features.find("sse4.2");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003316 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00003317 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-popcnt") ==
3318 FeaturesVec.end())
3319 Features["popcnt"] = true;
3320
3321 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
3322 I = Features.find("3dnow");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003323 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00003324 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-prfchw") ==
3325 FeaturesVec.end())
3326 Features["prfchw"] = true;
3327
Eric Christophera7260af2015-10-08 20:10:18 +00003328 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
3329 // then enable MMX.
3330 I = Features.find("sse");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003331 if (I != Features.end() && I->getValue() &&
Eric Christophera7260af2015-10-08 20:10:18 +00003332 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-mmx") ==
3333 FeaturesVec.end())
3334 Features["mmx"] = true;
3335
Eric Christopherbbd746d2015-10-08 20:10:14 +00003336 return true;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003337}
3338
Rafael Espindolae62e2792013-08-20 13:44:29 +00003339void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00003340 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003341 if (Enabled) {
3342 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003343 case AVX512F:
3344 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003345 case AVX2:
3346 Features["avx2"] = true;
3347 case AVX:
3348 Features["avx"] = true;
Craig Topperda9fe562015-10-15 05:23:38 +00003349 Features["xsave"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003350 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00003351 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003352 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00003353 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003354 case SSSE3:
3355 Features["ssse3"] = true;
3356 case SSE3:
3357 Features["sse3"] = true;
3358 case SSE2:
3359 Features["sse2"] = true;
3360 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00003361 Features["sse"] = true;
3362 case NoSSE:
3363 break;
3364 }
3365 return;
3366 }
3367
3368 switch (Level) {
3369 case NoSSE:
3370 case SSE1:
3371 Features["sse"] = false;
3372 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00003373 Features["sse2"] = Features["pclmul"] = Features["aes"] =
3374 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003375 case SSE3:
3376 Features["sse3"] = false;
3377 setXOPLevel(Features, NoXOP, false);
3378 case SSSE3:
3379 Features["ssse3"] = false;
3380 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00003381 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003382 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00003383 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003384 case AVX:
Craig Topperda9fe562015-10-15 05:23:38 +00003385 Features["fma"] = Features["avx"] = Features["f16c"] = Features["xsave"] =
3386 Features["xsaveopt"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00003387 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003388 case AVX2:
3389 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00003390 case AVX512F:
Eric Christopher917e9522014-11-18 22:36:15 +00003391 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
Craig Toppera31a5da2014-12-27 06:59:37 +00003392 Features["avx512pf"] = Features["avx512dq"] = Features["avx512bw"] =
Craig Topperb4f83a02016-02-29 06:51:38 +00003393 Features["avx512vl"] = Features["avx512vbmi"] =
3394 Features["avx512ifma"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003395 }
3396}
3397
3398void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00003399 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003400 if (Enabled) {
3401 switch (Level) {
3402 case AMD3DNowAthlon:
3403 Features["3dnowa"] = true;
3404 case AMD3DNow:
3405 Features["3dnow"] = true;
3406 case MMX:
3407 Features["mmx"] = true;
3408 case NoMMX3DNow:
3409 break;
3410 }
3411 return;
3412 }
3413
3414 switch (Level) {
3415 case NoMMX3DNow:
3416 case MMX:
3417 Features["mmx"] = false;
3418 case AMD3DNow:
3419 Features["3dnow"] = false;
3420 case AMD3DNowAthlon:
3421 Features["3dnowa"] = false;
3422 }
3423}
3424
3425void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00003426 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003427 if (Enabled) {
3428 switch (Level) {
3429 case XOP:
3430 Features["xop"] = true;
3431 case FMA4:
3432 Features["fma4"] = true;
3433 setSSELevel(Features, AVX, true);
3434 case SSE4A:
3435 Features["sse4a"] = true;
3436 setSSELevel(Features, SSE3, true);
3437 case NoXOP:
3438 break;
3439 }
3440 return;
3441 }
3442
3443 switch (Level) {
3444 case NoXOP:
3445 case SSE4A:
3446 Features["sse4a"] = false;
3447 case FMA4:
3448 Features["fma4"] = false;
3449 case XOP:
3450 Features["xop"] = false;
3451 }
3452}
3453
Craig Topper86d79ef2013-09-17 04:51:29 +00003454void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
3455 StringRef Name, bool Enabled) {
Eric Christopher298ac302015-07-01 00:08:32 +00003456 // This is a bit of a hack to deal with the sse4 target feature when used
3457 // as part of the target attribute. We handle sse4 correctly everywhere
3458 // else. See below for more information on how we handle the sse4 options.
3459 if (Name != "sse4")
3460 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00003461
Craig Topper29561122013-09-19 01:13:07 +00003462 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003463 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003464 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003465 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003466 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003467 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003468 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003469 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003470 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003471 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003472 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003473 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003474 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003475 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003476 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003477 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003478 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003479 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003480 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003481 if (Enabled)
3482 setSSELevel(Features, SSE2, Enabled);
3483 } else if (Name == "pclmul") {
3484 if (Enabled)
3485 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003486 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003487 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003488 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003489 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003490 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003491 setSSELevel(Features, AVX512F, Enabled);
Craig Topperb4f83a02016-02-29 06:51:38 +00003492 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf" ||
3493 Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl" ||
3494 Name == "avx512vbmi" || Name == "avx512ifma") {
Craig Topper679b53a2013-08-21 05:29:10 +00003495 if (Enabled)
3496 setSSELevel(Features, AVX512F, Enabled);
Craig Topper6c7ecc52016-11-09 04:51:03 +00003497 // Enable BWI instruction if VBMI is being enabled.
3498 if (Name == "avx512vbmi" && Enabled)
3499 Features["avx512bw"] = true;
3500 // Also disable VBMI if BWI is being disabled.
3501 if (Name == "avx512bw" && !Enabled)
3502 Features["avx512vbmi"] = false;
Craig Topper679b53a2013-08-21 05:29:10 +00003503 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003504 if (Enabled)
3505 setSSELevel(Features, AVX, Enabled);
3506 } else if (Name == "fma4") {
3507 setXOPLevel(Features, FMA4, Enabled);
3508 } else if (Name == "xop") {
3509 setXOPLevel(Features, XOP, Enabled);
3510 } else if (Name == "sse4a") {
3511 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00003512 } else if (Name == "f16c") {
3513 if (Enabled)
3514 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00003515 } else if (Name == "sha") {
3516 if (Enabled)
3517 setSSELevel(Features, SSE2, Enabled);
Eric Christopher298ac302015-07-01 00:08:32 +00003518 } else if (Name == "sse4") {
3519 // We can get here via the __target__ attribute since that's not controlled
3520 // via the -msse4/-mno-sse4 command line alias. Handle this the same way
3521 // here - turn on the sse4.2 if enabled, turn off the sse4.1 level if
3522 // disabled.
3523 if (Enabled)
3524 setSSELevel(Features, SSE42, Enabled);
3525 else
3526 setSSELevel(Features, SSE41, Enabled);
Craig Topperda9fe562015-10-15 05:23:38 +00003527 } else if (Name == "xsave") {
Craig Topper840927e2016-02-29 06:51:34 +00003528 if (!Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003529 Features["xsaveopt"] = false;
3530 } else if (Name == "xsaveopt" || Name == "xsavec" || Name == "xsaves") {
Craig Topper840927e2016-02-29 06:51:34 +00003531 if (Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003532 Features["xsave"] = true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003533 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003534}
3535
Eric Christopher3ff21b32013-10-16 21:26:26 +00003536/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003537/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00003538bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00003539 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00003540 for (const auto &Feature : Features) {
3541 if (Feature[0] != '+')
Daniel Dunbar979586e2009-11-11 09:38:56 +00003542 continue;
3543
Eric Christopher610fe112015-08-26 08:21:55 +00003544 if (Feature == "+aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00003545 HasAES = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003546 } else if (Feature == "+pclmul") {
Craig Topper3f122a72012-05-31 05:18:48 +00003547 HasPCLMUL = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003548 } else if (Feature == "+lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00003549 HasLZCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003550 } else if (Feature == "+rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00003551 HasRDRND = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003552 } else if (Feature == "+fsgsbase") {
Craig Topper8c7f2512014-11-03 06:51:41 +00003553 HasFSGSBASE = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003554 } else if (Feature == "+bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00003555 HasBMI = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003556 } else if (Feature == "+bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00003557 HasBMI2 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003558 } else if (Feature == "+popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00003559 HasPOPCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003560 } else if (Feature == "+rtm") {
Michael Liao625a8752012-11-10 05:17:46 +00003561 HasRTM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003562 } else if (Feature == "+prfchw") {
Michael Liao74f4eaf2013-03-26 17:52:08 +00003563 HasPRFCHW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003564 } else if (Feature == "+rdseed") {
Michael Liaoffaae352013-03-29 05:17:55 +00003565 HasRDSEED = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003566 } else if (Feature == "+adx") {
Robert Khasanov50e6f582014-09-19 09:53:48 +00003567 HasADX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003568 } else if (Feature == "+tbm") {
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003569 HasTBM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003570 } else if (Feature == "+fma") {
Craig Topperbba778b2012-06-03 21:46:30 +00003571 HasFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003572 } else if (Feature == "+f16c") {
Manman Rena45358c2012-10-11 00:59:55 +00003573 HasF16C = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003574 } else if (Feature == "+avx512cd") {
Craig Topper679b53a2013-08-21 05:29:10 +00003575 HasAVX512CD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003576 } else if (Feature == "+avx512er") {
Craig Topper679b53a2013-08-21 05:29:10 +00003577 HasAVX512ER = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003578 } else if (Feature == "+avx512pf") {
Craig Topper679b53a2013-08-21 05:29:10 +00003579 HasAVX512PF = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003580 } else if (Feature == "+avx512dq") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003581 HasAVX512DQ = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003582 } else if (Feature == "+avx512bw") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003583 HasAVX512BW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003584 } else if (Feature == "+avx512vl") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003585 HasAVX512VL = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003586 } else if (Feature == "+avx512vbmi") {
3587 HasAVX512VBMI = true;
3588 } else if (Feature == "+avx512ifma") {
3589 HasAVX512IFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003590 } else if (Feature == "+sha") {
Ben Langmuir58078d02013-09-19 13:22:04 +00003591 HasSHA = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003592 } else if (Feature == "+mpx") {
3593 HasMPX = true;
3594 } else if (Feature == "+movbe") {
3595 HasMOVBE = true;
3596 } else if (Feature == "+sgx") {
3597 HasSGX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003598 } else if (Feature == "+cx16") {
Nick Lewycky50e8f482013-10-05 20:14:27 +00003599 HasCX16 = true;
Craig Toppere33f51f2015-10-16 06:22:36 +00003600 } else if (Feature == "+fxsr") {
3601 HasFXSR = true;
Craig Topperda9fe562015-10-15 05:23:38 +00003602 } else if (Feature == "+xsave") {
3603 HasXSAVE = true;
3604 } else if (Feature == "+xsaveopt") {
3605 HasXSAVEOPT = true;
3606 } else if (Feature == "+xsavec") {
3607 HasXSAVEC = true;
3608 } else if (Feature == "+xsaves") {
3609 HasXSAVES = true;
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003610 } else if (Feature == "+mwaitx") {
3611 HasMWAITX = true;
Asaf Badouha9d1e182015-12-31 14:14:07 +00003612 } else if (Feature == "+pku") {
3613 HasPKU = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003614 } else if (Feature == "+clflushopt") {
3615 HasCLFLUSHOPT = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003616 } else if (Feature == "+clwb") {
3617 HasCLWB = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003618 } else if (Feature == "+prefetchwt1") {
3619 HasPREFETCHWT1 = true;
Craig Topper45742262017-02-09 06:10:14 +00003620 } else if (Feature == "+clzero") {
3621 HasCLZERO = true;
Nick Lewycky50e8f482013-10-05 20:14:27 +00003622 }
3623
Benjamin Kramer27402c62012-03-05 15:10:44 +00003624 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003625 .Case("+avx512f", AVX512F)
3626 .Case("+avx2", AVX2)
3627 .Case("+avx", AVX)
3628 .Case("+sse4.2", SSE42)
3629 .Case("+sse4.1", SSE41)
3630 .Case("+ssse3", SSSE3)
3631 .Case("+sse3", SSE3)
3632 .Case("+sse2", SSE2)
3633 .Case("+sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00003634 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003635 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003636
Eli Friedman33465822011-07-08 23:31:17 +00003637 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00003638 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003639 .Case("+3dnowa", AMD3DNowAthlon)
3640 .Case("+3dnow", AMD3DNow)
3641 .Case("+mmx", MMX)
Eli Friedman33465822011-07-08 23:31:17 +00003642 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00003643 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003644
3645 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003646 .Case("+xop", XOP)
3647 .Case("+fma4", FMA4)
3648 .Case("+sse4a", SSE4A)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003649 .Default(NoXOP);
3650 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003651 }
Eli Friedman33465822011-07-08 23:31:17 +00003652
Rafael Espindolaeb265472013-08-21 21:59:03 +00003653 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
3654 // matches the selected sse level.
Craig Topperd945d502015-10-20 00:00:17 +00003655 if ((FPMath == FP_SSE && SSELevel < SSE1) ||
3656 (FPMath == FP_387 && SSELevel >= SSE1)) {
3657 Diags.Report(diag::err_target_unsupported_fpmath) <<
3658 (FPMath == FP_SSE ? "sse" : "387");
Rafael Espindolaeb265472013-08-21 21:59:03 +00003659 return false;
3660 }
3661
Alexey Bataev00396512015-07-02 03:40:19 +00003662 SimdDefaultAlign =
Ahmed Bougacha68bf64e2015-08-27 22:24:56 +00003663 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Rafael Espindolaeb265472013-08-21 21:59:03 +00003664 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00003665}
Chris Lattnerecd49032009-03-02 22:27:17 +00003666
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003667/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
3668/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00003669void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003670 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00003671 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00003672 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003673 Builder.defineMacro("__amd64__");
3674 Builder.defineMacro("__amd64");
3675 Builder.defineMacro("__x86_64");
3676 Builder.defineMacro("__x86_64__");
Bob Wilsona2acb1e2014-08-08 23:46:28 +00003677 if (getTriple().getArchName() == "x86_64h") {
3678 Builder.defineMacro("__x86_64h");
3679 Builder.defineMacro("__x86_64h__");
3680 }
Chris Lattnerecd49032009-03-02 22:27:17 +00003681 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003682 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00003683 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003684
Chris Lattnerecd49032009-03-02 22:27:17 +00003685 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003686 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
3687 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00003688 switch (CPU) {
3689 case CK_Generic:
3690 break;
3691 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003692 // The rest are coming from the i386 define above.
3693 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003694 break;
3695 case CK_i486:
3696 case CK_WinChipC6:
3697 case CK_WinChip2:
3698 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003699 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00003700 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003701 case CK_PentiumMMX:
3702 Builder.defineMacro("__pentium_mmx__");
3703 Builder.defineMacro("__tune_pentium_mmx__");
3704 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003705 case CK_i586:
3706 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003707 defineCPUMacros(Builder, "i586");
3708 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00003709 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003710 case CK_Pentium3:
3711 case CK_Pentium3M:
3712 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003713 Builder.defineMacro("__tune_pentium3__");
3714 // Fallthrough
3715 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00003716 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003717 Builder.defineMacro("__tune_pentium2__");
3718 // Fallthrough
3719 case CK_PentiumPro:
3720 Builder.defineMacro("__tune_i686__");
3721 Builder.defineMacro("__tune_pentiumpro__");
3722 // Fallthrough
3723 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003724 Builder.defineMacro("__i686");
3725 Builder.defineMacro("__i686__");
3726 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
3727 Builder.defineMacro("__pentiumpro");
3728 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003729 break;
3730 case CK_Pentium4:
3731 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003732 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00003733 break;
3734 case CK_Yonah:
3735 case CK_Prescott:
3736 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003737 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00003738 break;
3739 case CK_Core2:
3740 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003741 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00003742 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003743 case CK_Bonnell:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003744 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00003745 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00003746 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00003747 defineCPUMacros(Builder, "slm");
3748 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003749 case CK_Nehalem:
3750 case CK_Westmere:
3751 case CK_SandyBridge:
3752 case CK_IvyBridge:
3753 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00003754 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003755 case CK_SkylakeClient:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003756 // FIXME: Historically, we defined this legacy name, it would be nice to
3757 // remove it at some point. We've never exposed fine-grained names for
3758 // recent primary x86 CPUs, and we should keep it that way.
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003759 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00003760 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003761 case CK_SkylakeServer:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003762 defineCPUMacros(Builder, "skx");
3763 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003764 case CK_Cannonlake:
3765 break;
Craig Topper449314e2013-08-20 07:09:39 +00003766 case CK_KNL:
3767 defineCPUMacros(Builder, "knl");
3768 break;
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003769 case CK_Lakemont:
3770 Builder.defineMacro("__tune_lakemont__");
3771 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003772 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003773 Builder.defineMacro("__k6_2__");
3774 Builder.defineMacro("__tune_k6_2__");
3775 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003776 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003777 if (CPU != CK_K6_2) { // In case of fallthrough
3778 // FIXME: GCC may be enabling these in cases where some other k6
3779 // architecture is specified but -m3dnow is explicitly provided. The
3780 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003781 Builder.defineMacro("__k6_3__");
3782 Builder.defineMacro("__tune_k6_3__");
3783 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003784 // Fallthrough
3785 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003786 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00003787 break;
3788 case CK_Athlon:
3789 case CK_AthlonThunderbird:
3790 case CK_Athlon4:
3791 case CK_AthlonXP:
3792 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003793 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003794 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003795 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003796 Builder.defineMacro("__tune_athlon_sse__");
3797 }
Chandler Carruth212334f2011-09-28 08:55:37 +00003798 break;
3799 case CK_K8:
3800 case CK_K8SSE3:
3801 case CK_x86_64:
3802 case CK_Opteron:
3803 case CK_OpteronSSE3:
3804 case CK_Athlon64:
3805 case CK_Athlon64SSE3:
3806 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003807 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00003808 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00003809 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003810 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00003811 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00003812 case CK_BTVER1:
3813 defineCPUMacros(Builder, "btver1");
3814 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003815 case CK_BTVER2:
3816 defineCPUMacros(Builder, "btver2");
3817 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003818 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003819 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003820 break;
3821 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003822 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003823 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003824 case CK_BDVER3:
3825 defineCPUMacros(Builder, "bdver3");
3826 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003827 case CK_BDVER4:
3828 defineCPUMacros(Builder, "bdver4");
3829 break;
Craig Topperc45744a2017-01-10 06:02:12 +00003830 case CK_ZNVER1:
3831 defineCPUMacros(Builder, "znver1");
3832 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003833 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003834 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00003835 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003836 }
Chris Lattner96e43572009-03-02 22:40:39 +00003837
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003838 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003839 Builder.defineMacro("__REGISTER_PREFIX__", "");
3840
Chris Lattner6df41af2009-04-19 17:32:33 +00003841 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
3842 // functions in glibc header files that use FP Stack inline asm which the
3843 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003844 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003845
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003846 if (HasAES)
3847 Builder.defineMacro("__AES__");
3848
Craig Topper3f122a72012-05-31 05:18:48 +00003849 if (HasPCLMUL)
3850 Builder.defineMacro("__PCLMUL__");
3851
Craig Topper22967d42011-12-25 05:06:45 +00003852 if (HasLZCNT)
3853 Builder.defineMacro("__LZCNT__");
3854
Benjamin Kramer1e250392012-07-07 09:39:18 +00003855 if (HasRDRND)
3856 Builder.defineMacro("__RDRND__");
3857
Craig Topper8c7f2512014-11-03 06:51:41 +00003858 if (HasFSGSBASE)
3859 Builder.defineMacro("__FSGSBASE__");
3860
Craig Topper22967d42011-12-25 05:06:45 +00003861 if (HasBMI)
3862 Builder.defineMacro("__BMI__");
3863
3864 if (HasBMI2)
3865 Builder.defineMacro("__BMI2__");
3866
Craig Topper1de83482011-12-29 16:10:46 +00003867 if (HasPOPCNT)
3868 Builder.defineMacro("__POPCNT__");
3869
Michael Liao625a8752012-11-10 05:17:46 +00003870 if (HasRTM)
3871 Builder.defineMacro("__RTM__");
3872
Michael Liao74f4eaf2013-03-26 17:52:08 +00003873 if (HasPRFCHW)
3874 Builder.defineMacro("__PRFCHW__");
3875
Michael Liaoffaae352013-03-29 05:17:55 +00003876 if (HasRDSEED)
3877 Builder.defineMacro("__RDSEED__");
3878
Robert Khasanov50e6f582014-09-19 09:53:48 +00003879 if (HasADX)
3880 Builder.defineMacro("__ADX__");
3881
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003882 if (HasTBM)
3883 Builder.defineMacro("__TBM__");
3884
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003885 if (HasMWAITX)
3886 Builder.defineMacro("__MWAITX__");
3887
Rafael Espindolae62e2792013-08-20 13:44:29 +00003888 switch (XOPLevel) {
3889 case XOP:
3890 Builder.defineMacro("__XOP__");
3891 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00003892 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00003893 case SSE4A:
3894 Builder.defineMacro("__SSE4A__");
3895 case NoXOP:
3896 break;
3897 }
Craig Topperffdb46c2011-12-30 07:33:42 +00003898
Craig Topperbba778b2012-06-03 21:46:30 +00003899 if (HasFMA)
3900 Builder.defineMacro("__FMA__");
3901
Manman Rena45358c2012-10-11 00:59:55 +00003902 if (HasF16C)
3903 Builder.defineMacro("__F16C__");
3904
Craig Topper679b53a2013-08-21 05:29:10 +00003905 if (HasAVX512CD)
3906 Builder.defineMacro("__AVX512CD__");
3907 if (HasAVX512ER)
3908 Builder.defineMacro("__AVX512ER__");
3909 if (HasAVX512PF)
3910 Builder.defineMacro("__AVX512PF__");
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003911 if (HasAVX512DQ)
3912 Builder.defineMacro("__AVX512DQ__");
3913 if (HasAVX512BW)
3914 Builder.defineMacro("__AVX512BW__");
3915 if (HasAVX512VL)
3916 Builder.defineMacro("__AVX512VL__");
Craig Topperb4f83a02016-02-29 06:51:38 +00003917 if (HasAVX512VBMI)
3918 Builder.defineMacro("__AVX512VBMI__");
3919 if (HasAVX512IFMA)
3920 Builder.defineMacro("__AVX512IFMA__");
Craig Topper679b53a2013-08-21 05:29:10 +00003921
Ben Langmuir58078d02013-09-19 13:22:04 +00003922 if (HasSHA)
3923 Builder.defineMacro("__SHA__");
3924
Craig Toppere33f51f2015-10-16 06:22:36 +00003925 if (HasFXSR)
3926 Builder.defineMacro("__FXSR__");
Craig Topperda9fe562015-10-15 05:23:38 +00003927 if (HasXSAVE)
3928 Builder.defineMacro("__XSAVE__");
3929 if (HasXSAVEOPT)
3930 Builder.defineMacro("__XSAVEOPT__");
3931 if (HasXSAVEC)
3932 Builder.defineMacro("__XSAVEC__");
3933 if (HasXSAVES)
3934 Builder.defineMacro("__XSAVES__");
Asaf Badouha9d1e182015-12-31 14:14:07 +00003935 if (HasPKU)
3936 Builder.defineMacro("__PKU__");
Nick Lewycky50e8f482013-10-05 20:14:27 +00003937 if (HasCX16)
3938 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
Craig Topper78b47872017-02-08 06:48:58 +00003939 if (HasCLFLUSHOPT)
3940 Builder.defineMacro("__CLFLUSHOPT__");
Craig Topper8c708cf2017-02-08 07:36:58 +00003941 if (HasCLWB)
3942 Builder.defineMacro("__CLWB__");
Craig Topperb16cb822017-02-08 07:56:42 +00003943 if (HasMPX)
3944 Builder.defineMacro("__MPX__");
Craig Topper204ecff2017-02-08 08:23:17 +00003945 if (HasSGX)
3946 Builder.defineMacro("__SGX__");
Craig Topperd2bf7b02017-02-08 08:23:40 +00003947 if (HasPREFETCHWT1)
3948 Builder.defineMacro("__PREFETCHWT1__");
Craig Topper45742262017-02-09 06:10:14 +00003949 if (HasCLZERO)
3950 Builder.defineMacro("__CLZERO__");
Nick Lewycky50e8f482013-10-05 20:14:27 +00003951
Chris Lattner96e43572009-03-02 22:40:39 +00003952 // Each case falls through to the previous one here.
3953 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003954 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00003955 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00003956 case AVX2:
3957 Builder.defineMacro("__AVX2__");
3958 case AVX:
3959 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00003960 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003961 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00003962 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003963 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00003964 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003965 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003966 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003967 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003968 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003969 Builder.defineMacro("__SSE2__");
3970 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00003971 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003972 Builder.defineMacro("__SSE__");
3973 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00003974 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00003975 break;
3976 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003977
Derek Schuffc7dd7222012-10-11 15:52:22 +00003978 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003979 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003980 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00003981 case AVX2:
3982 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003983 case SSE42:
3984 case SSE41:
3985 case SSSE3:
3986 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003987 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003988 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003989 break;
3990 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003991 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003992 break;
3993 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003994 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003995 }
3996 }
3997
Anders Carlssone437c682010-01-27 03:47:49 +00003998 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00003999 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00004000 case AMD3DNowAthlon:
4001 Builder.defineMacro("__3dNOW_A__");
4002 case AMD3DNow:
4003 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00004004 case MMX:
4005 Builder.defineMacro("__MMX__");
4006 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00004007 break;
4008 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00004009
4010 if (CPU >= CK_i486) {
4011 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
4012 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
4013 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
4014 }
4015 if (CPU >= CK_i586)
4016 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00004017}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004018
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004019bool X86TargetInfo::hasFeature(StringRef Feature) const {
4020 return llvm::StringSwitch<bool>(Feature)
4021 .Case("aes", HasAES)
4022 .Case("avx", SSELevel >= AVX)
4023 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00004024 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00004025 .Case("avx512cd", HasAVX512CD)
4026 .Case("avx512er", HasAVX512ER)
4027 .Case("avx512pf", HasAVX512PF)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00004028 .Case("avx512dq", HasAVX512DQ)
4029 .Case("avx512bw", HasAVX512BW)
4030 .Case("avx512vl", HasAVX512VL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00004031 .Case("avx512vbmi", HasAVX512VBMI)
4032 .Case("avx512ifma", HasAVX512IFMA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004033 .Case("bmi", HasBMI)
4034 .Case("bmi2", HasBMI2)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00004035 .Case("clflushopt", HasCLFLUSHOPT)
4036 .Case("clwb", HasCLWB)
Craig Topper45742262017-02-09 06:10:14 +00004037 .Case("clzero", HasCLZERO)
Nick Lewycky50e8f482013-10-05 20:14:27 +00004038 .Case("cx16", HasCX16)
4039 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00004040 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00004041 .Case("fma4", XOPLevel >= FMA4)
Craig Topper8c7f2512014-11-03 06:51:41 +00004042 .Case("fsgsbase", HasFSGSBASE)
Craig Toppere33f51f2015-10-16 06:22:36 +00004043 .Case("fxsr", HasFXSR)
Craig Topper8dbc5842014-11-03 07:05:26 +00004044 .Case("lzcnt", HasLZCNT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004045 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
4046 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
4047 .Case("mmx", MMX3DNowLevel >= MMX)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00004048 .Case("movbe", HasMOVBE)
4049 .Case("mpx", HasMPX)
Craig Topper3f122a72012-05-31 05:18:48 +00004050 .Case("pclmul", HasPCLMUL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00004051 .Case("pku", HasPKU)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004052 .Case("popcnt", HasPOPCNT)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00004053 .Case("prefetchwt1", HasPREFETCHWT1)
Michael Liao74f4eaf2013-03-26 17:52:08 +00004054 .Case("prfchw", HasPRFCHW)
Craig Topper8dbc5842014-11-03 07:05:26 +00004055 .Case("rdrnd", HasRDRND)
Michael Liaoffaae352013-03-29 05:17:55 +00004056 .Case("rdseed", HasRDSEED)
Craig Topper8dbc5842014-11-03 07:05:26 +00004057 .Case("rtm", HasRTM)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00004058 .Case("sgx", HasSGX)
Ben Langmuir58078d02013-09-19 13:22:04 +00004059 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004060 .Case("sse", SSELevel >= SSE1)
4061 .Case("sse2", SSELevel >= SSE2)
4062 .Case("sse3", SSELevel >= SSE3)
4063 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00004064 .Case("sse4.1", SSELevel >= SSE41)
4065 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00004066 .Case("sse4a", XOPLevel >= SSE4A)
Craig Topper8dbc5842014-11-03 07:05:26 +00004067 .Case("tbm", HasTBM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004068 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00004069 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
4070 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00004071 .Case("xop", XOPLevel >= XOP)
Craig Topperda9fe562015-10-15 05:23:38 +00004072 .Case("xsave", HasXSAVE)
4073 .Case("xsavec", HasXSAVEC)
4074 .Case("xsaves", HasXSAVES)
4075 .Case("xsaveopt", HasXSAVEOPT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004076 .Default(false);
4077}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004078
Eric Christopherd9832702015-06-29 21:00:05 +00004079// We can't use a generic validation scheme for the features accepted here
4080// versus subtarget features accepted in the target attribute because the
4081// bitfield structure that's initialized in the runtime only supports the
4082// below currently rather than the full range of subtarget features. (See
4083// X86TargetInfo::hasFeature for a somewhat comprehensive list).
4084bool X86TargetInfo::validateCpuSupports(StringRef FeatureStr) const {
4085 return llvm::StringSwitch<bool>(FeatureStr)
4086 .Case("cmov", true)
4087 .Case("mmx", true)
4088 .Case("popcnt", true)
4089 .Case("sse", true)
4090 .Case("sse2", true)
4091 .Case("sse3", true)
Benjamin Kramerf4c520d2016-05-20 15:21:08 +00004092 .Case("ssse3", true)
Eric Christopherd9832702015-06-29 21:00:05 +00004093 .Case("sse4.1", true)
4094 .Case("sse4.2", true)
4095 .Case("avx", true)
4096 .Case("avx2", true)
4097 .Case("sse4a", true)
4098 .Case("fma4", true)
4099 .Case("xop", true)
4100 .Case("fma", true)
4101 .Case("avx512f", true)
4102 .Case("bmi", true)
4103 .Case("bmi2", true)
Benjamin Kramerf4c520d2016-05-20 15:21:08 +00004104 .Case("aes", true)
4105 .Case("pclmul", true)
4106 .Case("avx512vl", true)
4107 .Case("avx512bw", true)
4108 .Case("avx512dq", true)
4109 .Case("avx512cd", true)
4110 .Case("avx512er", true)
4111 .Case("avx512pf", true)
4112 .Case("avx512vbmi", true)
4113 .Case("avx512ifma", true)
Eric Christopherd9832702015-06-29 21:00:05 +00004114 .Default(false);
4115}
4116
Eli Friedman3fd920a2008-08-20 02:34:37 +00004117bool
Anders Carlsson58436352009-02-28 17:11:49 +00004118X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00004119 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00004120 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004121 default: return false;
Alexey Bataev91e58602015-07-20 12:08:00 +00004122 // Constant constraints.
4123 case 'e': // 32-bit signed integer constant for use with sign-extending x86_64
4124 // instructions.
4125 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
4126 // x86_64 instructions.
4127 case 's':
4128 Info.setRequiresImmediate();
4129 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00004130 case 'I':
4131 Info.setRequiresImmediate(0, 31);
4132 return true;
4133 case 'J':
4134 Info.setRequiresImmediate(0, 63);
4135 return true;
4136 case 'K':
4137 Info.setRequiresImmediate(-128, 127);
4138 return true;
4139 case 'L':
Alexey Bataev91e58602015-07-20 12:08:00 +00004140 Info.setRequiresImmediate({ int(0xff), int(0xffff), int(0xffffffff) });
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00004141 return true;
4142 case 'M':
4143 Info.setRequiresImmediate(0, 3);
4144 return true;
4145 case 'N':
4146 Info.setRequiresImmediate(0, 255);
4147 return true;
4148 case 'O':
4149 Info.setRequiresImmediate(0, 127);
4150 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00004151 // Register constraints.
4152 case 'Y': // 'Y' is the first character for several 2-character constraints.
4153 // Shift the pointer to the second character of the constraint.
4154 Name++;
4155 switch (*Name) {
4156 default:
4157 return false;
4158 case '0': // First SSE register.
4159 case 't': // Any SSE register, when SSE2 is enabled.
4160 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
4161 case 'm': // Any MMX register, when inter-unit moves enabled.
Michael Zuckerman849a6a52016-10-31 17:23:52 +00004162 case 'k': // AVX512 arch mask registers: k1-k7.
Alexey Bataev91e58602015-07-20 12:08:00 +00004163 Info.setAllowsRegister();
4164 return true;
4165 }
4166 case 'f': // Any x87 floating point stack register.
Akira Hatanaka88ef7282014-07-18 23:30:30 +00004167 // Constraint 'f' cannot be used for output operands.
4168 if (Info.ConstraintStr[0] == '=')
4169 return false;
Akira Hatanaka88ef7282014-07-18 23:30:30 +00004170 Info.setAllowsRegister();
4171 return true;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004172 case 'a': // eax.
4173 case 'b': // ebx.
4174 case 'c': // ecx.
4175 case 'd': // edx.
4176 case 'S': // esi.
4177 case 'D': // edi.
4178 case 'A': // edx:eax.
Alexey Bataev91e58602015-07-20 12:08:00 +00004179 case 't': // Top of floating point stack.
4180 case 'u': // Second from top of floating point stack.
Eli Friedman3fd920a2008-08-20 02:34:37 +00004181 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00004182 case 'y': // Any MMX register.
Michael Zuckerman62f516f2016-11-01 13:16:44 +00004183 case 'v': // Any {X,Y,Z}MM register (Arch & context dependent)
Anders Carlsson5f7ee682008-10-06 19:17:39 +00004184 case 'x': // Any SSE register.
Michael Zuckerman849a6a52016-10-31 17:23:52 +00004185 case 'k': // Any AVX512 mask register (same as Yk, additionaly allows k0
4186 // for intermideate k reg operations).
Eli Friedman3fd920a2008-08-20 02:34:37 +00004187 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00004188 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
4189 case 'l': // "Index" registers: any general register that can be used as an
4190 // index in a base+index memory access.
4191 Info.setAllowsRegister();
4192 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00004193 // Floating point constant constraints.
Dale Johannesen46742a42010-08-24 22:33:12 +00004194 case 'C': // SSE floating point constant.
4195 case 'G': // x87 floating point constant.
Eli Friedman3fd920a2008-08-20 02:34:37 +00004196 return true;
4197 }
4198}
4199
Akira Hatanaka974131e2014-09-18 18:17:18 +00004200bool X86TargetInfo::validateOutputSize(StringRef Constraint,
4201 unsigned Size) const {
4202 // Strip off constraint modifiers.
4203 while (Constraint[0] == '=' ||
4204 Constraint[0] == '+' ||
4205 Constraint[0] == '&')
4206 Constraint = Constraint.substr(1);
4207
4208 return validateOperandSize(Constraint, Size);
4209}
4210
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004211bool X86TargetInfo::validateInputSize(StringRef Constraint,
4212 unsigned Size) const {
Akira Hatanaka974131e2014-09-18 18:17:18 +00004213 return validateOperandSize(Constraint, Size);
4214}
4215
4216bool X86TargetInfo::validateOperandSize(StringRef Constraint,
4217 unsigned Size) const {
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004218 switch (Constraint[0]) {
4219 default: break;
Michael Zuckerman849a6a52016-10-31 17:23:52 +00004220 case 'k':
4221 // Registers k0-k7 (AVX512) size limit is 64 bit.
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004222 case 'y':
4223 return Size <= 64;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004224 case 'f':
4225 case 't':
4226 case 'u':
4227 return Size <= 128;
Michael Zuckerman62f516f2016-11-01 13:16:44 +00004228 case 'v':
Hans Wennborg3c619a42014-09-18 20:24:04 +00004229 case 'x':
Alexey Bataev91e58602015-07-20 12:08:00 +00004230 if (SSELevel >= AVX512F)
4231 // 512-bit zmm registers can be used if target supports AVX512F.
4232 return Size <= 512U;
4233 else if (SSELevel >= AVX)
4234 // 256-bit ymm registers can be used if target supports AVX.
4235 return Size <= 256U;
4236 return Size <= 128U;
4237 case 'Y':
4238 // 'Y' is the first character for several 2-character constraints.
4239 switch (Constraint[1]) {
4240 default: break;
4241 case 'm':
4242 // 'Ym' is synonymous with 'y'.
Michael Zuckerman849a6a52016-10-31 17:23:52 +00004243 case 'k':
Alexey Bataev91e58602015-07-20 12:08:00 +00004244 return Size <= 64;
4245 case 'i':
4246 case 't':
4247 // 'Yi' and 'Yt' are synonymous with 'x' when SSE2 is enabled.
4248 if (SSELevel >= AVX512F)
4249 return Size <= 512U;
4250 else if (SSELevel >= AVX)
4251 return Size <= 256U;
4252 return SSELevel >= SSE2 && Size <= 128U;
4253 }
4254
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004255 }
4256
4257 return true;
4258}
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00004259
Eli Friedman3fd920a2008-08-20 02:34:37 +00004260std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004261X86TargetInfo::convertConstraint(const char *&Constraint) const {
4262 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004263 case 'a': return std::string("{ax}");
4264 case 'b': return std::string("{bx}");
4265 case 'c': return std::string("{cx}");
4266 case 'd': return std::string("{dx}");
4267 case 'S': return std::string("{si}");
4268 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00004269 case 'p': // address
4270 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00004271 case 't': // top of floating point stack.
4272 return std::string("{st}");
4273 case 'u': // second from top of floating point stack.
4274 return std::string("{st(1)}"); // second from top of floating point stack.
Michael Zuckerman849a6a52016-10-31 17:23:52 +00004275 case 'Y':
4276 switch (Constraint[1]) {
4277 default:
4278 // Break from inner switch and fall through (copy single char),
4279 // continue parsing after copying the current constraint into
4280 // the return string.
4281 break;
4282 case 'k':
4283 // "^" hints llvm that this is a 2 letter constraint.
4284 // "Constraint++" is used to promote the string iterator
4285 // to the next constraint.
4286 return std::string("^") + std::string(Constraint++, 2);
4287 }
4288 LLVM_FALLTHROUGH;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004289 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004290 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00004291 }
4292}
Chris Lattner5ba61f02006-10-14 07:39:34 +00004293
Eli Friedman3fd920a2008-08-20 02:34:37 +00004294// X86-32 generic target
4295class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00004296public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004297 X86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4298 : X86TargetInfo(Triple, Opts) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004299 DoubleAlign = LongLongAlign = 32;
4300 LongDoubleWidth = 96;
4301 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00004302 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00004303 resetDataLayout("e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128");
Eli Friedman32ca82a2009-03-29 20:31:09 +00004304 SizeType = UnsignedInt;
4305 PtrDiffType = SignedInt;
4306 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00004307 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00004308
4309 // Use fpret for all types.
4310 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
4311 (1 << TargetInfo::Double) |
4312 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004313
4314 // x86-32 has atomics up to 8 bytes
4315 // FIXME: Check that we actually have cmpxchg8b before setting
4316 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
4317 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004318 }
Craig Topper3164f332014-03-11 03:39:26 +00004319 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004320 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004321 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004322
Craig Topper3164f332014-03-11 03:39:26 +00004323 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00004324 if (RegNo == 0) return 0;
4325 if (RegNo == 1) return 2;
4326 return -1;
4327 }
Akira Hatanaka974131e2014-09-18 18:17:18 +00004328 bool validateOperandSize(StringRef Constraint,
4329 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00004330 switch (Constraint[0]) {
4331 default: break;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004332 case 'R':
4333 case 'q':
4334 case 'Q':
Bill Wendling887b4852012-11-12 06:42:51 +00004335 case 'a':
4336 case 'b':
4337 case 'c':
4338 case 'd':
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004339 case 'S':
4340 case 'D':
Bill Wendling3c7fed82012-11-12 18:52:32 +00004341 return Size <= 32;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004342 case 'A':
4343 return Size <= 64;
Bill Wendling887b4852012-11-12 06:42:51 +00004344 }
4345
Akira Hatanaka974131e2014-09-18 18:17:18 +00004346 return X86TargetInfo::validateOperandSize(Constraint, Size);
Bill Wendling887b4852012-11-12 06:42:51 +00004347 }
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00004348 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
4349 return llvm::makeArrayRef(BuiltinInfoX86, clang::X86::LastX86CommonBuiltin -
4350 Builtin::FirstTSBuiltin + 1);
4351 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004352};
Eli Friedman3fd920a2008-08-20 02:34:37 +00004353
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004354class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
4355public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004356 NetBSDI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4357 : NetBSDTargetInfo<X86_32TargetInfo>(Triple, Opts) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004358
Craig Topper3164f332014-03-11 03:39:26 +00004359 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00004360 unsigned Major, Minor, Micro;
4361 getTriple().getOSVersion(Major, Minor, Micro);
4362 // New NetBSD uses the default rounding mode.
4363 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
4364 return X86_32TargetInfo::getFloatEvalMethod();
4365 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004366 return 1;
4367 }
4368};
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004369
Eli Friedmane3aa4542009-07-05 18:47:56 +00004370class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
4371public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004372 OpenBSDI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4373 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00004374 SizeType = UnsignedLong;
4375 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004376 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00004377 }
4378};
Eli Friedmane3aa4542009-07-05 18:47:56 +00004379
Eli Friedman9fa28852012-08-08 23:57:20 +00004380class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
4381public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004382 BitrigI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4383 : BitrigTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman9fa28852012-08-08 23:57:20 +00004384 SizeType = UnsignedLong;
4385 IntPtrType = SignedLong;
4386 PtrDiffType = SignedLong;
4387 }
4388};
Eli Friedman9fa28852012-08-08 23:57:20 +00004389
Torok Edwinb2b37c62009-06-30 17:10:35 +00004390class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004391public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004392 DarwinI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4393 : DarwinTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004394 LongDoubleWidth = 128;
4395 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004396 SuitableAlign = 128;
Tim Northover5627d392015-10-30 16:30:45 +00004397 MaxVectorAlign = 256;
4398 // The watchOS simulator uses the builtin bool type for Objective-C.
4399 llvm::Triple T = llvm::Triple(Triple);
4400 if (T.isWatchOS())
4401 UseSignedCharForObjCBool = false;
Eli Friedman32ca82a2009-03-29 20:31:09 +00004402 SizeType = UnsignedLong;
4403 IntPtrType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00004404 resetDataLayout("e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128");
Daniel Dunbarbd606522010-05-27 00:35:16 +00004405 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00004406 }
4407
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004408 bool handleTargetFeatures(std::vector<std::string> &Features,
4409 DiagnosticsEngine &Diags) override {
4410 if (!DarwinTargetInfo<X86_32TargetInfo>::handleTargetFeatures(Features,
4411 Diags))
4412 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004413 // We now know the features we have: we can decide how to align vectors.
4414 MaxVectorAlign =
4415 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004416 return true;
4417 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004418};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004419
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004420// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004421class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004422public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004423 WindowsX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4424 : WindowsTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Chris Lattner46be2e12009-06-24 17:12:15 +00004425 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00004426 DoubleAlign = LongLongAlign = 64;
Reid Kleckner7510c092015-04-01 16:45:06 +00004427 bool IsWinCOFF =
4428 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
James Y Knightb214cbc2016-03-04 19:00:41 +00004429 resetDataLayout(IsWinCOFF
4430 ? "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
4431 : "e-m:e-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32");
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004432 }
Craig Topper3164f332014-03-11 03:39:26 +00004433 void getTargetDefines(const LangOptions &Opts,
4434 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004435 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
4436 }
4437};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004438
4439// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004440class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004441public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004442 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple,
4443 const TargetOptions &Opts)
4444 : WindowsX86_32TargetInfo(Triple, Opts) {
Eli Friedman015d6282011-03-22 21:25:11 +00004445 LongDoubleWidth = LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00004446 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004447 }
Craig Topper3164f332014-03-11 03:39:26 +00004448 void getTargetDefines(const LangOptions &Opts,
4449 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004450 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
4451 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
4452 // The value of the following reflects processor type.
4453 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
4454 // We lost the original triple, so we use the default.
4455 Builder.defineMacro("_M_IX86", "600");
4456 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004457};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004458
David Majnemerae1ed0e2015-05-28 04:36:18 +00004459static void addCygMingDefines(const LangOptions &Opts, MacroBuilder &Builder) {
Eric Christopherb093d692015-10-09 18:39:59 +00004460 // Mingw and cygwin define __declspec(a) to __attribute__((a)). Clang
4461 // supports __declspec natively under -fms-extensions, but we define a no-op
4462 // __declspec macro anyway for pre-processor compatibility.
Reid Kleckner47606832014-04-21 20:58:00 +00004463 if (Opts.MicrosoftExt)
4464 Builder.defineMacro("__declspec", "__declspec");
4465 else
4466 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
4467
4468 if (!Opts.MicrosoftExt) {
4469 // Provide macros for all the calling convention keywords. Provide both
4470 // single and double underscore prefixed variants. These are available on
4471 // x64 as well as x86, even though they have no effect.
4472 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
4473 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00004474 std::string GCCSpelling = "__attribute__((__";
4475 GCCSpelling += CC;
4476 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00004477 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
4478 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
4479 }
4480 }
4481}
4482
David Majnemerae1ed0e2015-05-28 04:36:18 +00004483static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
4484 Builder.defineMacro("__MSVCRT__");
4485 Builder.defineMacro("__MINGW32__");
4486 addCygMingDefines(Opts, Builder);
4487}
4488
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004489// x86-32 MinGW target
4490class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
4491public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004492 MinGWX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4493 : WindowsX86_32TargetInfo(Triple, Opts) {}
Craig Topper3164f332014-03-11 03:39:26 +00004494 void getTargetDefines(const LangOptions &Opts,
4495 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004496 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004497 DefineStd(Builder, "WIN32", Opts);
4498 DefineStd(Builder, "WINNT", Opts);
4499 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00004500 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004501 }
4502};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004503
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004504// x86-32 Cygwin target
4505class CygwinX86_32TargetInfo : public X86_32TargetInfo {
4506public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004507 CygwinX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4508 : X86_32TargetInfo(Triple, Opts) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004509 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004510 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00004511 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 +00004512 }
Craig Topper3164f332014-03-11 03:39:26 +00004513 void getTargetDefines(const LangOptions &Opts,
4514 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004515 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00004516 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004517 Builder.defineMacro("__CYGWIN__");
4518 Builder.defineMacro("__CYGWIN32__");
David Majnemerae1ed0e2015-05-28 04:36:18 +00004519 addCygMingDefines(Opts, Builder);
Saleem Abdulrasool56027092017-02-07 19:00:06 +00004520 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00004521 if (Opts.CPlusPlus)
4522 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00004523 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004524};
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004525
Chris Lattnerb986aba2010-04-11 19:29:39 +00004526// x86-32 Haiku target
Reid Kleckner330fb172016-05-11 16:19:05 +00004527class HaikuX86_32TargetInfo : public HaikuTargetInfo<X86_32TargetInfo> {
Chris Lattnerb986aba2010-04-11 19:29:39 +00004528public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004529 HaikuX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Reid Kleckner330fb172016-05-11 16:19:05 +00004530 : HaikuTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman04831922010-08-22 01:00:03 +00004531 }
Craig Topper3164f332014-03-11 03:39:26 +00004532 void getTargetDefines(const LangOptions &Opts,
4533 MacroBuilder &Builder) const override {
Reid Kleckner330fb172016-05-11 16:19:05 +00004534 HaikuTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
Chris Lattnerb986aba2010-04-11 19:29:39 +00004535 Builder.defineMacro("__INTEL__");
Chris Lattnerb986aba2010-04-11 19:29:39 +00004536 }
4537};
Chris Lattnerb986aba2010-04-11 19:29:39 +00004538
Alexey Bataevc99b0492015-11-25 09:24:26 +00004539// X86-32 MCU target
4540class MCUX86_32TargetInfo : public X86_32TargetInfo {
4541public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004542 MCUX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4543 : X86_32TargetInfo(Triple, Opts) {
Alexey Bataevc99b0492015-11-25 09:24:26 +00004544 LongDoubleWidth = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00004545 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
James Y Knightb214cbc2016-03-04 19:00:41 +00004546 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 +00004547 WIntType = UnsignedInt;
Alexey Bataevc99b0492015-11-25 09:24:26 +00004548 }
4549
4550 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
4551 // On MCU we support only C calling convention.
4552 return CC == CC_C ? CCCR_OK : CCCR_Warning;
4553 }
4554
4555 void getTargetDefines(const LangOptions &Opts,
4556 MacroBuilder &Builder) const override {
4557 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4558 Builder.defineMacro("__iamcu");
4559 Builder.defineMacro("__iamcu__");
4560 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00004561
4562 bool allowsLargerPreferedTypeAlignment() const override {
4563 return false;
4564 }
Alexey Bataevc99b0492015-11-25 09:24:26 +00004565};
4566
Douglas Gregor9fabd852011-07-01 22:41:14 +00004567// RTEMS Target
4568template<typename Target>
4569class RTEMSTargetInfo : public OSTargetInfo<Target> {
4570protected:
Craig Topper3164f332014-03-11 03:39:26 +00004571 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4572 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004573 // RTEMS defines; list based off of gcc output
4574
Douglas Gregor9fabd852011-07-01 22:41:14 +00004575 Builder.defineMacro("__rtems__");
4576 Builder.defineMacro("__ELF__");
4577 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004578
Douglas Gregor9fabd852011-07-01 22:41:14 +00004579public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004580 RTEMSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4581 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004582 switch (Triple.getArch()) {
4583 default:
4584 case llvm::Triple::x86:
4585 // this->MCountName = ".mcount";
4586 break;
4587 case llvm::Triple::mips:
4588 case llvm::Triple::mipsel:
4589 case llvm::Triple::ppc:
4590 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00004591 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004592 // this->MCountName = "_mcount";
4593 break;
4594 case llvm::Triple::arm:
4595 // this->MCountName = "__mcount";
4596 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004597 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004598 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00004599};
4600
Douglas Gregor9fabd852011-07-01 22:41:14 +00004601// x86-32 RTEMS target
4602class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
4603public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004604 RTEMSX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4605 : X86_32TargetInfo(Triple, Opts) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004606 SizeType = UnsignedLong;
4607 IntPtrType = SignedLong;
4608 PtrDiffType = SignedLong;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004609 }
Craig Topper3164f332014-03-11 03:39:26 +00004610 void getTargetDefines(const LangOptions &Opts,
4611 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004612 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4613 Builder.defineMacro("__INTEL__");
4614 Builder.defineMacro("__rtems__");
4615 }
4616};
Douglas Gregor9fabd852011-07-01 22:41:14 +00004617
Eli Friedman3fd920a2008-08-20 02:34:37 +00004618// x86-64 generic target
4619class X86_64TargetInfo : public X86TargetInfo {
4620public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004621 X86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4622 : X86TargetInfo(Triple, Opts) {
David Blaikie40f842d2014-07-10 18:46:15 +00004623 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
David Majnemer8fa8c382015-03-17 23:55:00 +00004624 bool IsWinCOFF =
4625 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Zinovy Nis1db95732014-07-10 15:27:19 +00004626 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00004627 LongDoubleWidth = 128;
4628 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00004629 LargeArrayMinWidth = 128;
4630 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004631 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00004632 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
4633 PtrDiffType = IsX32 ? SignedInt : SignedLong;
4634 IntPtrType = IsX32 ? SignedInt : SignedLong;
4635 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00004636 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00004637 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00004638
Eric Christopher917e9522014-11-18 22:36:15 +00004639 // Pointers are 32-bit in x32.
Eric Christopherf6ee1f32017-02-10 04:35:21 +00004640 resetDataLayout(IsX32
4641 ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128"
4642 : IsWinCOFF ? "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
4643 : "e-m:e-i64:64-f80:128-n8:16:32:64-S128");
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00004644
4645 // Use fpret only for long double.
4646 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004647
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00004648 // Use fp2ret for _Complex long double.
4649 ComplexLongDoubleUsesFP2Ret = true;
4650
Charles Davisc7d5c942015-09-17 20:55:33 +00004651 // Make __builtin_ms_va_list available.
4652 HasBuiltinMSVaList = true;
4653
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004654 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004655 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00004656 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00004657 }
Craig Topper3164f332014-03-11 03:39:26 +00004658 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004659 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00004660 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004661
Craig Topper3164f332014-03-11 03:39:26 +00004662 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00004663 if (RegNo == 0) return 0;
4664 if (RegNo == 1) return 1;
4665 return -1;
4666 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004667
Craig Topper3164f332014-03-11 03:39:26 +00004668 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00004669 switch (CC) {
4670 case CC_C:
4671 case CC_Swift:
4672 case CC_X86VectorCall:
4673 case CC_IntelOclBicc:
4674 case CC_X86_64Win64:
Roman Levenstein35aa5ce2016-03-16 18:00:46 +00004675 case CC_PreserveMost:
4676 case CC_PreserveAll:
Erich Keane757d3172016-11-02 18:29:35 +00004677 case CC_X86RegCall:
John McCall477f2bb2016-03-03 06:39:32 +00004678 return CCCR_OK;
4679 default:
4680 return CCCR_Warning;
4681 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004682 }
4683
Craig Topper3164f332014-03-11 03:39:26 +00004684 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00004685 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004686 }
4687
Pavel Chupinfd223e12014-08-04 12:39:43 +00004688 // for x32 we need it here explicitly
4689 bool hasInt128Type() const override { return true; }
Reid Klecknerf27e7522016-02-01 18:58:24 +00004690 unsigned getUnwindWordWidth() const override { return 64; }
4691 unsigned getRegisterWidth() const override { return 64; }
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00004692
4693 bool validateGlobalRegisterVariable(StringRef RegName,
4694 unsigned RegSize,
4695 bool &HasSizeMismatch) const override {
4696 // rsp and rbp are the only 64-bit registers the x86 backend can currently
4697 // handle.
4698 if (RegName.equals("rsp") || RegName.equals("rbp")) {
4699 // Check that the register size is 64-bit.
4700 HasSizeMismatch = RegSize != 64;
4701 return true;
4702 }
4703
4704 // Check if the register is a 32-bit register the backend can handle.
4705 return X86TargetInfo::validateGlobalRegisterVariable(RegName, RegSize,
4706 HasSizeMismatch);
4707 }
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00004708 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
4709 return llvm::makeArrayRef(BuiltinInfoX86,
4710 X86::LastTSBuiltin - Builtin::FirstTSBuiltin);
4711 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004712};
Eli Friedman3fd920a2008-08-20 02:34:37 +00004713
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004714// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004715class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004716public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004717 WindowsX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4718 : WindowsTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004719 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00004720 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004721 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004722 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004723 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00004724 SizeType = UnsignedLongLong;
4725 PtrDiffType = SignedLongLong;
4726 IntPtrType = SignedLongLong;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004727 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004728
Craig Topper3164f332014-03-11 03:39:26 +00004729 void getTargetDefines(const LangOptions &Opts,
4730 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004731 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004732 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004733 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004734
Craig Topper3164f332014-03-11 03:39:26 +00004735 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004736 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00004737 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004738
Craig Topper3164f332014-03-11 03:39:26 +00004739 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004740 switch (CC) {
4741 case CC_X86StdCall:
4742 case CC_X86ThisCall:
4743 case CC_X86FastCall:
4744 return CCCR_Ignore;
4745 case CC_C:
4746 case CC_X86VectorCall:
4747 case CC_IntelOclBicc:
4748 case CC_X86_64SysV:
Arnold Schwaighofer4fc955e2016-10-12 18:59:24 +00004749 case CC_Swift:
Erich Keane757d3172016-11-02 18:29:35 +00004750 case CC_X86RegCall:
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004751 return CCCR_OK;
4752 default:
4753 return CCCR_Warning;
4754 }
Charles Davisb5a214e2013-08-30 04:39:01 +00004755 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004756};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004757
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004758// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004759class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004760public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004761 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple,
4762 const TargetOptions &Opts)
4763 : WindowsX86_64TargetInfo(Triple, Opts) {
Eli Friedman015d6282011-03-22 21:25:11 +00004764 LongDoubleWidth = LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00004765 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004766 }
Craig Topper3164f332014-03-11 03:39:26 +00004767 void getTargetDefines(const LangOptions &Opts,
4768 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004769 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
4770 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
David Majnemerb856e8f2015-07-26 23:17:29 +00004771 Builder.defineMacro("_M_X64", "100");
4772 Builder.defineMacro("_M_AMD64", "100");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004773 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004774};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004775
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004776// x86-64 MinGW target
4777class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
4778public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004779 MinGWX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4780 : WindowsX86_64TargetInfo(Triple, Opts) {
Reid Kleckner11a17192015-10-28 22:29:52 +00004781 // Mingw64 rounds long double size and alignment up to 16 bytes, but sticks
4782 // with x86 FP ops. Weird.
4783 LongDoubleWidth = LongDoubleAlign = 128;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00004784 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended();
Reid Kleckner11a17192015-10-28 22:29:52 +00004785 }
4786
Craig Topper3164f332014-03-11 03:39:26 +00004787 void getTargetDefines(const LangOptions &Opts,
4788 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004789 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004790 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004791 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00004792 addMinGWDefines(Opts, Builder);
Reid Klecknere070b992014-11-14 02:01:10 +00004793
4794 // GCC defines this macro when it is using __gxx_personality_seh0.
4795 if (!Opts.SjLjExceptions)
4796 Builder.defineMacro("__SEH__");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004797 }
4798};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004799
Yaron Kerend030d112015-07-22 17:38:19 +00004800// x86-64 Cygwin target
4801class CygwinX86_64TargetInfo : public X86_64TargetInfo {
4802public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004803 CygwinX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4804 : X86_64TargetInfo(Triple, Opts) {
Yaron Kerend030d112015-07-22 17:38:19 +00004805 TLSSupported = false;
4806 WCharType = UnsignedShort;
4807 }
4808 void getTargetDefines(const LangOptions &Opts,
4809 MacroBuilder &Builder) const override {
4810 X86_64TargetInfo::getTargetDefines(Opts, Builder);
4811 Builder.defineMacro("__x86_64__");
4812 Builder.defineMacro("__CYGWIN__");
4813 Builder.defineMacro("__CYGWIN64__");
4814 addCygMingDefines(Opts, Builder);
Saleem Abdulrasool56027092017-02-07 19:00:06 +00004815 DefineStd(Builder, "unix", Opts);
Yaron Kerend030d112015-07-22 17:38:19 +00004816 if (Opts.CPlusPlus)
4817 Builder.defineMacro("_GNU_SOURCE");
4818
4819 // GCC defines this macro when it is using __gxx_personality_seh0.
4820 if (!Opts.SjLjExceptions)
4821 Builder.defineMacro("__SEH__");
4822 }
4823};
4824
Eli Friedman2857ccb2009-07-01 03:36:11 +00004825class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
4826public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004827 DarwinX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4828 : DarwinTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00004829 Int64Type = SignedLongLong;
Tim Northovera2ee4332014-03-29 15:09:45 +00004830 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
4831 llvm::Triple T = llvm::Triple(Triple);
Bob Wilson946c04c2014-10-19 02:19:27 +00004832 if (T.isiOS())
Tim Northovera2ee4332014-03-29 15:09:45 +00004833 UseSignedCharForObjCBool = false;
James Y Knightb214cbc2016-03-04 19:00:41 +00004834 resetDataLayout("e-m:o-i64:64-f80:128-n8:16:32:64-S128");
Eli Friedman2857ccb2009-07-01 03:36:11 +00004835 }
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004836
4837 bool handleTargetFeatures(std::vector<std::string> &Features,
4838 DiagnosticsEngine &Diags) override {
4839 if (!DarwinTargetInfo<X86_64TargetInfo>::handleTargetFeatures(Features,
4840 Diags))
4841 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004842 // We now know the features we have: we can decide how to align vectors.
4843 MaxVectorAlign =
4844 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004845 return true;
4846 }
Eli Friedman2857ccb2009-07-01 03:36:11 +00004847};
Eli Friedman2857ccb2009-07-01 03:36:11 +00004848
Eli Friedman245f2292009-07-05 22:31:18 +00004849class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
4850public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004851 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4852 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Eli Friedman245f2292009-07-05 22:31:18 +00004853 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004854 Int64Type = SignedLongLong;
4855 }
4856};
Eli Friedman245f2292009-07-05 22:31:18 +00004857
Eli Friedman9fa28852012-08-08 23:57:20 +00004858class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
4859public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004860 BitrigX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4861 : BitrigTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004862 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004863 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00004864 }
4865};
Tim Northover9bb857a2013-01-31 12:13:10 +00004866
Eli Friedmanf05b7722008-08-20 07:44:10 +00004867class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004868 // Possible FPU choices.
4869 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004870 VFP2FPU = (1 << 0),
4871 VFP3FPU = (1 << 1),
4872 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00004873 NeonFPU = (1 << 3),
4874 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004875 };
4876
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004877 // Possible HWDiv features.
4878 enum HWDivMode {
4879 HWDivThumb = (1 << 0),
4880 HWDivARM = (1 << 1)
4881 };
4882
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004883 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004884 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004885 }
4886
4887 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4888 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004889
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004890 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004891
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004892 StringRef CPUProfile;
4893 StringRef CPUAttr;
4894
Rafael Espindolaeb265472013-08-21 21:59:03 +00004895 enum {
4896 FP_Default,
4897 FP_VFP,
4898 FP_Neon
4899 } FPMath;
4900
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004901 unsigned ArchISA;
Renato Goline84b0002015-10-08 16:43:26 +00004902 unsigned ArchKind = llvm::ARM::AK_ARMV4T;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004903 unsigned ArchProfile;
4904 unsigned ArchVersion;
4905
Bernard Ogdenda13af32013-10-24 18:32:51 +00004906 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004907
Logan Chien57086ce2012-10-10 06:56:20 +00004908 unsigned IsAAPCS : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004909 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004910
4911 // Initialized via features.
4912 unsigned SoftFloat : 1;
4913 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004914
Bernard Ogden18b57012013-10-29 09:47:51 +00004915 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00004916 unsigned Crypto : 1;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004917 unsigned DSP : 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004918 unsigned Unaligned : 1;
4919
4920 enum {
4921 LDREX_B = (1 << 0), /// byte (8-bit)
4922 LDREX_H = (1 << 1), /// half (16-bit)
4923 LDREX_W = (1 << 2), /// word (32-bit)
4924 LDREX_D = (1 << 3), /// double (64-bit)
4925 };
4926
4927 uint32_t LDREX;
Bernard Ogden18b57012013-10-29 09:47:51 +00004928
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004929 // ACLE 6.5.1 Hardware floating point
4930 enum {
4931 HW_FP_HP = (1 << 1), /// half (16-bit)
4932 HW_FP_SP = (1 << 2), /// single (32-bit)
4933 HW_FP_DP = (1 << 3), /// double (64-bit)
4934 };
4935 uint32_t HW_FP;
4936
Chris Lattner5cc15e02010-03-03 19:03:45 +00004937 static const Builtin::Info BuiltinInfo[];
4938
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004939 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004940 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004941
4942 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00004943 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004944
Renato Golin0201a9e2016-09-22 19:28:20 +00004945 // size_t is unsigned long on MachO-derived environments, NetBSD,
4946 // OpenBSD and Bitrig.
Renato Golin9ba39232015-02-27 16:35:48 +00004947 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD ||
Renato Golin0201a9e2016-09-22 19:28:20 +00004948 T.getOS() == llvm::Triple::OpenBSD ||
Renato Golin9ba39232015-02-27 16:35:48 +00004949 T.getOS() == llvm::Triple::Bitrig)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004950 SizeType = UnsignedLong;
4951 else
4952 SizeType = UnsignedInt;
4953
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004954 switch (T.getOS()) {
4955 case llvm::Triple::NetBSD:
Renato Golin0201a9e2016-09-22 19:28:20 +00004956 case llvm::Triple::OpenBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004957 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004958 break;
4959 case llvm::Triple::Win32:
4960 WCharType = UnsignedShort;
4961 break;
4962 case llvm::Triple::Linux:
4963 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004964 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
4965 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004966 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004967 }
4968
4969 UseBitFieldTypeAlignment = true;
4970
4971 ZeroLengthBitfieldBoundary = 0;
4972
Tim Northover147cd2f2014-10-14 22:12:21 +00004973 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
4974 // so set preferred for small types to 32.
4975 if (T.isOSBinFormatMachO()) {
James Y Knightb214cbc2016-03-04 19:00:41 +00004976 resetDataLayout(BigEndian
4977 ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4978 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Tim Northover147cd2f2014-10-14 22:12:21 +00004979 } else if (T.isOSWindows()) {
Tim Northover147cd2f2014-10-14 22:12:21 +00004980 assert(!BigEndian && "Windows on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004981 resetDataLayout("e"
4982 "-m:w"
4983 "-p:32:32"
4984 "-i64:64"
4985 "-v128:64:128"
4986 "-a:0:32"
4987 "-n32"
4988 "-S64");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00004989 } else if (T.isOSNaCl()) {
4990 assert(!BigEndian && "NaCl on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004991 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004992 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00004993 resetDataLayout(BigEndian
4994 ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4995 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004996 }
4997
4998 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004999 }
5000
Tim Northover5627d392015-10-30 16:30:45 +00005001 void setABIAPCS(bool IsAAPCS16) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00005002 const llvm::Triple &T = getTriple();
5003
Rafael Espindolaafa854c2013-12-18 20:24:51 +00005004 IsAAPCS = false;
5005
Tim Northover5627d392015-10-30 16:30:45 +00005006 if (IsAAPCS16)
5007 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
5008 else
5009 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00005010
Rafael Espindolad6c2b722013-12-18 19:47:32 +00005011 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00005012 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00005013 SizeType = UnsignedInt;
5014 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00005015 SizeType = UnsignedLong;
5016
5017 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
5018 WCharType = SignedInt;
5019
5020 // Do not respect the alignment of bit-field types when laying out
5021 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
5022 UseBitFieldTypeAlignment = false;
5023
5024 /// gcc forces the alignment to 4 bytes, regardless of the type of the
5025 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
5026 /// gcc.
5027 ZeroLengthBitfieldBoundary = 32;
5028
Tim Northover5627d392015-10-30 16:30:45 +00005029 if (T.isOSBinFormatMachO() && IsAAPCS16) {
5030 assert(!BigEndian && "AAPCS16 does not support big-endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00005031 resetDataLayout("e-m:o-p:32:32-i64:64-a:0:32-n32-S128");
Tim Northover5627d392015-10-30 16:30:45 +00005032 } else if (T.isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00005033 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00005034 BigEndian
5035 ? "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 +00005036 : "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 +00005037 else
James Y Knightb214cbc2016-03-04 19:00:41 +00005038 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00005039 BigEndian
5040 ? "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 +00005041 : "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 +00005042
5043 // FIXME: Override "preferred align" for double and long long.
5044 }
5045
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005046 void setArchInfo() {
5047 StringRef ArchName = getTriple().getArchName();
5048
Renato Goline84b0002015-10-08 16:43:26 +00005049 ArchISA = llvm::ARM::parseArchISA(ArchName);
5050 CPU = llvm::ARM::getDefaultCPU(ArchName);
5051 unsigned AK = llvm::ARM::parseArch(ArchName);
5052 if (AK != llvm::ARM::AK_INVALID)
5053 ArchKind = AK;
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005054 setArchInfo(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005055 }
5056
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005057 void setArchInfo(unsigned Kind) {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005058 StringRef SubArch;
5059
5060 // cache TargetParser info
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005061 ArchKind = Kind;
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00005062 SubArch = llvm::ARM::getSubArch(ArchKind);
5063 ArchProfile = llvm::ARM::parseArchProfile(SubArch);
5064 ArchVersion = llvm::ARM::parseArchVersion(SubArch);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005065
5066 // cache CPU related strings
5067 CPUAttr = getCPUAttr();
5068 CPUProfile = getCPUProfile();
5069 }
5070
5071 void setAtomic() {
Eric Christopherb093d692015-10-09 18:39:59 +00005072 // when triple does not specify a sub arch,
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005073 // then we are not using inline atomics
Renato Goline84b0002015-10-08 16:43:26 +00005074 bool ShouldUseInlineAtomic =
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005075 (ArchISA == llvm::ARM::IK_ARM && ArchVersion >= 6) ||
5076 (ArchISA == llvm::ARM::IK_THUMB && ArchVersion >= 7);
Eric Christopherb093d692015-10-09 18:39:59 +00005077 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005078 if (ArchProfile == llvm::ARM::PK_M) {
5079 MaxAtomicPromoteWidth = 32;
5080 if (ShouldUseInlineAtomic)
5081 MaxAtomicInlineWidth = 32;
5082 }
5083 else {
5084 MaxAtomicPromoteWidth = 64;
5085 if (ShouldUseInlineAtomic)
5086 MaxAtomicInlineWidth = 64;
Eric Christopherb093d692015-10-09 18:39:59 +00005087 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005088 }
5089
5090 bool isThumb() const {
5091 return (ArchISA == llvm::ARM::IK_THUMB);
5092 }
5093
5094 bool supportsThumb() const {
5095 return CPUAttr.count('T') || ArchVersion >= 6;
5096 }
5097
5098 bool supportsThumb2() const {
Bradley Smithf4affc12016-03-03 13:52:22 +00005099 return CPUAttr.equals("6T2") ||
5100 (ArchVersion >= 7 && !CPUAttr.equals("8M_BASE"));
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005101 }
5102
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005103 StringRef getCPUAttr() const {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005104 // For most sub-arches, the build attribute CPU name is enough.
5105 // For Cortex variants, it's slightly different.
5106 switch(ArchKind) {
5107 default:
Chandler Carruthd96f37a2015-08-30 07:51:18 +00005108 return llvm::ARM::getCPUAttr(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005109 case llvm::ARM::AK_ARMV6M:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005110 return "6M";
Tim Northover525c73c2015-07-21 21:47:33 +00005111 case llvm::ARM::AK_ARMV7S:
5112 return "7S";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005113 case llvm::ARM::AK_ARMV7A:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005114 return "7A";
5115 case llvm::ARM::AK_ARMV7R:
5116 return "7R";
5117 case llvm::ARM::AK_ARMV7M:
5118 return "7M";
5119 case llvm::ARM::AK_ARMV7EM:
5120 return "7EM";
George Burgess IVfc970562017-02-09 23:30:10 +00005121 case llvm::ARM::AK_ARMV7VE:
5122 return "7VE";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005123 case llvm::ARM::AK_ARMV8A:
5124 return "8A";
5125 case llvm::ARM::AK_ARMV8_1A:
5126 return "8_1A";
Oliver Stannard3086c042016-02-11 16:05:52 +00005127 case llvm::ARM::AK_ARMV8_2A:
5128 return "8_2A";
Bradley Smithf4affc12016-03-03 13:52:22 +00005129 case llvm::ARM::AK_ARMV8MBaseline:
5130 return "8M_BASE";
5131 case llvm::ARM::AK_ARMV8MMainline:
5132 return "8M_MAIN";
Javed Absar00b74442016-10-07 12:08:41 +00005133 case llvm::ARM::AK_ARMV8R:
5134 return "8R";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005135 }
5136 }
5137
5138 StringRef getCPUProfile() const {
5139 switch(ArchProfile) {
5140 case llvm::ARM::PK_A:
5141 return "A";
5142 case llvm::ARM::PK_R:
5143 return "R";
5144 case llvm::ARM::PK_M:
5145 return "M";
5146 default:
5147 return "";
5148 }
5149 }
5150
Chris Lattner17df24e2008-04-21 18:56:49 +00005151public:
Matt Arsenaultf333de32016-09-07 07:08:02 +00005152 ARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005153 : TargetInfo(Triple), FPMath(FP_Default), IsAAPCS(true), LDREX(0),
5154 HW_FP(0) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005155
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00005156 switch (getTriple().getOS()) {
5157 case llvm::Triple::NetBSD:
Renato Golin0201a9e2016-09-22 19:28:20 +00005158 case llvm::Triple::OpenBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00005159 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00005160 break;
5161 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00005162 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00005163 break;
5164 }
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00005165
Renato Goline84b0002015-10-08 16:43:26 +00005166 // Cache arch related info.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005167 setArchInfo();
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00005168
Chris Lattner1a8f3942010-04-23 16:29:58 +00005169 // {} in inline assembly are neon specifiers, not assembly variant
5170 // specifiers.
5171 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005172
Eric Christopher0e261882014-12-05 01:06:59 +00005173 // FIXME: This duplicates code from the driver that sets the -target-abi
5174 // option - this code is used if -target-abi isn't passed and should
5175 // be unified in some way.
5176 if (Triple.isOSBinFormatMachO()) {
5177 // The backend is hardwired to assume AAPCS for M-class processors, ensure
5178 // the frontend matches that.
5179 if (Triple.getEnvironment() == llvm::Triple::EABI ||
5180 Triple.getOS() == llvm::Triple::UnknownOS ||
Zijiao Ma56a83722016-08-17 02:13:33 +00005181 ArchProfile == llvm::ARM::PK_M) {
Eric Christopher0e261882014-12-05 01:06:59 +00005182 setABI("aapcs");
Tim Northoverd88ecb32016-01-27 19:32:40 +00005183 } else if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00005184 setABI("aapcs16");
Eric Christopher0e261882014-12-05 01:06:59 +00005185 } else {
5186 setABI("apcs-gnu");
5187 }
5188 } else if (Triple.isOSWindows()) {
5189 // FIXME: this is invalid for WindowsCE
5190 setABI("aapcs");
5191 } else {
5192 // Select the default based on the platform.
5193 switch (Triple.getEnvironment()) {
5194 case llvm::Triple::Android:
5195 case llvm::Triple::GNUEABI:
5196 case llvm::Triple::GNUEABIHF:
Rafael Espindola0fa66802016-06-24 21:35:06 +00005197 case llvm::Triple::MuslEABI:
5198 case llvm::Triple::MuslEABIHF:
Eric Christopher0e261882014-12-05 01:06:59 +00005199 setABI("aapcs-linux");
5200 break;
5201 case llvm::Triple::EABIHF:
5202 case llvm::Triple::EABI:
5203 setABI("aapcs");
5204 break;
Eric Christopher560cc4f2014-12-18 02:08:55 +00005205 case llvm::Triple::GNU:
Renato Goline84b0002015-10-08 16:43:26 +00005206 setABI("apcs-gnu");
5207 break;
Eric Christopher0e261882014-12-05 01:06:59 +00005208 default:
5209 if (Triple.getOS() == llvm::Triple::NetBSD)
5210 setABI("apcs-gnu");
Brad Smith3d648b32017-02-28 03:20:26 +00005211 else if (Triple.getOS() == llvm::Triple::OpenBSD)
5212 setABI("aapcs-linux");
Eric Christopher0e261882014-12-05 01:06:59 +00005213 else
5214 setABI("aapcs");
5215 break;
5216 }
5217 }
John McCall86353412010-08-21 22:46:04 +00005218
5219 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00005220 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005221
Renato Golin15b86152015-07-03 16:41:13 +00005222 // ARM has atomics up to 8 bytes
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005223 setAtomic();
Rafael Espindola5ab8e2e2015-07-02 15:14:10 +00005224
James Molloya7139222012-03-12 09:14:10 +00005225 // Do force alignment of members that follow zero length bitfields. If
Eric Christopher917e9522014-11-18 22:36:15 +00005226 // the alignment of the zero-length bitfield is greater than the member
5227 // that follows it, `bar', `bar' will be aligned as the type of the
James Molloya7139222012-03-12 09:14:10 +00005228 // zero length bitfield.
5229 UseZeroLengthBitfieldAlignment = true;
Saleem Abdulrasool9b5ba542016-04-10 03:19:47 +00005230
5231 if (Triple.getOS() == llvm::Triple::Linux ||
5232 Triple.getOS() == llvm::Triple::UnknownOS)
5233 this->MCountName =
5234 Opts.EABIVersion == "gnu" ? "\01__gnu_mcount_nc" : "\01mcount";
Eli Friedmanb5366062008-05-20 14:21:01 +00005235 }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00005236
Alp Toker4925ba72014-06-07 23:30:42 +00005237 StringRef getABI() const override { return ABI; }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00005238
Craig Topper3164f332014-03-11 03:39:26 +00005239 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00005240 ABI = Name;
5241
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00005242 // The defaults (above) are for AAPCS, check if we need to change them.
5243 //
5244 // FIXME: We need support for -meabi... we could just mangle it into the
5245 // name.
Tim Northover756447a2015-10-30 16:30:36 +00005246 if (Name == "apcs-gnu" || Name == "aapcs16") {
Tim Northover5627d392015-10-30 16:30:45 +00005247 setABIAPCS(Name == "aapcs16");
Rafael Espindolad6c2b722013-12-18 19:47:32 +00005248 return true;
5249 }
5250 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
5251 setABIAAPCS();
5252 return true;
5253 }
5254 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00005255 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00005256
Renato Golinf5c4dec2015-05-27 13:33:00 +00005257 // FIXME: This should be based on Arch attributes, not CPU names.
Eric Christopher8c47b422015-10-09 18:39:55 +00005258 bool
5259 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
5260 StringRef CPU,
5261 const std::vector<std::string> &FeaturesVec) const override {
5262
Mehdi Aminia0016ec2016-10-07 08:37:29 +00005263 std::vector<StringRef> TargetFeatures;
Bradley Smithb3501962015-11-16 11:16:36 +00005264 unsigned Arch = llvm::ARM::parseArch(getTriple().getArchName());
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005265
5266 // get default FPU features
Bradley Smithb3501962015-11-16 11:16:36 +00005267 unsigned FPUKind = llvm::ARM::getDefaultFPU(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005268 llvm::ARM::getFPUFeatures(FPUKind, TargetFeatures);
5269
5270 // get default Extension features
Bradley Smithb3501962015-11-16 11:16:36 +00005271 unsigned Extensions = llvm::ARM::getDefaultExtensions(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005272 llvm::ARM::getExtensionFeatures(Extensions, TargetFeatures);
5273
Mehdi Aminia0016ec2016-10-07 08:37:29 +00005274 for (auto Feature : TargetFeatures)
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005275 if (Feature[0] == '+')
Mehdi Aminia0016ec2016-10-07 08:37:29 +00005276 Features[Feature.drop_front(1)] = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005277
Eric Christopher007b0a02015-08-28 22:32:01 +00005278 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005279 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005280
Craig Topper3164f332014-03-11 03:39:26 +00005281 bool handleTargetFeatures(std::vector<std::string> &Features,
5282 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005283 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00005284 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00005285 Crypto = 0;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005286 DSP = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005287 Unaligned = 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005288 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005289 HWDiv = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005290
Ranjeet Singhac08e532015-06-24 23:39:25 +00005291 // This does not diagnose illegal cases like having both
5292 // "+vfpv2" and "+vfpv3" or having "+neon" and "+fp-only-sp".
5293 uint32_t HW_FP_remove = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005294 for (const auto &Feature : Features) {
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005295 if (Feature == "+soft-float") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00005296 SoftFloat = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005297 } else if (Feature == "+soft-float-abi") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00005298 SoftFloatABI = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005299 } else if (Feature == "+vfp2") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005300 FPU |= VFP2FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005301 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005302 } else if (Feature == "+vfp3") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005303 FPU |= VFP3FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005304 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005305 } else if (Feature == "+vfp4") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005306 FPU |= VFP4FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005307 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005308 } else if (Feature == "+fp-armv8") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00005309 FPU |= FPARMV8;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005310 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005311 } else if (Feature == "+neon") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005312 FPU |= NeonFPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005313 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005314 } else if (Feature == "+hwdiv") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005315 HWDiv |= HWDivThumb;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005316 } else if (Feature == "+hwdiv-arm") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005317 HWDiv |= HWDivARM;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005318 } else if (Feature == "+crc") {
Bernard Ogden18b57012013-10-29 09:47:51 +00005319 CRC = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005320 } else if (Feature == "+crypto") {
Tim Northover02e38602014-02-03 17:28:04 +00005321 Crypto = 1;
Artyom Skrobov05d85ae2015-10-23 17:19:02 +00005322 } else if (Feature == "+dsp") {
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005323 DSP = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005324 } else if (Feature == "+fp-only-sp") {
Matt Arsenault250024f2016-06-08 01:56:42 +00005325 HW_FP_remove |= HW_FP_DP;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005326 } else if (Feature == "+strict-align") {
5327 Unaligned = 0;
5328 } else if (Feature == "+fp16") {
5329 HW_FP |= HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005330 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00005331 }
Ranjeet Singhac08e532015-06-24 23:39:25 +00005332 HW_FP &= ~HW_FP_remove;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005333
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005334 switch (ArchVersion) {
5335 case 6:
5336 if (ArchProfile == llvm::ARM::PK_M)
5337 LDREX = 0;
5338 else if (ArchKind == llvm::ARM::AK_ARMV6K)
5339 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5340 else
5341 LDREX = LDREX_W;
5342 break;
5343 case 7:
5344 if (ArchProfile == llvm::ARM::PK_M)
5345 LDREX = LDREX_W | LDREX_H | LDREX_B ;
5346 else
5347 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5348 break;
5349 case 8:
5350 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5351 }
5352
Rafael Espindolaeb265472013-08-21 21:59:03 +00005353 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
5354 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
5355 return false;
5356 }
5357
5358 if (FPMath == FP_Neon)
5359 Features.push_back("+neonfp");
5360 else if (FPMath == FP_VFP)
5361 Features.push_back("-neonfp");
5362
Daniel Dunbar893d4752009-12-19 04:15:38 +00005363 // Remove front-end specific options which the backend handles differently.
Eric Christopher9e172d22015-05-12 01:26:21 +00005364 auto Feature =
5365 std::find(Features.begin(), Features.end(), "+soft-float-abi");
5366 if (Feature != Features.end())
5367 Features.erase(Feature);
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005368
Rafael Espindolaeb265472013-08-21 21:59:03 +00005369 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005370 }
5371
Craig Topper3164f332014-03-11 03:39:26 +00005372 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005373 return llvm::StringSwitch<bool>(Feature)
5374 .Case("arm", true)
Ben Langmuir587aeaf2015-08-07 01:59:56 +00005375 .Case("aarch32", true)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005376 .Case("softfloat", SoftFloat)
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005377 .Case("thumb", isThumb())
Amara Emerson8c3de542013-09-16 18:07:35 +00005378 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005379 .Case("hwdiv", HWDiv & HWDivThumb)
5380 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005381 .Default(false);
5382 }
Renato Golin15b86152015-07-03 16:41:13 +00005383
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005384 bool setCPU(const std::string &Name) override {
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005385 if (Name != "generic")
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00005386 setArchInfo(llvm::ARM::parseCPUArch(Name));
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005387
Renato Golin15b86152015-07-03 16:41:13 +00005388 if (ArchKind == llvm::ARM::AK_INVALID)
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005389 return false;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005390 setAtomic();
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005391 CPU = Name;
5392 return true;
5393 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005394
Craig Topper3164f332014-03-11 03:39:26 +00005395 bool setFPMath(StringRef Name) override;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005396
Craig Topper3164f332014-03-11 03:39:26 +00005397 void getTargetDefines(const LangOptions &Opts,
5398 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00005399 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005400 Builder.defineMacro("__arm");
5401 Builder.defineMacro("__arm__");
Weiming Zhaob0613132016-04-18 16:25:46 +00005402 // For bare-metal none-eabi.
5403 if (getTriple().getOS() == llvm::Triple::UnknownOS &&
5404 getTriple().getEnvironment() == llvm::Triple::EABI)
5405 Builder.defineMacro("__ELF__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00005406
Chris Lattnerecd49032009-03-02 22:27:17 +00005407 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005408 Builder.defineMacro("__REGISTER_PREFIX__", "");
Tim Northover5627d392015-10-30 16:30:45 +00005409
5410 // Unfortunately, __ARM_ARCH_7K__ is now more of an ABI descriptor. The CPU
5411 // happens to be Cortex-A7 though, so it should still get __ARM_ARCH_7A__.
Tim Northoverd88ecb32016-01-27 19:32:40 +00005412 if (getTriple().isWatchABI())
Tim Northover5627d392015-10-30 16:30:45 +00005413 Builder.defineMacro("__ARM_ARCH_7K__", "2");
5414
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005415 if (!CPUAttr.empty())
5416 Builder.defineMacro("__ARM_ARCH_" + CPUAttr + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005417
5418 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005419 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
Benjamin Kramerb42d9a52015-12-24 10:07:37 +00005420 Builder.defineMacro("__ARM_ARCH", Twine(ArchVersion));
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005421
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005422 if (ArchVersion >= 8) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005423 // ACLE 6.5.7 Crypto Extension
5424 if (Crypto)
5425 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
5426 // ACLE 6.5.8 CRC32 Extension
5427 if (CRC)
5428 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
5429 // ACLE 6.5.10 Numeric Maximum and Minimum
5430 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
5431 // ACLE 6.5.9 Directed Rounding
5432 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
James Molloy0ffb0932014-09-15 11:25:38 +00005433 }
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005434
5435 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
5436 // is not defined for the M-profile.
Bradley Smithf4affc12016-03-03 13:52:22 +00005437 // NOTE that the default profile is assumed to be 'A'
5438 if (CPUProfile.empty() || ArchProfile != llvm::ARM::PK_M)
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005439 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
5440
Bradley Smithf4affc12016-03-03 13:52:22 +00005441 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supports the original
5442 // Thumb ISA (including v6-M and v8-M Baseline). It is set to 2 if the
5443 // core supports the Thumb-2 ISA as found in the v6T2 architecture and all
5444 // v7 and v8 architectures excluding v8-M Baseline.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005445 if (supportsThumb2())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005446 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005447 else if (supportsThumb())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005448 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
5449
5450 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
5451 // instruction set such as ARM or Thumb.
5452 Builder.defineMacro("__ARM_32BIT_STATE", "1");
5453
5454 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
5455
5456 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005457 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005458 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00005459
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005460 // ACLE 6.4.3 Unaligned access supported in hardware
Eric Christopherb093d692015-10-09 18:39:59 +00005461 if (Unaligned)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005462 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Eric Christopherb093d692015-10-09 18:39:59 +00005463
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005464 // ACLE 6.4.4 LDREX/STREX
5465 if (LDREX)
5466 Builder.defineMacro("__ARM_FEATURE_LDREX", "0x" + llvm::utohexstr(LDREX));
5467
5468 // ACLE 6.4.5 CLZ
Eric Christopherb093d692015-10-09 18:39:59 +00005469 if (ArchVersion == 5 ||
5470 (ArchVersion == 6 && CPUProfile != "M") ||
5471 ArchVersion > 6)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005472 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
5473
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005474 // ACLE 6.5.1 Hardware Floating Point
5475 if (HW_FP)
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +00005476 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005477
Yi Konga44c4d72014-06-27 21:25:42 +00005478 // ACLE predefines.
5479 Builder.defineMacro("__ARM_ACLE", "200");
5480
Oliver Stannarddc2854c2015-09-03 12:40:58 +00005481 // FP16 support (we currently only support IEEE format).
5482 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
5483 Builder.defineMacro("__ARM_FP16_ARGS", "1");
5484
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005485 // ACLE 6.5.3 Fused multiply-accumulate (FMA)
Silviu Baranga632fdc52016-04-28 11:29:08 +00005486 if (ArchVersion >= 7 && (FPU & VFP4FPU))
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005487 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
5488
Mike Stump9d54bd72009-04-08 02:07:04 +00005489 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005490
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005491 // FIXME: It's more complicated than this and we don't really support
5492 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005493 // Windows on ARM does not "support" interworking
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005494 if (5 <= ArchVersion && ArchVersion <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005495 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005496
David Tweed8f676532012-10-25 13:33:01 +00005497 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00005498 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005499 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
Tim Northover862eaf82016-05-13 21:26:45 +00005500 if (!getTriple().isOSBinFormatMachO() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00005501 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005502 Builder.defineMacro("__ARM_PCS", "1");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005503 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005504
Tim Northover28fc0e12016-04-28 13:59:55 +00005505 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp" ||
5506 ABI == "aapcs16")
5507 Builder.defineMacro("__ARM_PCS_VFP", "1");
5508
Daniel Dunbar893d4752009-12-19 04:15:38 +00005509 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005510 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005511
Zijiao Ma56a83722016-08-17 02:13:33 +00005512 if (ArchKind == llvm::ARM::AK_XSCALE)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005513 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005514
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005515 if (isThumb()) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005516 Builder.defineMacro("__THUMBEL__");
5517 Builder.defineMacro("__thumb__");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005518 if (supportsThumb2())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005519 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005520 }
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005521
5522 // ACLE 6.4.9 32-bit SIMD instructions
5523 if (ArchVersion >= 6 && (CPUProfile != "M" || CPUAttr == "7EM"))
5524 Builder.defineMacro("__ARM_FEATURE_SIMD32", "1");
5525
5526 // ACLE 6.4.10 Hardware Integer Divide
Eric Christopherb093d692015-10-09 18:39:59 +00005527 if (((HWDiv & HWDivThumb) && isThumb()) ||
5528 ((HWDiv & HWDivARM) && !isThumb())) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005529 Builder.defineMacro("__ARM_FEATURE_IDIV", "1");
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005530 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005531 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005532
5533 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005534 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005535
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005536 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005537 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005538 if (FPU & VFP2FPU)
5539 Builder.defineMacro("__ARM_VFPV2__");
5540 if (FPU & VFP3FPU)
5541 Builder.defineMacro("__ARM_VFPV3__");
5542 if (FPU & VFP4FPU)
5543 Builder.defineMacro("__ARM_VFPV4__");
Tim Northoverc67803f2016-12-21 20:49:43 +00005544 if (FPU & FPARMV8)
5545 Builder.defineMacro("__ARM_FPV5__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005546 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00005547
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005548 // This only gets set when Neon instructions are actually available, unlike
5549 // the VFP define, hence the soft float and arch check. This is subtly
5550 // different from gcc, we follow the intent which was that it should be set
5551 // when Neon instructions are actually available.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005552 if ((FPU & NeonFPU) && !SoftFloat && ArchVersion >= 7) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005553 Builder.defineMacro("__ARM_NEON", "1");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005554 Builder.defineMacro("__ARM_NEON__");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005555 // current AArch32 NEON implementations do not support double-precision
5556 // floating-point even when it is present in VFP.
Eric Christopherb093d692015-10-09 18:39:59 +00005557 Builder.defineMacro("__ARM_NEON_FP",
5558 "0x" + llvm::utohexstr(HW_FP & ~HW_FP_DP));
Tim Northover5bb34ca2013-11-21 12:36:34 +00005559 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00005560
Bradley Smith0f28f0c2014-01-20 10:52:00 +00005561 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
5562 Opts.ShortWChar ? "2" : "4");
5563
5564 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5565 Opts.ShortEnums ? "1" : "4");
5566
Bradley Smithf4affc12016-03-03 13:52:22 +00005567 if (ArchVersion >= 6 && CPUAttr != "6M" && CPUAttr != "8M_BASE") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00005568 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5569 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5570 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5571 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
5572 }
Sergey Dmitrouk745f5302014-11-25 08:57:36 +00005573
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005574 // ACLE 6.4.7 DSP instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005575 if (DSP) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005576 Builder.defineMacro("__ARM_FEATURE_DSP", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005577 }
5578
5579 // ACLE 6.4.8 Saturation instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005580 bool SAT = false;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005581 if ((ArchVersion == 6 && CPUProfile != "M") || ArchVersion > 6 ) {
5582 Builder.defineMacro("__ARM_FEATURE_SAT", "1");
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005583 SAT = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005584 }
5585
5586 // ACLE 6.4.6 Q (saturation) flag
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005587 if (DSP || SAT)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005588 Builder.defineMacro("__ARM_FEATURE_QBIT", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005589
5590 if (Opts.UnsafeFPMath)
5591 Builder.defineMacro("__ARM_FP_FAST", "1");
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005592
5593 if (ArchKind == llvm::ARM::AK_ARMV8_1A)
5594 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
Chris Lattner17df24e2008-04-21 18:56:49 +00005595 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005596
Craig Topper6c03a542015-10-19 04:51:35 +00005597 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5598 return llvm::makeArrayRef(BuiltinInfo,
5599 clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner17df24e2008-04-21 18:56:49 +00005600 }
Craig Topper3164f332014-03-11 03:39:26 +00005601 bool isCLZForZeroUndef() const override { return false; }
5602 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northover5627d392015-10-30 16:30:45 +00005603 return IsAAPCS
5604 ? AAPCSABIBuiltinVaList
Tim Northoverd88ecb32016-01-27 19:32:40 +00005605 : (getTriple().isWatchABI() ? TargetInfo::CharPtrBuiltinVaList
5606 : TargetInfo::VoidPtrBuiltinVaList);
Chris Lattner17df24e2008-04-21 18:56:49 +00005607 }
Craig Topperf054e3a2015-10-19 03:52:27 +00005608 ArrayRef<const char *> getGCCRegNames() const override;
5609 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00005610 bool validateAsmConstraint(const char *&Name,
5611 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00005612 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00005613 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00005614 case 'l': // r0-r7
5615 case 'h': // r8-r15
JF Bastien750caef2016-02-19 06:54:45 +00005616 case 't': // VFP Floating point register single precision
5617 case 'w': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00005618 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00005619 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005620 case 'I':
5621 case 'J':
5622 case 'K':
5623 case 'L':
5624 case 'M':
5625 // FIXME
5626 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00005627 case 'Q': // A memory address that is a single base register.
5628 Info.setAllowsMemory();
5629 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005630 case 'U': // a memory reference...
5631 switch (Name[1]) {
5632 case 'q': // ...ARMV4 ldrsb
5633 case 'v': // ...VFP load/store (reg+constant offset)
5634 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00005635 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00005636 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00005637 case 'n': // valid address for Neon doubleword vector load/store
5638 case 'm': // valid address for Neon element and structure load/store
5639 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00005640 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005641 Info.setAllowsMemory();
5642 Name++;
5643 return true;
5644 }
Nate Begeman2908fa02008-04-22 05:03:19 +00005645 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005646 return false;
5647 }
Craig Topper3164f332014-03-11 03:39:26 +00005648 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005649 std::string R;
5650 switch (*Constraint) {
5651 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00005652 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005653 Constraint++;
5654 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00005655 case 'p': // 'p' should be translated to 'r' by default.
5656 R = std::string("r");
5657 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005658 default:
5659 return std::string(1, *Constraint);
5660 }
5661 return R;
5662 }
Akira Hatanaka987f1862014-08-22 06:05:21 +00005663 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005664 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005665 std::string &SuggestedModifier) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00005666 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00005667 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00005668
Bill Wendling9d1ee112012-10-25 23:28:48 +00005669 // Strip off constraint modifiers.
5670 while (Constraint[0] == '=' ||
5671 Constraint[0] == '+' ||
5672 Constraint[0] == '&')
5673 Constraint = Constraint.substr(1);
5674
5675 switch (Constraint[0]) {
5676 default: break;
5677 case 'r': {
5678 switch (Modifier) {
5679 default:
Tim Northover8f24b172013-12-08 15:24:55 +00005680 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00005681 case 'q':
5682 // A register of size 32 cannot fit a vector type.
5683 return false;
5684 }
5685 }
5686 }
5687
5688 return true;
5689 }
Craig Topper3164f332014-03-11 03:39:26 +00005690 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00005691 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00005692 return "";
5693 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005694
Craig Topper3164f332014-03-11 03:39:26 +00005695 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00005696 switch (CC) {
5697 case CC_AAPCS:
5698 case CC_AAPCS_VFP:
5699 case CC_Swift:
5700 return CCCR_OK;
5701 default:
5702 return CCCR_Warning;
5703 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005704 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00005705
Craig Topper3164f332014-03-11 03:39:26 +00005706 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00005707 if (RegNo == 0) return 0;
5708 if (RegNo == 1) return 1;
5709 return -1;
5710 }
Matthias Braund1e2fad2015-07-17 00:15:22 +00005711
5712 bool hasSjLjLowering() const override {
5713 return true;
5714 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005715};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005716
Rafael Espindolaeb265472013-08-21 21:59:03 +00005717bool ARMTargetInfo::setFPMath(StringRef Name) {
5718 if (Name == "neon") {
5719 FPMath = FP_Neon;
5720 return true;
5721 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
5722 Name == "vfp4") {
5723 FPMath = FP_VFP;
5724 return true;
5725 }
5726 return false;
5727}
5728
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005729const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005730 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005731 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005732 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
5733
5734 // Float registers
5735 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
5736 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
5737 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005738 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005739
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005740 // Double registers
5741 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
5742 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005743 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
5744 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005745
5746 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005747 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
5748 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005749};
5750
Craig Topperf054e3a2015-10-19 03:52:27 +00005751ArrayRef<const char *> ARMTargetInfo::getGCCRegNames() const {
5752 return llvm::makeArrayRef(GCCRegNames);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005753}
5754
5755const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005756 { { "a1" }, "r0" },
5757 { { "a2" }, "r1" },
5758 { { "a3" }, "r2" },
5759 { { "a4" }, "r3" },
5760 { { "v1" }, "r4" },
5761 { { "v2" }, "r5" },
5762 { { "v3" }, "r6" },
5763 { { "v4" }, "r7" },
5764 { { "v5" }, "r8" },
5765 { { "v6", "rfp" }, "r9" },
5766 { { "sl" }, "r10" },
5767 { { "fp" }, "r11" },
5768 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00005769 { { "r13" }, "sp" },
5770 { { "r14" }, "lr" },
5771 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005772 // The S, D and Q registers overlap, but aren't really aliases; we
5773 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005774};
5775
Craig Topperf054e3a2015-10-19 03:52:27 +00005776ArrayRef<TargetInfo::GCCRegAlias> ARMTargetInfo::getGCCRegAliases() const {
5777 return llvm::makeArrayRef(GCCRegAliases);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005778}
Chris Lattner5cc15e02010-03-03 19:03:45 +00005779
5780const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00005781#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005782 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005783#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5784 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00005785#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00005786
Craig Topper07d3b622015-08-07 05:14:44 +00005787#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005788 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005789#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005790 { #ID, TYPE, ATTRS, nullptr, LANG, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005791#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5792 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Albert Gutowski2a0621e2016-10-12 22:01:05 +00005793#define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANGS, FEATURE) \
5794 { #ID, TYPE, ATTRS, HEADER, LANGS, FEATURE },
Chris Lattner5cc15e02010-03-03 19:03:45 +00005795#include "clang/Basic/BuiltinsARM.def"
5796};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005797
5798class ARMleTargetInfo : public ARMTargetInfo {
5799public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005800 ARMleTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Matt Arsenaultf333de32016-09-07 07:08:02 +00005801 : ARMTargetInfo(Triple, Opts) {}
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005802 void getTargetDefines(const LangOptions &Opts,
5803 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005804 Builder.defineMacro("__ARMEL__");
5805 ARMTargetInfo::getTargetDefines(Opts, Builder);
5806 }
5807};
5808
5809class ARMbeTargetInfo : public ARMTargetInfo {
5810public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005811 ARMbeTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Matt Arsenaultf333de32016-09-07 07:08:02 +00005812 : ARMTargetInfo(Triple, Opts) {}
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005813 void getTargetDefines(const LangOptions &Opts,
5814 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005815 Builder.defineMacro("__ARMEB__");
5816 Builder.defineMacro("__ARM_BIG_ENDIAN");
5817 ARMTargetInfo::getTargetDefines(Opts, Builder);
5818 }
5819};
Chris Lattner17df24e2008-04-21 18:56:49 +00005820
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005821class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
5822 const llvm::Triple Triple;
5823public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005824 WindowsARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5825 : WindowsTargetInfo<ARMleTargetInfo>(Triple, Opts), Triple(Triple) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005826 WCharType = UnsignedShort;
5827 SizeType = UnsignedInt;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005828 }
5829 void getVisualStudioDefines(const LangOptions &Opts,
5830 MacroBuilder &Builder) const {
5831 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
5832
5833 // FIXME: this is invalid for WindowsCE
5834 Builder.defineMacro("_M_ARM_NT", "1");
5835 Builder.defineMacro("_M_ARMT", "_M_ARM");
5836 Builder.defineMacro("_M_THUMB", "_M_ARM");
5837
5838 assert((Triple.getArch() == llvm::Triple::arm ||
5839 Triple.getArch() == llvm::Triple::thumb) &&
5840 "invalid architecture for Windows ARM target info");
5841 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
5842 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
5843
5844 // TODO map the complete set of values
5845 // 31: VFPv3 40: VFPv4
5846 Builder.defineMacro("_M_ARM_FP", "31");
5847 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00005848 BuiltinVaListKind getBuiltinVaListKind() const override {
5849 return TargetInfo::CharPtrBuiltinVaList;
5850 }
Martell Malone7ccda3c2015-08-14 18:00:09 +00005851 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5852 switch (CC) {
5853 case CC_X86StdCall:
5854 case CC_X86ThisCall:
5855 case CC_X86FastCall:
5856 case CC_X86VectorCall:
5857 return CCCR_Ignore;
5858 case CC_C:
5859 return CCCR_OK;
5860 default:
5861 return CCCR_Warning;
5862 }
5863 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005864};
5865
5866// Windows ARM + Itanium C++ ABI Target
5867class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
5868public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005869 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple,
5870 const TargetOptions &Opts)
5871 : WindowsARMTargetInfo(Triple, Opts) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005872 TheCXXABI.set(TargetCXXABI::GenericARM);
5873 }
5874
5875 void getTargetDefines(const LangOptions &Opts,
5876 MacroBuilder &Builder) const override {
5877 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5878
5879 if (Opts.MSVCCompat)
5880 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5881 }
5882};
5883
5884// Windows ARM, MS (C++) ABI
5885class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
5886public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005887 MicrosoftARMleTargetInfo(const llvm::Triple &Triple,
5888 const TargetOptions &Opts)
5889 : WindowsARMTargetInfo(Triple, Opts) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005890 TheCXXABI.set(TargetCXXABI::Microsoft);
5891 }
5892
5893 void getTargetDefines(const LangOptions &Opts,
5894 MacroBuilder &Builder) const override {
5895 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5896 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5897 }
5898};
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005899
Yaron Keren321249c2015-07-15 13:32:23 +00005900// ARM MinGW target
5901class MinGWARMTargetInfo : public WindowsARMTargetInfo {
5902public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005903 MinGWARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5904 : WindowsARMTargetInfo(Triple, Opts) {
Yaron Keren321249c2015-07-15 13:32:23 +00005905 TheCXXABI.set(TargetCXXABI::GenericARM);
5906 }
5907
5908 void getTargetDefines(const LangOptions &Opts,
5909 MacroBuilder &Builder) const override {
5910 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5911 DefineStd(Builder, "WIN32", Opts);
5912 DefineStd(Builder, "WINNT", Opts);
5913 Builder.defineMacro("_ARM_");
5914 addMinGWDefines(Opts, Builder);
5915 }
5916};
5917
5918// ARM Cygwin target
5919class CygwinARMTargetInfo : public ARMleTargetInfo {
5920public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005921 CygwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5922 : ARMleTargetInfo(Triple, Opts) {
Yaron Keren321249c2015-07-15 13:32:23 +00005923 TLSSupported = false;
5924 WCharType = UnsignedShort;
5925 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00005926 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Yaron Keren321249c2015-07-15 13:32:23 +00005927 }
5928 void getTargetDefines(const LangOptions &Opts,
5929 MacroBuilder &Builder) const override {
5930 ARMleTargetInfo::getTargetDefines(Opts, Builder);
5931 Builder.defineMacro("_ARM_");
5932 Builder.defineMacro("__CYGWIN__");
5933 Builder.defineMacro("__CYGWIN32__");
Saleem Abdulrasool56027092017-02-07 19:00:06 +00005934 DefineStd(Builder, "unix", Opts);
Yaron Keren321249c2015-07-15 13:32:23 +00005935 if (Opts.CPlusPlus)
5936 Builder.defineMacro("_GNU_SOURCE");
5937 }
5938};
5939
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005940class DarwinARMTargetInfo : public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00005941protected:
Craig Topper3164f332014-03-11 03:39:26 +00005942 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5943 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00005944 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00005945 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005946
Torok Edwinb2b37c62009-06-30 17:10:35 +00005947public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005948 DarwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5949 : DarwinTargetInfo<ARMleTargetInfo>(Triple, Opts) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005950 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005951 // iOS always has 64-bit atomic instructions.
Eric Christopher917e9522014-11-18 22:36:15 +00005952 // FIXME: This should be based off of the target features in
5953 // ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005954 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00005955
Tim Northoverd88ecb32016-01-27 19:32:40 +00005956 if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00005957 // Darwin on iOS uses a variant of the ARM C++ ABI.
5958 TheCXXABI.set(TargetCXXABI::WatchOS);
5959
5960 // The 32-bit ABI is silent on what ptrdiff_t should be, but given that
5961 // size_t is long, it's a bit weird for it to be int.
5962 PtrDiffType = SignedLong;
5963
5964 // BOOL should be a real boolean on the new ABI
5965 UseSignedCharForObjCBool = false;
5966 } else
5967 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005968 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005969};
Eli Friedmanf05b7722008-08-20 07:44:10 +00005970
Tim Northover573cbee2014-05-24 12:52:07 +00005971class AArch64TargetInfo : public TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00005972 virtual void setDataLayout() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00005973 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5974 static const char *const GCCRegNames[];
5975
James Molloy75f5f9e2014-04-16 15:33:48 +00005976 enum FPUModeEnum {
5977 FPUMode,
5978 NeonMode
5979 };
5980
5981 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00005982 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00005983 unsigned Crypto;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005984 unsigned Unaligned;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005985 unsigned V8_1A;
James Molloy75f5f9e2014-04-16 15:33:48 +00005986
Tim Northovera2ee4332014-03-29 15:09:45 +00005987 static const Builtin::Info BuiltinInfo[];
5988
5989 std::string ABI;
5990
5991public:
Saleem Abdulrasool9b5ba542016-04-10 03:19:47 +00005992 AArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Tim Northovera2ee4332014-03-29 15:09:45 +00005993 : TargetInfo(Triple), ABI("aapcs") {
Brad Smith9aa2bf22017-02-21 23:13:09 +00005994 if (getTriple().getOS() == llvm::Triple::NetBSD ||
5995 getTriple().getOS() == llvm::Triple::OpenBSD) {
Tim Northover25e8a672014-05-24 12:51:25 +00005996 WCharType = SignedInt;
5997
5998 // NetBSD apparently prefers consistency across ARM targets to consistency
5999 // across 64-bit targets.
6000 Int64Type = SignedLongLong;
6001 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00006002 } else {
6003 WCharType = UnsignedInt;
6004 Int64Type = SignedLong;
6005 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00006006 }
6007
Tim Northovera2ee4332014-03-29 15:09:45 +00006008 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00006009 MaxVectorAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00006010 MaxAtomicInlineWidth = 128;
6011 MaxAtomicPromoteWidth = 128;
6012
Tim Northovera6a19f12015-02-06 01:25:07 +00006013 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 128;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00006014 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Tim Northovera2ee4332014-03-29 15:09:45 +00006015
Tim Northovera2ee4332014-03-29 15:09:45 +00006016 // {} in inline assembly are neon specifiers, not assembly variant
6017 // specifiers.
6018 NoAsmVariants = true;
6019
Tim Northover7ad87af2015-01-16 18:44:04 +00006020 // AAPCS gives rules for bitfields. 7.1.7 says: "The container type
6021 // contributes to the alignment of the containing aggregate in the same way
6022 // a plain (non bit-field) member of that type would, without exception for
6023 // zero-sized or anonymous bit-fields."
Tim Northover5627d392015-10-30 16:30:45 +00006024 assert(UseBitFieldTypeAlignment && "bitfields affect type alignment");
Tim Northover7ad87af2015-01-16 18:44:04 +00006025 UseZeroLengthBitfieldAlignment = true;
6026
Tim Northover573cbee2014-05-24 12:52:07 +00006027 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00006028 TheCXXABI.set(TargetCXXABI::GenericAArch64);
Saleem Abdulrasoolc066d9c2016-04-12 03:05:03 +00006029
Eric Christopherfb834a82017-02-28 17:22:05 +00006030 if (Triple.getOS() == llvm::Triple::Linux)
6031 this->MCountName = "\01_mcount";
6032 else if (Triple.getOS() == llvm::Triple::UnknownOS)
Saleem Abdulrasoolc066d9c2016-04-12 03:05:03 +00006033 this->MCountName = Opts.EABIVersion == "gnu" ? "\01_mcount" : "mcount";
Tim Northovera2ee4332014-03-29 15:09:45 +00006034 }
6035
Alp Toker4925ba72014-06-07 23:30:42 +00006036 StringRef getABI() const override { return ABI; }
David Blaikie1cbb9712014-11-14 19:09:44 +00006037 bool setABI(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006038 if (Name != "aapcs" && Name != "darwinpcs")
6039 return false;
6040
6041 ABI = Name;
6042 return true;
6043 }
6044
David Blaikie1cbb9712014-11-14 19:09:44 +00006045 bool setCPU(const std::string &Name) override {
Zijiao Ma33e95212016-07-28 06:24:48 +00006046 return Name == "generic" ||
6047 llvm::AArch64::parseCPUArch(Name) !=
6048 static_cast<unsigned>(llvm::AArch64::ArchKind::AK_INVALID);
Tim Northovera2ee4332014-03-29 15:09:45 +00006049 }
6050
Alexander Kornienko34eb2072015-04-11 02:00:23 +00006051 void getTargetDefines(const LangOptions &Opts,
6052 MacroBuilder &Builder) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006053 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00006054 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00006055
6056 // Target properties.
6057 Builder.defineMacro("_LP64");
6058 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00006059
6060 // ACLE predefines. Many can only have one possible value on v8 AArch64.
6061 Builder.defineMacro("__ARM_ACLE", "200");
6062 Builder.defineMacro("__ARM_ARCH", "8");
6063 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
6064
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006065 Builder.defineMacro("__ARM_64BIT_STATE", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00006066 Builder.defineMacro("__ARM_PCS_AAPCS64", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006067 Builder.defineMacro("__ARM_ARCH_ISA_A64", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00006068
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006069 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
6070 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
6071 Builder.defineMacro("__ARM_FEATURE_LDREX", "0xF");
6072 Builder.defineMacro("__ARM_FEATURE_IDIV", "1"); // As specified in ACLE
James Molloy0ffb0932014-09-15 11:25:38 +00006073 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006074 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
6075 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00006076
6077 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
6078
6079 // 0xe implies support for half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006080 Builder.defineMacro("__ARM_FP", "0xE");
Tim Northovera2ee4332014-03-29 15:09:45 +00006081
6082 // PCS specifies this for SysV variants, which is all we support. Other ABIs
6083 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006084 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
6085 Builder.defineMacro("__ARM_FP16_ARGS", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00006086
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00006087 if (Opts.UnsafeFPMath)
6088 Builder.defineMacro("__ARM_FP_FAST", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00006089
6090 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
6091
6092 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
6093 Opts.ShortEnums ? "1" : "4");
6094
James Molloy75f5f9e2014-04-16 15:33:48 +00006095 if (FPU == NeonMode) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006096 Builder.defineMacro("__ARM_NEON", "1");
James Molloy75f5f9e2014-04-16 15:33:48 +00006097 // 64-bit NEON supports half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006098 Builder.defineMacro("__ARM_NEON_FP", "0xE");
James Molloy75f5f9e2014-04-16 15:33:48 +00006099 }
Tim Northovera2ee4332014-03-29 15:09:45 +00006100
Bradley Smith418c5932014-05-02 15:17:51 +00006101 if (CRC)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006102 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
Bradley Smith418c5932014-05-02 15:17:51 +00006103
James Molloy75f5f9e2014-04-16 15:33:48 +00006104 if (Crypto)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006105 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
6106
6107 if (Unaligned)
6108 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Reid Klecknerd167d422015-05-06 15:31:46 +00006109
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00006110 if (V8_1A)
6111 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
6112
Reid Klecknerd167d422015-05-06 15:31:46 +00006113 // All of the __sync_(bool|val)_compare_and_swap_(1|2|4|8) builtins work.
6114 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
6115 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
6116 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
6117 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Tim Northovera2ee4332014-03-29 15:09:45 +00006118 }
6119
Craig Topper6c03a542015-10-19 04:51:35 +00006120 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6121 return llvm::makeArrayRef(BuiltinInfo,
6122 clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin);
Tim Northovera2ee4332014-03-29 15:09:45 +00006123 }
6124
David Blaikie1cbb9712014-11-14 19:09:44 +00006125 bool hasFeature(StringRef Feature) const override {
James Molloy75f5f9e2014-04-16 15:33:48 +00006126 return Feature == "aarch64" ||
6127 Feature == "arm64" ||
Ben Langmuir587aeaf2015-08-07 01:59:56 +00006128 Feature == "arm" ||
James Molloy75f5f9e2014-04-16 15:33:48 +00006129 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00006130 }
6131
James Molloy5e73df52014-04-16 15:06:20 +00006132 bool handleTargetFeatures(std::vector<std::string> &Features,
6133 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00006134 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00006135 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00006136 Crypto = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006137 Unaligned = 1;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00006138 V8_1A = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006139
Eric Christopher610fe112015-08-26 08:21:55 +00006140 for (const auto &Feature : Features) {
6141 if (Feature == "+neon")
James Molloy75f5f9e2014-04-16 15:33:48 +00006142 FPU = NeonMode;
Eric Christopher610fe112015-08-26 08:21:55 +00006143 if (Feature == "+crc")
Bradley Smith418c5932014-05-02 15:17:51 +00006144 CRC = 1;
Eric Christopher610fe112015-08-26 08:21:55 +00006145 if (Feature == "+crypto")
James Molloy75f5f9e2014-04-16 15:33:48 +00006146 Crypto = 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006147 if (Feature == "+strict-align")
6148 Unaligned = 0;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00006149 if (Feature == "+v8.1a")
6150 V8_1A = 1;
James Molloy75f5f9e2014-04-16 15:33:48 +00006151 }
6152
James Y Knightb214cbc2016-03-04 19:00:41 +00006153 setDataLayout();
James Molloy5e73df52014-04-16 15:06:20 +00006154
6155 return true;
6156 }
6157
John McCall477f2bb2016-03-03 06:39:32 +00006158 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
6159 switch (CC) {
6160 case CC_C:
6161 case CC_Swift:
Roman Levenstein35aa5ce2016-03-16 18:00:46 +00006162 case CC_PreserveMost:
6163 case CC_PreserveAll:
John McCall477f2bb2016-03-03 06:39:32 +00006164 return CCCR_OK;
6165 default:
6166 return CCCR_Warning;
6167 }
6168 }
6169
David Blaikie1cbb9712014-11-14 19:09:44 +00006170 bool isCLZForZeroUndef() const override { return false; }
Tim Northovera2ee4332014-03-29 15:09:45 +00006171
David Blaikie1cbb9712014-11-14 19:09:44 +00006172 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006173 return TargetInfo::AArch64ABIBuiltinVaList;
6174 }
6175
Craig Topperf054e3a2015-10-19 03:52:27 +00006176 ArrayRef<const char *> getGCCRegNames() const override;
6177 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00006178
Alexander Kornienko34eb2072015-04-11 02:00:23 +00006179 bool validateAsmConstraint(const char *&Name,
6180 TargetInfo::ConstraintInfo &Info) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006181 switch (*Name) {
6182 default:
6183 return false;
6184 case 'w': // Floating point and SIMD registers (V0-V31)
6185 Info.setAllowsRegister();
6186 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00006187 case 'I': // Constant that can be used with an ADD instruction
6188 case 'J': // Constant that can be used with a SUB instruction
6189 case 'K': // Constant that can be used with a 32-bit logical instruction
6190 case 'L': // Constant that can be used with a 64-bit logical instruction
6191 case 'M': // Constant that can be used as a 32-bit MOV immediate
6192 case 'N': // Constant that can be used as a 64-bit MOV immediate
6193 case 'Y': // Floating point constant zero
6194 case 'Z': // Integer constant zero
6195 return true;
6196 case 'Q': // A memory reference with base register and no offset
6197 Info.setAllowsMemory();
6198 return true;
6199 case 'S': // A symbolic address
6200 Info.setAllowsRegister();
6201 return true;
6202 case 'U':
Eric Christopher917e9522014-11-18 22:36:15 +00006203 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
6204 // Utf: A memory address suitable for ldp/stp in TF mode.
6205 // Usa: An absolute symbolic address.
6206 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
6207 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
Tim Northovera2ee4332014-03-29 15:09:45 +00006208 case 'z': // Zero register, wzr or xzr
6209 Info.setAllowsRegister();
6210 return true;
6211 case 'x': // Floating point and SIMD registers (V0-V15)
6212 Info.setAllowsRegister();
6213 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00006214 }
6215 return false;
6216 }
6217
Akira Hatanaka987f1862014-08-22 06:05:21 +00006218 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00006219 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00006220 std::string &SuggestedModifier) const override {
James Molloy8a157bf2014-07-25 10:19:47 +00006221 // Strip off constraint modifiers.
6222 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
6223 Constraint = Constraint.substr(1);
6224
6225 switch (Constraint[0]) {
6226 default:
6227 return true;
6228 case 'z':
6229 case 'r': {
6230 switch (Modifier) {
6231 case 'x':
6232 case 'w':
6233 // For now assume that the person knows what they're
6234 // doing with the modifier.
6235 return true;
6236 default:
6237 // By default an 'r' constraint will be in the 'x'
6238 // registers.
Akira Hatanaka987f1862014-08-22 06:05:21 +00006239 if (Size == 64)
6240 return true;
6241
6242 SuggestedModifier = "w";
6243 return false;
James Molloy8a157bf2014-07-25 10:19:47 +00006244 }
6245 }
6246 }
6247 }
6248
David Blaikie1cbb9712014-11-14 19:09:44 +00006249 const char *getClobbers() const override { return ""; }
Tim Northovera2ee4332014-03-29 15:09:45 +00006250
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00006251 int getEHDataRegisterNumber(unsigned RegNo) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006252 if (RegNo == 0)
6253 return 0;
6254 if (RegNo == 1)
6255 return 1;
6256 return -1;
6257 }
6258};
6259
Tim Northover573cbee2014-05-24 12:52:07 +00006260const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00006261 // 32-bit Integer registers
6262 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
6263 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
6264 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
6265
6266 // 64-bit Integer registers
6267 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
6268 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
6269 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
6270
6271 // 32-bit floating point regsisters
6272 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
6273 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
6274 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
6275
6276 // 64-bit floating point regsisters
6277 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
6278 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
6279 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
6280
6281 // Vector registers
6282 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
6283 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
6284 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
6285};
6286
Craig Topperf054e3a2015-10-19 03:52:27 +00006287ArrayRef<const char *> AArch64TargetInfo::getGCCRegNames() const {
6288 return llvm::makeArrayRef(GCCRegNames);
Tim Northovera2ee4332014-03-29 15:09:45 +00006289}
6290
Tim Northover573cbee2014-05-24 12:52:07 +00006291const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00006292 { { "w31" }, "wsp" },
6293 { { "x29" }, "fp" },
6294 { { "x30" }, "lr" },
6295 { { "x31" }, "sp" },
6296 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
6297 // don't want to substitute one of these for a different-sized one.
6298};
6299
Craig Topperf054e3a2015-10-19 03:52:27 +00006300ArrayRef<TargetInfo::GCCRegAlias> AArch64TargetInfo::getGCCRegAliases() const {
6301 return llvm::makeArrayRef(GCCRegAliases);
Tim Northovera2ee4332014-03-29 15:09:45 +00006302}
6303
Tim Northover573cbee2014-05-24 12:52:07 +00006304const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00006305#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006306 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00006307#include "clang/Basic/BuiltinsNEON.def"
6308
6309#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006310 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northover573cbee2014-05-24 12:52:07 +00006311#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00006312};
James Molloy5e73df52014-04-16 15:06:20 +00006313
Tim Northover573cbee2014-05-24 12:52:07 +00006314class AArch64leTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00006315 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00006316 if (getTriple().isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00006317 resetDataLayout("e-m:o-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006318 else
Chad Rosier4c077aa2016-07-07 20:02:25 +00006319 resetDataLayout("e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006320 }
6321
6322public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006323 AArch64leTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6324 : AArch64TargetInfo(Triple, Opts) {
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006325 }
James Molloy5e73df52014-04-16 15:06:20 +00006326 void getTargetDefines(const LangOptions &Opts,
6327 MacroBuilder &Builder) const override {
6328 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00006329 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00006330 }
6331};
6332
Tim Northover573cbee2014-05-24 12:52:07 +00006333class AArch64beTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00006334 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00006335 assert(!getTriple().isOSBinFormatMachO());
Chad Rosier4c077aa2016-07-07 20:02:25 +00006336 resetDataLayout("E-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006337 }
6338
6339public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006340 AArch64beTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6341 : AArch64TargetInfo(Triple, Opts) {}
James Molloy5e73df52014-04-16 15:06:20 +00006342 void getTargetDefines(const LangOptions &Opts,
6343 MacroBuilder &Builder) const override {
6344 Builder.defineMacro("__AARCH64EB__");
6345 Builder.defineMacro("__AARCH_BIG_ENDIAN");
6346 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00006347 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00006348 }
6349};
Tim Northovera2ee4332014-03-29 15:09:45 +00006350
Tim Northover573cbee2014-05-24 12:52:07 +00006351class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00006352protected:
6353 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
6354 MacroBuilder &Builder) const override {
6355 Builder.defineMacro("__AARCH64_SIMD__");
6356 Builder.defineMacro("__ARM64_ARCH_8__");
6357 Builder.defineMacro("__ARM_NEON__");
6358 Builder.defineMacro("__LITTLE_ENDIAN__");
6359 Builder.defineMacro("__REGISTER_PREFIX__", "");
6360 Builder.defineMacro("__arm64", "1");
6361 Builder.defineMacro("__arm64__", "1");
6362
6363 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
6364 }
6365
Tim Northovera2ee4332014-03-29 15:09:45 +00006366public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006367 DarwinAArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6368 : DarwinTargetInfo<AArch64leTargetInfo>(Triple, Opts) {
Tim Northovera2ee4332014-03-29 15:09:45 +00006369 Int64Type = SignedLongLong;
6370 WCharType = SignedInt;
6371 UseSignedCharForObjCBool = false;
6372
Tim Northovera6a19f12015-02-06 01:25:07 +00006373 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00006374 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Tim Northovera2ee4332014-03-29 15:09:45 +00006375
6376 TheCXXABI.set(TargetCXXABI::iOS64);
6377 }
6378
David Blaikie1cbb9712014-11-14 19:09:44 +00006379 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006380 return TargetInfo::CharPtrBuiltinVaList;
6381 }
6382};
Tim Northovera2ee4332014-03-29 15:09:45 +00006383
Tony Linthicum76329bf2011-12-12 21:14:55 +00006384// Hexagon abstract base class
6385class HexagonTargetInfo : public TargetInfo {
6386 static const Builtin::Info BuiltinInfo[];
6387 static const char * const GCCRegNames[];
6388 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6389 std::string CPU;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006390 bool HasHVX, HasHVXDouble;
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006391 bool UseLongCalls;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006392
Tony Linthicum76329bf2011-12-12 21:14:55 +00006393public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006394 HexagonTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6395 : TargetInfo(Triple) {
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00006396 // Specify the vector alignment explicitly. For v512x1, the calculated
6397 // alignment would be 512*alignment(i1), which is 512 bytes, instead of
6398 // the required minimum of 64 bytes.
James Y Knightb214cbc2016-03-04 19:00:41 +00006399 resetDataLayout("e-m:e-p:32:32:32-a:0-n16:32-"
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00006400 "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 +00006401 "v32:32:32-v64:64:64-v512:512:512-v1024:1024:1024-v2048:2048:2048");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006402 SizeType = UnsignedInt;
6403 PtrDiffType = SignedInt;
6404 IntPtrType = SignedInt;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006405
6406 // {} in inline assembly are packet specifiers, not assembly variant
6407 // specifiers.
6408 NoAsmVariants = true;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006409
6410 LargeArrayMinWidth = 64;
6411 LargeArrayAlign = 64;
6412 UseBitFieldTypeAlignment = true;
6413 ZeroLengthBitfieldBoundary = 32;
6414 HasHVX = HasHVXDouble = false;
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006415 UseLongCalls = false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006416 }
6417
Craig Topper6c03a542015-10-19 04:51:35 +00006418 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6419 return llvm::makeArrayRef(BuiltinInfo,
6420 clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006421 }
6422
Craig Topper3164f332014-03-11 03:39:26 +00006423 bool validateAsmConstraint(const char *&Name,
6424 TargetInfo::ConstraintInfo &Info) const override {
Krzysztof Parzyszeke0026e42016-05-18 14:56:14 +00006425 switch (*Name) {
6426 case 'v':
6427 case 'q':
6428 if (HasHVX) {
6429 Info.setAllowsRegister();
6430 return true;
6431 }
6432 break;
Krzysztof Parzyszek89fb4412016-05-20 13:50:32 +00006433 case 's':
6434 // Relocatable constant.
6435 return true;
Krzysztof Parzyszeke0026e42016-05-18 14:56:14 +00006436 }
6437 return false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006438 }
6439
Craig Topper3164f332014-03-11 03:39:26 +00006440 void getTargetDefines(const LangOptions &Opts,
6441 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006442
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006443 bool isCLZForZeroUndef() const override { return false; }
6444
Craig Topper3164f332014-03-11 03:39:26 +00006445 bool hasFeature(StringRef Feature) const override {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006446 return llvm::StringSwitch<bool>(Feature)
6447 .Case("hexagon", true)
6448 .Case("hvx", HasHVX)
6449 .Case("hvx-double", HasHVXDouble)
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006450 .Case("long-calls", UseLongCalls)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006451 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006452 }
Craig Topper3164f332014-03-11 03:39:26 +00006453
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006454 bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6455 StringRef CPU, const std::vector<std::string> &FeaturesVec)
6456 const override;
6457
6458 bool handleTargetFeatures(std::vector<std::string> &Features,
6459 DiagnosticsEngine &Diags) override;
6460
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006461 void setFeatureEnabled(llvm::StringMap<bool> &Features, StringRef Name,
6462 bool Enabled) const override;
6463
Craig Topper3164f332014-03-11 03:39:26 +00006464 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006465 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006466 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006467 ArrayRef<const char *> getGCCRegNames() const override;
6468 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00006469 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006470 return "";
6471 }
Sebastian Pop86500282012-01-13 20:37:10 +00006472
6473 static const char *getHexagonCPUSuffix(StringRef Name) {
6474 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00006475 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006476 .Case("hexagonv5", "5")
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006477 .Case("hexagonv55", "55")
6478 .Case("hexagonv60", "60")
Krzysztof Parzyszekff7f6672017-03-14 20:29:23 +00006479 .Case("hexagonv62", "62")
Craig Topperf1186c52014-05-08 06:41:40 +00006480 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00006481 }
6482
Craig Topper3164f332014-03-11 03:39:26 +00006483 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00006484 if (!getHexagonCPUSuffix(Name))
6485 return false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006486 CPU = Name;
6487 return true;
6488 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006489
6490 int getEHDataRegisterNumber(unsigned RegNo) const override {
6491 return RegNo < 2 ? RegNo : -1;
6492 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006493};
6494
6495void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006496 MacroBuilder &Builder) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006497 Builder.defineMacro("__qdsp6__", "1");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006498 Builder.defineMacro("__hexagon__", "1");
6499
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006500 if (CPU == "hexagonv4") {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006501 Builder.defineMacro("__HEXAGON_V4__");
6502 Builder.defineMacro("__HEXAGON_ARCH__", "4");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006503 if (Opts.HexagonQdsp6Compat) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006504 Builder.defineMacro("__QDSP6_V4__");
6505 Builder.defineMacro("__QDSP6_ARCH__", "4");
6506 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006507 } else if (CPU == "hexagonv5") {
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006508 Builder.defineMacro("__HEXAGON_V5__");
6509 Builder.defineMacro("__HEXAGON_ARCH__", "5");
6510 if(Opts.HexagonQdsp6Compat) {
6511 Builder.defineMacro("__QDSP6_V5__");
6512 Builder.defineMacro("__QDSP6_ARCH__", "5");
6513 }
Krzysztof Parzyszeka58ff512016-04-21 14:30:04 +00006514 } else if (CPU == "hexagonv55") {
6515 Builder.defineMacro("__HEXAGON_V55__");
6516 Builder.defineMacro("__HEXAGON_ARCH__", "55");
6517 Builder.defineMacro("__QDSP6_V55__");
6518 Builder.defineMacro("__QDSP6_ARCH__", "55");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006519 } else if (CPU == "hexagonv60") {
6520 Builder.defineMacro("__HEXAGON_V60__");
6521 Builder.defineMacro("__HEXAGON_ARCH__", "60");
6522 Builder.defineMacro("__QDSP6_V60__");
6523 Builder.defineMacro("__QDSP6_ARCH__", "60");
Krzysztof Parzyszekff7f6672017-03-14 20:29:23 +00006524 } else if (CPU == "hexagonv62") {
6525 Builder.defineMacro("__HEXAGON_V62__");
6526 Builder.defineMacro("__HEXAGON_ARCH__", "62");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006527 }
Krzysztof Parzyszek7f0756c2016-04-18 18:38:11 +00006528
6529 if (hasFeature("hvx")) {
6530 Builder.defineMacro("__HVX__");
6531 if (hasFeature("hvx-double"))
6532 Builder.defineMacro("__HVXDBL__");
6533 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006534}
6535
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006536bool HexagonTargetInfo::initFeatureMap(llvm::StringMap<bool> &Features,
6537 DiagnosticsEngine &Diags, StringRef CPU,
6538 const std::vector<std::string> &FeaturesVec) const {
6539 // Default for v60: -hvx, -hvx-double.
6540 Features["hvx"] = false;
6541 Features["hvx-double"] = false;
6542 Features["long-calls"] = false;
6543
6544 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
6545}
6546
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006547bool HexagonTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
6548 DiagnosticsEngine &Diags) {
6549 for (auto &F : Features) {
6550 if (F == "+hvx")
6551 HasHVX = true;
6552 else if (F == "-hvx")
6553 HasHVX = HasHVXDouble = false;
6554 else if (F == "+hvx-double")
6555 HasHVX = HasHVXDouble = true;
6556 else if (F == "-hvx-double")
6557 HasHVXDouble = false;
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006558
6559 if (F == "+long-calls")
6560 UseLongCalls = true;
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006561 else if (F == "-long-calls")
6562 UseLongCalls = false;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006563 }
6564 return true;
6565}
6566
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006567void HexagonTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
6568 StringRef Name, bool Enabled) const {
6569 if (Enabled) {
6570 if (Name == "hvx-double")
6571 Features["hvx"] = true;
6572 } else {
6573 if (Name == "hvx")
6574 Features["hvx-double"] = false;
6575 }
6576 Features[Name] = Enabled;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006577}
6578
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006579const char *const HexagonTargetInfo::GCCRegNames[] = {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006580 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6581 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6582 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6583 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
6584 "p0", "p1", "p2", "p3",
6585 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
6586};
6587
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006588ArrayRef<const char*> HexagonTargetInfo::getGCCRegNames() const {
Craig Topperf054e3a2015-10-19 03:52:27 +00006589 return llvm::makeArrayRef(GCCRegNames);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006590}
6591
Tony Linthicum76329bf2011-12-12 21:14:55 +00006592const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
6593 { { "sp" }, "r29" },
6594 { { "fp" }, "r30" },
6595 { { "lr" }, "r31" },
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006596};
Tony Linthicum76329bf2011-12-12 21:14:55 +00006597
Craig Topperf054e3a2015-10-19 03:52:27 +00006598ArrayRef<TargetInfo::GCCRegAlias> HexagonTargetInfo::getGCCRegAliases() const {
6599 return llvm::makeArrayRef(GCCRegAliases);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006600}
6601
6602
6603const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00006604#define BUILTIN(ID, TYPE, ATTRS) \
6605 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
6606#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
6607 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tony Linthicum76329bf2011-12-12 21:14:55 +00006608#include "clang/Basic/BuiltinsHexagon.def"
6609};
Tony Linthicum76329bf2011-12-12 21:14:55 +00006610
Jacques Pienaard964cc22016-03-28 21:02:54 +00006611class LanaiTargetInfo : public TargetInfo {
6612 // Class for Lanai (32-bit).
6613 // The CPU profiles supported by the Lanai backend
6614 enum CPUKind {
6615 CK_NONE,
6616 CK_V11,
6617 } CPU;
6618
6619 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6620 static const char *const GCCRegNames[];
6621
6622public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006623 LanaiTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6624 : TargetInfo(Triple) {
Jacques Pienaard964cc22016-03-28 21:02:54 +00006625 // Description string has to be kept in sync with backend.
6626 resetDataLayout("E" // Big endian
6627 "-m:e" // ELF name manging
6628 "-p:32:32" // 32 bit pointers, 32 bit aligned
6629 "-i64:64" // 64 bit integers, 64 bit aligned
6630 "-a:0:32" // 32 bit alignment of objects of aggregate type
6631 "-n32" // 32 bit native integer width
6632 "-S64" // 64 bit natural stack alignment
6633 );
6634
6635 // Setting RegParmMax equal to what mregparm was set to in the old
6636 // toolchain
6637 RegParmMax = 4;
6638
6639 // Set the default CPU to V11
6640 CPU = CK_V11;
6641
6642 // Temporary approach to make everything at least word-aligned and allow for
6643 // safely casting between pointers with different alignment requirements.
6644 // TODO: Remove this when there are no more cast align warnings on the
6645 // firmware.
6646 MinGlobalAlign = 32;
6647 }
6648
6649 void getTargetDefines(const LangOptions &Opts,
6650 MacroBuilder &Builder) const override {
6651 // Define __lanai__ when building for target lanai.
6652 Builder.defineMacro("__lanai__");
6653
6654 // Set define for the CPU specified.
6655 switch (CPU) {
6656 case CK_V11:
6657 Builder.defineMacro("__LANAI_V11__");
6658 break;
6659 case CK_NONE:
6660 llvm_unreachable("Unhandled target CPU");
6661 }
6662 }
6663
6664 bool setCPU(const std::string &Name) override {
6665 CPU = llvm::StringSwitch<CPUKind>(Name)
6666 .Case("v11", CK_V11)
6667 .Default(CK_NONE);
6668
6669 return CPU != CK_NONE;
6670 }
6671
6672 bool hasFeature(StringRef Feature) const override {
6673 return llvm::StringSwitch<bool>(Feature).Case("lanai", true).Default(false);
6674 }
6675
6676 ArrayRef<const char *> getGCCRegNames() const override;
6677
6678 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
6679
6680 BuiltinVaListKind getBuiltinVaListKind() const override {
6681 return TargetInfo::VoidPtrBuiltinVaList;
6682 }
6683
6684 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
6685
6686 bool validateAsmConstraint(const char *&Name,
6687 TargetInfo::ConstraintInfo &info) const override {
6688 return false;
6689 }
6690
6691 const char *getClobbers() const override { return ""; }
6692};
6693
6694const char *const LanaiTargetInfo::GCCRegNames[] = {
6695 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10",
6696 "r11", "r12", "r13", "r14", "r15", "r16", "r17", "r18", "r19", "r20", "r21",
6697 "r22", "r23", "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"};
6698
6699ArrayRef<const char *> LanaiTargetInfo::getGCCRegNames() const {
6700 return llvm::makeArrayRef(GCCRegNames);
6701}
6702
6703const TargetInfo::GCCRegAlias LanaiTargetInfo::GCCRegAliases[] = {
6704 {{"pc"}, "r2"},
6705 {{"sp"}, "r4"},
6706 {{"fp"}, "r5"},
6707 {{"rv"}, "r8"},
6708 {{"rr1"}, "r10"},
6709 {{"rr2"}, "r11"},
6710 {{"rca"}, "r15"},
6711};
6712
6713ArrayRef<TargetInfo::GCCRegAlias> LanaiTargetInfo::getGCCRegAliases() const {
6714 return llvm::makeArrayRef(GCCRegAliases);
6715}
6716
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006717// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
6718class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00006719 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6720 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006721 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00006722public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006723 SparcTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
James Y Knighta3518ad2016-01-27 01:04:51 +00006724 : TargetInfo(Triple), SoftFloat(false) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006725
Joerg Sonnenbergerd0be8dc2016-03-07 17:19:15 +00006726 int getEHDataRegisterNumber(unsigned RegNo) const override {
6727 if (RegNo == 0) return 24;
6728 if (RegNo == 1) return 25;
6729 return -1;
6730 }
6731
Craig Topper3164f332014-03-11 03:39:26 +00006732 bool handleTargetFeatures(std::vector<std::string> &Features,
6733 DiagnosticsEngine &Diags) override {
Jacob Baungard Hansen13a49372016-05-24 08:30:08 +00006734 // Check if software floating point is enabled
Eric Christopherfb481a42015-04-29 23:32:17 +00006735 auto Feature = std::find(Features.begin(), Features.end(), "+soft-float");
6736 if (Feature != Features.end()) {
6737 SoftFloat = true;
Eric Christopherfb481a42015-04-29 23:32:17 +00006738 }
Rafael Espindolaeb265472013-08-21 21:59:03 +00006739 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006740 }
Craig Topper3164f332014-03-11 03:39:26 +00006741 void getTargetDefines(const LangOptions &Opts,
6742 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006743 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006744 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006745
6746 if (SoftFloat)
6747 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00006748 }
Craig Topper3164f332014-03-11 03:39:26 +00006749
6750 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006751 return llvm::StringSwitch<bool>(Feature)
6752 .Case("softfloat", SoftFloat)
6753 .Case("sparc", true)
6754 .Default(false);
6755 }
Craig Topper3164f332014-03-11 03:39:26 +00006756
Chris Dewhurst0381cd72016-06-15 12:44:47 +00006757 bool hasSjLjLowering() const override {
6758 return true;
6759 }
6760
Craig Topper6c03a542015-10-19 04:51:35 +00006761 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006762 // FIXME: Implement!
Craig Topper6c03a542015-10-19 04:51:35 +00006763 return None;
Gabor Greif49991682008-02-21 16:29:08 +00006764 }
Craig Topper3164f332014-03-11 03:39:26 +00006765 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006766 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00006767 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006768 ArrayRef<const char *> getGCCRegNames() const override;
6769 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00006770 bool validateAsmConstraint(const char *&Name,
6771 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006772 // FIXME: Implement!
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00006773 switch (*Name) {
6774 case 'I': // Signed 13-bit constant
6775 case 'J': // Zero
6776 case 'K': // 32-bit constant with the low 12 bits clear
6777 case 'L': // A constant in the range supported by movcc (11-bit signed imm)
6778 case 'M': // A constant in the range supported by movrcc (19-bit signed imm)
6779 case 'N': // Same as 'K' but zext (required for SIMode)
6780 case 'O': // The constant 4096
6781 return true;
6782 }
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006783 return false;
Gabor Greif49991682008-02-21 16:29:08 +00006784 }
Craig Topper3164f332014-03-11 03:39:26 +00006785 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006786 // FIXME: Implement!
6787 return "";
Gabor Greif49991682008-02-21 16:29:08 +00006788 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006789
6790 // No Sparc V7 for now, the backend doesn't support it anyway.
6791 enum CPUKind {
6792 CK_GENERIC,
6793 CK_V8,
6794 CK_SUPERSPARC,
6795 CK_SPARCLITE,
6796 CK_F934,
6797 CK_HYPERSPARC,
6798 CK_SPARCLITE86X,
6799 CK_SPARCLET,
6800 CK_TSC701,
6801 CK_V9,
6802 CK_ULTRASPARC,
6803 CK_ULTRASPARC3,
6804 CK_NIAGARA,
6805 CK_NIAGARA2,
6806 CK_NIAGARA3,
Douglas Katzman6871afc2016-03-15 22:34:02 +00006807 CK_NIAGARA4,
Douglas Katzman87da5f42016-07-25 16:36:02 +00006808 CK_MYRIAD2100,
6809 CK_MYRIAD2150,
6810 CK_MYRIAD2450,
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006811 CK_LEON2,
6812 CK_LEON2_AT697E,
6813 CK_LEON2_AT697F,
6814 CK_LEON3,
6815 CK_LEON3_UT699,
6816 CK_LEON3_GR712RC,
6817 CK_LEON4,
6818 CK_LEON4_GR740
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006819 } CPU = CK_GENERIC;
6820
6821 enum CPUGeneration {
6822 CG_V8,
6823 CG_V9,
6824 };
6825
6826 CPUGeneration getCPUGeneration(CPUKind Kind) const {
6827 switch (Kind) {
6828 case CK_GENERIC:
6829 case CK_V8:
6830 case CK_SUPERSPARC:
6831 case CK_SPARCLITE:
6832 case CK_F934:
6833 case CK_HYPERSPARC:
6834 case CK_SPARCLITE86X:
6835 case CK_SPARCLET:
6836 case CK_TSC701:
Douglas Katzman87da5f42016-07-25 16:36:02 +00006837 case CK_MYRIAD2100:
6838 case CK_MYRIAD2150:
6839 case CK_MYRIAD2450:
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006840 case CK_LEON2:
6841 case CK_LEON2_AT697E:
6842 case CK_LEON2_AT697F:
6843 case CK_LEON3:
6844 case CK_LEON3_UT699:
6845 case CK_LEON3_GR712RC:
6846 case CK_LEON4:
6847 case CK_LEON4_GR740:
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006848 return CG_V8;
6849 case CK_V9:
6850 case CK_ULTRASPARC:
6851 case CK_ULTRASPARC3:
6852 case CK_NIAGARA:
6853 case CK_NIAGARA2:
6854 case CK_NIAGARA3:
6855 case CK_NIAGARA4:
6856 return CG_V9;
6857 }
Aaron Ballmana9a72852015-11-11 13:42:02 +00006858 llvm_unreachable("Unexpected CPU kind");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006859 }
6860
6861 CPUKind getCPUKind(StringRef Name) const {
6862 return llvm::StringSwitch<CPUKind>(Name)
6863 .Case("v8", CK_V8)
6864 .Case("supersparc", CK_SUPERSPARC)
6865 .Case("sparclite", CK_SPARCLITE)
6866 .Case("f934", CK_F934)
6867 .Case("hypersparc", CK_HYPERSPARC)
6868 .Case("sparclite86x", CK_SPARCLITE86X)
6869 .Case("sparclet", CK_SPARCLET)
6870 .Case("tsc701", CK_TSC701)
6871 .Case("v9", CK_V9)
6872 .Case("ultrasparc", CK_ULTRASPARC)
6873 .Case("ultrasparc3", CK_ULTRASPARC3)
6874 .Case("niagara", CK_NIAGARA)
6875 .Case("niagara2", CK_NIAGARA2)
6876 .Case("niagara3", CK_NIAGARA3)
6877 .Case("niagara4", CK_NIAGARA4)
Douglas Katzman87da5f42016-07-25 16:36:02 +00006878 .Case("ma2100", CK_MYRIAD2100)
6879 .Case("ma2150", CK_MYRIAD2150)
6880 .Case("ma2450", CK_MYRIAD2450)
6881 // FIXME: the myriad2[.n] spellings are obsolete,
6882 // but a grace period is needed to allow updating dependent builds.
6883 .Case("myriad2", CK_MYRIAD2100)
6884 .Case("myriad2.1", CK_MYRIAD2100)
6885 .Case("myriad2.2", CK_MYRIAD2150)
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006886 .Case("leon2", CK_LEON2)
6887 .Case("at697e", CK_LEON2_AT697E)
6888 .Case("at697f", CK_LEON2_AT697F)
6889 .Case("leon3", CK_LEON3)
6890 .Case("ut699", CK_LEON3_UT699)
6891 .Case("gr712rc", CK_LEON3_GR712RC)
6892 .Case("leon4", CK_LEON4)
6893 .Case("gr740", CK_LEON4_GR740)
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006894 .Default(CK_GENERIC);
6895 }
6896
6897 bool setCPU(const std::string &Name) override {
6898 CPU = getCPUKind(Name);
6899 return CPU != CK_GENERIC;
6900 }
Gabor Greif49991682008-02-21 16:29:08 +00006901};
6902
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006903const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00006904 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6905 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6906 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6907 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
6908};
6909
Craig Topperf054e3a2015-10-19 03:52:27 +00006910ArrayRef<const char *> SparcTargetInfo::getGCCRegNames() const {
6911 return llvm::makeArrayRef(GCCRegNames);
Chris Lattner9b415d62009-01-27 01:58:38 +00006912}
6913
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006914const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00006915 { { "g0" }, "r0" },
6916 { { "g1" }, "r1" },
6917 { { "g2" }, "r2" },
6918 { { "g3" }, "r3" },
6919 { { "g4" }, "r4" },
6920 { { "g5" }, "r5" },
6921 { { "g6" }, "r6" },
6922 { { "g7" }, "r7" },
6923 { { "o0" }, "r8" },
6924 { { "o1" }, "r9" },
6925 { { "o2" }, "r10" },
6926 { { "o3" }, "r11" },
6927 { { "o4" }, "r12" },
6928 { { "o5" }, "r13" },
6929 { { "o6", "sp" }, "r14" },
6930 { { "o7" }, "r15" },
6931 { { "l0" }, "r16" },
6932 { { "l1" }, "r17" },
6933 { { "l2" }, "r18" },
6934 { { "l3" }, "r19" },
6935 { { "l4" }, "r20" },
6936 { { "l5" }, "r21" },
6937 { { "l6" }, "r22" },
6938 { { "l7" }, "r23" },
6939 { { "i0" }, "r24" },
6940 { { "i1" }, "r25" },
6941 { { "i2" }, "r26" },
6942 { { "i3" }, "r27" },
6943 { { "i4" }, "r28" },
6944 { { "i5" }, "r29" },
6945 { { "i6", "fp" }, "r30" },
6946 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00006947};
6948
Craig Topperf054e3a2015-10-19 03:52:27 +00006949ArrayRef<TargetInfo::GCCRegAlias> SparcTargetInfo::getGCCRegAliases() const {
6950 return llvm::makeArrayRef(GCCRegAliases);
Chris Lattner9b415d62009-01-27 01:58:38 +00006951}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006952
6953// SPARC v8 is the 32-bit mode selected by Triple::sparc.
6954class SparcV8TargetInfo : public SparcTargetInfo {
6955public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006956 SparcV8TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6957 : SparcTargetInfo(Triple, Opts) {
James Y Knightb214cbc2016-03-04 19:00:41 +00006958 resetDataLayout("E-m:e-p:32:32-i64:64-f128:64-n32-S64");
Brad Smith73859112015-08-13 21:45:57 +00006959 // NetBSD / OpenBSD use long (same as llvm default); everyone else uses int.
6960 switch (getTriple().getOS()) {
6961 default:
James Y Knight4b4d19e2015-06-04 15:36:29 +00006962 SizeType = UnsignedInt;
6963 IntPtrType = SignedInt;
6964 PtrDiffType = SignedInt;
Brad Smith73859112015-08-13 21:45:57 +00006965 break;
6966 case llvm::Triple::NetBSD:
6967 case llvm::Triple::OpenBSD:
6968 SizeType = UnsignedLong;
6969 IntPtrType = SignedLong;
6970 PtrDiffType = SignedLong;
6971 break;
Brad Smith56495d52015-08-13 22:00:53 +00006972 }
Douglas Katzman13f4a912016-11-09 15:43:51 +00006973 // Up to 32 bits are lock-free atomic, but we're willing to do atomic ops
6974 // on up to 64 bits.
6975 MaxAtomicPromoteWidth = 64;
6976 MaxAtomicInlineWidth = 32;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006977 }
6978
Craig Topper3164f332014-03-11 03:39:26 +00006979 void getTargetDefines(const LangOptions &Opts,
6980 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006981 SparcTargetInfo::getTargetDefines(Opts, Builder);
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006982 switch (getCPUGeneration(CPU)) {
6983 case CG_V8:
6984 Builder.defineMacro("__sparcv8");
6985 if (getTriple().getOS() != llvm::Triple::Solaris)
6986 Builder.defineMacro("__sparcv8__");
6987 break;
6988 case CG_V9:
6989 Builder.defineMacro("__sparcv9");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00006990 if (getTriple().getOS() != llvm::Triple::Solaris) {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006991 Builder.defineMacro("__sparcv9__");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00006992 Builder.defineMacro("__sparc_v9__");
6993 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006994 break;
6995 }
Douglas Katzman6871afc2016-03-15 22:34:02 +00006996 if (getTriple().getVendor() == llvm::Triple::Myriad) {
Douglas Katzman87da5f42016-07-25 16:36:02 +00006997 std::string MyriadArchValue, Myriad2Value;
6998 Builder.defineMacro("__sparc_v8__");
6999 Builder.defineMacro("__leon__");
Douglas Katzman6871afc2016-03-15 22:34:02 +00007000 switch (CPU) {
Douglas Katzman87da5f42016-07-25 16:36:02 +00007001 case CK_MYRIAD2150:
7002 MyriadArchValue = "__ma2150";
7003 Myriad2Value = "2";
Douglas Katzman6871afc2016-03-15 22:34:02 +00007004 break;
Douglas Katzman87da5f42016-07-25 16:36:02 +00007005 case CK_MYRIAD2450:
7006 MyriadArchValue = "__ma2450";
7007 Myriad2Value = "2";
Douglas Katzman6871afc2016-03-15 22:34:02 +00007008 break;
7009 default:
Douglas Katzman87da5f42016-07-25 16:36:02 +00007010 MyriadArchValue = "__ma2100";
7011 Myriad2Value = "1";
Douglas Katzman6871afc2016-03-15 22:34:02 +00007012 break;
7013 }
Douglas Katzman87da5f42016-07-25 16:36:02 +00007014 Builder.defineMacro(MyriadArchValue, "1");
7015 Builder.defineMacro(MyriadArchValue+"__", "1");
7016 Builder.defineMacro("__myriad2__", Myriad2Value);
7017 Builder.defineMacro("__myriad2", Myriad2Value);
Douglas Katzman6871afc2016-03-15 22:34:02 +00007018 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007019 }
Chris Dewhurst69fa1922016-05-04 09:33:30 +00007020
7021 bool hasSjLjLowering() const override {
7022 return true;
7023 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007024};
7025
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007026// SPARCV8el is the 32-bit little-endian mode selected by Triple::sparcel.
7027class SparcV8elTargetInfo : public SparcV8TargetInfo {
7028 public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007029 SparcV8elTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7030 : SparcV8TargetInfo(Triple, Opts) {
7031 resetDataLayout("e-m:e-p:32:32-i64:64-f128:64-n32-S64");
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007032 }
7033};
7034
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007035// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
7036class SparcV9TargetInfo : public SparcTargetInfo {
7037public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007038 SparcV9TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7039 : SparcTargetInfo(Triple, Opts) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007040 // FIXME: Support Sparc quad-precision long double?
James Y Knightb214cbc2016-03-04 19:00:41 +00007041 resetDataLayout("E-m:e-i64:64-n32:64-S128");
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00007042 // This is an LP64 platform.
7043 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00007044
7045 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00007046 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00007047 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00007048 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00007049 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00007050 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00007051
7052 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
7053 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
7054 LongDoubleWidth = 128;
7055 LongDoubleAlign = 128;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007056 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00007057 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007058 }
7059
Craig Topper3164f332014-03-11 03:39:26 +00007060 void getTargetDefines(const LangOptions &Opts,
7061 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007062 SparcTargetInfo::getTargetDefines(Opts, Builder);
7063 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00007064 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00007065 // Solaris doesn't need these variants, but the BSDs do.
7066 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00007067 Builder.defineMacro("__sparc64__");
7068 Builder.defineMacro("__sparc_v9__");
7069 Builder.defineMacro("__sparcv9__");
7070 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007071 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00007072
Craig Topper3164f332014-03-11 03:39:26 +00007073 bool setCPU(const std::string &Name) override {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00007074 if (!SparcTargetInfo::setCPU(Name))
7075 return false;
7076 return getCPUGeneration(CPU) == CG_V9;
Roman Divackyb1ae3d42014-02-25 18:35:30 +00007077 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007078};
7079
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007080class SystemZTargetInfo : public TargetInfo {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007081 static const Builtin::Info BuiltinInfo[];
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007082 static const char *const GCCRegNames[];
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007083 std::string CPU;
7084 bool HasTransactionalExecution;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007085 bool HasVector;
Ulrich Weigand47445072013-05-06 16:26:41 +00007086
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007087public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007088 SystemZTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Eric Christopherb093d692015-10-09 18:39:59 +00007089 : TargetInfo(Triple), CPU("z10"), HasTransactionalExecution(false),
7090 HasVector(false) {
Ulrich Weigand881497a2015-03-30 13:50:21 +00007091 IntMaxType = SignedLong;
7092 Int64Type = SignedLong;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007093 TLSSupported = true;
7094 IntWidth = IntAlign = 32;
7095 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
7096 PointerWidth = PointerAlign = 64;
7097 LongDoubleWidth = 128;
7098 LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007099 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Ulrich Weigandca3cb7f2015-04-21 17:29:35 +00007100 DefaultAlignForAttributeAligned = 64;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007101 MinGlobalAlign = 16;
James Y Knightb214cbc2016-03-04 19:00:41 +00007102 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 +00007103 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
7104 }
7105 void getTargetDefines(const LangOptions &Opts,
7106 MacroBuilder &Builder) const override {
7107 Builder.defineMacro("__s390__");
7108 Builder.defineMacro("__s390x__");
7109 Builder.defineMacro("__zarch__");
7110 Builder.defineMacro("__LONG_DOUBLE_128__");
Ulrich Weigandb038a522016-02-05 21:34:28 +00007111
Ulrich Weigand82a86cb2017-02-06 17:04:22 +00007112 const std::string ISARev = llvm::StringSwitch<std::string>(CPU)
7113 .Cases("arch8", "z10", "8")
7114 .Cases("arch9", "z196", "9")
7115 .Cases("arch10", "zEC12", "10")
7116 .Cases("arch11", "z13", "11")
7117 .Default("");
7118 if (!ISARev.empty())
7119 Builder.defineMacro("__ARCH__", ISARev);
7120
Ulrich Weigandb038a522016-02-05 21:34:28 +00007121 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
7122 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
7123 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
7124 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
7125
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007126 if (HasTransactionalExecution)
7127 Builder.defineMacro("__HTM__");
Ulrich Weigand82a86cb2017-02-06 17:04:22 +00007128 if (HasVector)
7129 Builder.defineMacro("__VX__");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00007130 if (Opts.ZVector)
7131 Builder.defineMacro("__VEC__", "10301");
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007132 }
Craig Topper6c03a542015-10-19 04:51:35 +00007133 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7134 return llvm::makeArrayRef(BuiltinInfo,
7135 clang::SystemZ::LastTSBuiltin-Builtin::FirstTSBuiltin);
Ulrich Weigand47445072013-05-06 16:26:41 +00007136 }
7137
Craig Topperf054e3a2015-10-19 03:52:27 +00007138 ArrayRef<const char *> getGCCRegNames() const override;
7139 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007140 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00007141 return None;
Ulrich Weigand47445072013-05-06 16:26:41 +00007142 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007143 bool validateAsmConstraint(const char *&Name,
7144 TargetInfo::ConstraintInfo &info) const override;
7145 const char *getClobbers() const override {
7146 // FIXME: Is this really right?
7147 return "";
7148 }
7149 BuiltinVaListKind getBuiltinVaListKind() const override {
7150 return TargetInfo::SystemZBuiltinVaList;
7151 }
7152 bool setCPU(const std::string &Name) override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007153 CPU = Name;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007154 bool CPUKnown = llvm::StringSwitch<bool>(Name)
7155 .Case("z10", true)
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007156 .Case("arch8", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007157 .Case("z196", true)
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007158 .Case("arch9", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007159 .Case("zEC12", true)
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007160 .Case("arch10", true)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007161 .Case("z13", true)
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007162 .Case("arch11", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007163 .Default(false);
7164
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007165 return CPUKnown;
7166 }
Eric Christopher8c47b422015-10-09 18:39:55 +00007167 bool
7168 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7169 StringRef CPU,
7170 const std::vector<std::string> &FeaturesVec) const override {
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007171 if (CPU == "zEC12" || CPU == "arch10")
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007172 Features["transactional-execution"] = true;
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007173 if (CPU == "z13" || CPU == "arch11") {
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007174 Features["transactional-execution"] = true;
7175 Features["vector"] = true;
7176 }
Eric Christopher007b0a02015-08-28 22:32:01 +00007177 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007178 }
7179
7180 bool handleTargetFeatures(std::vector<std::string> &Features,
7181 DiagnosticsEngine &Diags) override {
7182 HasTransactionalExecution = false;
Eric Christopher610fe112015-08-26 08:21:55 +00007183 for (const auto &Feature : Features) {
7184 if (Feature == "+transactional-execution")
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007185 HasTransactionalExecution = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007186 else if (Feature == "+vector")
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007187 HasVector = true;
7188 }
7189 // If we use the vector ABI, vector types are 64-bit aligned.
7190 if (HasVector) {
7191 MaxVectorAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00007192 resetDataLayout("E-m:e-i1:8:16-i8:8:16-i64:64-f128:64"
7193 "-v128:64-a:8:16-n32:64");
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007194 }
7195 return true;
7196 }
7197
7198 bool hasFeature(StringRef Feature) const override {
7199 return llvm::StringSwitch<bool>(Feature)
Ulrich Weigandcc673442015-04-01 14:15:35 +00007200 .Case("systemz", true)
7201 .Case("htm", HasTransactionalExecution)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007202 .Case("vx", HasVector)
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007203 .Default(false);
7204 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007205
Bryan Chane3f1ed52016-04-28 13:56:43 +00007206 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
7207 switch (CC) {
7208 case CC_C:
7209 case CC_Swift:
7210 return CCCR_OK;
7211 default:
7212 return CCCR_Warning;
7213 }
7214 }
7215
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007216 StringRef getABI() const override {
7217 if (HasVector)
7218 return "vector";
7219 return "";
7220 }
Ulrich Weigand47fd2532015-06-16 15:21:47 +00007221
7222 bool useFloat128ManglingForLongDouble() const override {
7223 return true;
7224 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007225};
7226
7227const Builtin::Info SystemZTargetInfo::BuiltinInfo[] = {
7228#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00007229 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Jonas Paulsson3ace74a2016-03-30 15:51:24 +00007230#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
7231 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007232#include "clang/Basic/BuiltinsSystemZ.def"
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007233};
7234
7235const char *const SystemZTargetInfo::GCCRegNames[] = {
7236 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
7237 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
7238 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
7239 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
7240};
7241
Craig Topperf054e3a2015-10-19 03:52:27 +00007242ArrayRef<const char *> SystemZTargetInfo::getGCCRegNames() const {
7243 return llvm::makeArrayRef(GCCRegNames);
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007244}
7245
7246bool SystemZTargetInfo::
7247validateAsmConstraint(const char *&Name,
7248 TargetInfo::ConstraintInfo &Info) const {
7249 switch (*Name) {
7250 default:
7251 return false;
7252
7253 case 'a': // Address register
7254 case 'd': // Data register (equivalent to 'r')
7255 case 'f': // Floating-point register
7256 Info.setAllowsRegister();
7257 return true;
7258
7259 case 'I': // Unsigned 8-bit constant
7260 case 'J': // Unsigned 12-bit constant
7261 case 'K': // Signed 16-bit constant
7262 case 'L': // Signed 20-bit displacement (on all targets we support)
7263 case 'M': // 0x7fffffff
7264 return true;
7265
7266 case 'Q': // Memory with base and unsigned 12-bit displacement
7267 case 'R': // Likewise, plus an index
7268 case 'S': // Memory with base and signed 20-bit displacement
7269 case 'T': // Likewise, plus an index
7270 Info.setAllowsMemory();
7271 return true;
7272 }
7273}
Ulrich Weigand47445072013-05-06 16:26:41 +00007274
Eric Christopherc48497a2015-09-18 21:26:24 +00007275class MSP430TargetInfo : public TargetInfo {
7276 static const char *const GCCRegNames[];
Anton Korobeynikova0f54372009-05-03 13:43:08 +00007277
Eric Christopherc48497a2015-09-18 21:26:24 +00007278public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007279 MSP430TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7280 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007281 TLSSupported = false;
7282 IntWidth = 16;
7283 IntAlign = 16;
7284 LongWidth = 32;
7285 LongLongWidth = 64;
7286 LongAlign = LongLongAlign = 16;
7287 PointerWidth = 16;
7288 PointerAlign = 16;
7289 SuitableAlign = 16;
7290 SizeType = UnsignedInt;
7291 IntMaxType = SignedLongLong;
7292 IntPtrType = SignedInt;
7293 PtrDiffType = SignedInt;
7294 SigAtomicType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00007295 resetDataLayout("e-m:e-p:16:16-i32:16:32-a:16-n8:16");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00007296 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007297 void getTargetDefines(const LangOptions &Opts,
7298 MacroBuilder &Builder) const override {
7299 Builder.defineMacro("MSP430");
7300 Builder.defineMacro("__MSP430__");
7301 // FIXME: defines for different 'flavours' of MCU
7302 }
Craig Topper6c03a542015-10-19 04:51:35 +00007303 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00007304 // FIXME: Implement.
Craig Topper6c03a542015-10-19 04:51:35 +00007305 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00007306 }
7307 bool hasFeature(StringRef Feature) const override {
7308 return Feature == "msp430";
7309 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007310 ArrayRef<const char *> getGCCRegNames() const override;
7311 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00007312 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00007313 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00007314 }
7315 bool validateAsmConstraint(const char *&Name,
7316 TargetInfo::ConstraintInfo &info) const override {
7317 // FIXME: implement
7318 switch (*Name) {
7319 case 'K': // the constant 1
7320 case 'L': // constant -1^20 .. 1^19
7321 case 'M': // constant 1-4:
Eli Friedmana9c3d712009-08-19 20:47:07 +00007322 return true;
7323 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007324 // No target constraints for now.
7325 return false;
7326 }
7327 const char *getClobbers() const override {
7328 // FIXME: Is this really right?
7329 return "";
7330 }
7331 BuiltinVaListKind getBuiltinVaListKind() const override {
7332 // FIXME: implement
7333 return TargetInfo::CharPtrBuiltinVaList;
7334 }
7335};
7336
7337const char *const MSP430TargetInfo::GCCRegNames[] = {
7338 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
7339 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"};
7340
Craig Topperf054e3a2015-10-19 03:52:27 +00007341ArrayRef<const char *> MSP430TargetInfo::getGCCRegNames() const {
7342 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00007343}
7344
7345// LLVM and Clang cannot be used directly to output native binaries for
7346// target, but is used to compile C code to llvm bitcode with correct
7347// type and alignment information.
7348//
7349// TCE uses the llvm bitcode as input and uses it for generating customized
7350// target processor and program binary. TCE co-design environment is
7351// publicly available in http://tce.cs.tut.fi
7352
7353static const unsigned TCEOpenCLAddrSpaceMap[] = {
7354 3, // opencl_global
7355 4, // opencl_local
7356 5, // opencl_constant
7357 // FIXME: generic has to be added to the target
7358 0, // opencl_generic
7359 0, // cuda_device
7360 0, // cuda_constant
7361 0 // cuda_shared
7362};
7363
7364class TCETargetInfo : public TargetInfo {
7365public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007366 TCETargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7367 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007368 TLSSupported = false;
7369 IntWidth = 32;
7370 LongWidth = LongLongWidth = 32;
7371 PointerWidth = 32;
7372 IntAlign = 32;
7373 LongAlign = LongLongAlign = 32;
7374 PointerAlign = 32;
7375 SuitableAlign = 32;
7376 SizeType = UnsignedInt;
7377 IntMaxType = SignedLong;
7378 IntPtrType = SignedInt;
7379 PtrDiffType = SignedInt;
7380 FloatWidth = 32;
7381 FloatAlign = 32;
7382 DoubleWidth = 32;
7383 DoubleAlign = 32;
7384 LongDoubleWidth = 32;
7385 LongDoubleAlign = 32;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007386 FloatFormat = &llvm::APFloat::IEEEsingle();
7387 DoubleFormat = &llvm::APFloat::IEEEsingle();
7388 LongDoubleFormat = &llvm::APFloat::IEEEsingle();
Pekka Jaaskelainen67354482016-11-16 15:22:31 +00007389 resetDataLayout("E-p:32:32:32-i1:8:8-i8:8:32-"
7390 "i16:16:32-i32:32:32-i64:32:32-"
7391 "f32:32:32-f64:32:32-v64:32:32-"
7392 "v128:32:32-v256:32:32-v512:32:32-"
7393 "v1024:32:32-a0:0:32-n32");
Eric Christopherc48497a2015-09-18 21:26:24 +00007394 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
7395 UseAddrSpaceMapMangling = true;
7396 }
7397
7398 void getTargetDefines(const LangOptions &Opts,
7399 MacroBuilder &Builder) const override {
7400 DefineStd(Builder, "tce", Opts);
7401 Builder.defineMacro("__TCE__");
7402 Builder.defineMacro("__TCE_V1__");
7403 }
7404 bool hasFeature(StringRef Feature) const override { return Feature == "tce"; }
7405
Craig Topper6c03a542015-10-19 04:51:35 +00007406 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007407 const char *getClobbers() const override { return ""; }
7408 BuiltinVaListKind getBuiltinVaListKind() const override {
7409 return TargetInfo::VoidPtrBuiltinVaList;
7410 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007411 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007412 bool validateAsmConstraint(const char *&Name,
7413 TargetInfo::ConstraintInfo &info) const override {
7414 return true;
7415 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007416 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7417 return None;
7418 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007419};
Eli Friedmana9c3d712009-08-19 20:47:07 +00007420
Pekka Jaaskelainen67354482016-11-16 15:22:31 +00007421class TCELETargetInfo : public TCETargetInfo {
7422public:
7423 TCELETargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7424 : TCETargetInfo(Triple, Opts) {
7425 BigEndian = false;
7426
7427 resetDataLayout("e-p:32:32:32-i1:8:8-i8:8:32-"
7428 "i16:16:32-i32:32:32-i64:32:32-"
7429 "f32:32:32-f64:32:32-v64:32:32-"
7430 "v128:32:32-v256:32:32-v512:32:32-"
7431 "v1024:32:32-a0:0:32-n32");
7432
7433 }
7434
7435 virtual void getTargetDefines(const LangOptions &Opts,
7436 MacroBuilder &Builder) const {
7437 DefineStd(Builder, "tcele", Opts);
7438 Builder.defineMacro("__TCE__");
7439 Builder.defineMacro("__TCE_V1__");
7440 Builder.defineMacro("__TCELE__");
7441 Builder.defineMacro("__TCELE_V1__");
7442 }
7443
7444};
7445
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007446class BPFTargetInfo : public TargetInfo {
7447public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007448 BPFTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7449 : TargetInfo(Triple) {
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007450 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
7451 SizeType = UnsignedLong;
7452 PtrDiffType = SignedLong;
7453 IntPtrType = SignedLong;
7454 IntMaxType = SignedLong;
7455 Int64Type = SignedLong;
7456 RegParmMax = 5;
7457 if (Triple.getArch() == llvm::Triple::bpfeb) {
James Y Knightb214cbc2016-03-04 19:00:41 +00007458 resetDataLayout("E-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007459 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00007460 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007461 }
7462 MaxAtomicPromoteWidth = 64;
7463 MaxAtomicInlineWidth = 64;
7464 TLSSupported = false;
7465 }
7466 void getTargetDefines(const LangOptions &Opts,
7467 MacroBuilder &Builder) const override {
7468 DefineStd(Builder, "bpf", Opts);
7469 Builder.defineMacro("__BPF__");
7470 }
7471 bool hasFeature(StringRef Feature) const override {
7472 return Feature == "bpf";
7473 }
7474
Craig Topper6c03a542015-10-19 04:51:35 +00007475 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007476 const char *getClobbers() const override {
7477 return "";
7478 }
7479 BuiltinVaListKind getBuiltinVaListKind() const override {
7480 return TargetInfo::VoidPtrBuiltinVaList;
7481 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007482 ArrayRef<const char *> getGCCRegNames() const override {
7483 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007484 }
7485 bool validateAsmConstraint(const char *&Name,
7486 TargetInfo::ConstraintInfo &info) const override {
7487 return true;
7488 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007489 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7490 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007491 }
7492};
7493
Daniel Sanders4672af62016-05-27 11:51:02 +00007494class MipsTargetInfo : public TargetInfo {
7495 void setDataLayout() {
Daniel Sanders55e40692016-06-03 10:11:01 +00007496 StringRef Layout;
7497
7498 if (ABI == "o32")
7499 Layout = "m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
7500 else if (ABI == "n32")
Daniel Sanders6a738832016-07-19 10:49:03 +00007501 Layout = "m:e-p:32:32-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Daniel Sanders55e40692016-06-03 10:11:01 +00007502 else if (ABI == "n64")
Daniel Sanders6a738832016-07-19 10:49:03 +00007503 Layout = "m:e-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Daniel Sanders55e40692016-06-03 10:11:01 +00007504 else
7505 llvm_unreachable("Invalid ABI");
7506
7507 if (BigEndian)
7508 resetDataLayout(("E-" + Layout).str());
7509 else
7510 resetDataLayout(("e-" + Layout).str());
Daniel Sanders4672af62016-05-27 11:51:02 +00007511 }
7512
Akira Hatanaka9064e362013-10-29 18:30:33 +00007513
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00007514 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007515 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00007516 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00007517 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007518 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00007519 bool IsSingleFloat;
Simon Dardisdf827a72017-02-21 16:01:00 +00007520 bool IsNoABICalls;
7521 bool CanUseBSDABICalls;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007522 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00007523 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007524 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007525 enum DspRevEnum {
7526 NoDSP, DSP1, DSP2
7527 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00007528 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007529
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007530protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00007531 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007532 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007533
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007534public:
Daniel Sanders4672af62016-05-27 11:51:02 +00007535 MipsTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007536 : TargetInfo(Triple), IsMips16(false), IsMicromips(false),
Simon Dardisdf827a72017-02-21 16:01:00 +00007537 IsNan2008(false), IsSingleFloat(false), IsNoABICalls(false),
7538 CanUseBSDABICalls(false), FloatABI(HardFloat), DspRev(NoDSP),
7539 HasMSA(false), HasFP64(false) {
Zoran Jovanovic26a12162015-02-18 15:21:35 +00007540 TheCXXABI.set(TargetCXXABI::GenericMIPS);
Daniel Sanders4672af62016-05-27 11:51:02 +00007541
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007542 setABI((getTriple().getArch() == llvm::Triple::mips ||
7543 getTriple().getArch() == llvm::Triple::mipsel)
7544 ? "o32"
7545 : "n64");
7546
7547 CPU = ABI == "o32" ? "mips32r2" : "mips64r2";
Simon Dardisdf827a72017-02-21 16:01:00 +00007548
7549 CanUseBSDABICalls = Triple.getOS() == llvm::Triple::FreeBSD ||
7550 Triple.getOS() == llvm::Triple::OpenBSD;
Zoran Jovanovic26a12162015-02-18 15:21:35 +00007551 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007552
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007553 bool isNaN2008Default() const {
7554 return CPU == "mips32r6" || CPU == "mips64r6";
7555 }
7556
7557 bool isFP64Default() const {
7558 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
7559 }
7560
Petar Jovanovicd55ae6b2015-02-26 18:19:22 +00007561 bool isNan2008() const override {
7562 return IsNan2008;
7563 }
7564
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007565 bool processorSupportsGPR64() const {
7566 return llvm::StringSwitch<bool>(CPU)
7567 .Case("mips3", true)
7568 .Case("mips4", true)
7569 .Case("mips5", true)
7570 .Case("mips64", true)
7571 .Case("mips64r2", true)
7572 .Case("mips64r3", true)
7573 .Case("mips64r5", true)
7574 .Case("mips64r6", true)
7575 .Case("octeon", true)
7576 .Default(false);
7577 return false;
7578 }
7579
Alp Toker4925ba72014-06-07 23:30:42 +00007580 StringRef getABI() const override { return ABI; }
Daniel Sanders4672af62016-05-27 11:51:02 +00007581 bool setABI(const std::string &Name) override {
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007582 if (Name == "o32") {
7583 setO32ABITypes();
7584 ABI = Name;
7585 return true;
Daniel Sanders4672af62016-05-27 11:51:02 +00007586 }
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007587
7588 if (Name == "n32") {
7589 setN32ABITypes();
7590 ABI = Name;
7591 return true;
7592 }
7593 if (Name == "n64") {
7594 setN64ABITypes();
7595 ABI = Name;
7596 return true;
Daniel Sanders4672af62016-05-27 11:51:02 +00007597 }
7598 return false;
7599 }
7600
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007601 void setO32ABITypes() {
7602 Int64Type = SignedLongLong;
7603 IntMaxType = Int64Type;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007604 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007605 LongDoubleWidth = LongDoubleAlign = 64;
7606 LongWidth = LongAlign = 32;
7607 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
7608 PointerWidth = PointerAlign = 32;
7609 PtrDiffType = SignedInt;
7610 SizeType = UnsignedInt;
7611 SuitableAlign = 64;
7612 }
7613
7614 void setN32N64ABITypes() {
7615 LongDoubleWidth = LongDoubleAlign = 128;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007616 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007617 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
7618 LongDoubleWidth = LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007619 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007620 }
7621 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
7622 SuitableAlign = 128;
7623 }
7624
Daniel Sanders4672af62016-05-27 11:51:02 +00007625 void setN64ABITypes() {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007626 setN32N64ABITypes();
Brad Smith8e55bd52017-03-06 23:48:31 +00007627 if (getTriple().getOS() == llvm::Triple::OpenBSD) {
7628 Int64Type = SignedLongLong;
7629 } else {
7630 Int64Type = SignedLong;
7631 }
Daniel Sanders4672af62016-05-27 11:51:02 +00007632 IntMaxType = Int64Type;
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007633 LongWidth = LongAlign = 64;
7634 PointerWidth = PointerAlign = 64;
7635 PtrDiffType = SignedLong;
7636 SizeType = UnsignedLong;
Daniel Sanders4672af62016-05-27 11:51:02 +00007637 }
7638
7639 void setN32ABITypes() {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007640 setN32N64ABITypes();
Daniel Sanders4672af62016-05-27 11:51:02 +00007641 Int64Type = SignedLongLong;
7642 IntMaxType = Int64Type;
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007643 LongWidth = LongAlign = 32;
7644 PointerWidth = PointerAlign = 32;
7645 PtrDiffType = SignedInt;
7646 SizeType = UnsignedInt;
Daniel Sanders4672af62016-05-27 11:51:02 +00007647 }
7648
Craig Topper3164f332014-03-11 03:39:26 +00007649 bool setCPU(const std::string &Name) override {
Eric Christopher0b26a612010-03-02 02:41:08 +00007650 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007651 return llvm::StringSwitch<bool>(Name)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007652 .Case("mips1", true)
7653 .Case("mips2", true)
Simon Atanasyan26610c52014-07-04 12:36:56 +00007654 .Case("mips3", true)
7655 .Case("mips4", true)
7656 .Case("mips5", true)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007657 .Case("mips32", true)
7658 .Case("mips32r2", true)
7659 .Case("mips32r3", true)
7660 .Case("mips32r5", true)
7661 .Case("mips32r6", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007662 .Case("mips64", true)
7663 .Case("mips64r2", true)
Simon Atanasyan162feb52015-02-20 23:37:40 +00007664 .Case("mips64r3", true)
7665 .Case("mips64r5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007666 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00007667 .Case("octeon", true)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007668 .Case("p5600", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007669 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00007670 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00007671 const std::string& getCPU() const { return CPU; }
Eric Christopher8c47b422015-10-09 18:39:55 +00007672 bool
7673 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7674 StringRef CPU,
7675 const std::vector<std::string> &FeaturesVec) const override {
Bhushan D. Attardebacb988732016-03-04 06:56:29 +00007676 if (CPU.empty())
7677 CPU = getCPU();
Simon Atanasyan4e16a422014-07-04 12:37:04 +00007678 if (CPU == "octeon")
7679 Features["mips64r2"] = Features["cnmips"] = true;
7680 else
7681 Features[CPU] = true;
Eric Christopher007b0a02015-08-28 22:32:01 +00007682 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Eric Christopher0b26a612010-03-02 02:41:08 +00007683 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007684
Craig Topper3164f332014-03-11 03:39:26 +00007685 void getTargetDefines(const LangOptions &Opts,
7686 MacroBuilder &Builder) const override {
Daniel Sanders4672af62016-05-27 11:51:02 +00007687 if (BigEndian) {
7688 DefineStd(Builder, "MIPSEB", Opts);
7689 Builder.defineMacro("_MIPSEB");
7690 } else {
7691 DefineStd(Builder, "MIPSEL", Opts);
7692 Builder.defineMacro("_MIPSEL");
7693 }
7694
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007695 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00007696 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007697 if (Opts.GNUMode)
7698 Builder.defineMacro("mips");
7699
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007700 if (ABI == "o32") {
Daniel Sanders4672af62016-05-27 11:51:02 +00007701 Builder.defineMacro("__mips", "32");
7702 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
7703 } else {
7704 Builder.defineMacro("__mips", "64");
7705 Builder.defineMacro("__mips64");
7706 Builder.defineMacro("__mips64__");
7707 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
7708 }
7709
7710 const std::string ISARev = llvm::StringSwitch<std::string>(getCPU())
7711 .Cases("mips32", "mips64", "1")
7712 .Cases("mips32r2", "mips64r2", "2")
7713 .Cases("mips32r3", "mips64r3", "3")
7714 .Cases("mips32r5", "mips64r5", "5")
7715 .Cases("mips32r6", "mips64r6", "6")
7716 .Default("");
7717 if (!ISARev.empty())
7718 Builder.defineMacro("__mips_isa_rev", ISARev);
7719
7720 if (ABI == "o32") {
7721 Builder.defineMacro("__mips_o32");
7722 Builder.defineMacro("_ABIO32", "1");
7723 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
Daniel Sanders07c86542016-05-27 14:30:23 +00007724 } else if (ABI == "n32") {
Daniel Sanders4672af62016-05-27 11:51:02 +00007725 Builder.defineMacro("__mips_n32");
7726 Builder.defineMacro("_ABIN32", "2");
7727 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
7728 } else if (ABI == "n64") {
7729 Builder.defineMacro("__mips_n64");
7730 Builder.defineMacro("_ABI64", "3");
7731 Builder.defineMacro("_MIPS_SIM", "_ABI64");
7732 } else
7733 llvm_unreachable("Invalid ABI.");
7734
Simon Dardisdf827a72017-02-21 16:01:00 +00007735 if (!IsNoABICalls) {
7736 Builder.defineMacro("__mips_abicalls");
7737 if (CanUseBSDABICalls)
7738 Builder.defineMacro("__ABICALLS__");
7739 }
7740
Simon Atanasyan683535b2012-08-29 19:14:58 +00007741 Builder.defineMacro("__REGISTER_PREFIX__", "");
7742
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007743 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007744 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00007745 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007746 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007747 case SoftFloat:
7748 Builder.defineMacro("__mips_soft_float", Twine(1));
7749 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00007750 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00007751
Simon Atanasyan16071912013-04-14 14:07:30 +00007752 if (IsSingleFloat)
7753 Builder.defineMacro("__mips_single_float", Twine(1));
7754
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007755 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
7756 Builder.defineMacro("_MIPS_FPSET",
7757 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
7758
Simon Atanasyan72244b62012-07-05 16:06:06 +00007759 if (IsMips16)
7760 Builder.defineMacro("__mips16", Twine(1));
7761
Simon Atanasyan60777612013-04-14 14:07:51 +00007762 if (IsMicromips)
7763 Builder.defineMacro("__mips_micromips", Twine(1));
7764
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007765 if (IsNan2008)
7766 Builder.defineMacro("__mips_nan2008", Twine(1));
7767
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007768 switch (DspRev) {
7769 default:
7770 break;
7771 case DSP1:
7772 Builder.defineMacro("__mips_dsp_rev", Twine(1));
7773 Builder.defineMacro("__mips_dsp", Twine(1));
7774 break;
7775 case DSP2:
7776 Builder.defineMacro("__mips_dsp_rev", Twine(2));
7777 Builder.defineMacro("__mips_dspr2", Twine(1));
7778 Builder.defineMacro("__mips_dsp", Twine(1));
7779 break;
7780 }
7781
Jack Carter44ff1e52013-08-12 17:20:29 +00007782 if (HasMSA)
7783 Builder.defineMacro("__mips_msa", Twine(1));
7784
Simon Atanasyan26f19672012-04-05 19:28:31 +00007785 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
7786 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
7787 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00007788
7789 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
7790 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Daniel Sanders5176f7e2015-12-22 12:59:30 +00007791
7792 // These shouldn't be defined for MIPS-I but there's no need to check
7793 // for that since MIPS-I isn't supported.
7794 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
7795 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
7796 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007797
7798 // 32-bit MIPS processors don't have the necessary lld/scd instructions
7799 // found in 64-bit processors. In the case of O32 on a 64-bit processor,
7800 // the instructions exist but using them violates the ABI since they
7801 // require 64-bit GPRs and O32 only supports 32-bit GPRs.
7802 if (ABI == "n32" || ABI == "n64")
Daniel Sanders4672af62016-05-27 11:51:02 +00007803 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007804 }
7805
Craig Topper6c03a542015-10-19 04:51:35 +00007806 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7807 return llvm::makeArrayRef(BuiltinInfo,
7808 clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin);
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007809 }
Craig Topper3164f332014-03-11 03:39:26 +00007810 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00007811 return llvm::StringSwitch<bool>(Feature)
7812 .Case("mips", true)
7813 .Case("fp64", HasFP64)
7814 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00007815 }
Craig Topper3164f332014-03-11 03:39:26 +00007816 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00007817 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007818 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007819 ArrayRef<const char *> getGCCRegNames() const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00007820 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00007821 // CPU register names
7822 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007823 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
7824 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
7825 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00007826 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
7827 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007828 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
7829 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
7830 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
7831 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00007832 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007833 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Hrvoje Varga14c42ee2016-03-29 12:46:16 +00007834 "$fcc5","$fcc6","$fcc7","$ac1hi","$ac1lo","$ac2hi","$ac2lo",
7835 "$ac3hi","$ac3lo",
Daniel Sanders8b59af12013-11-12 12:56:01 +00007836 // MSA register names
7837 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
7838 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
7839 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
7840 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
7841 // MSA control register names
7842 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
7843 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007844 };
Craig Topperf054e3a2015-10-19 03:52:27 +00007845 return llvm::makeArrayRef(GCCRegNames);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007846 }
Craig Topper3164f332014-03-11 03:39:26 +00007847 bool validateAsmConstraint(const char *&Name,
7848 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007849 switch (*Name) {
7850 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00007851 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007852 case 'r': // CPU registers.
7853 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00007854 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007855 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00007856 case 'c': // $25 for indirect jumps
7857 case 'l': // lo register
7858 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007859 Info.setAllowsRegister();
7860 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00007861 case 'I': // Signed 16-bit constant
7862 case 'J': // Integer 0
7863 case 'K': // Unsigned 16-bit constant
7864 case 'L': // Signed 32-bit constant, lower 16-bit zeros (for lui)
7865 case 'M': // Constants not loadable via lui, addiu, or ori
7866 case 'N': // Constant -1 to -65535
7867 case 'O': // A signed 15-bit constant
7868 case 'P': // A constant between 1 go 65535
7869 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00007870 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00007871 Info.setAllowsMemory();
7872 return true;
Daniel Sanders48fa39e2015-03-30 13:47:23 +00007873 case 'Z':
7874 if (Name[1] == 'C') { // An address usable by ll, and sc.
7875 Info.setAllowsMemory();
7876 Name++; // Skip over 'Z'.
7877 return true;
7878 }
7879 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007880 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007881 }
7882
Daniel Sanders48fa39e2015-03-30 13:47:23 +00007883 std::string convertConstraint(const char *&Constraint) const override {
7884 std::string R;
7885 switch (*Constraint) {
7886 case 'Z': // Two-character constraint; add "^" hint for later parsing.
7887 if (Constraint[1] == 'C') {
7888 R = std::string("^") + std::string(Constraint, 2);
7889 Constraint++;
7890 return R;
7891 }
7892 break;
7893 }
7894 return TargetInfo::convertConstraint(Constraint);
7895 }
7896
Craig Topper3164f332014-03-11 03:39:26 +00007897 const char *getClobbers() const override {
Toma Tabacucfab40f2015-01-12 14:41:30 +00007898 // In GCC, $1 is not widely used in generated code (it's used only in a few
7899 // specific situations), so there is no real need for users to add it to
7900 // the clobbers list if they want to use it in their inline assembly code.
7901 //
7902 // In LLVM, $1 is treated as a normal GPR and is always allocatable during
7903 // code generation, so using it in inline assembly without adding it to the
7904 // clobbers list can cause conflicts between the inline assembly code and
7905 // the surrounding generated code.
7906 //
7907 // Another problem is that LLVM is allowed to choose $1 for inline assembly
7908 // operands, which will conflict with the ".set at" assembler option (which
7909 // we use only for inline assembly, in order to maintain compatibility with
7910 // GCC) and will also conflict with the user's usage of $1.
7911 //
7912 // The easiest way to avoid these conflicts and keep $1 as an allocatable
7913 // register for generated code is to automatically clobber $1 for all inline
7914 // assembly code.
7915 //
7916 // FIXME: We should automatically clobber $1 only for inline assembly code
7917 // which actually uses it. This would allow LLVM to use $1 for inline
7918 // assembly operands if the user's assembly code doesn't use it.
Toma Tabacu99411952014-12-17 12:02:58 +00007919 return "~{$1}";
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007920 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007921
Craig Topper3164f332014-03-11 03:39:26 +00007922 bool handleTargetFeatures(std::vector<std::string> &Features,
7923 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00007924 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00007925 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007926 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00007927 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007928 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007929 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007930 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007931
Eric Christopher610fe112015-08-26 08:21:55 +00007932 for (const auto &Feature : Features) {
7933 if (Feature == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00007934 IsSingleFloat = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007935 else if (Feature == "+soft-float")
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007936 FloatABI = SoftFloat;
Eric Christopher610fe112015-08-26 08:21:55 +00007937 else if (Feature == "+mips16")
Simon Atanasyan72244b62012-07-05 16:06:06 +00007938 IsMips16 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007939 else if (Feature == "+micromips")
Simon Atanasyan60777612013-04-14 14:07:51 +00007940 IsMicromips = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007941 else if (Feature == "+dsp")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007942 DspRev = std::max(DspRev, DSP1);
Eric Christopher610fe112015-08-26 08:21:55 +00007943 else if (Feature == "+dspr2")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007944 DspRev = std::max(DspRev, DSP2);
Eric Christopher610fe112015-08-26 08:21:55 +00007945 else if (Feature == "+msa")
Jack Carter44ff1e52013-08-12 17:20:29 +00007946 HasMSA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007947 else if (Feature == "+fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007948 HasFP64 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007949 else if (Feature == "-fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007950 HasFP64 = false;
Eric Christopher610fe112015-08-26 08:21:55 +00007951 else if (Feature == "+nan2008")
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007952 IsNan2008 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007953 else if (Feature == "-nan2008")
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007954 IsNan2008 = false;
Simon Dardisdf827a72017-02-21 16:01:00 +00007955 else if (Feature == "+noabicalls")
7956 IsNoABICalls = true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007957 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007958
James Y Knightb214cbc2016-03-04 19:00:41 +00007959 setDataLayout();
Akira Hatanaka9064e362013-10-29 18:30:33 +00007960
Rafael Espindolaeb265472013-08-21 21:59:03 +00007961 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007962 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00007963
Craig Topper3164f332014-03-11 03:39:26 +00007964 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00007965 if (RegNo == 0) return 4;
7966 if (RegNo == 1) return 5;
7967 return -1;
7968 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00007969
7970 bool isCLZForZeroUndef() const override { return false; }
Daniel Sanders4672af62016-05-27 11:51:02 +00007971
7972 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7973 static const TargetInfo::GCCRegAlias O32RegAliases[] = {
7974 {{"at"}, "$1"}, {{"v0"}, "$2"}, {{"v1"}, "$3"},
7975 {{"a0"}, "$4"}, {{"a1"}, "$5"}, {{"a2"}, "$6"},
7976 {{"a3"}, "$7"}, {{"t0"}, "$8"}, {{"t1"}, "$9"},
7977 {{"t2"}, "$10"}, {{"t3"}, "$11"}, {{"t4"}, "$12"},
7978 {{"t5"}, "$13"}, {{"t6"}, "$14"}, {{"t7"}, "$15"},
7979 {{"s0"}, "$16"}, {{"s1"}, "$17"}, {{"s2"}, "$18"},
7980 {{"s3"}, "$19"}, {{"s4"}, "$20"}, {{"s5"}, "$21"},
7981 {{"s6"}, "$22"}, {{"s7"}, "$23"}, {{"t8"}, "$24"},
7982 {{"t9"}, "$25"}, {{"k0"}, "$26"}, {{"k1"}, "$27"},
7983 {{"gp"}, "$28"}, {{"sp", "$sp"}, "$29"}, {{"fp", "$fp"}, "$30"},
7984 {{"ra"}, "$31"}};
7985 static const TargetInfo::GCCRegAlias NewABIRegAliases[] = {
7986 {{"at"}, "$1"}, {{"v0"}, "$2"}, {{"v1"}, "$3"},
7987 {{"a0"}, "$4"}, {{"a1"}, "$5"}, {{"a2"}, "$6"},
7988 {{"a3"}, "$7"}, {{"a4"}, "$8"}, {{"a5"}, "$9"},
7989 {{"a6"}, "$10"}, {{"a7"}, "$11"}, {{"t0"}, "$12"},
7990 {{"t1"}, "$13"}, {{"t2"}, "$14"}, {{"t3"}, "$15"},
7991 {{"s0"}, "$16"}, {{"s1"}, "$17"}, {{"s2"}, "$18"},
7992 {{"s3"}, "$19"}, {{"s4"}, "$20"}, {{"s5"}, "$21"},
7993 {{"s6"}, "$22"}, {{"s7"}, "$23"}, {{"t8"}, "$24"},
7994 {{"t9"}, "$25"}, {{"k0"}, "$26"}, {{"k1"}, "$27"},
7995 {{"gp"}, "$28"}, {{"sp", "$sp"}, "$29"}, {{"fp", "$fp"}, "$30"},
7996 {{"ra"}, "$31"}};
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007997 if (ABI == "o32")
Daniel Sanders4672af62016-05-27 11:51:02 +00007998 return llvm::makeArrayRef(O32RegAliases);
7999 return llvm::makeArrayRef(NewABIRegAliases);
8000 }
8001
8002 bool hasInt128Type() const override {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00008003 return ABI == "n32" || ABI == "n64";
Daniel Sanders4672af62016-05-27 11:51:02 +00008004 }
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00008005
8006 bool validateTarget(DiagnosticsEngine &Diags) const override {
8007 // FIXME: It's valid to use O32 on a 64-bit CPU but the backend can't handle
8008 // this yet. It's better to fail here than on the backend assertion.
8009 if (processorSupportsGPR64() && ABI == "o32") {
8010 Diags.Report(diag::err_target_unsupported_abi) << ABI << CPU;
8011 return false;
8012 }
8013
8014 // 64-bit ABI's require 64-bit CPU's.
8015 if (!processorSupportsGPR64() && (ABI == "n32" || ABI == "n64")) {
8016 Diags.Report(diag::err_target_unsupported_abi) << ABI << CPU;
8017 return false;
8018 }
8019
8020 // FIXME: It's valid to use O32 on a mips64/mips64el triple but the backend
8021 // can't handle this yet. It's better to fail here than on the
8022 // backend assertion.
8023 if ((getTriple().getArch() == llvm::Triple::mips64 ||
8024 getTriple().getArch() == llvm::Triple::mips64el) &&
8025 ABI == "o32") {
8026 Diags.Report(diag::err_target_unsupported_abi_for_triple)
8027 << ABI << getTriple().str();
8028 return false;
8029 }
8030
8031 // FIXME: It's valid to use N32/N64 on a mips/mipsel triple but the backend
8032 // can't handle this yet. It's better to fail here than on the
8033 // backend assertion.
8034 if ((getTriple().getArch() == llvm::Triple::mips ||
8035 getTriple().getArch() == llvm::Triple::mipsel) &&
8036 (ABI == "n32" || ABI == "n64")) {
8037 Diags.Report(diag::err_target_unsupported_abi_for_triple)
8038 << ABI << getTriple().str();
8039 return false;
8040 }
8041
8042 return true;
8043 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008044};
8045
Daniel Sanders4672af62016-05-27 11:51:02 +00008046const Builtin::Info MipsTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00008047#define BUILTIN(ID, TYPE, ATTRS) \
8048 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
8049#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
8050 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00008051#include "clang/Basic/BuiltinsMips.def"
8052};
8053
Ivan Krasindd7403e2011-08-24 20:22:22 +00008054class PNaClTargetInfo : public TargetInfo {
8055public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008056 PNaClTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8057 : TargetInfo(Triple) {
Ivan Krasindd7403e2011-08-24 20:22:22 +00008058 this->LongAlign = 32;
8059 this->LongWidth = 32;
8060 this->PointerAlign = 32;
8061 this->PointerWidth = 32;
8062 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00008063 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00008064 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00008065 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00008066 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00008067 this->SizeType = TargetInfo::UnsignedInt;
8068 this->PtrDiffType = TargetInfo::SignedInt;
8069 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00008070 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00008071 }
8072
Craig Toppere6f17d02014-03-11 04:07:52 +00008073 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00008074 Builder.defineMacro("__le32__");
8075 Builder.defineMacro("__pnacl__");
8076 }
Craig Topper3164f332014-03-11 03:39:26 +00008077 void getTargetDefines(const LangOptions &Opts,
8078 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00008079 getArchDefines(Opts, Builder);
8080 }
Craig Topper3164f332014-03-11 03:39:26 +00008081 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00008082 return Feature == "pnacl";
8083 }
Craig Topper6c03a542015-10-19 04:51:35 +00008084 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Craig Topper3164f332014-03-11 03:39:26 +00008085 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00008086 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00008087 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008088 ArrayRef<const char *> getGCCRegNames() const override;
8089 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00008090 bool validateAsmConstraint(const char *&Name,
8091 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00008092 return false;
8093 }
8094
Craig Topper3164f332014-03-11 03:39:26 +00008095 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00008096 return "";
8097 }
8098};
8099
Craig Topperf054e3a2015-10-19 03:52:27 +00008100ArrayRef<const char *> PNaClTargetInfo::getGCCRegNames() const {
8101 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00008102}
8103
Craig Topperf054e3a2015-10-19 03:52:27 +00008104ArrayRef<TargetInfo::GCCRegAlias> PNaClTargetInfo::getGCCRegAliases() const {
8105 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00008106}
Ivan Krasindd7403e2011-08-24 20:22:22 +00008107
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008108// We attempt to use PNaCl (le32) frontend and Mips32EL backend.
Daniel Sanders4672af62016-05-27 11:51:02 +00008109class NaClMips32TargetInfo : public MipsTargetInfo {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008110public:
Daniel Sanders4672af62016-05-27 11:51:02 +00008111 NaClMips32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8112 : MipsTargetInfo(Triple, Opts) {}
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008113
8114 BuiltinVaListKind getBuiltinVaListKind() const override {
8115 return TargetInfo::PNaClABIBuiltinVaList;
8116 }
8117};
8118
JF Bastien643817d2014-09-12 17:52:47 +00008119class Le64TargetInfo : public TargetInfo {
8120 static const Builtin::Info BuiltinInfo[];
8121
8122public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008123 Le64TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
8124 : TargetInfo(Triple) {
JF Bastien643817d2014-09-12 17:52:47 +00008125 NoAsmVariants = true;
8126 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
8127 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00008128 resetDataLayout("e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128");
JF Bastien643817d2014-09-12 17:52:47 +00008129 }
8130
8131 void getTargetDefines(const LangOptions &Opts,
8132 MacroBuilder &Builder) const override {
Saleem Abdulrasool56027092017-02-07 19:00:06 +00008133 DefineStd(Builder, "unix", Opts);
JF Bastien643817d2014-09-12 17:52:47 +00008134 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
8135 Builder.defineMacro("__ELF__");
8136 }
Craig Topper6c03a542015-10-19 04:51:35 +00008137 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
8138 return llvm::makeArrayRef(BuiltinInfo,
8139 clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin);
JF Bastien643817d2014-09-12 17:52:47 +00008140 }
8141 BuiltinVaListKind getBuiltinVaListKind() const override {
8142 return TargetInfo::PNaClABIBuiltinVaList;
8143 }
8144 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00008145 ArrayRef<const char *> getGCCRegNames() const override {
8146 return None;
JF Bastien643817d2014-09-12 17:52:47 +00008147 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008148 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8149 return None;
JF Bastien643817d2014-09-12 17:52:47 +00008150 }
8151 bool validateAsmConstraint(const char *&Name,
8152 TargetInfo::ConstraintInfo &Info) const override {
8153 return false;
8154 }
8155
8156 bool hasProtectedVisibility() const override { return false; }
JF Bastien643817d2014-09-12 17:52:47 +00008157};
Dan Gohmanc2853072015-09-03 22:51:53 +00008158
8159class WebAssemblyTargetInfo : public TargetInfo {
8160 static const Builtin::Info BuiltinInfo[];
8161
8162 enum SIMDEnum {
8163 NoSIMD,
8164 SIMD128,
8165 } SIMDLevel;
8166
8167public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008168 explicit WebAssemblyTargetInfo(const llvm::Triple &T, const TargetOptions &)
Dan Gohmanc2853072015-09-03 22:51:53 +00008169 : TargetInfo(T), SIMDLevel(NoSIMD) {
Dan Gohmanc2853072015-09-03 22:51:53 +00008170 NoAsmVariants = true;
8171 SuitableAlign = 128;
8172 LargeArrayMinWidth = 128;
8173 LargeArrayAlign = 128;
8174 SimdDefaultAlign = 128;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00008175 SigAtomicType = SignedLong;
Dan Gohman6db46402015-11-10 21:01:46 +00008176 LongDoubleWidth = LongDoubleAlign = 128;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00008177 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Derek Schuffacdc8e62016-09-01 22:38:37 +00008178 SizeType = UnsignedInt;
8179 PtrDiffType = SignedInt;
8180 IntPtrType = SignedInt;
Dan Gohmanc2853072015-09-03 22:51:53 +00008181 }
8182
8183protected:
8184 void getTargetDefines(const LangOptions &Opts,
8185 MacroBuilder &Builder) const override {
8186 defineCPUMacros(Builder, "wasm", /*Tuning=*/false);
8187 if (SIMDLevel >= SIMD128)
8188 Builder.defineMacro("__wasm_simd128__");
8189 }
8190
8191private:
Eric Christopher8c47b422015-10-09 18:39:55 +00008192 bool
8193 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
8194 StringRef CPU,
8195 const std::vector<std::string> &FeaturesVec) const override {
Dan Gohmanc2853072015-09-03 22:51:53 +00008196 if (CPU == "bleeding-edge")
8197 Features["simd128"] = true;
8198 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
8199 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00008200 bool hasFeature(StringRef Feature) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00008201 return llvm::StringSwitch<bool>(Feature)
8202 .Case("simd128", SIMDLevel >= SIMD128)
8203 .Default(false);
8204 }
8205 bool handleTargetFeatures(std::vector<std::string> &Features,
Hans Wennborg7eb54642015-09-10 17:07:54 +00008206 DiagnosticsEngine &Diags) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00008207 for (const auto &Feature : Features) {
8208 if (Feature == "+simd128") {
8209 SIMDLevel = std::max(SIMDLevel, SIMD128);
8210 continue;
8211 }
8212 if (Feature == "-simd128") {
8213 SIMDLevel = std::min(SIMDLevel, SIMDEnum(SIMD128 - 1));
8214 continue;
8215 }
8216
8217 Diags.Report(diag::err_opt_not_valid_with_opt) << Feature
8218 << "-target-feature";
8219 return false;
8220 }
8221 return true;
8222 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00008223 bool setCPU(const std::string &Name) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00008224 return llvm::StringSwitch<bool>(Name)
8225 .Case("mvp", true)
8226 .Case("bleeding-edge", true)
8227 .Case("generic", true)
8228 .Default(false);
8229 }
Craig Topper6c03a542015-10-19 04:51:35 +00008230 ArrayRef<Builtin::Info> getTargetBuiltins() const final {
8231 return llvm::makeArrayRef(BuiltinInfo,
8232 clang::WebAssembly::LastTSBuiltin - Builtin::FirstTSBuiltin);
Dan Gohmanc2853072015-09-03 22:51:53 +00008233 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00008234 BuiltinVaListKind getBuiltinVaListKind() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00008235 return VoidPtrBuiltinVaList;
8236 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008237 ArrayRef<const char *> getGCCRegNames() const final {
8238 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00008239 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008240 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const final {
8241 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00008242 }
8243 bool
8244 validateAsmConstraint(const char *&Name,
Hans Wennborg7eb54642015-09-10 17:07:54 +00008245 TargetInfo::ConstraintInfo &Info) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00008246 return false;
8247 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00008248 const char *getClobbers() const final { return ""; }
8249 bool isCLZForZeroUndef() const final { return false; }
8250 bool hasInt128Type() const final { return true; }
Dan Gohmanab0e31f2015-09-14 21:49:41 +00008251 IntType getIntTypeByWidth(unsigned BitWidth,
8252 bool IsSigned) const final {
8253 // WebAssembly prefers long long for explicitly 64-bit integers.
8254 return BitWidth == 64 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
8255 : TargetInfo::getIntTypeByWidth(BitWidth, IsSigned);
8256 }
8257 IntType getLeastIntTypeByWidth(unsigned BitWidth,
8258 bool IsSigned) const final {
8259 // WebAssembly uses long long for int_least64_t and int_fast64_t.
8260 return BitWidth == 64
8261 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
8262 : TargetInfo::getLeastIntTypeByWidth(BitWidth, IsSigned);
8263 }
Dan Gohmanc2853072015-09-03 22:51:53 +00008264};
8265
8266const Builtin::Info WebAssemblyTargetInfo::BuiltinInfo[] = {
8267#define BUILTIN(ID, TYPE, ATTRS) \
8268 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
8269#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
8270 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
8271#include "clang/Basic/BuiltinsWebAssembly.def"
8272};
8273
8274class WebAssembly32TargetInfo : public WebAssemblyTargetInfo {
8275public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008276 explicit WebAssembly32TargetInfo(const llvm::Triple &T,
8277 const TargetOptions &Opts)
8278 : WebAssemblyTargetInfo(T, Opts) {
Dan Gohmanf1c34e62015-09-14 21:56:37 +00008279 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
James Y Knightb214cbc2016-03-04 19:00:41 +00008280 resetDataLayout("e-m:e-p:32:32-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00008281 }
8282
8283protected:
8284 void getTargetDefines(const LangOptions &Opts,
8285 MacroBuilder &Builder) const override {
8286 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
8287 defineCPUMacros(Builder, "wasm32", /*Tuning=*/false);
8288 }
8289};
8290
8291class WebAssembly64TargetInfo : public WebAssemblyTargetInfo {
8292public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008293 explicit WebAssembly64TargetInfo(const llvm::Triple &T,
8294 const TargetOptions &Opts)
8295 : WebAssemblyTargetInfo(T, Opts) {
Dan Gohmanc2853072015-09-03 22:51:53 +00008296 LongAlign = LongWidth = 64;
8297 PointerAlign = PointerWidth = 64;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00008298 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Derek Schuffacdc8e62016-09-01 22:38:37 +00008299 SizeType = UnsignedLong;
8300 PtrDiffType = SignedLong;
8301 IntPtrType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00008302 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00008303 }
8304
8305protected:
8306 void getTargetDefines(const LangOptions &Opts,
8307 MacroBuilder &Builder) const override {
8308 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
8309 defineCPUMacros(Builder, "wasm64", /*Tuning=*/false);
8310 }
8311};
8312
JF Bastien643817d2014-09-12 17:52:47 +00008313const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
8314#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00008315 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
JF Bastien643817d2014-09-12 17:52:47 +00008316#include "clang/Basic/BuiltinsLe64.def"
8317};
8318
Eric Christopherc48497a2015-09-18 21:26:24 +00008319static const unsigned SPIRAddrSpaceMap[] = {
8320 1, // opencl_global
8321 3, // opencl_local
8322 2, // opencl_constant
8323 4, // opencl_generic
8324 0, // cuda_device
8325 0, // cuda_constant
8326 0 // cuda_shared
8327};
8328class SPIRTargetInfo : public TargetInfo {
8329public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008330 SPIRTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
8331 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00008332 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
8333 "SPIR target must use unknown OS");
8334 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
8335 "SPIR target must use unknown environment type");
Eric Christopherc48497a2015-09-18 21:26:24 +00008336 TLSSupported = false;
8337 LongWidth = LongAlign = 64;
8338 AddrSpaceMap = &SPIRAddrSpaceMap;
8339 UseAddrSpaceMapMangling = true;
8340 // Define available target features
8341 // These must be defined in sorted order!
8342 NoAsmVariants = true;
8343 }
8344 void getTargetDefines(const LangOptions &Opts,
8345 MacroBuilder &Builder) const override {
8346 DefineStd(Builder, "SPIR", Opts);
8347 }
8348 bool hasFeature(StringRef Feature) const override {
8349 return Feature == "spir";
8350 }
Craig Topper3164f332014-03-11 03:39:26 +00008351
Craig Topper6c03a542015-10-19 04:51:35 +00008352 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00008353 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00008354 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00008355 bool validateAsmConstraint(const char *&Name,
8356 TargetInfo::ConstraintInfo &info) const override {
8357 return true;
8358 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008359 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8360 return None;
8361 }
Eric Christopherc48497a2015-09-18 21:26:24 +00008362 BuiltinVaListKind getBuiltinVaListKind() const override {
8363 return TargetInfo::VoidPtrBuiltinVaList;
8364 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00008365
Eric Christopherc48497a2015-09-18 21:26:24 +00008366 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Nikolay Haustov8c6538b2016-06-30 09:06:33 +00008367 return (CC == CC_SpirFunction || CC == CC_OpenCLKernel) ? CCCR_OK
8368 : CCCR_Warning;
Eric Christopherc48497a2015-09-18 21:26:24 +00008369 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00008370
Eric Christopherc48497a2015-09-18 21:26:24 +00008371 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
8372 return CC_SpirFunction;
8373 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00008374
8375 void setSupportedOpenCLOpts() override {
8376 // Assume all OpenCL extensions and optional core features are supported
8377 // for SPIR since it is a generic target.
Yaxun Liu5b746652016-12-18 05:18:55 +00008378 getSupportedOpenCLOpts().supportAll();
Yaxun Liu39cf40f2016-05-16 17:06:34 +00008379 }
Eric Christopherc48497a2015-09-18 21:26:24 +00008380};
Guy Benyeib798fc92012-12-11 21:38:14 +00008381
Eric Christopherc48497a2015-09-18 21:26:24 +00008382class SPIR32TargetInfo : public SPIRTargetInfo {
8383public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008384 SPIR32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8385 : SPIRTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00008386 PointerWidth = PointerAlign = 32;
8387 SizeType = TargetInfo::UnsignedInt;
8388 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +00008389 resetDataLayout("e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
8390 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00008391 }
8392 void getTargetDefines(const LangOptions &Opts,
8393 MacroBuilder &Builder) const override {
8394 DefineStd(Builder, "SPIR32", Opts);
8395 }
8396};
Guy Benyeib798fc92012-12-11 21:38:14 +00008397
Eric Christopherc48497a2015-09-18 21:26:24 +00008398class SPIR64TargetInfo : public SPIRTargetInfo {
8399public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008400 SPIR64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8401 : SPIRTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00008402 PointerWidth = PointerAlign = 64;
8403 SizeType = TargetInfo::UnsignedLong;
8404 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00008405 resetDataLayout("e-i64:64-v16:16-v24:32-v32:32-v48:64-"
8406 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00008407 }
8408 void getTargetDefines(const LangOptions &Opts,
8409 MacroBuilder &Builder) const override {
8410 DefineStd(Builder, "SPIR64", Opts);
8411 }
8412};
Guy Benyeib798fc92012-12-11 21:38:14 +00008413
Robert Lytton0e076492013-08-13 09:43:10 +00008414class XCoreTargetInfo : public TargetInfo {
8415 static const Builtin::Info BuiltinInfo[];
8416public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008417 XCoreTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
8418 : TargetInfo(Triple) {
Robert Lytton0e076492013-08-13 09:43:10 +00008419 NoAsmVariants = true;
8420 LongLongAlign = 32;
8421 SuitableAlign = 32;
8422 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00008423 SizeType = UnsignedInt;
8424 PtrDiffType = SignedInt;
8425 IntPtrType = SignedInt;
8426 WCharType = UnsignedChar;
8427 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00008428 UseZeroLengthBitfieldAlignment = true;
James Y Knightb214cbc2016-03-04 19:00:41 +00008429 resetDataLayout("e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32"
8430 "-f64:32-a:0:32-n32");
Robert Lytton0e076492013-08-13 09:43:10 +00008431 }
Craig Topper3164f332014-03-11 03:39:26 +00008432 void getTargetDefines(const LangOptions &Opts,
8433 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008434 Builder.defineMacro("__XS1B__");
8435 }
Craig Topper6c03a542015-10-19 04:51:35 +00008436 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
8437 return llvm::makeArrayRef(BuiltinInfo,
8438 clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin);
Robert Lytton0e076492013-08-13 09:43:10 +00008439 }
Craig Topper3164f332014-03-11 03:39:26 +00008440 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008441 return TargetInfo::VoidPtrBuiltinVaList;
8442 }
Craig Topper3164f332014-03-11 03:39:26 +00008443 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008444 return "";
8445 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008446 ArrayRef<const char *> getGCCRegNames() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008447 static const char * const GCCRegNames[] = {
8448 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
8449 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
8450 };
Craig Topperf054e3a2015-10-19 03:52:27 +00008451 return llvm::makeArrayRef(GCCRegNames);
Robert Lytton0e076492013-08-13 09:43:10 +00008452 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008453 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8454 return None;
Robert Lytton0e076492013-08-13 09:43:10 +00008455 }
Craig Topper3164f332014-03-11 03:39:26 +00008456 bool validateAsmConstraint(const char *&Name,
8457 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008458 return false;
8459 }
Craig Topper3164f332014-03-11 03:39:26 +00008460 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00008461 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
8462 return (RegNo < 2)? RegNo : -1;
8463 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00008464 bool allowsLargerPreferedTypeAlignment() const override {
8465 return false;
8466 }
Robert Lytton0e076492013-08-13 09:43:10 +00008467};
8468
8469const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00008470#define BUILTIN(ID, TYPE, ATTRS) \
8471 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
8472#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
8473 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Robert Lytton0e076492013-08-13 09:43:10 +00008474#include "clang/Basic/BuiltinsXCore.def"
8475};
Robert Lytton0e076492013-08-13 09:43:10 +00008476
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008477// x86_32 Android target
8478class AndroidX86_32TargetInfo : public LinuxTargetInfo<X86_32TargetInfo> {
8479public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008480 AndroidX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8481 : LinuxTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008482 SuitableAlign = 32;
8483 LongDoubleWidth = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00008484 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008485 }
8486};
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008487
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008488// x86_64 Android target
8489class AndroidX86_64TargetInfo : public LinuxTargetInfo<X86_64TargetInfo> {
8490public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008491 AndroidX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8492 : LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Stephan Bergmann17c7f702016-12-14 11:57:17 +00008493 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008494 }
Chih-Hung Hsieh0b0eeaa2015-07-24 18:12:54 +00008495
8496 bool useFloat128ManglingForLongDouble() const override {
8497 return true;
8498 }
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008499};
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008500
8501// 32-bit RenderScript is armv7 with width and align of 'long' set to 8-bytes
8502class RenderScript32TargetInfo : public ARMleTargetInfo {
8503public:
8504 RenderScript32TargetInfo(const llvm::Triple &Triple,
8505 const TargetOptions &Opts)
8506 : ARMleTargetInfo(llvm::Triple("armv7", Triple.getVendorName(),
8507 Triple.getOSName(),
8508 Triple.getEnvironmentName()),
8509 Opts) {
Pirama Arumuga Nainarbb846a32016-07-27 19:01:51 +00008510 IsRenderScriptTarget = true;
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008511 LongWidth = LongAlign = 64;
8512 }
8513 void getTargetDefines(const LangOptions &Opts,
8514 MacroBuilder &Builder) const override {
8515 Builder.defineMacro("__RENDERSCRIPT__");
8516 ARMleTargetInfo::getTargetDefines(Opts, Builder);
8517 }
8518};
8519
8520// 64-bit RenderScript is aarch64
8521class RenderScript64TargetInfo : public AArch64leTargetInfo {
8522public:
8523 RenderScript64TargetInfo(const llvm::Triple &Triple,
8524 const TargetOptions &Opts)
8525 : AArch64leTargetInfo(llvm::Triple("aarch64", Triple.getVendorName(),
8526 Triple.getOSName(),
8527 Triple.getEnvironmentName()),
Pirama Arumuga Nainarbb846a32016-07-27 19:01:51 +00008528 Opts) {
8529 IsRenderScriptTarget = true;
8530 }
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008531
8532 void getTargetDefines(const LangOptions &Opts,
8533 MacroBuilder &Builder) const override {
8534 Builder.defineMacro("__RENDERSCRIPT__");
8535 AArch64leTargetInfo::getTargetDefines(Opts, Builder);
8536 }
8537};
8538
Dylan McKayecb6e7b2017-02-07 06:04:18 +00008539/// Information about a specific microcontroller.
8540struct MCUInfo {
8541 const char *Name;
8542 const char *DefineName;
8543};
8544
8545// This list should be kept up-to-date with AVRDevices.td in LLVM.
8546static ArrayRef<MCUInfo> AVRMcus = {
8547 { "at90s1200", "__AVR_AT90S1200__" },
Dylan McKay315edb02017-02-11 21:06:07 +00008548 { "attiny11", "__AVR_ATtiny11__" },
8549 { "attiny12", "__AVR_ATtiny12__" },
8550 { "attiny15", "__AVR_ATtiny15__" },
8551 { "attiny28", "__AVR_ATtiny28__" },
8552 { "at90s2313", "__AVR_AT90S2313__" },
8553 { "at90s2323", "__AVR_AT90S2323__" },
8554 { "at90s2333", "__AVR_AT90S2333__" },
8555 { "at90s2343", "__AVR_AT90S2343__" },
8556 { "attiny22", "__AVR_ATtiny22__" },
8557 { "attiny26", "__AVR_ATtiny26__" },
8558 { "at86rf401", "__AVR_AT86RF401__" },
8559 { "at90s4414", "__AVR_AT90S4414__" },
8560 { "at90s4433", "__AVR_AT90S4433__" },
8561 { "at90s4434", "__AVR_AT90S4434__" },
8562 { "at90s8515", "__AVR_AT90S8515__" },
8563 { "at90c8534", "__AVR_AT90c8534__" },
8564 { "at90s8535", "__AVR_AT90S8535__" },
8565 { "ata5272", "__AVR_ATA5272__" },
8566 { "attiny13", "__AVR_ATtiny13__" },
8567 { "attiny13a", "__AVR_ATtiny13A__" },
8568 { "attiny2313", "__AVR_ATtiny2313__" },
8569 { "attiny2313a", "__AVR_ATtiny2313A__" },
8570 { "attiny24", "__AVR_ATtiny24__" },
8571 { "attiny24a", "__AVR_ATtiny24A__" },
8572 { "attiny4313", "__AVR_ATtiny4313__" },
8573 { "attiny44", "__AVR_ATtiny44__" },
8574 { "attiny44a", "__AVR_ATtiny44A__" },
8575 { "attiny84", "__AVR_ATtiny84__" },
8576 { "attiny84a", "__AVR_ATtiny84A__" },
8577 { "attiny25", "__AVR_ATtiny25__" },
8578 { "attiny45", "__AVR_ATtiny45__" },
8579 { "attiny85", "__AVR_ATtiny85__" },
8580 { "attiny261", "__AVR_ATtiny261__" },
8581 { "attiny261a", "__AVR_ATtiny261A__" },
8582 { "attiny461", "__AVR_ATtiny461__" },
8583 { "attiny461a", "__AVR_ATtiny461A__" },
8584 { "attiny861", "__AVR_ATtiny861__" },
8585 { "attiny861a", "__AVR_ATtiny861A__" },
8586 { "attiny87", "__AVR_ATtiny87__" },
8587 { "attiny43u", "__AVR_ATtiny43U__" },
8588 { "attiny48", "__AVR_ATtiny48__" },
8589 { "attiny88", "__AVR_ATtiny88__" },
8590 { "attiny828", "__AVR_ATtiny828__" },
8591 { "at43usb355", "__AVR_AT43USB355__" },
8592 { "at76c711", "__AVR_AT76C711__" },
8593 { "atmega103", "__AVR_ATmega103__" },
8594 { "at43usb320", "__AVR_AT43USB320__" },
8595 { "attiny167", "__AVR_ATtiny167__" },
8596 { "at90usb82", "__AVR_AT90USB82__" },
8597 { "at90usb162", "__AVR_AT90USB162__" },
8598 { "ata5505", "__AVR_ATA5505__" },
8599 { "atmega8u2", "__AVR_ATmega8U2__" },
8600 { "atmega16u2", "__AVR_ATmega16U2__" },
8601 { "atmega32u2", "__AVR_ATmega32U2__" },
8602 { "attiny1634", "__AVR_ATtiny1634__" },
8603 { "atmega8", "__AVR_ATmega8__" },
8604 { "ata6289", "__AVR_ATA6289__" },
8605 { "atmega8a", "__AVR_ATmega8A__" },
8606 { "ata6285", "__AVR_ATA6285__" },
8607 { "ata6286", "__AVR_ATA6286__" },
8608 { "atmega48", "__AVR_ATmega48__" },
8609 { "atmega48a", "__AVR_ATmega48A__" },
8610 { "atmega48pa", "__AVR_ATmega48PA__" },
8611 { "atmega48p", "__AVR_ATmega48P__" },
8612 { "atmega88", "__AVR_ATmega88__" },
8613 { "atmega88a", "__AVR_ATmega88A__" },
8614 { "atmega88p", "__AVR_ATmega88P__" },
8615 { "atmega88pa", "__AVR_ATmega88PA__" },
8616 { "atmega8515", "__AVR_ATmega8515__" },
8617 { "atmega8535", "__AVR_ATmega8535__" },
8618 { "atmega8hva", "__AVR_ATmega8HVA__" },
8619 { "at90pwm1", "__AVR_AT90PWM1__" },
8620 { "at90pwm2", "__AVR_AT90PWM2__" },
8621 { "at90pwm2b", "__AVR_AT90PWM2B__" },
8622 { "at90pwm3", "__AVR_AT90PWM3__" },
8623 { "at90pwm3b", "__AVR_AT90PWM3B__" },
8624 { "at90pwm81", "__AVR_AT90PWM81__" },
8625 { "ata5790", "__AVR_ATA5790__" },
8626 { "ata5795", "__AVR_ATA5795__" },
8627 { "atmega16", "__AVR_ATmega16__" },
8628 { "atmega16a", "__AVR_ATmega16A__" },
8629 { "atmega161", "__AVR_ATmega161__" },
8630 { "atmega162", "__AVR_ATmega162__" },
8631 { "atmega163", "__AVR_ATmega163__" },
8632 { "atmega164a", "__AVR_ATmega164A__" },
8633 { "atmega164p", "__AVR_ATmega164P__" },
8634 { "atmega164pa", "__AVR_ATmega164PA__" },
8635 { "atmega165", "__AVR_ATmega165__" },
8636 { "atmega165a", "__AVR_ATmega165A__" },
8637 { "atmega165p", "__AVR_ATmega165P__" },
8638 { "atmega165pa", "__AVR_ATmega165PA__" },
8639 { "atmega168", "__AVR_ATmega168__" },
8640 { "atmega168a", "__AVR_ATmega168A__" },
8641 { "atmega168p", "__AVR_ATmega168P__" },
8642 { "atmega168pa", "__AVR_ATmega168PA__" },
8643 { "atmega169", "__AVR_ATmega169__" },
8644 { "atmega169a", "__AVR_ATmega169A__" },
8645 { "atmega169p", "__AVR_ATmega169P__" },
8646 { "atmega169pa", "__AVR_ATmega169PA__" },
8647 { "atmega32", "__AVR_ATmega32__" },
8648 { "atmega32a", "__AVR_ATmega32A__" },
8649 { "atmega323", "__AVR_ATmega323__" },
8650 { "atmega324a", "__AVR_ATmega324A__" },
8651 { "atmega324p", "__AVR_ATmega324P__" },
8652 { "atmega324pa", "__AVR_ATmega324PA__" },
8653 { "atmega325", "__AVR_ATmega325__" },
8654 { "atmega325a", "__AVR_ATmega325A__" },
8655 { "atmega325p", "__AVR_ATmega325P__" },
8656 { "atmega325pa", "__AVR_ATmega325PA__" },
8657 { "atmega3250", "__AVR_ATmega3250__" },
8658 { "atmega3250a", "__AVR_ATmega3250A__" },
8659 { "atmega3250p", "__AVR_ATmega3250P__" },
8660 { "atmega3250pa", "__AVR_ATmega3250PA__" },
8661 { "atmega328", "__AVR_ATmega328__" },
8662 { "atmega328p", "__AVR_ATmega328P__" },
8663 { "atmega329", "__AVR_ATmega329__" },
8664 { "atmega329a", "__AVR_ATmega329A__" },
8665 { "atmega329p", "__AVR_ATmega329P__" },
8666 { "atmega329pa", "__AVR_ATmega329PA__" },
8667 { "atmega3290", "__AVR_ATmega3290__" },
8668 { "atmega3290a", "__AVR_ATmega3290A__" },
8669 { "atmega3290p", "__AVR_ATmega3290P__" },
8670 { "atmega3290pa", "__AVR_ATmega3290PA__" },
8671 { "atmega406", "__AVR_ATmega406__" },
8672 { "atmega64", "__AVR_ATmega64__" },
8673 { "atmega64a", "__AVR_ATmega64A__" },
8674 { "atmega640", "__AVR_ATmega640__" },
8675 { "atmega644", "__AVR_ATmega644__" },
8676 { "atmega644a", "__AVR_ATmega644A__" },
8677 { "atmega644p", "__AVR_ATmega644P__" },
8678 { "atmega644pa", "__AVR_ATmega644PA__" },
8679 { "atmega645", "__AVR_ATmega645__" },
8680 { "atmega645a", "__AVR_ATmega645A__" },
8681 { "atmega645p", "__AVR_ATmega645P__" },
8682 { "atmega649", "__AVR_ATmega649__" },
8683 { "atmega649a", "__AVR_ATmega649A__" },
8684 { "atmega649p", "__AVR_ATmega649P__" },
8685 { "atmega6450", "__AVR_ATmega6450__" },
8686 { "atmega6450a", "__AVR_ATmega6450A__" },
8687 { "atmega6450p", "__AVR_ATmega6450P__" },
8688 { "atmega6490", "__AVR_ATmega6490__" },
8689 { "atmega6490a", "__AVR_ATmega6490A__" },
8690 { "atmega6490p", "__AVR_ATmega6490P__" },
8691 { "atmega64rfr2", "__AVR_ATmega64RFR2__" },
8692 { "atmega644rfr2", "__AVR_ATmega644RFR2__" },
8693 { "atmega16hva", "__AVR_ATmega16HVA__" },
8694 { "atmega16hva2", "__AVR_ATmega16HVA2__" },
8695 { "atmega16hvb", "__AVR_ATmega16HVB__" },
8696 { "atmega16hvbrevb", "__AVR_ATmega16HVBREVB__" },
8697 { "atmega32hvb", "__AVR_ATmega32HVB__" },
8698 { "atmega32hvbrevb", "__AVR_ATmega32HVBREVB__" },
8699 { "atmega64hve", "__AVR_ATmega64HVE__" },
8700 { "at90can32", "__AVR_AT90CAN32__" },
8701 { "at90can64", "__AVR_AT90CAN64__" },
8702 { "at90pwm161", "__AVR_AT90PWM161__" },
8703 { "at90pwm216", "__AVR_AT90PWM216__" },
8704 { "at90pwm316", "__AVR_AT90PWM316__" },
8705 { "atmega32c1", "__AVR_ATmega32C1__" },
8706 { "atmega64c1", "__AVR_ATmega64C1__" },
8707 { "atmega16m1", "__AVR_ATmega16M1__" },
8708 { "atmega32m1", "__AVR_ATmega32M1__" },
8709 { "atmega64m1", "__AVR_ATmega64M1__" },
8710 { "atmega16u4", "__AVR_ATmega16U4__" },
8711 { "atmega32u4", "__AVR_ATmega32U4__" },
8712 { "atmega32u6", "__AVR_ATmega32U6__" },
8713 { "at90usb646", "__AVR_AT90USB646__" },
8714 { "at90usb647", "__AVR_AT90USB647__" },
8715 { "at90scr100", "__AVR_AT90SCR100__" },
8716 { "at94k", "__AVR_AT94K__" },
8717 { "m3000", "__AVR_AT000__" },
8718 { "atmega128", "__AVR_ATmega128__" },
8719 { "atmega128a", "__AVR_ATmega128A__" },
8720 { "atmega1280", "__AVR_ATmega1280__" },
8721 { "atmega1281", "__AVR_ATmega1281__" },
8722 { "atmega1284", "__AVR_ATmega1284__" },
8723 { "atmega1284p", "__AVR_ATmega1284P__" },
8724 { "atmega128rfa1", "__AVR_ATmega128RFA1__" },
8725 { "atmega128rfr2", "__AVR_ATmega128RFR2__" },
8726 { "atmega1284rfr2", "__AVR_ATmega1284RFR2__" },
8727 { "at90can128", "__AVR_AT90CAN128__" },
8728 { "at90usb1286", "__AVR_AT90USB1286__" },
8729 { "at90usb1287", "__AVR_AT90USB1287__" },
8730 { "atmega2560", "__AVR_ATmega2560__" },
8731 { "atmega2561", "__AVR_ATmega2561__" },
8732 { "atmega256rfr2", "__AVR_ATmega256RFR2__" },
8733 { "atmega2564rfr2", "__AVR_ATmega2564RFR2__" },
8734 { "atxmega16a4", "__AVR_ATxmega16A4__" },
8735 { "atxmega16a4u", "__AVR_ATxmega16a4U__" },
8736 { "atxmega16c4", "__AVR_ATxmega16C4__" },
8737 { "atxmega16d4", "__AVR_ATxmega16D4__" },
8738 { "atxmega32a4", "__AVR_ATxmega32A4__" },
8739 { "atxmega32a4u", "__AVR_ATxmega32A4U__" },
8740 { "atxmega32c4", "__AVR_ATxmega32C4__" },
8741 { "atxmega32d4", "__AVR_ATxmega32D4__" },
8742 { "atxmega32e5", "__AVR_ATxmega32E5__" },
8743 { "atxmega16e5", "__AVR_ATxmega16E5__" },
8744 { "atxmega8e5", "__AVR_ATxmega8E5__" },
8745 { "atxmega32x1", "__AVR_ATxmega32X1__" },
8746 { "atxmega64a3", "__AVR_ATxmega64A3__" },
8747 { "atxmega64a3u", "__AVR_ATxmega64A3U__" },
8748 { "atxmega64a4u", "__AVR_ATxmega64A4U__" },
8749 { "atxmega64b1", "__AVR_ATxmega64B1__" },
8750 { "atxmega64b3", "__AVR_ATxmega64B3__" },
8751 { "atxmega64c3", "__AVR_ATxmega64C3__" },
8752 { "atxmega64d3", "__AVR_ATxmega64D3__" },
8753 { "atxmega64d4", "__AVR_ATxmega64D4__" },
8754 { "atxmega64a1", "__AVR_ATxmega64A1__" },
8755 { "atxmega64a1u", "__AVR_ATxmega64A1U__" },
8756 { "atxmega128a3", "__AVR_ATxmega128A3__" },
8757 { "atxmega128a3u", "__AVR_ATxmega128A3U__" },
8758 { "atxmega128b1", "__AVR_ATxmega128B1__" },
8759 { "atxmega128b3", "__AVR_ATxmega128B3__" },
8760 { "atxmega128c3", "__AVR_ATxmega128C3__" },
8761 { "atxmega128d3", "__AVR_ATxmega128D3__" },
8762 { "atxmega128d4", "__AVR_ATxmega128D4__" },
8763 { "atxmega192a3", "__AVR_ATxmega192A3__" },
8764 { "atxmega192a3u", "__AVR_ATxmega192A3U__" },
8765 { "atxmega192c3", "__AVR_ATxmega192C3__" },
8766 { "atxmega192d3", "__AVR_ATxmega192D3__" },
8767 { "atxmega256a3", "__AVR_ATxmega256A3__" },
8768 { "atxmega256a3u", "__AVR_ATxmega256A3U__" },
8769 { "atxmega256a3b", "__AVR_ATxmega256A3B__" },
8770 { "atxmega256a3bu", "__AVR_ATxmega256A3BU__" },
8771 { "atxmega256c3", "__AVR_ATxmega256C3__" },
8772 { "atxmega256d3", "__AVR_ATxmega256D3__" },
8773 { "atxmega384c3", "__AVR_ATxmega384C3__" },
8774 { "atxmega384d3", "__AVR_ATxmega384D3__" },
8775 { "atxmega128a1", "__AVR_ATxmega128A1__" },
8776 { "atxmega128a1u", "__AVR_ATxmega128A1U__" },
8777 { "atxmega128a4u", "__AVR_ATxmega128a4U__" },
8778 { "attiny4", "__AVR_ATtiny4__" },
8779 { "attiny5", "__AVR_ATtiny5__" },
8780 { "attiny9", "__AVR_ATtiny9__" },
8781 { "attiny10", "__AVR_ATtiny10__" },
8782 { "attiny20", "__AVR_ATtiny20__" },
8783 { "attiny40", "__AVR_ATtiny40__" },
8784 { "attiny102", "__AVR_ATtiny102__" },
8785 { "attiny104", "__AVR_ATtiny104__" },
Dylan McKayecb6e7b2017-02-07 06:04:18 +00008786};
Dylan McKay924fa3a2017-01-05 05:20:27 +00008787
8788// AVR Target
8789class AVRTargetInfo : public TargetInfo {
8790public:
8791 AVRTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
8792 : TargetInfo(Triple) {
8793 TLSSupported = false;
8794 PointerWidth = 16;
8795 PointerAlign = 8;
8796 IntWidth = 16;
8797 IntAlign = 8;
8798 LongWidth = 32;
8799 LongAlign = 8;
8800 LongLongWidth = 64;
8801 LongLongAlign = 8;
8802 SuitableAlign = 8;
8803 DefaultAlignForAttributeAligned = 8;
8804 HalfWidth = 16;
8805 HalfAlign = 8;
8806 FloatWidth = 32;
8807 FloatAlign = 8;
8808 DoubleWidth = 32;
8809 DoubleAlign = 8;
8810 DoubleFormat = &llvm::APFloat::IEEEsingle();
8811 LongDoubleWidth = 32;
8812 LongDoubleAlign = 8;
8813 LongDoubleFormat = &llvm::APFloat::IEEEsingle();
8814 SizeType = UnsignedInt;
8815 PtrDiffType = SignedInt;
8816 IntPtrType = SignedInt;
8817 Char16Type = UnsignedInt;
8818 WCharType = SignedInt;
8819 WIntType = SignedInt;
8820 Char32Type = UnsignedLong;
8821 SigAtomicType = SignedChar;
8822 resetDataLayout("e-p:16:16:16-i8:8:8-i16:16:16-i32:32:32-i64:64:64"
8823 "-f32:32:32-f64:64:64-n8");
8824 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008825
Dylan McKay924fa3a2017-01-05 05:20:27 +00008826 void getTargetDefines(const LangOptions &Opts,
8827 MacroBuilder &Builder) const override {
Dylan McKayecb6e7b2017-02-07 06:04:18 +00008828 Builder.defineMacro("AVR");
8829 Builder.defineMacro("__AVR");
Dylan McKay924fa3a2017-01-05 05:20:27 +00008830 Builder.defineMacro("__AVR__");
Dylan McKayecb6e7b2017-02-07 06:04:18 +00008831
8832 if (!this->CPU.empty()) {
8833 auto It = std::find_if(AVRMcus.begin(), AVRMcus.end(),
8834 [&](const MCUInfo &Info) { return Info.Name == this->CPU; });
8835
8836 if (It != AVRMcus.end())
8837 Builder.defineMacro(It->DefineName);
8838 }
Dylan McKay924fa3a2017-01-05 05:20:27 +00008839 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008840
Dylan McKay924fa3a2017-01-05 05:20:27 +00008841 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
8842 return None;
8843 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008844
Dylan McKay924fa3a2017-01-05 05:20:27 +00008845 BuiltinVaListKind getBuiltinVaListKind() const override {
8846 return TargetInfo::VoidPtrBuiltinVaList;
8847 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008848
Dylan McKay924fa3a2017-01-05 05:20:27 +00008849 const char *getClobbers() const override {
8850 return "";
8851 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008852
Dylan McKay924fa3a2017-01-05 05:20:27 +00008853 ArrayRef<const char *> getGCCRegNames() const override {
8854 static const char * const GCCRegNames[] = {
8855 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
8856 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
8857 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
Dylan McKay95aa2652017-01-05 07:17:46 +00008858 "r24", "r25", "X", "Y", "Z", "SP"
Dylan McKay924fa3a2017-01-05 05:20:27 +00008859 };
8860 return llvm::makeArrayRef(GCCRegNames);
8861 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008862
Dylan McKay924fa3a2017-01-05 05:20:27 +00008863 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8864 return None;
8865 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008866
Dylan McKay924fa3a2017-01-05 05:20:27 +00008867 ArrayRef<TargetInfo::AddlRegName> getGCCAddlRegNames() const override {
8868 static const TargetInfo::AddlRegName AddlRegNames[] = {
8869 { { "r26", "r27"}, 26 },
8870 { { "r28", "r29"}, 27 },
8871 { { "r30", "r31"}, 28 },
8872 { { "SPL", "SPH"}, 29 },
8873 };
8874 return llvm::makeArrayRef(AddlRegNames);
8875 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008876
Dylan McKay924fa3a2017-01-05 05:20:27 +00008877 bool validateAsmConstraint(const char *&Name,
8878 TargetInfo::ConstraintInfo &Info) const override {
Dylan McKayd31534c2017-02-06 09:01:59 +00008879 // There aren't any multi-character AVR specific constraints.
8880 if (StringRef(Name).size() > 1) return false;
8881
8882 switch (*Name) {
8883 default: return false;
8884 case 'a': // Simple upper registers
8885 case 'b': // Base pointer registers pairs
8886 case 'd': // Upper register
8887 case 'l': // Lower registers
8888 case 'e': // Pointer register pairs
8889 case 'q': // Stack pointer register
8890 case 'r': // Any register
8891 case 'w': // Special upper register pairs
8892 case 't': // Temporary register
8893 case 'x': case 'X': // Pointer register pair X
8894 case 'y': case 'Y': // Pointer register pair Y
8895 case 'z': case 'Z': // Pointer register pair Z
8896 Info.setAllowsRegister();
8897 return true;
8898 case 'I': // 6-bit positive integer constant
8899 Info.setRequiresImmediate(0, 63);
8900 return true;
8901 case 'J': // 6-bit negative integer constant
8902 Info.setRequiresImmediate(-63, 0);
8903 return true;
8904 case 'K': // Integer constant (Range: 2)
8905 Info.setRequiresImmediate(2);
8906 return true;
8907 case 'L': // Integer constant (Range: 0)
8908 Info.setRequiresImmediate(0);
8909 return true;
8910 case 'M': // 8-bit integer constant
8911 Info.setRequiresImmediate(0, 0xff);
8912 return true;
8913 case 'N': // Integer constant (Range: -1)
8914 Info.setRequiresImmediate(-1);
8915 return true;
8916 case 'O': // Integer constant (Range: 8, 16, 24)
8917 Info.setRequiresImmediate({8, 16, 24});
8918 return true;
8919 case 'P': // Integer constant (Range: 1)
8920 Info.setRequiresImmediate(1);
8921 return true;
8922 case 'R': // Integer constant (Range: -6 to 5)
8923 Info.setRequiresImmediate(-6, 5);
8924 return true;
8925 case 'G': // Floating point constant
8926 case 'Q': // A memory address based on Y or Z pointer with displacement.
8927 return true;
8928 }
8929
Dylan McKay924fa3a2017-01-05 05:20:27 +00008930 return false;
8931 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008932
Dylan McKay924fa3a2017-01-05 05:20:27 +00008933 IntType getIntTypeByWidth(unsigned BitWidth,
8934 bool IsSigned) const final {
8935 // AVR prefers int for 16-bit integers.
8936 return BitWidth == 16 ? (IsSigned ? SignedInt : UnsignedInt)
8937 : TargetInfo::getIntTypeByWidth(BitWidth, IsSigned);
8938 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008939
Dylan McKay924fa3a2017-01-05 05:20:27 +00008940 IntType getLeastIntTypeByWidth(unsigned BitWidth,
8941 bool IsSigned) const final {
8942 // AVR uses int for int_least16_t and int_fast16_t.
8943 return BitWidth == 16
8944 ? (IsSigned ? SignedInt : UnsignedInt)
8945 : TargetInfo::getLeastIntTypeByWidth(BitWidth, IsSigned);
8946 }
Dylan McKayecb6e7b2017-02-07 06:04:18 +00008947
8948 bool setCPU(const std::string &Name) override {
8949 bool IsFamily = llvm::StringSwitch<bool>(Name)
8950 .Case("avr1", true)
8951 .Case("avr2", true)
8952 .Case("avr25", true)
8953 .Case("avr3", true)
8954 .Case("avr31", true)
8955 .Case("avr35", true)
8956 .Case("avr4", true)
8957 .Case("avr5", true)
8958 .Case("avr51", true)
8959 .Case("avr6", true)
8960 .Case("avrxmega1", true)
8961 .Case("avrxmega2", true)
8962 .Case("avrxmega3", true)
8963 .Case("avrxmega4", true)
8964 .Case("avrxmega5", true)
8965 .Case("avrxmega6", true)
8966 .Case("avrxmega7", true)
8967 .Case("avrtiny", true)
8968 .Default(false);
8969
8970 if (IsFamily) this->CPU = Name;
8971
8972 bool IsMCU = std::find_if(AVRMcus.begin(), AVRMcus.end(),
8973 [&](const MCUInfo &Info) { return Info.Name == Name; }) != AVRMcus.end();
8974
8975 if (IsMCU) this->CPU = Name;
8976
8977 return IsFamily || IsMCU;
8978 }
8979
8980protected:
8981 std::string CPU;
Dylan McKay924fa3a2017-01-05 05:20:27 +00008982};
8983
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008984} // end anonymous namespace
8985
Chris Lattner5ba61f02006-10-14 07:39:34 +00008986//===----------------------------------------------------------------------===//
8987// Driver code
8988//===----------------------------------------------------------------------===//
8989
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008990static TargetInfo *AllocateTarget(const llvm::Triple &Triple,
8991 const TargetOptions &Opts) {
Daniel Dunbar52322032009-08-18 05:47:58 +00008992 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00008993
Daniel Dunbar52322032009-08-18 05:47:58 +00008994 switch (Triple.getArch()) {
8995 default:
Craig Topperf1186c52014-05-08 06:41:40 +00008996 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00008997
Tim Northover2a0783d2014-05-30 14:14:07 +00008998 case llvm::Triple::xcore:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008999 return new XCoreTargetInfo(Triple, Opts);
Tim Northover2a0783d2014-05-30 14:14:07 +00009000
9001 case llvm::Triple::hexagon:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009002 return new HexagonTargetInfo(Triple, Opts);
Tim Northover2a0783d2014-05-30 14:14:07 +00009003
Jacques Pienaard964cc22016-03-28 21:02:54 +00009004 case llvm::Triple::lanai:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009005 return new LanaiTargetInfo(Triple, Opts);
Jacques Pienaard964cc22016-03-28 21:02:54 +00009006
Tim Northover2a0783d2014-05-30 14:14:07 +00009007 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00009008 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009009 return new DarwinAArch64TargetInfo(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00009010
9011 switch (os) {
Ed Schoutenea9448e2015-10-15 15:07:07 +00009012 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009013 return new CloudABITargetInfo<AArch64leTargetInfo>(Triple, Opts);
Ed Maste6a9eda52014-11-13 16:55:42 +00009014 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009015 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Petr Hosek9834fcd2016-10-24 22:55:57 +00009016 case llvm::Triple::Fuchsia:
9017 return new FuchsiaTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00009018 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009019 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple, Opts);
James Molloy5e73df52014-04-16 15:06:20 +00009020 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009021 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Brad Smith9aa2bf22017-02-21 23:13:09 +00009022 case llvm::Triple::OpenBSD:
9023 return new OpenBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00009024 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009025 return new AArch64leTargetInfo(Triple, Opts);
James Molloy5e73df52014-04-16 15:06:20 +00009026 }
9027
Christian Pirker9b019ae2014-02-25 13:51:00 +00009028 case llvm::Triple::aarch64_be:
9029 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00009030 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009031 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Petr Hosek9834fcd2016-10-24 22:55:57 +00009032 case llvm::Triple::Fuchsia:
9033 return new FuchsiaTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00009034 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009035 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00009036 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009037 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00009038 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009039 return new AArch64beTargetInfo(Triple, Opts);
Tim Northover9bb857a2013-01-31 12:13:10 +00009040 }
9041
Daniel Dunbar52322032009-08-18 05:47:58 +00009042 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00009043 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00009044 if (Triple.isOSBinFormatMachO())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009045 return new DarwinARMTargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00009046
Daniel Dunbar52322032009-08-18 05:47:58 +00009047 switch (os) {
Ed Schoutenc6d1a732016-09-05 18:38:34 +00009048 case llvm::Triple::CloudABI:
9049 return new CloudABITargetInfo<ARMleTargetInfo>(Triple, Opts);
Rafael Espindolaad8fed52010-06-10 00:46:51 +00009050 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009051 return new LinuxTargetInfo<ARMleTargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009052 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009053 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009054 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009055 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00009056 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009057 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00009058 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009059 return new BitrigTargetInfo<ARMleTargetInfo>(Triple, Opts);
Douglas Gregor9fabd852011-07-01 22:41:14 +00009060 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009061 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00009062 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009063 return new NaClTargetInfo<ARMleTargetInfo>(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00009064 case llvm::Triple::Win32:
9065 switch (Triple.getEnvironment()) {
Yaron Keren321249c2015-07-15 13:32:23 +00009066 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009067 return new CygwinARMTargetInfo(Triple, Opts);
Yaron Keren321249c2015-07-15 13:32:23 +00009068 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009069 return new MinGWARMTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00009070 case llvm::Triple::Itanium:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009071 return new ItaniumWindowsARMleTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00009072 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00009073 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009074 return new MicrosoftARMleTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00009075 }
Daniel Dunbar52322032009-08-18 05:47:58 +00009076 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009077 return new ARMleTargetInfo(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009078 }
9079
9080 case llvm::Triple::armeb:
9081 case llvm::Triple::thumbeb:
9082 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009083 return new DarwinARMTargetInfo(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009084
9085 switch (os) {
9086 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009087 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009088 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009089 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009090 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009091 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009092 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009093 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009094 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009095 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009096 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009097 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009098 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009099 return new NaClTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009100 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009101 return new ARMbeTargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009102 }
Eli Friedmanb5366062008-05-20 14:21:01 +00009103
Dylan McKay924fa3a2017-01-05 05:20:27 +00009104 case llvm::Triple::avr:
9105 return new AVRTargetInfo(Triple, Opts);
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00009106 case llvm::Triple::bpfeb:
9107 case llvm::Triple::bpfel:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009108 return new BPFTargetInfo(Triple, Opts);
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00009109
Daniel Dunbar52322032009-08-18 05:47:58 +00009110 case llvm::Triple::msp430:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009111 return new MSP430TargetInfo(Triple, Opts);
Eli Friedmanb5366062008-05-20 14:21:01 +00009112
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00009113 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009114 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009115 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00009116 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009117 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00009118 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009119 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009120 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009121 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009122 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009123 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00009124 return new MipsTargetInfo(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009125 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00009126
9127 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009128 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009129 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00009130 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009131 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00009132 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009133 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009134 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009135 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009136 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00009137 case llvm::Triple::NaCl:
Daniel Sanders4672af62016-05-27 11:51:02 +00009138 return new NaClTargetInfo<NaClMips32TargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009139 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00009140 return new MipsTargetInfo(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009141 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00009142
Akira Hatanakabef17452011-09-20 19:21:49 +00009143 case llvm::Triple::mips64:
9144 switch (os) {
9145 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00009146 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009147 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00009148 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009149 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009150 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009151 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009152 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00009153 case llvm::Triple::OpenBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009154 return new OpenBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009155 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00009156 return new MipsTargetInfo(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009157 }
9158
9159 case llvm::Triple::mips64el:
9160 switch (os) {
9161 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00009162 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009163 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00009164 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009165 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009166 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009167 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009168 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00009169 case llvm::Triple::OpenBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009170 return new OpenBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009171 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00009172 return new MipsTargetInfo(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009173 }
9174
Ivan Krasindd7403e2011-08-24 20:22:22 +00009175 case llvm::Triple::le32:
9176 switch (os) {
Douglas Katzman78d7c542015-05-12 21:18:10 +00009177 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009178 return new NaClTargetInfo<PNaClTargetInfo>(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00009179 default:
9180 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00009181 }
9182
JF Bastien643817d2014-09-12 17:52:47 +00009183 case llvm::Triple::le64:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009184 return new Le64TargetInfo(Triple, Opts);
JF Bastien643817d2014-09-12 17:52:47 +00009185
Daniel Dunbar52322032009-08-18 05:47:58 +00009186 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00009187 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009188 return new DarwinPPC32TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009189 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00009190 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009191 return new LinuxTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009192 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009193 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009194 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009195 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00009196 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009197 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009198 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009199 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009200 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009201 return new PPC32TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009202 }
Daniel Dunbar52322032009-08-18 05:47:58 +00009203
9204 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00009205 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009206 return new DarwinPPC64TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009207 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00009208 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009209 return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009210 case llvm::Triple::Lv2:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009211 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009212 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009213 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009214 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009215 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009216 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009217 return new PPC64TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009218 }
Daniel Dunbar52322032009-08-18 05:47:58 +00009219
Bill Schmidt778d3872013-07-26 01:36:11 +00009220 case llvm::Triple::ppc64le:
9221 switch (os) {
9222 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009223 return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger22a2d992015-04-10 20:53:48 +00009224 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009225 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Bill Schmidt778d3872013-07-26 01:36:11 +00009226 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009227 return new PPC64TargetInfo(Triple, Opts);
Bill Schmidt778d3872013-07-26 01:36:11 +00009228 }
9229
Peter Collingbournec947aae2012-05-20 23:28:41 +00009230 case llvm::Triple::nvptx:
Justin Lebarb6626592017-01-05 16:53:21 +00009231 return new NVPTXTargetInfo(Triple, Opts, /*TargetPointerWidth=*/32);
Peter Collingbournec947aae2012-05-20 23:28:41 +00009232 case llvm::Triple::nvptx64:
Justin Lebarb6626592017-01-05 16:53:21 +00009233 return new NVPTXTargetInfo(Triple, Opts, /*TargetPointerWidth=*/64);
Peter Collingbournec947aae2012-05-20 23:28:41 +00009234
Tom Stellardd8e38a32015-01-06 20:34:47 +00009235 case llvm::Triple::amdgcn:
Eli Friedmand13b41e2012-10-12 23:32:00 +00009236 case llvm::Triple::r600:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009237 return new AMDGPUTargetInfo(Triple, Opts);
Eli Friedmand13b41e2012-10-12 23:32:00 +00009238
Daniel Dunbar52322032009-08-18 05:47:58 +00009239 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009240 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00009241 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009242 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009243 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009244 return new SolarisTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009245 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009246 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00009247 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009248 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009249 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009250 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009251 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009252 return new SparcV8TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009253 }
Daniel Dunbar52322032009-08-18 05:47:58 +00009254
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009255 // The 'sparcel' architecture copies all the above cases except for Solaris.
9256 case llvm::Triple::sparcel:
9257 switch (os) {
9258 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009259 return new LinuxTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009260 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009261 return new NetBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009262 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009263 return new OpenBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009264 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009265 return new RTEMSTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009266 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009267 return new SparcV8elTargetInfo(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009268 }
9269
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009270 case llvm::Triple::sparcv9:
9271 switch (os) {
9272 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009273 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009274 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009275 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009276 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009277 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009278 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009279 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009280 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009281 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009282 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009283 return new SparcV9TargetInfo(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009284 }
9285
Ulrich Weigand47445072013-05-06 16:26:41 +00009286 case llvm::Triple::systemz:
9287 switch (os) {
9288 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009289 return new LinuxTargetInfo<SystemZTargetInfo>(Triple, Opts);
Ulrich Weigand47445072013-05-06 16:26:41 +00009290 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009291 return new SystemZTargetInfo(Triple, Opts);
Ulrich Weigand47445072013-05-06 16:26:41 +00009292 }
9293
Eli Friedmana9c3d712009-08-19 20:47:07 +00009294 case llvm::Triple::tce:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009295 return new TCETargetInfo(Triple, Opts);
Eli Friedmana9c3d712009-08-19 20:47:07 +00009296
Pekka Jaaskelainen67354482016-11-16 15:22:31 +00009297 case llvm::Triple::tcele:
9298 return new TCELETargetInfo(Triple, Opts);
9299
Daniel Dunbar52322032009-08-18 05:47:58 +00009300 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00009301 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009302 return new DarwinI386TargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00009303
Daniel Dunbar52322032009-08-18 05:47:58 +00009304 switch (os) {
Ed Schouten7893e682015-06-13 21:33:49 +00009305 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009306 return new CloudABITargetInfo<X86_32TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009307 case llvm::Triple::Linux: {
9308 switch (Triple.getEnvironment()) {
9309 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009310 return new LinuxTargetInfo<X86_32TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009311 case llvm::Triple::Android:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009312 return new AndroidX86_32TargetInfo(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009313 }
9314 }
Daniel Dunbar52322032009-08-18 05:47:58 +00009315 case llvm::Triple::DragonFly:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009316 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009317 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009318 return new NetBSDI386TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009319 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009320 return new OpenBSDI386TargetInfo(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00009321 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009322 return new BitrigI386TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009323 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009324 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00009325 case llvm::Triple::KFreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009326 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009327 case llvm::Triple::Minix:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009328 return new MinixTargetInfo<X86_32TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009329 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009330 return new SolarisTargetInfo<X86_32TargetInfo>(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009331 case llvm::Triple::Win32: {
9332 switch (Triple.getEnvironment()) {
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009333 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009334 return new CygwinX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009335 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009336 return new MinGWX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00009337 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009338 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00009339 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009340 return new MicrosoftX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009341 }
9342 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00009343 case llvm::Triple::Haiku:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009344 return new HaikuX86_32TargetInfo(Triple, Opts);
Douglas Gregor9fabd852011-07-01 22:41:14 +00009345 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009346 return new RTEMSX86_32TargetInfo(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00009347 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009348 return new NaClTargetInfo<X86_32TargetInfo>(Triple, Opts);
Alexey Bataevc99b0492015-11-25 09:24:26 +00009349 case llvm::Triple::ELFIAMCU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009350 return new MCUX86_32TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009351 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009352 return new X86_32TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009353 }
9354
9355 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009356 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009357 return new DarwinX86_64TargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00009358
Daniel Dunbar52322032009-08-18 05:47:58 +00009359 switch (os) {
Ed Schoutenf33c6072015-03-11 08:42:46 +00009360 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009361 return new CloudABITargetInfo<X86_64TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009362 case llvm::Triple::Linux: {
9363 switch (Triple.getEnvironment()) {
9364 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009365 return new LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009366 case llvm::Triple::Android:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009367 return new AndroidX86_64TargetInfo(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009368 }
9369 }
Chris Lattner002ba6b2010-01-09 05:41:14 +00009370 case llvm::Triple::DragonFly:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009371 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009372 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009373 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009374 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009375 return new OpenBSDX86_64TargetInfo(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00009376 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009377 return new BitrigX86_64TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009378 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009379 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Petr Hosek9834fcd2016-10-24 22:55:57 +00009380 case llvm::Triple::Fuchsia:
9381 return new FuchsiaTargetInfo<X86_64TargetInfo>(Triple, Opts);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00009382 case llvm::Triple::KFreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009383 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009384 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009385 return new SolarisTargetInfo<X86_64TargetInfo>(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009386 case llvm::Triple::Win32: {
9387 switch (Triple.getEnvironment()) {
Yaron Kerend030d112015-07-22 17:38:19 +00009388 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009389 return new CygwinX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009390 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009391 return new MinGWX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009392 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00009393 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009394 return new MicrosoftX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009395 }
9396 }
Reid Kleckner330fb172016-05-11 16:19:05 +00009397 case llvm::Triple::Haiku:
9398 return new HaikuTargetInfo<X86_64TargetInfo>(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00009399 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009400 return new NaClTargetInfo<X86_64TargetInfo>(Triple, Opts);
Alex Rosenberg12207fa2015-01-27 14:47:44 +00009401 case llvm::Triple::PS4:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009402 return new PS4OSTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009403 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009404 return new X86_64TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009405 }
Guy Benyeib798fc92012-12-11 21:38:14 +00009406
Douglas Katzman78d7c542015-05-12 21:18:10 +00009407 case llvm::Triple::spir: {
9408 if (Triple.getOS() != llvm::Triple::UnknownOS ||
9409 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
9410 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009411 return new SPIR32TargetInfo(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00009412 }
9413 case llvm::Triple::spir64: {
9414 if (Triple.getOS() != llvm::Triple::UnknownOS ||
9415 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
9416 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009417 return new SPIR64TargetInfo(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00009418 }
Dan Gohmanc2853072015-09-03 22:51:53 +00009419 case llvm::Triple::wasm32:
Dan Gohman839f2152017-01-17 21:46:38 +00009420 if (Triple.getSubArch() != llvm::Triple::NoSubArch ||
9421 Triple.getVendor() != llvm::Triple::UnknownVendor ||
9422 Triple.getOS() != llvm::Triple::UnknownOS ||
9423 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment ||
9424 !(Triple.isOSBinFormatELF() || Triple.isOSBinFormatWasm()))
Dan Gohmanc2853072015-09-03 22:51:53 +00009425 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009426 return new WebAssemblyOSTargetInfo<WebAssembly32TargetInfo>(Triple, Opts);
Dan Gohmanc2853072015-09-03 22:51:53 +00009427 case llvm::Triple::wasm64:
Dan Gohman839f2152017-01-17 21:46:38 +00009428 if (Triple.getSubArch() != llvm::Triple::NoSubArch ||
9429 Triple.getVendor() != llvm::Triple::UnknownVendor ||
9430 Triple.getOS() != llvm::Triple::UnknownOS ||
9431 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment ||
9432 !(Triple.isOSBinFormatELF() || Triple.isOSBinFormatWasm()))
Dan Gohmanc2853072015-09-03 22:51:53 +00009433 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009434 return new WebAssemblyOSTargetInfo<WebAssembly64TargetInfo>(Triple, Opts);
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00009435
9436 case llvm::Triple::renderscript32:
9437 return new LinuxTargetInfo<RenderScript32TargetInfo>(Triple, Opts);
9438 case llvm::Triple::renderscript64:
9439 return new LinuxTargetInfo<RenderScript64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009440 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00009441}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009442
9443/// CreateTargetInfo - Return the target info object for the specified target
Eric Christophere4f73b32015-08-07 19:07:08 +00009444/// options.
Alp Toker80758082014-07-06 05:26:44 +00009445TargetInfo *
9446TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
Saleem Abdulrasool10a49722016-04-08 16:52:00 +00009447 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00009448 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009449
9450 // Construct the target
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009451 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple, *Opts));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009452 if (!Target) {
9453 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00009454 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009455 }
Alp Toker80758082014-07-06 05:26:44 +00009456 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009457
Daniel Dunbaracde99e2009-12-18 18:42:37 +00009458 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00009459 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
9460 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00009461 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00009462 }
9463
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009464 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00009465 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
9466 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00009467 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009468 }
9469
Rafael Espindolaeb265472013-08-21 21:59:03 +00009470 // Set the fp math unit.
9471 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
9472 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00009473 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00009474 }
9475
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009476 // Compute the default target features, we need the target to handle this
9477 // because features may have dependencies on one another.
9478 llvm::StringMap<bool> Features;
Eric Christopher007b0a02015-08-28 22:32:01 +00009479 if (!Target->initFeatureMap(Features, Diags, Opts->CPU,
9480 Opts->FeaturesAsWritten))
Eric Christopher6b454372015-08-25 13:45:24 +00009481 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009482
9483 // Add the features to the compile options.
Douglas Gregorf8715de2012-11-16 04:24:59 +00009484 Opts->Features.clear();
Aaron Ballmanb226d3d2015-08-12 13:38:59 +00009485 for (const auto &F : Features)
9486 Opts->Features.push_back((F.getValue() ? "+" : "-") + F.getKey().str());
9487
Eric Christopher3ff21b32013-10-16 21:26:26 +00009488 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00009489 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009490
Yaxun Liu39cf40f2016-05-16 17:06:34 +00009491 Target->setSupportedOpenCLOpts();
Alexey Bader0ea07532016-11-01 15:50:52 +00009492 Target->setOpenCLExtensionOpts();
Yaxun Liu39cf40f2016-05-16 17:06:34 +00009493
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00009494 if (!Target->validateTarget(Diags))
9495 return nullptr;
9496
Ahmed Charles9a16beb2014-03-07 19:33:25 +00009497 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009498}