blob: 472a57b197e70682c0687e1ba9f3018af0eb4d17 [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
Bill Schmidt38378a02013-02-01 20:23:10 +0000936 // Note: GCC recognizes the following additional cpus:
937 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
938 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
939 // titan, rs64.
Craig Topper3164f332014-03-11 03:39:26 +0000940 bool setCPU(const std::string &Name) override {
Hal Finkel8eb59282012-06-11 22:35:19 +0000941 bool CPUKnown = llvm::StringSwitch<bool>(Name)
942 .Case("generic", true)
943 .Case("440", true)
944 .Case("450", true)
945 .Case("601", true)
946 .Case("602", true)
947 .Case("603", true)
948 .Case("603e", true)
949 .Case("603ev", true)
950 .Case("604", true)
951 .Case("604e", true)
952 .Case("620", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000953 .Case("630", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000954 .Case("g3", true)
955 .Case("7400", true)
956 .Case("g4", true)
957 .Case("7450", true)
958 .Case("g4+", true)
959 .Case("750", true)
960 .Case("970", true)
961 .Case("g5", true)
962 .Case("a2", true)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +0000963 .Case("a2q", true)
Hal Finkelf6d6cb02012-09-18 22:25:03 +0000964 .Case("e500mc", true)
965 .Case("e5500", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000966 .Case("power3", true)
967 .Case("pwr3", true)
968 .Case("power4", true)
969 .Case("pwr4", true)
970 .Case("power5", true)
971 .Case("pwr5", true)
972 .Case("power5x", true)
973 .Case("pwr5x", true)
974 .Case("power6", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000975 .Case("pwr6", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000976 .Case("power6x", true)
977 .Case("pwr6x", true)
978 .Case("power7", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000979 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +0000980 .Case("power8", true)
981 .Case("pwr8", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +0000982 .Case("power9", true)
983 .Case("pwr9", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000984 .Case("powerpc", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000985 .Case("ppc", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000986 .Case("powerpc64", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000987 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +0000988 .Case("powerpc64le", true)
989 .Case("ppc64le", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000990 .Default(false);
991
992 if (CPUKnown)
993 CPU = Name;
994
995 return CPUKnown;
996 }
997
Ulrich Weigand8afad612014-07-28 13:17:52 +0000998
999 StringRef getABI() const override { return ABI; }
1000
Craig Topper6c03a542015-10-19 04:51:35 +00001001 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
1002 return llvm::makeArrayRef(BuiltinInfo,
1003 clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner10a5b382007-01-29 05:24:35 +00001004 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001005
Craig Topper3164f332014-03-11 03:39:26 +00001006 bool isCLZForZeroUndef() const override { return false; }
Bob Wilson19a2f2b2012-01-28 18:02:29 +00001007
Craig Topper3164f332014-03-11 03:39:26 +00001008 void getTargetDefines(const LangOptions &Opts,
1009 MacroBuilder &Builder) const override;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001010
Eric Christopher8c47b422015-10-09 18:39:55 +00001011 bool
1012 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
1013 StringRef CPU,
1014 const std::vector<std::string> &FeaturesVec) const override;
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001015
Craig Topper3164f332014-03-11 03:39:26 +00001016 bool handleTargetFeatures(std::vector<std::string> &Features,
1017 DiagnosticsEngine &Diags) override;
1018 bool hasFeature(StringRef Feature) const override;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001019 void setFeatureEnabled(llvm::StringMap<bool> &Features, StringRef Name,
1020 bool Enabled) const override;
Craig Topper3164f332014-03-11 03:39:26 +00001021
Craig Topperf054e3a2015-10-19 03:52:27 +00001022 ArrayRef<const char *> getGCCRegNames() const override;
1023 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00001024 bool validateAsmConstraint(const char *&Name,
1025 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00001026 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +00001027 default: return false;
1028 case 'O': // Zero
John Thompson07a61a42010-06-24 22:44:13 +00001029 break;
Anders Carlssonf511f642007-11-27 04:11:28 +00001030 case 'b': // Base register
1031 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +00001032 Info.setAllowsRegister();
John Thompson07a61a42010-06-24 22:44:13 +00001033 break;
1034 // FIXME: The following are added to allow parsing.
1035 // I just took a guess at what the actions should be.
1036 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001037 case 'd': // Floating point register (containing 64-bit value)
John Thompson07a61a42010-06-24 22:44:13 +00001038 case 'v': // Altivec vector register
1039 Info.setAllowsRegister();
1040 break;
1041 case 'w':
1042 switch (Name[1]) {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001043 case 'd':// VSX vector register to hold vector double data
1044 case 'f':// VSX vector register to hold vector float data
1045 case 's':// VSX vector register to hold scalar float data
1046 case 'a':// Any VSX register
Hal Finkelf7a07a52014-03-02 18:24:18 +00001047 case 'c':// An individual CR bit
John Thompson07a61a42010-06-24 22:44:13 +00001048 break;
1049 default:
1050 return false;
1051 }
1052 Info.setAllowsRegister();
1053 Name++; // Skip over 'w'.
1054 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001055 case 'h': // `MQ', `CTR', or `LINK' register
1056 case 'q': // `MQ' register
1057 case 'c': // `CTR' register
1058 case 'l': // `LINK' register
1059 case 'x': // `CR' register (condition register) number 0
1060 case 'y': // `CR' register (condition register)
1061 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson07a61a42010-06-24 22:44:13 +00001062 Info.setAllowsRegister();
1063 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001064 case 'I': // Signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +00001065 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001066 // (use `L' instead for SImode constants)
1067 case 'K': // Unsigned 16-bit constant
1068 case 'L': // Signed 16-bit constant shifted left 16 bits
1069 case 'M': // Constant larger than 31
1070 case 'N': // Exact power of 2
1071 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +00001072 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001073 // register with one instruction per word
John Thompson07a61a42010-06-24 22:44:13 +00001074 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001075 // into a register using three instructions
John Thompson07a61a42010-06-24 22:44:13 +00001076 break;
1077 case 'm': // Memory operand. Note that on PowerPC targets, m can
1078 // include addresses that update the base register. It
1079 // is therefore only safe to use `m' in an asm statement
1080 // if that asm statement accesses the operand exactly once.
1081 // The asm statement must also use `%U<opno>' as a
Sebastian Redldd008712010-08-17 22:42:34 +00001082 // placeholder for the "update" flag in the corresponding
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001083 // load or store instruction. For example:
John Thompson07a61a42010-06-24 22:44:13 +00001084 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001085 // is correct but:
John Thompson07a61a42010-06-24 22:44:13 +00001086 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
1087 // is not. Use es rather than m if you don't want the base
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001088 // register to be updated.
1089 case 'e':
John Thompsonceebdf12010-06-25 00:02:05 +00001090 if (Name[1] != 's')
1091 return false;
Sebastian Redldd008712010-08-17 22:42:34 +00001092 // es: A "stable" memory operand; that is, one which does not
John Thompson07a61a42010-06-24 22:44:13 +00001093 // include any automodification of the base register. Unlike
1094 // `m', this constraint can be used in asm statements that
1095 // might access the operand several times, or that might not
John Thompsonceebdf12010-06-25 00:02:05 +00001096 // access it at all.
John Thompson07a61a42010-06-24 22:44:13 +00001097 Info.setAllowsMemory();
John Thompsonceebdf12010-06-25 00:02:05 +00001098 Name++; // Skip over 'e'.
John Thompson07a61a42010-06-24 22:44:13 +00001099 break;
1100 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001101 // usually better to use `m' or `es' in asm statements)
John Thompson07a61a42010-06-24 22:44:13 +00001102 case 'Z': // Memory operand that is an indexed or indirect from a
1103 // register (it is usually better to use `m' or `es' in
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001104 // asm statements)
John Thompson07a61a42010-06-24 22:44:13 +00001105 Info.setAllowsMemory();
1106 Info.setAllowsRegister();
1107 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001108 case 'R': // AIX TOC entry
John Thompson07a61a42010-06-24 22:44:13 +00001109 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001110 // register (`p' is preferable for asm statements)
1111 case 'S': // Constant suitable as a 64-bit mask operand
1112 case 'T': // Constant suitable as a 32-bit mask operand
1113 case 'U': // System V Release 4 small data area reference
John Thompson07a61a42010-06-24 22:44:13 +00001114 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001115 // instructions
1116 case 'W': // Vector constant that does not require memory
1117 case 'j': // Vector constant that is all zeros.
John Thompson07a61a42010-06-24 22:44:13 +00001118 break;
1119 // End FIXME.
Anders Carlssonf511f642007-11-27 04:11:28 +00001120 }
John Thompson07a61a42010-06-24 22:44:13 +00001121 return true;
Anders Carlssonf511f642007-11-27 04:11:28 +00001122 }
Craig Topper3164f332014-03-11 03:39:26 +00001123 std::string convertConstraint(const char *&Constraint) const override {
Hal Finkelf7a07a52014-03-02 18:24:18 +00001124 std::string R;
1125 switch (*Constraint) {
1126 case 'e':
1127 case 'w':
1128 // Two-character constraint; add "^" hint for later parsing.
1129 R = std::string("^") + std::string(Constraint, 2);
1130 Constraint++;
1131 break;
1132 default:
1133 return TargetInfo::convertConstraint(Constraint);
1134 }
1135 return R;
1136 }
Craig Topper3164f332014-03-11 03:39:26 +00001137 const char *getClobbers() const override {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001138 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +00001139 }
Craig Topper3164f332014-03-11 03:39:26 +00001140 int getEHDataRegisterNumber(unsigned RegNo) const override {
Adhemerval Zanella5d874ae2013-01-22 20:02:45 +00001141 if (RegNo == 0) return 3;
1142 if (RegNo == 1) return 4;
1143 return -1;
1144 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00001145
1146 bool hasSjLjLowering() const override {
1147 return true;
1148 }
David Majnemer2617ea62015-06-09 18:05:33 +00001149
1150 bool useFloat128ManglingForLongDouble() const override {
1151 return LongDoubleWidth == 128 &&
Stephan Bergmann17c7f702016-12-14 11:57:17 +00001152 LongDoubleFormat == &llvm::APFloat::PPCDoubleDouble() &&
David Majnemer2617ea62015-06-09 18:05:33 +00001153 getTriple().isOSBinFormatELF();
1154 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001155};
Anders Carlssonf511f642007-11-27 04:11:28 +00001156
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001157const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00001158#define BUILTIN(ID, TYPE, ATTRS) \
1159 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1160#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1161 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5abdec72009-06-14 01:05:48 +00001162#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001163};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001164
Eric Christopher917e9522014-11-18 22:36:15 +00001165/// handleTargetFeatures - Perform initialization based on the user
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001166/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00001167bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001168 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00001169 for (const auto &Feature : Features) {
Eric Christopher758aad72017-03-21 22:06:18 +00001170 if (Feature == "+altivec") {
1171 HasAltivec = true;
1172 } else if (Feature == "+vsx") {
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001173 HasVSX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001174 } else if (Feature == "+bpermd") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001175 HasBPERMD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001176 } else if (Feature == "+extdiv") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001177 HasExtDiv = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001178 } else if (Feature == "+power8-vector") {
Bill Schmidt8c184e32014-10-10 17:21:23 +00001179 HasP8Vector = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001180 } else if (Feature == "+crypto") {
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001181 HasP8Crypto = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001182 } else if (Feature == "+direct-move") {
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001183 HasDirectMove = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001184 } else if (Feature == "+qpx") {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001185 HasQPX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001186 } else if (Feature == "+htm") {
Kit Barton8246f282015-03-25 19:41:41 +00001187 HasHTM = true;
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001188 } else if (Feature == "+float128") {
1189 HasFloat128 = true;
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001190 } else if (Feature == "+power9-vector") {
1191 HasP9Vector = true;
Kit Barton8246f282015-03-25 19:41:41 +00001192 }
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001193 // TODO: Finish this list and add an assert that we've handled them
1194 // all.
1195 }
Eric Christopher02c33352015-08-25 00:59:11 +00001196
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001197 return true;
1198}
1199
Chris Lattnerecd49032009-03-02 22:27:17 +00001200/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
1201/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001202void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001203 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00001204 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001205 Builder.defineMacro("__ppc__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001206 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001207 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001208 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001209 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001210 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001211 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001212 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001213 Builder.defineMacro("__ppc64__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001214 Builder.defineMacro("__PPC64__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001215 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001216
Chris Lattnerecd49032009-03-02 22:27:17 +00001217 // Target properties.
Bill Schmidt778d3872013-07-26 01:36:11 +00001218 if (getTriple().getArch() == llvm::Triple::ppc64le) {
1219 Builder.defineMacro("_LITTLE_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001220 } else {
1221 if (getTriple().getOS() != llvm::Triple::NetBSD &&
1222 getTriple().getOS() != llvm::Triple::OpenBSD)
1223 Builder.defineMacro("_BIG_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001224 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001225
Ulrich Weigand8afad612014-07-28 13:17:52 +00001226 // ABI options.
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001227 if (ABI == "elfv1" || ABI == "elfv1-qpx")
Ulrich Weigand8afad612014-07-28 13:17:52 +00001228 Builder.defineMacro("_CALL_ELF", "1");
1229 if (ABI == "elfv2")
1230 Builder.defineMacro("_CALL_ELF", "2");
1231
Chris Lattnerecd49032009-03-02 22:27:17 +00001232 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001233 Builder.defineMacro("__NATURAL_ALIGNMENT__");
1234 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001235
Chris Lattnerecd49032009-03-02 22:27:17 +00001236 // FIXME: Should be controlled by command line option.
Roman Divacky13b586f2013-07-03 19:45:54 +00001237 if (LongDoubleWidth == 128)
1238 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001239
Eric Christopher32ac5e42017-02-15 07:50:11 +00001240 // Define this for elfv2 (64-bit only) or 64-bit darwin.
1241 if (ABI == "elfv2" ||
1242 (getTriple().getOS() == llvm::Triple::Darwin && PointerWidth == 64))
1243 Builder.defineMacro("__STRUCT_PARM_ALIGN__", "16");
1244
Hal Finkel8eb59282012-06-11 22:35:19 +00001245 // CPU identification.
Hal Finkel6b984f02012-07-03 16:51:04 +00001246 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
1247 .Case("440", ArchDefineName)
1248 .Case("450", ArchDefineName | ArchDefine440)
1249 .Case("601", ArchDefineName)
1250 .Case("602", ArchDefineName | ArchDefinePpcgr)
1251 .Case("603", ArchDefineName | ArchDefinePpcgr)
1252 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1253 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1254 .Case("604", ArchDefineName | ArchDefinePpcgr)
1255 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
1256 .Case("620", ArchDefineName | ArchDefinePpcgr)
Bill Schmidt38378a02013-02-01 20:23:10 +00001257 .Case("630", ArchDefineName | ArchDefinePpcgr)
Hal Finkel6b984f02012-07-03 16:51:04 +00001258 .Case("7400", ArchDefineName | ArchDefinePpcgr)
1259 .Case("7450", ArchDefineName | ArchDefinePpcgr)
1260 .Case("750", ArchDefineName | ArchDefinePpcgr)
1261 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1262 | ArchDefinePpcsq)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001263 .Case("a2", ArchDefineA2)
1264 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
Bill Schmidt38378a02013-02-01 20:23:10 +00001265 .Case("pwr3", ArchDefinePpcgr)
1266 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
1267 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1268 | ArchDefinePpcsq)
1269 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4
1270 | ArchDefinePpcgr | ArchDefinePpcsq)
1271 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5
1272 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1273 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x
1274 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1275 | ArchDefinePpcsq)
1276 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6
1277 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001278 | ArchDefinePpcgr | ArchDefinePpcsq)
1279 .Case("pwr8", ArchDefineName | ArchDefinePwr7 | ArchDefinePwr6x
1280 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1281 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001282 .Case("pwr9", ArchDefineName | ArchDefinePwr8 | ArchDefinePwr7
1283 | ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1284 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1285 | ArchDefinePpcsq)
Bill Schmidt38378a02013-02-01 20:23:10 +00001286 .Case("power3", ArchDefinePpcgr)
1287 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1288 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1289 | ArchDefinePpcsq)
1290 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1291 | ArchDefinePpcgr | ArchDefinePpcsq)
1292 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1293 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1294 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1295 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1296 | ArchDefinePpcsq)
1297 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6
1298 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001299 | ArchDefinePpcgr | ArchDefinePpcsq)
1300 .Case("power8", ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr6x
1301 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1302 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001303 .Case("power9", ArchDefinePwr9 | ArchDefinePwr8 | ArchDefinePwr7
1304 | ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1305 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1306 | ArchDefinePpcsq)
Hal Finkel6b984f02012-07-03 16:51:04 +00001307 .Default(ArchDefineNone);
1308
1309 if (defs & ArchDefineName)
1310 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
1311 if (defs & ArchDefinePpcgr)
1312 Builder.defineMacro("_ARCH_PPCGR");
1313 if (defs & ArchDefinePpcsq)
1314 Builder.defineMacro("_ARCH_PPCSQ");
1315 if (defs & ArchDefine440)
Hal Finkel8eb59282012-06-11 22:35:19 +00001316 Builder.defineMacro("_ARCH_440");
Hal Finkel6b984f02012-07-03 16:51:04 +00001317 if (defs & ArchDefine603)
1318 Builder.defineMacro("_ARCH_603");
1319 if (defs & ArchDefine604)
1320 Builder.defineMacro("_ARCH_604");
Bill Schmidt38378a02013-02-01 20:23:10 +00001321 if (defs & ArchDefinePwr4)
Hal Finkel6b984f02012-07-03 16:51:04 +00001322 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt38378a02013-02-01 20:23:10 +00001323 if (defs & ArchDefinePwr5)
Hal Finkel6b984f02012-07-03 16:51:04 +00001324 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt38378a02013-02-01 20:23:10 +00001325 if (defs & ArchDefinePwr5x)
1326 Builder.defineMacro("_ARCH_PWR5X");
1327 if (defs & ArchDefinePwr6)
Hal Finkel8eb59282012-06-11 22:35:19 +00001328 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt38378a02013-02-01 20:23:10 +00001329 if (defs & ArchDefinePwr6x)
1330 Builder.defineMacro("_ARCH_PWR6X");
1331 if (defs & ArchDefinePwr7)
1332 Builder.defineMacro("_ARCH_PWR7");
Will Schmidtf0487512014-06-26 13:34:10 +00001333 if (defs & ArchDefinePwr8)
1334 Builder.defineMacro("_ARCH_PWR8");
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001335 if (defs & ArchDefinePwr9)
1336 Builder.defineMacro("_ARCH_PWR9");
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001337 if (defs & ArchDefineA2)
1338 Builder.defineMacro("_ARCH_A2");
1339 if (defs & ArchDefineA2q) {
1340 Builder.defineMacro("_ARCH_A2Q");
1341 Builder.defineMacro("_ARCH_QP");
1342 }
1343
1344 if (getTriple().getVendor() == llvm::Triple::BGQ) {
1345 Builder.defineMacro("__bg__");
1346 Builder.defineMacro("__THW_BLUEGENE__");
1347 Builder.defineMacro("__bgq__");
1348 Builder.defineMacro("__TOS_BGQ__");
1349 }
Bill Schmidt38378a02013-02-01 20:23:10 +00001350
Eric Christopher758aad72017-03-21 22:06:18 +00001351 if (HasAltivec) {
1352 Builder.defineMacro("__VEC__", "10206");
1353 Builder.defineMacro("__ALTIVEC__");
1354 }
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001355 if (HasVSX)
1356 Builder.defineMacro("__VSX__");
Bill Schmidt8c184e32014-10-10 17:21:23 +00001357 if (HasP8Vector)
Bill Schmidt59eb7672014-10-10 15:09:43 +00001358 Builder.defineMacro("__POWER8_VECTOR__");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001359 if (HasP8Crypto)
1360 Builder.defineMacro("__CRYPTO__");
Kit Barton8246f282015-03-25 19:41:41 +00001361 if (HasHTM)
1362 Builder.defineMacro("__HTM__");
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001363 if (HasFloat128)
1364 Builder.defineMacro("__FLOAT128__");
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001365 if (HasP9Vector)
1366 Builder.defineMacro("__POWER9_VECTOR__");
Hal Finkela57b8902015-10-01 13:39:49 +00001367
1368 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
1369 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
1370 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
1371 if (PointerWidth == 64)
1372 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001373
Bill Schmidt38378a02013-02-01 20:23:10 +00001374 // FIXME: The following are not yet generated here by Clang, but are
1375 // generated by GCC:
1376 //
1377 // _SOFT_FLOAT_
1378 // __RECIP_PRECISION__
1379 // __APPLE_ALTIVEC__
Bill Schmidt38378a02013-02-01 20:23:10 +00001380 // __RECIP__
1381 // __RECIPF__
1382 // __RSQRTE__
1383 // __RSQRTEF__
1384 // _SOFT_DOUBLE_
1385 // __NO_LWSYNC__
1386 // __HAVE_BSWAP__
1387 // __LONGDOUBLE128
1388 // __CMODEL_MEDIUM__
1389 // __CMODEL_LARGE__
1390 // _CALL_SYSV
1391 // _CALL_DARWIN
1392 // __NO_FPRS__
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001393}
1394
Eric Christophera8a14c32015-08-31 18:39:16 +00001395// Handle explicit options being passed to the compiler here: if we've
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001396// explicitly turned off vsx and turned on any of:
1397// - power8-vector
1398// - direct-move
1399// - float128
1400// - power9-vector
1401// then go ahead and error since the customer has expressed an incompatible
Eric Christophera8a14c32015-08-31 18:39:16 +00001402// set of options.
1403static bool ppcUserFeaturesCheck(DiagnosticsEngine &Diags,
Eric Christopher8c47b422015-10-09 18:39:55 +00001404 const std::vector<std::string> &FeaturesVec) {
Eric Christophera8a14c32015-08-31 18:39:16 +00001405
1406 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "-vsx") !=
1407 FeaturesVec.end()) {
1408 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+power8-vector") !=
1409 FeaturesVec.end()) {
1410 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mpower8-vector"
1411 << "-mno-vsx";
1412 return false;
1413 }
1414
1415 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+direct-move") !=
1416 FeaturesVec.end()) {
1417 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mdirect-move"
1418 << "-mno-vsx";
1419 return false;
1420 }
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001421
1422 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+float128") !=
1423 FeaturesVec.end()) {
1424 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mfloat128"
1425 << "-mno-vsx";
1426 return false;
1427 }
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001428
1429 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+power9-vector") !=
1430 FeaturesVec.end()) {
1431 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mpower9-vector"
1432 << "-mno-vsx";
1433 return false;
1434 }
Eric Christophera8a14c32015-08-31 18:39:16 +00001435 }
1436
1437 return true;
1438}
1439
Eric Christopher8c47b422015-10-09 18:39:55 +00001440bool PPCTargetInfo::initFeatureMap(
1441 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
1442 const std::vector<std::string> &FeaturesVec) const {
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001443 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1444 .Case("7400", true)
1445 .Case("g4", true)
1446 .Case("7450", true)
1447 .Case("g4+", true)
1448 .Case("970", true)
1449 .Case("g5", true)
1450 .Case("pwr6", true)
1451 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +00001452 .Case("pwr8", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001453 .Case("pwr9", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001454 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +00001455 .Case("ppc64le", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001456 .Default(false);
Hal Finkelb58ce852013-02-01 18:44:19 +00001457
1458 Features["qpx"] = (CPU == "a2q");
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001459 Features["power9-vector"] = (CPU == "pwr9");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001460 Features["crypto"] = llvm::StringSwitch<bool>(CPU)
1461 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001462 .Case("pwr9", true)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001463 .Case("pwr8", true)
1464 .Default(false);
1465 Features["power8-vector"] = llvm::StringSwitch<bool>(CPU)
1466 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001467 .Case("pwr9", true)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001468 .Case("pwr8", true)
1469 .Default(false);
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001470 Features["bpermd"] = llvm::StringSwitch<bool>(CPU)
1471 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001472 .Case("pwr9", true)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001473 .Case("pwr8", true)
1474 .Case("pwr7", true)
1475 .Default(false);
1476 Features["extdiv"] = llvm::StringSwitch<bool>(CPU)
1477 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001478 .Case("pwr9", true)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001479 .Case("pwr8", true)
1480 .Case("pwr7", true)
1481 .Default(false);
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001482 Features["direct-move"] = llvm::StringSwitch<bool>(CPU)
1483 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001484 .Case("pwr9", true)
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001485 .Case("pwr8", true)
1486 .Default(false);
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001487 Features["vsx"] = llvm::StringSwitch<bool>(CPU)
1488 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001489 .Case("pwr9", true)
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001490 .Case("pwr8", true)
1491 .Case("pwr7", true)
1492 .Default(false);
Eric Christopher74fa24f2017-03-20 21:12:53 +00001493 Features["htm"] = llvm::StringSwitch<bool>(CPU)
1494 .Case("ppc64le", true)
1495 .Case("pwr9", true)
1496 .Case("pwr8", true)
1497 .Default(false);
Eric Christopheref1e2952015-08-28 02:13:58 +00001498
Eric Christophera8a14c32015-08-31 18:39:16 +00001499 if (!ppcUserFeaturesCheck(Diags, FeaturesVec))
1500 return false;
Eric Christopher007b0a02015-08-28 22:32:01 +00001501
Eric Christopher007b0a02015-08-28 22:32:01 +00001502 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001503}
1504
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001505bool PPCTargetInfo::hasFeature(StringRef Feature) const {
Bill Schmidte6e9d152014-11-02 14:56:41 +00001506 return llvm::StringSwitch<bool>(Feature)
Eric Christopher758aad72017-03-21 22:06:18 +00001507 .Case("powerpc", true)
1508 .Case("altivec", HasAltivec)
1509 .Case("vsx", HasVSX)
1510 .Case("power8-vector", HasP8Vector)
1511 .Case("crypto", HasP8Crypto)
1512 .Case("direct-move", HasDirectMove)
1513 .Case("qpx", HasQPX)
1514 .Case("htm", HasHTM)
1515 .Case("bpermd", HasBPERMD)
1516 .Case("extdiv", HasExtDiv)
1517 .Case("float128", HasFloat128)
1518 .Case("power9-vector", HasP9Vector)
1519 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001520}
Chris Lattner17df24e2008-04-21 18:56:49 +00001521
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001522void PPCTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
1523 StringRef Name, bool Enabled) const {
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001524 // If we're enabling direct-move or power8-vector go ahead and enable vsx
1525 // as well. Do the inverse if we're disabling vsx. We'll diagnose any user
1526 // incompatible options.
1527 if (Enabled) {
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001528 if (Name == "direct-move" ||
1529 Name == "power8-vector" ||
1530 Name == "float128" ||
1531 Name == "power9-vector") {
1532 // power9-vector is really a superset of power8-vector so encode that.
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001533 Features[Name] = Features["vsx"] = true;
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001534 if (Name == "power9-vector")
1535 Features["power8-vector"] = true;
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001536 } else {
1537 Features[Name] = true;
1538 }
1539 } else {
1540 if (Name == "vsx") {
1541 Features[Name] = Features["direct-move"] = Features["power8-vector"] =
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001542 Features["float128"] = Features["power9-vector"] = false;
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001543 } else {
1544 Features[Name] = false;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001545 }
1546 }
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001547}
1548
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001549const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001550 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1551 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1552 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1553 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1554 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1555 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1556 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1557 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001558 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001559 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001560 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001561 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1562 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1563 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1564 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001565 "vrsave", "vscr",
1566 "spe_acc", "spefscr",
1567 "sfp"
1568};
Chris Lattner10a5b382007-01-29 05:24:35 +00001569
Craig Topperf054e3a2015-10-19 03:52:27 +00001570ArrayRef<const char*> PPCTargetInfo::getGCCRegNames() const {
1571 return llvm::makeArrayRef(GCCRegNames);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001572}
Chris Lattner5ba61f02006-10-14 07:39:34 +00001573
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001574const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1575 // While some of these aliases do map to different registers
1576 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001577 { { "0" }, "r0" },
1578 { { "1"}, "r1" },
1579 { { "2" }, "r2" },
1580 { { "3" }, "r3" },
1581 { { "4" }, "r4" },
1582 { { "5" }, "r5" },
1583 { { "6" }, "r6" },
1584 { { "7" }, "r7" },
1585 { { "8" }, "r8" },
1586 { { "9" }, "r9" },
1587 { { "10" }, "r10" },
1588 { { "11" }, "r11" },
1589 { { "12" }, "r12" },
1590 { { "13" }, "r13" },
1591 { { "14" }, "r14" },
1592 { { "15" }, "r15" },
1593 { { "16" }, "r16" },
1594 { { "17" }, "r17" },
1595 { { "18" }, "r18" },
1596 { { "19" }, "r19" },
1597 { { "20" }, "r20" },
1598 { { "21" }, "r21" },
1599 { { "22" }, "r22" },
1600 { { "23" }, "r23" },
1601 { { "24" }, "r24" },
1602 { { "25" }, "r25" },
1603 { { "26" }, "r26" },
1604 { { "27" }, "r27" },
1605 { { "28" }, "r28" },
1606 { { "29" }, "r29" },
1607 { { "30" }, "r30" },
1608 { { "31" }, "r31" },
1609 { { "fr0" }, "f0" },
1610 { { "fr1" }, "f1" },
1611 { { "fr2" }, "f2" },
1612 { { "fr3" }, "f3" },
1613 { { "fr4" }, "f4" },
1614 { { "fr5" }, "f5" },
1615 { { "fr6" }, "f6" },
1616 { { "fr7" }, "f7" },
1617 { { "fr8" }, "f8" },
1618 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +00001619 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001620 { { "fr11" }, "f11" },
1621 { { "fr12" }, "f12" },
1622 { { "fr13" }, "f13" },
1623 { { "fr14" }, "f14" },
1624 { { "fr15" }, "f15" },
1625 { { "fr16" }, "f16" },
1626 { { "fr17" }, "f17" },
1627 { { "fr18" }, "f18" },
1628 { { "fr19" }, "f19" },
1629 { { "fr20" }, "f20" },
1630 { { "fr21" }, "f21" },
1631 { { "fr22" }, "f22" },
1632 { { "fr23" }, "f23" },
1633 { { "fr24" }, "f24" },
1634 { { "fr25" }, "f25" },
1635 { { "fr26" }, "f26" },
1636 { { "fr27" }, "f27" },
1637 { { "fr28" }, "f28" },
1638 { { "fr29" }, "f29" },
1639 { { "fr30" }, "f30" },
1640 { { "fr31" }, "f31" },
1641 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001642};
1643
Craig Topperf054e3a2015-10-19 03:52:27 +00001644ArrayRef<TargetInfo::GCCRegAlias> PPCTargetInfo::getGCCRegAliases() const {
1645 return llvm::makeArrayRef(GCCRegAliases);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001646}
Chris Lattner02dffbd2006-10-14 07:50:21 +00001647
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001648class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001649public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001650 PPC32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1651 : PPCTargetInfo(Triple, Opts) {
James Y Knightb214cbc2016-03-04 19:00:41 +00001652 resetDataLayout("E-m:e-p:32:32-i64:64-n32");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001653
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001654 switch (getTriple().getOS()) {
Nico Weber3435ede2012-01-31 02:07:33 +00001655 case llvm::Triple::Linux:
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001656 case llvm::Triple::FreeBSD:
1657 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001658 SizeType = UnsignedInt;
Hal Finkel26908382012-03-02 20:54:36 +00001659 PtrDiffType = SignedInt;
1660 IntPtrType = SignedInt;
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001661 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +00001662 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001663 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001664 }
Roman Divacky816dcd12012-03-13 16:53:54 +00001665
Roman Divacky3ffe7462012-03-13 19:20:17 +00001666 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1667 LongDoubleWidth = LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00001668 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Roman Divacky3ffe7462012-03-13 19:20:17 +00001669 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001670
1671 // PPC32 supports atomics up to 4 bytes.
1672 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divacky965b0b72011-01-06 08:27:10 +00001673 }
1674
Craig Topper3164f332014-03-11 03:39:26 +00001675 BuiltinVaListKind getBuiltinVaListKind() const override {
Roman Divacky965b0b72011-01-06 08:27:10 +00001676 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Inge5d3fb222012-06-16 03:34:49 +00001677 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman873f65a2008-08-21 00:13:15 +00001678 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001679};
Chris Lattner5ba61f02006-10-14 07:39:34 +00001680
Bill Schmidt778d3872013-07-26 01:36:11 +00001681// Note: ABI differences may eventually require us to have a separate
1682// TargetInfo for little endian.
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001683class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001684public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001685 PPC64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1686 : PPCTargetInfo(Triple, Opts) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001687 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001688 IntMaxType = SignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001689 Int64Type = SignedLong;
Roman Divacky816dcd12012-03-13 16:53:54 +00001690
Eric Christopherf6ee1f32017-02-10 04:35:21 +00001691 if ((Triple.getArch() == llvm::Triple::ppc64le)) {
1692 resetDataLayout("e-m:e-i64:64-n32:64");
Eric Christopher4855ba82017-02-10 03:32:34 +00001693 ABI = "elfv2";
Eric Christopherf6ee1f32017-02-10 04:35:21 +00001694 } else {
1695 resetDataLayout("E-m:e-i64:64-n32:64");
Eric Christopher4855ba82017-02-10 03:32:34 +00001696 ABI = "elfv1";
Eric Christopherf6ee1f32017-02-10 04:35:21 +00001697 }
Eric Christopher4855ba82017-02-10 03:32:34 +00001698
Eric Christopherf6ee1f32017-02-10 04:35:21 +00001699 switch (getTriple().getOS()) {
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001700 case llvm::Triple::FreeBSD:
Roman Divacky3ffe7462012-03-13 19:20:17 +00001701 LongDoubleWidth = LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00001702 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001703 break;
Joerg Sonnenbergeraac82c42014-10-15 19:52:03 +00001704 case llvm::Triple::NetBSD:
1705 IntMaxType = SignedLongLong;
1706 Int64Type = SignedLongLong;
1707 break;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001708 default:
1709 break;
Ulrich Weigand8afad612014-07-28 13:17:52 +00001710 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001711
1712 // PPC64 supports atomics up to 8 bytes.
1713 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001714 }
Craig Topper3164f332014-03-11 03:39:26 +00001715 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001716 return TargetInfo::CharPtrBuiltinVaList;
Roman Divacky965b0b72011-01-06 08:27:10 +00001717 }
Eric Christophere6b7cf42015-07-10 18:25:52 +00001718 // PPC64 Linux-specific ABI options.
Ulrich Weigand8afad612014-07-28 13:17:52 +00001719 bool setABI(const std::string &Name) override {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001720 if (Name == "elfv1" || Name == "elfv1-qpx" || Name == "elfv2") {
Ulrich Weigand8afad612014-07-28 13:17:52 +00001721 ABI = Name;
1722 return true;
1723 }
1724 return false;
1725 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001726};
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001727
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001728class DarwinPPC32TargetInfo : public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001729public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001730 DarwinPPC32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1731 : DarwinTargetInfo<PPC32TargetInfo>(Triple, Opts) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001732 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +00001733 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Eric Christopher917e9522014-11-18 22:36:15 +00001734 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev68d773c2012-01-17 22:40:00 +00001735 LongLongAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001736 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00001737 resetDataLayout("E-m:o-p:32:32-f64:32:64-n32");
Roman Divacky965b0b72011-01-06 08:27:10 +00001738 }
Craig Topper3164f332014-03-11 03:39:26 +00001739 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001740 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001741 }
1742};
1743
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001744class DarwinPPC64TargetInfo : public DarwinTargetInfo<PPC64TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001745public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001746 DarwinPPC64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1747 : DarwinTargetInfo<PPC64TargetInfo>(Triple, Opts) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001748 HasAlignMac68kSupport = true;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001749 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00001750 resetDataLayout("E-m:o-i64:64-n32:64");
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001751 }
1752};
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001753
Eric Christopherc48497a2015-09-18 21:26:24 +00001754static const unsigned NVPTXAddrSpaceMap[] = {
1755 1, // opencl_global
1756 3, // opencl_local
1757 4, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00001758 // FIXME: generic has to be added to the target
Eric Christopherc48497a2015-09-18 21:26:24 +00001759 0, // opencl_generic
1760 1, // cuda_device
1761 4, // cuda_constant
1762 3, // cuda_shared
1763};
1764
1765class NVPTXTargetInfo : public TargetInfo {
1766 static const char *const GCCRegNames[];
1767 static const Builtin::Info BuiltinInfo[];
Justin Lebar62907612016-07-06 21:21:39 +00001768 CudaArch GPU;
Justin Lebarb6626592017-01-05 16:53:21 +00001769 std::unique_ptr<TargetInfo> HostTarget;
Reid Klecknerbbc01782014-12-03 21:53:36 +00001770
Eric Christopherc48497a2015-09-18 21:26:24 +00001771public:
Justin Lebarb6626592017-01-05 16:53:21 +00001772 NVPTXTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts,
1773 unsigned TargetPointerWidth)
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001774 : TargetInfo(Triple) {
Justin Lebarb6626592017-01-05 16:53:21 +00001775 assert((TargetPointerWidth == 32 || TargetPointerWidth == 64) &&
1776 "NVPTX only supports 32- and 64-bit modes.");
1777
Eric Christopherc48497a2015-09-18 21:26:24 +00001778 TLSSupported = false;
Eric Christopherc48497a2015-09-18 21:26:24 +00001779 AddrSpaceMap = &NVPTXAddrSpaceMap;
1780 UseAddrSpaceMapMangling = true;
Justin Lebarb6626592017-01-05 16:53:21 +00001781
Eric Christopherc48497a2015-09-18 21:26:24 +00001782 // Define available target features
1783 // These must be defined in sorted order!
1784 NoAsmVariants = true;
Justin Lebar62907612016-07-06 21:21:39 +00001785 GPU = CudaArch::SM_20;
Justin Lebar76945b22016-04-29 23:05:19 +00001786
Justin Lebarb6626592017-01-05 16:53:21 +00001787 if (TargetPointerWidth == 32)
1788 resetDataLayout("e-p:32:32-i64:64-v16:16-v32:32-n16:32:64");
1789 else
1790 resetDataLayout("e-i64:64-v16:16-v32:32-n16:32:64");
1791
Justin Lebar76945b22016-04-29 23:05:19 +00001792 // If possible, get a TargetInfo for our host triple, so we can match its
1793 // types.
1794 llvm::Triple HostTriple(Opts.HostTriple);
Justin Lebarb6626592017-01-05 16:53:21 +00001795 if (!HostTriple.isNVPTX())
1796 HostTarget.reset(AllocateTarget(llvm::Triple(Opts.HostTriple), Opts));
1797
1798 // If no host target, make some guesses about the data layout and return.
Justin Lebar76945b22016-04-29 23:05:19 +00001799 if (!HostTarget) {
Justin Lebarb6626592017-01-05 16:53:21 +00001800 LongWidth = LongAlign = TargetPointerWidth;
1801 PointerWidth = PointerAlign = TargetPointerWidth;
1802 switch (TargetPointerWidth) {
1803 case 32:
1804 SizeType = TargetInfo::UnsignedInt;
1805 PtrDiffType = TargetInfo::SignedInt;
1806 IntPtrType = TargetInfo::SignedInt;
1807 break;
1808 case 64:
1809 SizeType = TargetInfo::UnsignedLong;
1810 PtrDiffType = TargetInfo::SignedLong;
1811 IntPtrType = TargetInfo::SignedLong;
1812 break;
1813 default:
1814 llvm_unreachable("TargetPointerWidth must be 32 or 64");
1815 }
Justin Lebar76945b22016-04-29 23:05:19 +00001816 return;
1817 }
1818
Justin Lebarb6626592017-01-05 16:53:21 +00001819 // Copy properties from host target.
Justin Lebar76945b22016-04-29 23:05:19 +00001820 PointerWidth = HostTarget->getPointerWidth(/* AddrSpace = */ 0);
1821 PointerAlign = HostTarget->getPointerAlign(/* AddrSpace = */ 0);
1822 BoolWidth = HostTarget->getBoolWidth();
1823 BoolAlign = HostTarget->getBoolAlign();
1824 IntWidth = HostTarget->getIntWidth();
1825 IntAlign = HostTarget->getIntAlign();
1826 HalfWidth = HostTarget->getHalfWidth();
1827 HalfAlign = HostTarget->getHalfAlign();
1828 FloatWidth = HostTarget->getFloatWidth();
1829 FloatAlign = HostTarget->getFloatAlign();
1830 DoubleWidth = HostTarget->getDoubleWidth();
1831 DoubleAlign = HostTarget->getDoubleAlign();
1832 LongWidth = HostTarget->getLongWidth();
1833 LongAlign = HostTarget->getLongAlign();
1834 LongLongWidth = HostTarget->getLongLongWidth();
1835 LongLongAlign = HostTarget->getLongLongAlign();
1836 MinGlobalAlign = HostTarget->getMinGlobalAlign();
Richard Smith59139022016-09-30 22:41:36 +00001837 NewAlign = HostTarget->getNewAlign();
Justin Lebar76945b22016-04-29 23:05:19 +00001838 DefaultAlignForAttributeAligned =
1839 HostTarget->getDefaultAlignForAttributeAligned();
1840 SizeType = HostTarget->getSizeType();
1841 IntMaxType = HostTarget->getIntMaxType();
1842 PtrDiffType = HostTarget->getPtrDiffType(/* AddrSpace = */ 0);
1843 IntPtrType = HostTarget->getIntPtrType();
1844 WCharType = HostTarget->getWCharType();
1845 WIntType = HostTarget->getWIntType();
1846 Char16Type = HostTarget->getChar16Type();
1847 Char32Type = HostTarget->getChar32Type();
1848 Int64Type = HostTarget->getInt64Type();
1849 SigAtomicType = HostTarget->getSigAtomicType();
1850 ProcessIDType = HostTarget->getProcessIDType();
1851
1852 UseBitFieldTypeAlignment = HostTarget->useBitFieldTypeAlignment();
1853 UseZeroLengthBitfieldAlignment =
1854 HostTarget->useZeroLengthBitfieldAlignment();
1855 UseExplicitBitFieldAlignment = HostTarget->useExplicitBitFieldAlignment();
1856 ZeroLengthBitfieldBoundary = HostTarget->getZeroLengthBitfieldBoundary();
1857
Justin Lebar5057f172016-09-09 20:35:43 +00001858 // This is a bit of a lie, but it controls __GCC_ATOMIC_XXX_LOCK_FREE, and
1859 // we need those macros to be identical on host and device, because (among
1860 // other things) they affect which standard library classes are defined, and
1861 // we need all classes to be defined on both the host and device.
1862 MaxAtomicInlineWidth = HostTarget->getMaxAtomicInlineWidth();
1863
Justin Lebar76945b22016-04-29 23:05:19 +00001864 // Properties intentionally not copied from host:
1865 // - LargeArrayMinWidth, LargeArrayAlign: Not visible across the
1866 // host/device boundary.
1867 // - SuitableAlign: Not visible across the host/device boundary, and may
1868 // correctly be different on host/device, e.g. if host has wider vector
1869 // types than device.
1870 // - LongDoubleWidth, LongDoubleAlign: nvptx's long double type is the same
1871 // as its double type, but that's not necessarily true on the host.
1872 // TODO: nvcc emits a warning when using long double on device; we should
1873 // do the same.
Eric Christopherc48497a2015-09-18 21:26:24 +00001874 }
1875 void getTargetDefines(const LangOptions &Opts,
1876 MacroBuilder &Builder) const override {
1877 Builder.defineMacro("__PTX__");
1878 Builder.defineMacro("__NVPTX__");
1879 if (Opts.CUDAIsDevice) {
1880 // Set __CUDA_ARCH__ for the GPU specified.
Justin Lebaref1aaac2016-07-06 21:21:14 +00001881 std::string CUDAArchCode = [this] {
1882 switch (GPU) {
Simon Pilgrim13dff572016-07-07 22:32:26 +00001883 case CudaArch::UNKNOWN:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001884 assert(false && "No GPU arch when compiling CUDA device code.");
1885 return "";
Justin Lebar62907612016-07-06 21:21:39 +00001886 case CudaArch::SM_20:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001887 return "200";
Justin Lebar62907612016-07-06 21:21:39 +00001888 case CudaArch::SM_21:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001889 return "210";
Justin Lebar62907612016-07-06 21:21:39 +00001890 case CudaArch::SM_30:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001891 return "300";
Justin Lebar62907612016-07-06 21:21:39 +00001892 case CudaArch::SM_32:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001893 return "320";
Justin Lebar62907612016-07-06 21:21:39 +00001894 case CudaArch::SM_35:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001895 return "350";
Justin Lebar62907612016-07-06 21:21:39 +00001896 case CudaArch::SM_37:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001897 return "370";
Justin Lebar62907612016-07-06 21:21:39 +00001898 case CudaArch::SM_50:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001899 return "500";
Justin Lebar62907612016-07-06 21:21:39 +00001900 case CudaArch::SM_52:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001901 return "520";
Justin Lebar62907612016-07-06 21:21:39 +00001902 case CudaArch::SM_53:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001903 return "530";
Justin Lebar62907612016-07-06 21:21:39 +00001904 case CudaArch::SM_60:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001905 return "600";
Justin Lebar62907612016-07-06 21:21:39 +00001906 case CudaArch::SM_61:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001907 return "610";
Justin Lebar62907612016-07-06 21:21:39 +00001908 case CudaArch::SM_62:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001909 return "620";
1910 }
Simon Pilgrim13dff572016-07-07 22:32:26 +00001911 llvm_unreachable("unhandled CudaArch");
Justin Lebaref1aaac2016-07-06 21:21:14 +00001912 }();
Eric Christopherc48497a2015-09-18 21:26:24 +00001913 Builder.defineMacro("__CUDA_ARCH__", CUDAArchCode);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001914 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001915 }
Craig Topper6c03a542015-10-19 04:51:35 +00001916 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
1917 return llvm::makeArrayRef(BuiltinInfo,
1918 clang::NVPTX::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eric Christopherc48497a2015-09-18 21:26:24 +00001919 }
Artem Belevichfda99052016-09-28 17:47:35 +00001920 bool
1921 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
1922 StringRef CPU,
1923 const std::vector<std::string> &FeaturesVec) const override {
1924 Features["satom"] = GPU >= CudaArch::SM_60;
1925 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
1926 }
1927
Eric Christopherc48497a2015-09-18 21:26:24 +00001928 bool hasFeature(StringRef Feature) const override {
Artem Belevichfda99052016-09-28 17:47:35 +00001929 return llvm::StringSwitch<bool>(Feature)
1930 .Cases("ptx", "nvptx", true)
1931 .Case("satom", GPU >= CudaArch::SM_60) // Atomics w/ scope.
1932 .Default(false);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001933 }
1934
Craig Topperf054e3a2015-10-19 03:52:27 +00001935 ArrayRef<const char *> getGCCRegNames() const override;
1936 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00001937 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00001938 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00001939 }
1940 bool validateAsmConstraint(const char *&Name,
1941 TargetInfo::ConstraintInfo &Info) const override {
1942 switch (*Name) {
1943 default:
1944 return false;
1945 case 'c':
1946 case 'h':
1947 case 'r':
1948 case 'l':
1949 case 'f':
1950 case 'd':
1951 Info.setAllowsRegister();
1952 return true;
Eli Bendersky13467172015-04-01 20:29:18 +00001953 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001954 }
1955 const char *getClobbers() const override {
1956 // FIXME: Is this really right?
1957 return "";
1958 }
1959 BuiltinVaListKind getBuiltinVaListKind() const override {
1960 // FIXME: implement
1961 return TargetInfo::CharPtrBuiltinVaList;
1962 }
1963 bool setCPU(const std::string &Name) override {
Justin Lebar62907612016-07-06 21:21:39 +00001964 GPU = StringToCudaArch(Name);
1965 return GPU != CudaArch::UNKNOWN;
Eric Christopherc48497a2015-09-18 21:26:24 +00001966 }
Jan Vesely9674bd42016-06-17 19:02:14 +00001967 void setSupportedOpenCLOpts() override {
1968 auto &Opts = getSupportedOpenCLOpts();
Yaxun Liu5b746652016-12-18 05:18:55 +00001969 Opts.support("cl_clang_storage_class_specifiers");
1970 Opts.support("cl_khr_gl_sharing");
1971 Opts.support("cl_khr_icd");
Jan Vesely9674bd42016-06-17 19:02:14 +00001972
Yaxun Liu5b746652016-12-18 05:18:55 +00001973 Opts.support("cl_khr_fp64");
1974 Opts.support("cl_khr_byte_addressable_store");
1975 Opts.support("cl_khr_global_int32_base_atomics");
1976 Opts.support("cl_khr_global_int32_extended_atomics");
1977 Opts.support("cl_khr_local_int32_base_atomics");
1978 Opts.support("cl_khr_local_int32_extended_atomics");
Jan Vesely9674bd42016-06-17 19:02:14 +00001979 }
Justin Lebar86c4e632017-01-05 16:53:38 +00001980
1981 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
1982 // CUDA compilations support all of the host's calling conventions.
1983 //
1984 // TODO: We should warn if you apply a non-default CC to anything other than
1985 // a host function.
1986 if (HostTarget)
1987 return HostTarget->checkCallingConvention(CC);
1988 return CCCR_Warning;
1989 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001990};
1991
1992const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1993#define BUILTIN(ID, TYPE, ATTRS) \
1994 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1995#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1996 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Artem Belevichfda99052016-09-28 17:47:35 +00001997#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
1998 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Eric Christopherc48497a2015-09-18 21:26:24 +00001999#include "clang/Basic/BuiltinsNVPTX.def"
2000};
2001
2002const char *const NVPTXTargetInfo::GCCRegNames[] = {"r0"};
2003
Craig Topperf054e3a2015-10-19 03:52:27 +00002004ArrayRef<const char *> NVPTXTargetInfo::getGCCRegNames() const {
2005 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00002006}
2007
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002008static const unsigned AMDGPUAddrSpaceMap[] = {
Eli Friedmand13b41e2012-10-12 23:32:00 +00002009 1, // opencl_global
2010 3, // opencl_local
2011 2, // opencl_constant
Matt Arsenaultbfe25b22014-12-01 16:46:03 +00002012 4, // opencl_generic
Eli Friedmand13b41e2012-10-12 23:32:00 +00002013 1, // cuda_device
2014 2, // cuda_constant
2015 3 // cuda_shared
2016};
2017
Tom Stellarda96344b2014-08-21 13:58:40 +00002018// If you edit the description strings, make sure you update
2019// getPointerWidthV().
2020
Craig Topper273dbc62015-10-18 05:29:26 +00002021static const char *const DataLayoutStringR600 =
Rafael Espindola29db13a2014-01-03 18:13:17 +00002022 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
2023 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00002024
Craig Topper273dbc62015-10-18 05:29:26 +00002025static const char *const DataLayoutStringSI =
Matt Arsenault6dc455f2016-05-31 16:58:18 +00002026 "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 +00002027 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
2028 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00002029
Matt Arsenault250024f2016-06-08 01:56:42 +00002030class AMDGPUTargetInfo final : public TargetInfo {
Matt Arsenault56f008d2014-06-24 20:45:01 +00002031 static const Builtin::Info BuiltinInfo[];
Tom Stellard7b1059b2015-04-14 14:36:56 +00002032 static const char * const GCCRegNames[];
Matt Arsenault56f008d2014-06-24 20:45:01 +00002033
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002034 /// \brief The GPU profiles supported by the AMDGPU target.
Tom Stellardc74b1e02013-03-04 17:40:53 +00002035 enum GPUKind {
2036 GK_NONE,
2037 GK_R600,
2038 GK_R600_DOUBLE_OPS,
2039 GK_R700,
2040 GK_R700_DOUBLE_OPS,
2041 GK_EVERGREEN,
2042 GK_EVERGREEN_DOUBLE_OPS,
2043 GK_NORTHERN_ISLANDS,
2044 GK_CAYMAN,
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002045 GK_GFX6,
2046 GK_GFX7,
Matt Arsenaulteb952fd2017-02-18 19:02:41 +00002047 GK_GFX8,
2048 GK_GFX9
Tom Stellardc74b1e02013-03-04 17:40:53 +00002049 } GPU;
2050
Jan Veselyeebeaea2015-05-04 19:53:36 +00002051 bool hasFP64:1;
2052 bool hasFMAF:1;
2053 bool hasLDEXPF:1;
Yaxun Liud3e85b92016-09-13 17:37:09 +00002054 bool hasFullSpeedFP32Denorms:1;
Jan Veselya3abd6d2015-05-01 17:38:13 +00002055
Matt Arsenault250024f2016-06-08 01:56:42 +00002056 static bool isAMDGCN(const llvm::Triple &TT) {
2057 return TT.getArch() == llvm::Triple::amdgcn;
2058 }
2059
Eli Friedmand13b41e2012-10-12 23:32:00 +00002060public:
Yaxun Liu2c17e822016-08-09 19:43:38 +00002061 AMDGPUTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Matt Arsenault250024f2016-06-08 01:56:42 +00002062 : TargetInfo(Triple) ,
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002063 GPU(isAMDGCN(Triple) ? GK_GFX6 : GK_R600),
Matt Arsenault250024f2016-06-08 01:56:42 +00002064 hasFP64(false),
2065 hasFMAF(false),
Yaxun Liu2c17e822016-08-09 19:43:38 +00002066 hasLDEXPF(false),
Yaxun Liud3e85b92016-09-13 17:37:09 +00002067 hasFullSpeedFP32Denorms(false){
Matt Arsenault250024f2016-06-08 01:56:42 +00002068 if (getTriple().getArch() == llvm::Triple::amdgcn) {
Jan Veselya3abd6d2015-05-01 17:38:13 +00002069 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00002070 hasFMAF = true;
2071 hasLDEXPF = true;
Tom Stellardd99fb952015-01-28 15:38:44 +00002072 }
Matt Arsenault250024f2016-06-08 01:56:42 +00002073
2074 resetDataLayout(getTriple().getArch() == llvm::Triple::amdgcn ?
2075 DataLayoutStringSI : DataLayoutStringR600);
2076
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002077 AddrSpaceMap = &AMDGPUAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00002078 UseAddrSpaceMapMangling = true;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002079 }
2080
Tom Stellarda96344b2014-08-21 13:58:40 +00002081 uint64_t getPointerWidthV(unsigned AddrSpace) const override {
2082 if (GPU <= GK_CAYMAN)
2083 return 32;
2084
2085 switch(AddrSpace) {
2086 default:
2087 return 64;
2088 case 0:
2089 case 3:
2090 case 5:
2091 return 32;
2092 }
2093 }
2094
Yaxun Liu26f75662016-08-19 05:17:25 +00002095 uint64_t getMaxPointerWidth() const override {
2096 return getTriple().getArch() == llvm::Triple::amdgcn ? 64 : 32;
2097 }
2098
Craig Topper3164f332014-03-11 03:39:26 +00002099 const char * getClobbers() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00002100 return "";
2101 }
2102
Craig Topperf054e3a2015-10-19 03:52:27 +00002103 ArrayRef<const char *> getGCCRegNames() const override;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002104
Craig Topperf054e3a2015-10-19 03:52:27 +00002105 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
2106 return None;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002107 }
2108
Craig Topper3164f332014-03-11 03:39:26 +00002109 bool validateAsmConstraint(const char *&Name,
Tom Stellardd097e942015-11-19 22:11:58 +00002110 TargetInfo::ConstraintInfo &Info) const override {
2111 switch (*Name) {
2112 default: break;
2113 case 'v': // vgpr
2114 case 's': // sgpr
2115 Info.setAllowsRegister();
2116 return true;
2117 }
2118 return false;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002119 }
2120
Matt Arsenault250024f2016-06-08 01:56:42 +00002121 bool initFeatureMap(llvm::StringMap<bool> &Features,
2122 DiagnosticsEngine &Diags, StringRef CPU,
2123 const std::vector<std::string> &FeatureVec) const override;
2124
Yaxun Liu2c17e822016-08-09 19:43:38 +00002125 void adjustTargetOptions(const CodeGenOptions &CGOpts,
2126 TargetOptions &TargetOpts) const override {
Yaxun Liu2c17e822016-08-09 19:43:38 +00002127 bool hasFP32Denormals = false;
2128 bool hasFP64Denormals = false;
2129 for (auto &I : TargetOpts.FeaturesAsWritten) {
2130 if (I == "+fp32-denormals" || I == "-fp32-denormals")
2131 hasFP32Denormals = true;
Matt Arsenault09cca092017-01-23 22:31:14 +00002132 if (I == "+fp64-fp16-denormals" || I == "-fp64-fp16-denormals")
Yaxun Liu2c17e822016-08-09 19:43:38 +00002133 hasFP64Denormals = true;
2134 }
2135 if (!hasFP32Denormals)
Yaxun Liud3e85b92016-09-13 17:37:09 +00002136 TargetOpts.Features.push_back((Twine(hasFullSpeedFP32Denorms &&
2137 !CGOpts.FlushDenorm ? '+' : '-') + Twine("fp32-denormals")).str());
Matt Arsenault09cca092017-01-23 22:31:14 +00002138 // Always do not flush fp64 or fp16 denorms.
Yaxun Liu2c17e822016-08-09 19:43:38 +00002139 if (!hasFP64Denormals && hasFP64)
Matt Arsenault09cca092017-01-23 22:31:14 +00002140 TargetOpts.Features.push_back("+fp64-fp16-denormals");
Yaxun Liu2c17e822016-08-09 19:43:38 +00002141 }
2142
Craig Topper6c03a542015-10-19 04:51:35 +00002143 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
2144 return llvm::makeArrayRef(BuiltinInfo,
2145 clang::AMDGPU::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eli Friedmand13b41e2012-10-12 23:32:00 +00002146 }
2147
Craig Topper3164f332014-03-11 03:39:26 +00002148 void getTargetDefines(const LangOptions &Opts,
2149 MacroBuilder &Builder) const override {
Matt Arsenault5e020b22016-02-27 09:06:26 +00002150 if (getTriple().getArch() == llvm::Triple::amdgcn)
2151 Builder.defineMacro("__AMDGCN__");
2152 else
2153 Builder.defineMacro("__R600__");
2154
Jan Veselyeebeaea2015-05-04 19:53:36 +00002155 if (hasFMAF)
2156 Builder.defineMacro("__HAS_FMAF__");
2157 if (hasLDEXPF)
2158 Builder.defineMacro("__HAS_LDEXPF__");
Jan Vesely211ba782016-06-17 02:25:03 +00002159 if (hasFP64)
2160 Builder.defineMacro("__HAS_FP64__");
Eli Friedmand13b41e2012-10-12 23:32:00 +00002161 }
2162
Craig Topper3164f332014-03-11 03:39:26 +00002163 BuiltinVaListKind getBuiltinVaListKind() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00002164 return TargetInfo::CharPtrBuiltinVaList;
2165 }
2166
Matt Arsenault250024f2016-06-08 01:56:42 +00002167 static GPUKind parseR600Name(StringRef Name) {
2168 return llvm::StringSwitch<GPUKind>(Name)
Tom Stellardc74b1e02013-03-04 17:40:53 +00002169 .Case("r600" , GK_R600)
2170 .Case("rv610", GK_R600)
2171 .Case("rv620", GK_R600)
2172 .Case("rv630", GK_R600)
2173 .Case("rv635", GK_R600)
2174 .Case("rs780", GK_R600)
2175 .Case("rs880", GK_R600)
2176 .Case("rv670", GK_R600_DOUBLE_OPS)
2177 .Case("rv710", GK_R700)
2178 .Case("rv730", GK_R700)
2179 .Case("rv740", GK_R700_DOUBLE_OPS)
2180 .Case("rv770", GK_R700_DOUBLE_OPS)
2181 .Case("palm", GK_EVERGREEN)
2182 .Case("cedar", GK_EVERGREEN)
2183 .Case("sumo", GK_EVERGREEN)
2184 .Case("sumo2", GK_EVERGREEN)
2185 .Case("redwood", GK_EVERGREEN)
2186 .Case("juniper", GK_EVERGREEN)
2187 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
2188 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
2189 .Case("barts", GK_NORTHERN_ISLANDS)
2190 .Case("turks", GK_NORTHERN_ISLANDS)
2191 .Case("caicos", GK_NORTHERN_ISLANDS)
2192 .Case("cayman", GK_CAYMAN)
2193 .Case("aruba", GK_CAYMAN)
Matt Arsenault250024f2016-06-08 01:56:42 +00002194 .Default(GK_NONE);
2195 }
2196
2197 static GPUKind parseAMDGCNName(StringRef Name) {
2198 return llvm::StringSwitch<GPUKind>(Name)
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002199 .Case("tahiti", GK_GFX6)
2200 .Case("pitcairn", GK_GFX6)
2201 .Case("verde", GK_GFX6)
2202 .Case("oland", GK_GFX6)
2203 .Case("hainan", GK_GFX6)
2204 .Case("bonaire", GK_GFX7)
2205 .Case("kabini", GK_GFX7)
2206 .Case("kaveri", GK_GFX7)
2207 .Case("hawaii", GK_GFX7)
2208 .Case("mullins", GK_GFX7)
Yaxun Liue59a0bc2016-10-26 16:40:21 +00002209 .Case("gfx700", GK_GFX7)
2210 .Case("gfx701", GK_GFX7)
2211 .Case("gfx702", GK_GFX7)
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002212 .Case("tonga", GK_GFX8)
2213 .Case("iceland", GK_GFX8)
2214 .Case("carrizo", GK_GFX8)
2215 .Case("fiji", GK_GFX8)
2216 .Case("stoney", GK_GFX8)
2217 .Case("polaris10", GK_GFX8)
2218 .Case("polaris11", GK_GFX8)
Yaxun Liue59a0bc2016-10-26 16:40:21 +00002219 .Case("gfx800", GK_GFX8)
2220 .Case("gfx801", GK_GFX8)
2221 .Case("gfx802", GK_GFX8)
2222 .Case("gfx803", GK_GFX8)
2223 .Case("gfx804", GK_GFX8)
2224 .Case("gfx810", GK_GFX8)
Matt Arsenaulteb952fd2017-02-18 19:02:41 +00002225 .Case("gfx900", GK_GFX9)
2226 .Case("gfx901", GK_GFX9)
Tom Stellardc74b1e02013-03-04 17:40:53 +00002227 .Default(GK_NONE);
Matt Arsenault250024f2016-06-08 01:56:42 +00002228 }
Tom Stellardc74b1e02013-03-04 17:40:53 +00002229
Matt Arsenault250024f2016-06-08 01:56:42 +00002230 bool setCPU(const std::string &Name) override {
2231 if (getTriple().getArch() == llvm::Triple::amdgcn)
2232 GPU = parseAMDGCNName(Name);
2233 else
2234 GPU = parseR600Name(Name);
Tom Stellardc74b1e02013-03-04 17:40:53 +00002235
Matt Arsenault250024f2016-06-08 01:56:42 +00002236 return GPU != GK_NONE;
Tom Stellardc74b1e02013-03-04 17:40:53 +00002237 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002238
Jan Vesely211ba782016-06-17 02:25:03 +00002239 void setSupportedOpenCLOpts() override {
2240 auto &Opts = getSupportedOpenCLOpts();
Yaxun Liu5b746652016-12-18 05:18:55 +00002241 Opts.support("cl_clang_storage_class_specifiers");
2242 Opts.support("cl_khr_icd");
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002243
Jan Vesely211ba782016-06-17 02:25:03 +00002244 if (hasFP64)
Yaxun Liu5b746652016-12-18 05:18:55 +00002245 Opts.support("cl_khr_fp64");
Jan Vesely211ba782016-06-17 02:25:03 +00002246 if (GPU >= GK_EVERGREEN) {
Yaxun Liu5b746652016-12-18 05:18:55 +00002247 Opts.support("cl_khr_byte_addressable_store");
2248 Opts.support("cl_khr_global_int32_base_atomics");
2249 Opts.support("cl_khr_global_int32_extended_atomics");
2250 Opts.support("cl_khr_local_int32_base_atomics");
2251 Opts.support("cl_khr_local_int32_extended_atomics");
Jan Vesely211ba782016-06-17 02:25:03 +00002252 }
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002253 if (GPU >= GK_GFX6) {
Yaxun Liu5b746652016-12-18 05:18:55 +00002254 Opts.support("cl_khr_fp16");
2255 Opts.support("cl_khr_int64_base_atomics");
2256 Opts.support("cl_khr_int64_extended_atomics");
2257 Opts.support("cl_khr_mipmap_image");
2258 Opts.support("cl_khr_subgroups");
2259 Opts.support("cl_khr_3d_image_writes");
2260 Opts.support("cl_amd_media_ops");
2261 Opts.support("cl_amd_media_ops2");
Jan Vesely211ba782016-06-17 02:25:03 +00002262 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002263 }
Nikolay Haustov8c6538b2016-06-30 09:06:33 +00002264
Yaxun Liu99444cb2016-08-03 20:38:06 +00002265 LangAS::ID getOpenCLImageAddrSpace() const override {
2266 return LangAS::opencl_constant;
2267 }
2268
Konstantin Zhuravlyovd1ba16e2017-03-08 23:56:48 +00002269 /// \returns Target specific vtbl ptr address space.
2270 unsigned getVtblPtrAddressSpace() const override {
2271 // \todo: We currently have address spaces defined in AMDGPU Backend. It
2272 // would be nice if we could use it here instead of using bare numbers (same
2273 // applies to getDWARFAddressSpace).
2274 return 2; // constant.
2275 }
2276
2277 /// \returns If a target requires an address within a target specific address
2278 /// space \p AddressSpace to be converted in order to be used, then return the
2279 /// corresponding target specific DWARF address space.
2280 ///
2281 /// \returns Otherwise return None and no conversion will be emitted in the
2282 /// DWARF.
2283 Optional<unsigned> getDWARFAddressSpace(
2284 unsigned AddressSpace) const override {
2285 switch (AddressSpace) {
2286 case 0: // LLVM Private.
2287 return 1; // DWARF Private.
2288 case 3: // LLVM Local.
2289 return 2; // DWARF Local.
2290 default:
2291 return None;
2292 }
2293 }
2294
Nikolay Haustov8c6538b2016-06-30 09:06:33 +00002295 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
2296 switch (CC) {
2297 default:
2298 return CCCR_Warning;
2299 case CC_C:
2300 case CC_OpenCLKernel:
2301 return CCCR_OK;
2302 }
2303 }
Yaxun Liu402804b2016-12-15 08:09:08 +00002304
2305 // In amdgcn target the null pointer in global, constant, and generic
2306 // address space has value 0 but in private and local address space has
2307 // value ~0.
2308 uint64_t getNullPointerValue(unsigned AS) const override {
Matt Arsenaultbf5e3e42017-03-13 19:47:53 +00002309 return AS == LangAS::opencl_local ? ~0 : 0;
Yaxun Liu402804b2016-12-15 08:09:08 +00002310 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00002311};
2312
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002313const Builtin::Info AMDGPUTargetInfo::BuiltinInfo[] = {
Matt Arsenault56f008d2014-06-24 20:45:01 +00002314#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00002315 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Matt Arsenault250024f2016-06-08 01:56:42 +00002316#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
2317 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002318#include "clang/Basic/BuiltinsAMDGPU.def"
Matt Arsenault56f008d2014-06-24 20:45:01 +00002319};
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002320const char * const AMDGPUTargetInfo::GCCRegNames[] = {
Tom Stellard7b1059b2015-04-14 14:36:56 +00002321 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
2322 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
2323 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
2324 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
2325 "v32", "v33", "v34", "v35", "v36", "v37", "v38", "v39",
2326 "v40", "v41", "v42", "v43", "v44", "v45", "v46", "v47",
2327 "v48", "v49", "v50", "v51", "v52", "v53", "v54", "v55",
2328 "v56", "v57", "v58", "v59", "v60", "v61", "v62", "v63",
2329 "v64", "v65", "v66", "v67", "v68", "v69", "v70", "v71",
2330 "v72", "v73", "v74", "v75", "v76", "v77", "v78", "v79",
2331 "v80", "v81", "v82", "v83", "v84", "v85", "v86", "v87",
2332 "v88", "v89", "v90", "v91", "v92", "v93", "v94", "v95",
2333 "v96", "v97", "v98", "v99", "v100", "v101", "v102", "v103",
2334 "v104", "v105", "v106", "v107", "v108", "v109", "v110", "v111",
2335 "v112", "v113", "v114", "v115", "v116", "v117", "v118", "v119",
2336 "v120", "v121", "v122", "v123", "v124", "v125", "v126", "v127",
2337 "v128", "v129", "v130", "v131", "v132", "v133", "v134", "v135",
2338 "v136", "v137", "v138", "v139", "v140", "v141", "v142", "v143",
2339 "v144", "v145", "v146", "v147", "v148", "v149", "v150", "v151",
2340 "v152", "v153", "v154", "v155", "v156", "v157", "v158", "v159",
2341 "v160", "v161", "v162", "v163", "v164", "v165", "v166", "v167",
2342 "v168", "v169", "v170", "v171", "v172", "v173", "v174", "v175",
2343 "v176", "v177", "v178", "v179", "v180", "v181", "v182", "v183",
2344 "v184", "v185", "v186", "v187", "v188", "v189", "v190", "v191",
2345 "v192", "v193", "v194", "v195", "v196", "v197", "v198", "v199",
2346 "v200", "v201", "v202", "v203", "v204", "v205", "v206", "v207",
2347 "v208", "v209", "v210", "v211", "v212", "v213", "v214", "v215",
2348 "v216", "v217", "v218", "v219", "v220", "v221", "v222", "v223",
2349 "v224", "v225", "v226", "v227", "v228", "v229", "v230", "v231",
2350 "v232", "v233", "v234", "v235", "v236", "v237", "v238", "v239",
2351 "v240", "v241", "v242", "v243", "v244", "v245", "v246", "v247",
2352 "v248", "v249", "v250", "v251", "v252", "v253", "v254", "v255",
2353 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
2354 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
2355 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
2356 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
2357 "s32", "s33", "s34", "s35", "s36", "s37", "s38", "s39",
2358 "s40", "s41", "s42", "s43", "s44", "s45", "s46", "s47",
2359 "s48", "s49", "s50", "s51", "s52", "s53", "s54", "s55",
2360 "s56", "s57", "s58", "s59", "s60", "s61", "s62", "s63",
2361 "s64", "s65", "s66", "s67", "s68", "s69", "s70", "s71",
2362 "s72", "s73", "s74", "s75", "s76", "s77", "s78", "s79",
2363 "s80", "s81", "s82", "s83", "s84", "s85", "s86", "s87",
2364 "s88", "s89", "s90", "s91", "s92", "s93", "s94", "s95",
2365 "s96", "s97", "s98", "s99", "s100", "s101", "s102", "s103",
2366 "s104", "s105", "s106", "s107", "s108", "s109", "s110", "s111",
2367 "s112", "s113", "s114", "s115", "s116", "s117", "s118", "s119",
Etienne Bergerone8ae26f2016-03-24 18:29:24 +00002368 "s120", "s121", "s122", "s123", "s124", "s125", "s126", "s127",
Matt Arsenaultb015d622016-02-27 09:06:22 +00002369 "exec", "vcc", "scc", "m0", "flat_scratch", "exec_lo", "exec_hi",
2370 "vcc_lo", "vcc_hi", "flat_scratch_lo", "flat_scratch_hi"
Tom Stellard7b1059b2015-04-14 14:36:56 +00002371};
2372
Craig Topperf054e3a2015-10-19 03:52:27 +00002373ArrayRef<const char *> AMDGPUTargetInfo::getGCCRegNames() const {
2374 return llvm::makeArrayRef(GCCRegNames);
Tom Stellard7b1059b2015-04-14 14:36:56 +00002375}
Matt Arsenault56f008d2014-06-24 20:45:01 +00002376
Matt Arsenault250024f2016-06-08 01:56:42 +00002377bool AMDGPUTargetInfo::initFeatureMap(
2378 llvm::StringMap<bool> &Features,
2379 DiagnosticsEngine &Diags, StringRef CPU,
2380 const std::vector<std::string> &FeatureVec) const {
2381
2382 // XXX - What does the member GPU mean if device name string passed here?
2383 if (getTriple().getArch() == llvm::Triple::amdgcn) {
2384 if (CPU.empty())
2385 CPU = "tahiti";
2386
2387 switch (parseAMDGCNName(CPU)) {
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002388 case GK_GFX6:
2389 case GK_GFX7:
Matt Arsenault250024f2016-06-08 01:56:42 +00002390 break;
2391
Matt Arsenaulta0c6dca2017-02-22 20:55:59 +00002392 case GK_GFX9:
2393 Features["gfx9-insts"] = true;
2394 LLVM_FALLTHROUGH;
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002395 case GK_GFX8:
Matt Arsenault250024f2016-06-08 01:56:42 +00002396 Features["s-memrealtime"] = true;
2397 Features["16-bit-insts"] = true;
Yaxun Liu4d867992017-03-10 01:30:46 +00002398 Features["dpp"] = true;
Matt Arsenault250024f2016-06-08 01:56:42 +00002399 break;
2400
2401 case GK_NONE:
2402 return false;
2403 default:
2404 llvm_unreachable("unhandled subtarget");
2405 }
2406 } else {
2407 if (CPU.empty())
2408 CPU = "r600";
2409
2410 switch (parseR600Name(CPU)) {
2411 case GK_R600:
2412 case GK_R700:
2413 case GK_EVERGREEN:
2414 case GK_NORTHERN_ISLANDS:
2415 break;
2416 case GK_R600_DOUBLE_OPS:
2417 case GK_R700_DOUBLE_OPS:
2418 case GK_EVERGREEN_DOUBLE_OPS:
2419 case GK_CAYMAN:
2420 Features["fp64"] = true;
2421 break;
2422 case GK_NONE:
2423 return false;
2424 default:
2425 llvm_unreachable("unhandled subtarget");
2426 }
2427 }
2428
2429 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeatureVec);
2430}
2431
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00002432const Builtin::Info BuiltinInfoX86[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00002433#define BUILTIN(ID, TYPE, ATTRS) \
2434 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002435#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
Craig Topper07d3b622015-08-07 05:14:44 +00002436 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Albert Gutowski727ab8a2016-09-14 21:19:43 +00002437#define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANGS, FEATURE) \
2438 { #ID, TYPE, ATTRS, HEADER, LANGS, FEATURE },
Chris Lattner5abdec72009-06-14 01:05:48 +00002439#include "clang/Basic/BuiltinsX86.def"
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00002440
2441#define BUILTIN(ID, TYPE, ATTRS) \
2442 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Albert Gutowski0fd6e962016-10-12 17:28:44 +00002443#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
2444 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00002445#define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANGS, FEATURE) \
2446 { #ID, TYPE, ATTRS, HEADER, LANGS, FEATURE },
2447#include "clang/Basic/BuiltinsX86_64.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00002448};
Eli Friedmanb5366062008-05-20 14:21:01 +00002449
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00002450
Nuno Lopescfca1f02009-12-23 17:49:57 +00002451static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002452 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
2453 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00002454 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002455 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
2456 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
2457 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00002458 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00002459 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
2460 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Marina Yatsina41c45fa2016-02-03 11:32:08 +00002461 "xmm16", "xmm17", "xmm18", "xmm19", "xmm20", "xmm21", "xmm22", "xmm23",
2462 "xmm24", "xmm25", "xmm26", "xmm27", "xmm28", "xmm29", "xmm30", "xmm31",
2463 "ymm16", "ymm17", "ymm18", "ymm19", "ymm20", "ymm21", "ymm22", "ymm23",
2464 "ymm24", "ymm25", "ymm26", "ymm27", "ymm28", "ymm29", "ymm30", "ymm31",
2465 "zmm0", "zmm1", "zmm2", "zmm3", "zmm4", "zmm5", "zmm6", "zmm7",
2466 "zmm8", "zmm9", "zmm10", "zmm11", "zmm12", "zmm13", "zmm14", "zmm15",
2467 "zmm16", "zmm17", "zmm18", "zmm19", "zmm20", "zmm21", "zmm22", "zmm23",
2468 "zmm24", "zmm25", "zmm26", "zmm27", "zmm28", "zmm29", "zmm30", "zmm31",
Michael Zuckerman15604b92016-10-31 14:16:57 +00002469 "k0", "k1", "k2", "k3", "k4", "k5", "k6", "k7",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002470};
2471
Eric Christophercdd36352011-06-21 00:05:20 +00002472const TargetInfo::AddlRegName AddlRegNames[] = {
2473 { { "al", "ah", "eax", "rax" }, 0 },
2474 { { "bl", "bh", "ebx", "rbx" }, 3 },
2475 { { "cl", "ch", "ecx", "rcx" }, 2 },
2476 { { "dl", "dh", "edx", "rdx" }, 1 },
2477 { { "esi", "rsi" }, 4 },
2478 { { "edi", "rdi" }, 5 },
2479 { { "esp", "rsp" }, 7 },
2480 { { "ebp", "rbp" }, 6 },
Alexey Bataeva7ab1b42015-09-04 03:42:23 +00002481 { { "r8d", "r8w", "r8b" }, 38 },
2482 { { "r9d", "r9w", "r9b" }, 39 },
2483 { { "r10d", "r10w", "r10b" }, 40 },
2484 { { "r11d", "r11w", "r11b" }, 41 },
2485 { { "r12d", "r12w", "r12b" }, 42 },
2486 { { "r13d", "r13w", "r13b" }, 43 },
2487 { { "r14d", "r14w", "r14b" }, 44 },
2488 { { "r15d", "r15w", "r15b" }, 45 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00002489};
2490
2491// X86 target abstract base class; x86-32 and x86-64 are very close, so
2492// most of the implementation can be shared.
2493class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00002494 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002495 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Craig Topper543f3bd2015-10-14 23:47:57 +00002496 } SSELevel = NoSSE;
Eli Friedman33465822011-07-08 23:31:17 +00002497 enum MMX3DNowEnum {
2498 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
Craig Topper543f3bd2015-10-14 23:47:57 +00002499 } MMX3DNowLevel = NoMMX3DNow;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002500 enum XOPEnum {
2501 NoXOP,
2502 SSE4A,
2503 FMA4,
2504 XOP
Craig Topper543f3bd2015-10-14 23:47:57 +00002505 } XOPLevel = NoXOP;
Anders Carlssone437c682010-01-27 03:47:49 +00002506
Craig Topper543f3bd2015-10-14 23:47:57 +00002507 bool HasAES = false;
2508 bool HasPCLMUL = false;
2509 bool HasLZCNT = false;
2510 bool HasRDRND = false;
2511 bool HasFSGSBASE = false;
2512 bool HasBMI = false;
2513 bool HasBMI2 = false;
2514 bool HasPOPCNT = false;
2515 bool HasRTM = false;
2516 bool HasPRFCHW = false;
2517 bool HasRDSEED = false;
2518 bool HasADX = false;
2519 bool HasTBM = false;
2520 bool HasFMA = false;
2521 bool HasF16C = false;
2522 bool HasAVX512CD = false;
2523 bool HasAVX512ER = false;
2524 bool HasAVX512PF = false;
2525 bool HasAVX512DQ = false;
2526 bool HasAVX512BW = false;
2527 bool HasAVX512VL = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002528 bool HasAVX512VBMI = false;
2529 bool HasAVX512IFMA = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002530 bool HasSHA = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002531 bool HasMPX = false;
2532 bool HasSGX = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002533 bool HasCX16 = false;
Craig Toppere33f51f2015-10-16 06:22:36 +00002534 bool HasFXSR = false;
Craig Topperda9fe562015-10-15 05:23:38 +00002535 bool HasXSAVE = false;
2536 bool HasXSAVEOPT = false;
2537 bool HasXSAVEC = false;
2538 bool HasXSAVES = false;
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00002539 bool HasMWAITX = false;
Craig Topper45742262017-02-09 06:10:14 +00002540 bool HasCLZERO = false;
Asaf Badouha9d1e182015-12-31 14:14:07 +00002541 bool HasPKU = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002542 bool HasCLFLUSHOPT = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002543 bool HasCLWB = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002544 bool HasMOVBE = false;
2545 bool HasPREFETCHWT1 = false;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00002546
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002547 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
2548 ///
2549 /// Each enumeration represents a particular CPU supported by Clang. These
2550 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
2551 enum CPUKind {
2552 CK_Generic,
2553
2554 /// \name i386
2555 /// i386-generation processors.
2556 //@{
2557 CK_i386,
2558 //@}
2559
2560 /// \name i486
2561 /// i486-generation processors.
2562 //@{
2563 CK_i486,
2564 CK_WinChipC6,
2565 CK_WinChip2,
2566 CK_C3,
2567 //@}
2568
2569 /// \name i586
2570 /// i586-generation processors, P5 microarchitecture based.
2571 //@{
2572 CK_i586,
2573 CK_Pentium,
2574 CK_PentiumMMX,
2575 //@}
2576
2577 /// \name i686
2578 /// i686-generation processors, P6 / Pentium M microarchitecture based.
2579 //@{
2580 CK_i686,
2581 CK_PentiumPro,
2582 CK_Pentium2,
2583 CK_Pentium3,
2584 CK_Pentium3M,
2585 CK_PentiumM,
2586 CK_C3_2,
2587
2588 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
2589 /// Clang however has some logic to suport this.
2590 // FIXME: Warn, deprecate, and potentially remove this.
2591 CK_Yonah,
2592 //@}
2593
2594 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00002595 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002596 //@{
2597 CK_Pentium4,
2598 CK_Pentium4M,
2599 CK_Prescott,
2600 CK_Nocona,
2601 //@}
2602
2603 /// \name Core
2604 /// Core microarchitecture based processors.
2605 //@{
2606 CK_Core2,
2607
2608 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
2609 /// codename which GCC no longer accepts as an option to -march, but Clang
2610 /// has some logic for recognizing it.
2611 // FIXME: Warn, deprecate, and potentially remove this.
2612 CK_Penryn,
2613 //@}
2614
2615 /// \name Atom
2616 /// Atom processors
2617 //@{
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002618 CK_Bonnell,
Preston Gurda3c58c02013-09-13 19:27:17 +00002619 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002620 //@}
2621
2622 /// \name Nehalem
2623 /// Nehalem microarchitecture based processors.
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002624 CK_Nehalem,
2625
2626 /// \name Westmere
2627 /// Westmere microarchitecture based processors.
2628 CK_Westmere,
2629
2630 /// \name Sandy Bridge
2631 /// Sandy Bridge microarchitecture based processors.
2632 CK_SandyBridge,
2633
2634 /// \name Ivy Bridge
2635 /// Ivy Bridge microarchitecture based processors.
2636 CK_IvyBridge,
2637
2638 /// \name Haswell
2639 /// Haswell microarchitecture based processors.
2640 CK_Haswell,
2641
2642 /// \name Broadwell
2643 /// Broadwell microarchitecture based processors.
Robert Khasanov50e6f582014-09-19 09:53:48 +00002644 CK_Broadwell,
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002645
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002646 /// \name Skylake Client
2647 /// Skylake client microarchitecture based processors.
2648 CK_SkylakeClient,
2649
2650 /// \name Skylake Server
2651 /// Skylake server microarchitecture based processors.
2652 CK_SkylakeServer,
2653
2654 /// \name Cannonlake Client
2655 /// Cannonlake client microarchitecture based processors.
2656 CK_Cannonlake,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002657
Craig Topper449314e2013-08-20 07:09:39 +00002658 /// \name Knights Landing
2659 /// Knights Landing processor.
2660 CK_KNL,
2661
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002662 /// \name Lakemont
2663 /// Lakemont microarchitecture based processors.
2664 CK_Lakemont,
2665
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002666 /// \name K6
2667 /// K6 architecture processors.
2668 //@{
2669 CK_K6,
2670 CK_K6_2,
2671 CK_K6_3,
2672 //@}
2673
2674 /// \name K7
2675 /// K7 architecture processors.
2676 //@{
2677 CK_Athlon,
2678 CK_AthlonThunderbird,
2679 CK_Athlon4,
2680 CK_AthlonXP,
2681 CK_AthlonMP,
2682 //@}
2683
2684 /// \name K8
2685 /// K8 architecture processors.
2686 //@{
2687 CK_Athlon64,
2688 CK_Athlon64SSE3,
2689 CK_AthlonFX,
2690 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00002691 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002692 CK_Opteron,
2693 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00002694 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002695 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002696
Benjamin Kramer569f2152012-01-10 11:50:18 +00002697 /// \name Bobcat
2698 /// Bobcat architecture processors.
2699 //@{
2700 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002701 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002702 //@}
2703
2704 /// \name Bulldozer
2705 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002706 //@{
2707 CK_BDVER1,
2708 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002709 CK_BDVER3,
Benjamin Kramer56c58222014-05-02 15:47:51 +00002710 CK_BDVER4,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002711 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002712
Craig Topperc45744a2017-01-10 06:02:12 +00002713 /// \name zen
2714 /// Zen architecture processors.
2715 //@{
2716 CK_ZNVER1,
2717 //@}
2718
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002719 /// This specification is deprecated and will be removed in the future.
2720 /// Users should prefer \see CK_K8.
2721 // FIXME: Warn on this when the CPU is set to it.
Saleem Abdulrasoolcb29c1a2014-11-17 18:40:15 +00002722 //@{
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002723 CK_x86_64,
2724 //@}
2725
2726 /// \name Geode
2727 /// Geode processors.
2728 //@{
2729 CK_Geode
2730 //@}
Craig Topper543f3bd2015-10-14 23:47:57 +00002731 } CPU = CK_Generic;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002732
Eric Christopherc50738f2015-08-27 00:05:50 +00002733 CPUKind getCPUKind(StringRef CPU) const {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002734 return llvm::StringSwitch<CPUKind>(CPU)
2735 .Case("i386", CK_i386)
2736 .Case("i486", CK_i486)
2737 .Case("winchip-c6", CK_WinChipC6)
2738 .Case("winchip2", CK_WinChip2)
2739 .Case("c3", CK_C3)
2740 .Case("i586", CK_i586)
2741 .Case("pentium", CK_Pentium)
2742 .Case("pentium-mmx", CK_PentiumMMX)
2743 .Case("i686", CK_i686)
2744 .Case("pentiumpro", CK_PentiumPro)
2745 .Case("pentium2", CK_Pentium2)
2746 .Case("pentium3", CK_Pentium3)
2747 .Case("pentium3m", CK_Pentium3M)
2748 .Case("pentium-m", CK_PentiumM)
2749 .Case("c3-2", CK_C3_2)
2750 .Case("yonah", CK_Yonah)
2751 .Case("pentium4", CK_Pentium4)
2752 .Case("pentium4m", CK_Pentium4M)
2753 .Case("prescott", CK_Prescott)
2754 .Case("nocona", CK_Nocona)
2755 .Case("core2", CK_Core2)
2756 .Case("penryn", CK_Penryn)
2757 .Case("bonnell", CK_Bonnell)
2758 .Case("atom", CK_Bonnell) // Legacy name.
2759 .Case("silvermont", CK_Silvermont)
2760 .Case("slm", CK_Silvermont) // Legacy name.
2761 .Case("nehalem", CK_Nehalem)
2762 .Case("corei7", CK_Nehalem) // Legacy name.
2763 .Case("westmere", CK_Westmere)
2764 .Case("sandybridge", CK_SandyBridge)
2765 .Case("corei7-avx", CK_SandyBridge) // Legacy name.
2766 .Case("ivybridge", CK_IvyBridge)
2767 .Case("core-avx-i", CK_IvyBridge) // Legacy name.
2768 .Case("haswell", CK_Haswell)
2769 .Case("core-avx2", CK_Haswell) // Legacy name.
2770 .Case("broadwell", CK_Broadwell)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002771 .Case("skylake", CK_SkylakeClient)
2772 .Case("skylake-avx512", CK_SkylakeServer)
2773 .Case("skx", CK_SkylakeServer) // Legacy name.
2774 .Case("cannonlake", CK_Cannonlake)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002775 .Case("knl", CK_KNL)
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002776 .Case("lakemont", CK_Lakemont)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002777 .Case("k6", CK_K6)
2778 .Case("k6-2", CK_K6_2)
2779 .Case("k6-3", CK_K6_3)
2780 .Case("athlon", CK_Athlon)
2781 .Case("athlon-tbird", CK_AthlonThunderbird)
2782 .Case("athlon-4", CK_Athlon4)
2783 .Case("athlon-xp", CK_AthlonXP)
2784 .Case("athlon-mp", CK_AthlonMP)
2785 .Case("athlon64", CK_Athlon64)
2786 .Case("athlon64-sse3", CK_Athlon64SSE3)
2787 .Case("athlon-fx", CK_AthlonFX)
2788 .Case("k8", CK_K8)
2789 .Case("k8-sse3", CK_K8SSE3)
2790 .Case("opteron", CK_Opteron)
2791 .Case("opteron-sse3", CK_OpteronSSE3)
2792 .Case("barcelona", CK_AMDFAM10)
2793 .Case("amdfam10", CK_AMDFAM10)
2794 .Case("btver1", CK_BTVER1)
2795 .Case("btver2", CK_BTVER2)
2796 .Case("bdver1", CK_BDVER1)
2797 .Case("bdver2", CK_BDVER2)
2798 .Case("bdver3", CK_BDVER3)
2799 .Case("bdver4", CK_BDVER4)
Craig Topperc45744a2017-01-10 06:02:12 +00002800 .Case("znver1", CK_ZNVER1)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002801 .Case("x86-64", CK_x86_64)
2802 .Case("geode", CK_Geode)
2803 .Default(CK_Generic);
2804 }
2805
Rafael Espindolaeb265472013-08-21 21:59:03 +00002806 enum FPMathKind {
2807 FP_Default,
2808 FP_SSE,
2809 FP_387
Craig Topper543f3bd2015-10-14 23:47:57 +00002810 } FPMath = FP_Default;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002811
Eli Friedman3fd920a2008-08-20 02:34:37 +00002812public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00002813 X86TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
2814 : TargetInfo(Triple) {
Stephan Bergmann17c7f702016-12-14 11:57:17 +00002815 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended();
Chris Lattner1f5ad112006-10-14 18:32:12 +00002816 }
Craig Topper3164f332014-03-11 03:39:26 +00002817 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00002818 // X87 evaluates with 80 bits "long double" precision.
2819 return SSELevel == NoSSE ? 2 : 0;
2820 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002821 ArrayRef<const char *> getGCCRegNames() const override {
2822 return llvm::makeArrayRef(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00002823 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002824 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
2825 return None;
Eric Christophercdd36352011-06-21 00:05:20 +00002826 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002827 ArrayRef<TargetInfo::AddlRegName> getGCCAddlRegNames() const override {
2828 return llvm::makeArrayRef(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00002829 }
Eric Christopherd9832702015-06-29 21:00:05 +00002830 bool validateCpuSupports(StringRef Name) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002831 bool validateAsmConstraint(const char *&Name,
Eric Christopher917e9522014-11-18 22:36:15 +00002832 TargetInfo::ConstraintInfo &info) const override;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002833
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00002834 bool validateGlobalRegisterVariable(StringRef RegName,
2835 unsigned RegSize,
2836 bool &HasSizeMismatch) const override {
2837 // esp and ebp are the only 32-bit registers the x86 backend can currently
2838 // handle.
2839 if (RegName.equals("esp") || RegName.equals("ebp")) {
2840 // Check that the register size is 32-bit.
2841 HasSizeMismatch = RegSize != 32;
2842 return true;
2843 }
2844
2845 return false;
2846 }
2847
Akira Hatanaka974131e2014-09-18 18:17:18 +00002848 bool validateOutputSize(StringRef Constraint, unsigned Size) const override;
2849
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002850 bool validateInputSize(StringRef Constraint, unsigned Size) const override;
2851
Akira Hatanaka974131e2014-09-18 18:17:18 +00002852 virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const;
2853
Craig Topper3164f332014-03-11 03:39:26 +00002854 std::string convertConstraint(const char *&Constraint) const override;
2855 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002856 return "~{dirflag},~{fpsr},~{flags}";
2857 }
Marina Yatsinac42fd032016-12-26 12:23:42 +00002858
2859 StringRef getConstraintRegister(const StringRef &Constraint,
2860 const StringRef &Expression) const override {
2861 StringRef::iterator I, E;
2862 for (I = Constraint.begin(), E = Constraint.end(); I != E; ++I) {
2863 if (isalpha(*I))
2864 break;
2865 }
2866 if (I == E)
2867 return "";
2868 switch (*I) {
2869 // For the register constraints, return the matching register name
2870 case 'a':
2871 return "ax";
2872 case 'b':
2873 return "bx";
2874 case 'c':
2875 return "cx";
2876 case 'd':
2877 return "dx";
2878 case 'S':
2879 return "si";
2880 case 'D':
2881 return "di";
2882 // In case the constraint is 'r' we need to return Expression
2883 case 'r':
2884 return Expression;
2885 default:
2886 // Default value if there is no constraint for the register
2887 return "";
2888 }
2889 return "";
2890 }
2891
Craig Topper3164f332014-03-11 03:39:26 +00002892 void getTargetDefines(const LangOptions &Opts,
2893 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00002894 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
2895 bool Enabled);
2896 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
2897 bool Enabled);
2898 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
2899 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002900 void setFeatureEnabled(llvm::StringMap<bool> &Features,
2901 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00002902 setFeatureEnabledImpl(Features, Name, Enabled);
2903 }
2904 // This exists purely to cut down on the number of virtual calls in
Eric Christopheref1e2952015-08-28 02:13:58 +00002905 // initFeatureMap which calls this repeatedly.
Craig Topper86d79ef2013-09-17 04:51:29 +00002906 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2907 StringRef Name, bool Enabled);
Eric Christopher8c47b422015-10-09 18:39:55 +00002908 bool
2909 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
2910 StringRef CPU,
2911 const std::vector<std::string> &FeaturesVec) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002912 bool hasFeature(StringRef Feature) const override;
2913 bool handleTargetFeatures(std::vector<std::string> &Features,
2914 DiagnosticsEngine &Diags) override;
Alp Toker4925ba72014-06-07 23:30:42 +00002915 StringRef getABI() const override {
Ahmed Bougacha0b938282015-06-22 21:31:43 +00002916 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX512F)
2917 return "avx512";
Craig Topperd945d502015-10-20 00:00:17 +00002918 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002919 return "avx";
Craig Topperd945d502015-10-20 00:00:17 +00002920 if (getTriple().getArch() == llvm::Triple::x86 &&
Derek Schuffc7dd7222012-10-11 15:52:22 +00002921 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002922 return "no-mmx";
2923 return "";
Eli Friedman33465822011-07-08 23:31:17 +00002924 }
Craig Topper3164f332014-03-11 03:39:26 +00002925 bool setCPU(const std::string &Name) override {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002926 CPU = getCPUKind(Name);
Chandler Carruth212334f2011-09-28 08:55:37 +00002927
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002928 // Perform any per-CPU checks necessary to determine if this CPU is
2929 // acceptable.
2930 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
2931 // invalid without explaining *why*.
2932 switch (CPU) {
2933 case CK_Generic:
2934 // No processor selected!
2935 return false;
2936
2937 case CK_i386:
2938 case CK_i486:
2939 case CK_WinChipC6:
2940 case CK_WinChip2:
2941 case CK_C3:
2942 case CK_i586:
2943 case CK_Pentium:
2944 case CK_PentiumMMX:
2945 case CK_i686:
2946 case CK_PentiumPro:
2947 case CK_Pentium2:
2948 case CK_Pentium3:
2949 case CK_Pentium3M:
2950 case CK_PentiumM:
2951 case CK_Yonah:
2952 case CK_C3_2:
2953 case CK_Pentium4:
2954 case CK_Pentium4M:
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002955 case CK_Lakemont:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002956 case CK_Prescott:
2957 case CK_K6:
2958 case CK_K6_2:
2959 case CK_K6_3:
2960 case CK_Athlon:
2961 case CK_AthlonThunderbird:
2962 case CK_Athlon4:
2963 case CK_AthlonXP:
2964 case CK_AthlonMP:
2965 case CK_Geode:
2966 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002967 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002968 return false;
2969
2970 // Fallthrough
2971 case CK_Nocona:
2972 case CK_Core2:
2973 case CK_Penryn:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002974 case CK_Bonnell:
Preston Gurda3c58c02013-09-13 19:27:17 +00002975 case CK_Silvermont:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002976 case CK_Nehalem:
2977 case CK_Westmere:
2978 case CK_SandyBridge:
2979 case CK_IvyBridge:
2980 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002981 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002982 case CK_SkylakeClient:
2983 case CK_SkylakeServer:
2984 case CK_Cannonlake:
Craig Topper449314e2013-08-20 07:09:39 +00002985 case CK_KNL:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002986 case CK_Athlon64:
2987 case CK_Athlon64SSE3:
2988 case CK_AthlonFX:
2989 case CK_K8:
2990 case CK_K8SSE3:
2991 case CK_Opteron:
2992 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00002993 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00002994 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002995 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002996 case CK_BDVER1:
2997 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002998 case CK_BDVER3:
Benjamin Kramer56c58222014-05-02 15:47:51 +00002999 case CK_BDVER4:
Craig Topperc45744a2017-01-10 06:02:12 +00003000 case CK_ZNVER1:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00003001 case CK_x86_64:
3002 return true;
3003 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00003004 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003005 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003006
Craig Topper3164f332014-03-11 03:39:26 +00003007 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00003008
Craig Topper3164f332014-03-11 03:39:26 +00003009 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00003010 // Most of the non-ARM calling conventions are i386 conventions.
3011 switch (CC) {
3012 case CC_X86ThisCall:
3013 case CC_X86FastCall:
3014 case CC_X86StdCall:
3015 case CC_X86VectorCall:
Erich Keane757d3172016-11-02 18:29:35 +00003016 case CC_X86RegCall:
John McCall477f2bb2016-03-03 06:39:32 +00003017 case CC_C:
3018 case CC_Swift:
3019 case CC_X86Pascal:
3020 case CC_IntelOclBicc:
3021 return CCCR_OK;
3022 default:
3023 return CCCR_Warning;
3024 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003025 }
3026
Craig Topper3164f332014-03-11 03:39:26 +00003027 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00003028 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003029 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00003030
3031 bool hasSjLjLowering() const override {
3032 return true;
3033 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00003034
3035 void setSupportedOpenCLOpts() override {
Yaxun Liu5b746652016-12-18 05:18:55 +00003036 getSupportedOpenCLOpts().supportAll();
Yaxun Liu39cf40f2016-05-16 17:06:34 +00003037 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00003038};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00003039
Rafael Espindolaeb265472013-08-21 21:59:03 +00003040bool X86TargetInfo::setFPMath(StringRef Name) {
3041 if (Name == "387") {
3042 FPMath = FP_387;
3043 return true;
3044 }
3045 if (Name == "sse") {
3046 FPMath = FP_SSE;
3047 return true;
3048 }
3049 return false;
3050}
3051
Eric Christopher007b0a02015-08-28 22:32:01 +00003052bool X86TargetInfo::initFeatureMap(
3053 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
Eric Christopher8c47b422015-10-09 18:39:55 +00003054 const std::vector<std::string> &FeaturesVec) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003055 // FIXME: This *really* should not be here.
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003056 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00003057 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00003058 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003059
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003060 const CPUKind Kind = getCPUKind(CPU);
Andrey Turetskiy5f1cf5f2016-03-23 11:15:10 +00003061
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003062 // Enable X87 for all X86 processors but Lakemont.
3063 if (Kind != CK_Lakemont)
3064 setFeatureEnabledImpl(Features, "x87", true);
3065
3066 switch (Kind) {
Chandler Carruth212334f2011-09-28 08:55:37 +00003067 case CK_Generic:
3068 case CK_i386:
3069 case CK_i486:
3070 case CK_i586:
3071 case CK_Pentium:
3072 case CK_i686:
3073 case CK_PentiumPro:
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003074 case CK_Lakemont:
Chandler Carruth212334f2011-09-28 08:55:37 +00003075 break;
3076 case CK_PentiumMMX:
3077 case CK_Pentium2:
Craig Topperdb4dc082014-11-06 05:52:19 +00003078 case CK_K6:
3079 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00003080 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003081 break;
3082 case CK_Pentium3:
3083 case CK_Pentium3M:
Craig Topperdb4dc082014-11-06 05:52:19 +00003084 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00003085 setFeatureEnabledImpl(Features, "sse", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003086 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003087 break;
3088 case CK_PentiumM:
3089 case CK_Pentium4:
3090 case CK_Pentium4M:
3091 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00003092 setFeatureEnabledImpl(Features, "sse2", 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_Yonah:
3096 case CK_Prescott:
3097 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00003098 setFeatureEnabledImpl(Features, "sse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003099 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003100 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003101 break;
3102 case CK_Core2:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003103 case CK_Bonnell:
Craig Topper86d79ef2013-09-17 04:51:29 +00003104 setFeatureEnabledImpl(Features, "ssse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003105 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003106 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003107 break;
3108 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00003109 setFeatureEnabledImpl(Features, "sse4.1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003110 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003111 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003112 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003113 case CK_Cannonlake:
3114 setFeatureEnabledImpl(Features, "avx512ifma", true);
3115 setFeatureEnabledImpl(Features, "avx512vbmi", true);
3116 setFeatureEnabledImpl(Features, "sha", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003117 LLVM_FALLTHROUGH;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003118 case CK_SkylakeServer:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003119 setFeatureEnabledImpl(Features, "avx512f", true);
3120 setFeatureEnabledImpl(Features, "avx512cd", true);
3121 setFeatureEnabledImpl(Features, "avx512dq", true);
3122 setFeatureEnabledImpl(Features, "avx512bw", true);
3123 setFeatureEnabledImpl(Features, "avx512vl", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003124 setFeatureEnabledImpl(Features, "pku", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003125 setFeatureEnabledImpl(Features, "clwb", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003126 LLVM_FALLTHROUGH;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003127 case CK_SkylakeClient:
Craig Topperda9fe562015-10-15 05:23:38 +00003128 setFeatureEnabledImpl(Features, "xsavec", true);
3129 setFeatureEnabledImpl(Features, "xsaves", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003130 setFeatureEnabledImpl(Features, "mpx", true);
3131 setFeatureEnabledImpl(Features, "sgx", true);
3132 setFeatureEnabledImpl(Features, "clflushopt", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003133 LLVM_FALLTHROUGH;
Craig Topperdb4dc082014-11-06 05:52:19 +00003134 case CK_Broadwell:
3135 setFeatureEnabledImpl(Features, "rdseed", true);
3136 setFeatureEnabledImpl(Features, "adx", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003137 LLVM_FALLTHROUGH;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003138 case CK_Haswell:
Craig Topperdb4dc082014-11-06 05:52:19 +00003139 setFeatureEnabledImpl(Features, "avx2", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003140 setFeatureEnabledImpl(Features, "lzcnt", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003141 setFeatureEnabledImpl(Features, "bmi", true);
3142 setFeatureEnabledImpl(Features, "bmi2", true);
3143 setFeatureEnabledImpl(Features, "rtm", true);
3144 setFeatureEnabledImpl(Features, "fma", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003145 setFeatureEnabledImpl(Features, "movbe", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003146 LLVM_FALLTHROUGH;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003147 case CK_IvyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00003148 setFeatureEnabledImpl(Features, "rdrnd", true);
3149 setFeatureEnabledImpl(Features, "f16c", true);
3150 setFeatureEnabledImpl(Features, "fsgsbase", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003151 LLVM_FALLTHROUGH;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003152 case CK_SandyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00003153 setFeatureEnabledImpl(Features, "avx", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003154 setFeatureEnabledImpl(Features, "xsave", true);
3155 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003156 LLVM_FALLTHROUGH;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003157 case CK_Westmere:
Craig Topperdb4dc082014-11-06 05:52:19 +00003158 case CK_Silvermont:
3159 setFeatureEnabledImpl(Features, "aes", true);
3160 setFeatureEnabledImpl(Features, "pclmul", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003161 LLVM_FALLTHROUGH;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003162 case CK_Nehalem:
Craig Topperdb4dc082014-11-06 05:52:19 +00003163 setFeatureEnabledImpl(Features, "sse4.2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003164 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00003165 setFeatureEnabledImpl(Features, "cx16", true);
3166 break;
3167 case CK_KNL:
3168 setFeatureEnabledImpl(Features, "avx512f", true);
3169 setFeatureEnabledImpl(Features, "avx512cd", true);
3170 setFeatureEnabledImpl(Features, "avx512er", true);
3171 setFeatureEnabledImpl(Features, "avx512pf", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003172 setFeatureEnabledImpl(Features, "prefetchwt1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003173 setFeatureEnabledImpl(Features, "fxsr", true);
Robert Khasanov50e6f582014-09-19 09:53:48 +00003174 setFeatureEnabledImpl(Features, "rdseed", true);
3175 setFeatureEnabledImpl(Features, "adx", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00003176 setFeatureEnabledImpl(Features, "lzcnt", true);
3177 setFeatureEnabledImpl(Features, "bmi", true);
3178 setFeatureEnabledImpl(Features, "bmi2", true);
3179 setFeatureEnabledImpl(Features, "rtm", true);
3180 setFeatureEnabledImpl(Features, "fma", true);
3181 setFeatureEnabledImpl(Features, "rdrnd", true);
3182 setFeatureEnabledImpl(Features, "f16c", true);
3183 setFeatureEnabledImpl(Features, "fsgsbase", true);
3184 setFeatureEnabledImpl(Features, "aes", true);
3185 setFeatureEnabledImpl(Features, "pclmul", true);
3186 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003187 setFeatureEnabledImpl(Features, "xsaveopt", true);
3188 setFeatureEnabledImpl(Features, "xsave", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003189 setFeatureEnabledImpl(Features, "movbe", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003190 break;
3191 case CK_K6_2:
3192 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00003193 case CK_WinChip2:
3194 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00003195 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003196 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00003197 case CK_Athlon:
3198 case CK_AthlonThunderbird:
3199 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00003200 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00003201 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003202 case CK_Athlon4:
3203 case CK_AthlonXP:
3204 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00003205 setFeatureEnabledImpl(Features, "sse", true);
3206 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003207 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003208 break;
3209 case CK_K8:
3210 case CK_Opteron:
3211 case CK_Athlon64:
3212 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00003213 setFeatureEnabledImpl(Features, "sse2", true);
3214 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003215 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003216 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00003217 case CK_AMDFAM10:
3218 setFeatureEnabledImpl(Features, "sse4a", true);
3219 setFeatureEnabledImpl(Features, "lzcnt", true);
3220 setFeatureEnabledImpl(Features, "popcnt", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003221 LLVM_FALLTHROUGH;
Chandler Carruth212334f2011-09-28 08:55:37 +00003222 case CK_K8SSE3:
3223 case CK_OpteronSSE3:
3224 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00003225 setFeatureEnabledImpl(Features, "sse3", true);
3226 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003227 setFeatureEnabledImpl(Features, "fxsr", true);
Roman Divackyce253d82011-10-30 13:47:56 +00003228 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00003229 case CK_BTVER2:
3230 setFeatureEnabledImpl(Features, "avx", true);
3231 setFeatureEnabledImpl(Features, "aes", true);
3232 setFeatureEnabledImpl(Features, "pclmul", true);
3233 setFeatureEnabledImpl(Features, "bmi", true);
3234 setFeatureEnabledImpl(Features, "f16c", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003235 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003236 LLVM_FALLTHROUGH;
Benjamin Kramer569f2152012-01-10 11:50:18 +00003237 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00003238 setFeatureEnabledImpl(Features, "ssse3", true);
3239 setFeatureEnabledImpl(Features, "sse4a", true);
3240 setFeatureEnabledImpl(Features, "lzcnt", true);
3241 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00003242 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003243 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003244 setFeatureEnabledImpl(Features, "fxsr", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003245 break;
Craig Topperc45744a2017-01-10 06:02:12 +00003246 case CK_ZNVER1:
3247 setFeatureEnabledImpl(Features, "adx", true);
3248 setFeatureEnabledImpl(Features, "aes", true);
3249 setFeatureEnabledImpl(Features, "avx2", true);
3250 setFeatureEnabledImpl(Features, "bmi", true);
3251 setFeatureEnabledImpl(Features, "bmi2", true);
3252 setFeatureEnabledImpl(Features, "clflushopt", true);
Craig Topper45742262017-02-09 06:10:14 +00003253 setFeatureEnabledImpl(Features, "clzero", true);
Craig Topperc45744a2017-01-10 06:02:12 +00003254 setFeatureEnabledImpl(Features, "cx16", true);
3255 setFeatureEnabledImpl(Features, "f16c", true);
3256 setFeatureEnabledImpl(Features, "fma", true);
3257 setFeatureEnabledImpl(Features, "fsgsbase", true);
3258 setFeatureEnabledImpl(Features, "fxsr", true);
3259 setFeatureEnabledImpl(Features, "lzcnt", true);
3260 setFeatureEnabledImpl(Features, "mwaitx", true);
3261 setFeatureEnabledImpl(Features, "movbe", true);
3262 setFeatureEnabledImpl(Features, "pclmul", true);
3263 setFeatureEnabledImpl(Features, "popcnt", true);
3264 setFeatureEnabledImpl(Features, "prfchw", true);
3265 setFeatureEnabledImpl(Features, "rdrnd", true);
3266 setFeatureEnabledImpl(Features, "rdseed", true);
3267 setFeatureEnabledImpl(Features, "sha", true);
3268 setFeatureEnabledImpl(Features, "sse4a", true);
3269 setFeatureEnabledImpl(Features, "xsave", true);
3270 setFeatureEnabledImpl(Features, "xsavec", true);
3271 setFeatureEnabledImpl(Features, "xsaveopt", true);
3272 setFeatureEnabledImpl(Features, "xsaves", true);
3273 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003274 case CK_BDVER4:
3275 setFeatureEnabledImpl(Features, "avx2", true);
3276 setFeatureEnabledImpl(Features, "bmi2", true);
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003277 setFeatureEnabledImpl(Features, "mwaitx", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003278 LLVM_FALLTHROUGH;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003279 case CK_BDVER3:
Craig Topper8c7f2512014-11-03 06:51:41 +00003280 setFeatureEnabledImpl(Features, "fsgsbase", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003281 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003282 LLVM_FALLTHROUGH;
Craig Topper8c7f2512014-11-03 06:51:41 +00003283 case CK_BDVER2:
Andrea Di Biagio9760a442014-11-06 12:08:57 +00003284 setFeatureEnabledImpl(Features, "bmi", true);
3285 setFeatureEnabledImpl(Features, "fma", true);
3286 setFeatureEnabledImpl(Features, "f16c", true);
3287 setFeatureEnabledImpl(Features, "tbm", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003288 LLVM_FALLTHROUGH;
Andrea Di Biagio9760a442014-11-06 12:08:57 +00003289 case CK_BDVER1:
3290 // xop implies avx, sse4a and fma4.
Craig Topper86d79ef2013-09-17 04:51:29 +00003291 setFeatureEnabledImpl(Features, "xop", true);
3292 setFeatureEnabledImpl(Features, "lzcnt", true);
3293 setFeatureEnabledImpl(Features, "aes", true);
3294 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00003295 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003296 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003297 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003298 setFeatureEnabledImpl(Features, "xsave", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003299 break;
Eli Friedman33465822011-07-08 23:31:17 +00003300 }
Eric Christopherbbd746d2015-10-08 20:10:14 +00003301 if (!TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec))
3302 return false;
3303
3304 // Can't do this earlier because we need to be able to explicitly enable
3305 // or disable these features and the things that they depend upon.
3306
3307 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
3308 auto I = Features.find("sse4.2");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003309 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00003310 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-popcnt") ==
3311 FeaturesVec.end())
3312 Features["popcnt"] = true;
3313
3314 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
3315 I = Features.find("3dnow");
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(), "-prfchw") ==
3318 FeaturesVec.end())
3319 Features["prfchw"] = true;
3320
Eric Christophera7260af2015-10-08 20:10:18 +00003321 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
3322 // then enable MMX.
3323 I = Features.find("sse");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003324 if (I != Features.end() && I->getValue() &&
Eric Christophera7260af2015-10-08 20:10:18 +00003325 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-mmx") ==
3326 FeaturesVec.end())
3327 Features["mmx"] = true;
3328
Eric Christopherbbd746d2015-10-08 20:10:14 +00003329 return true;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003330}
3331
Rafael Espindolae62e2792013-08-20 13:44:29 +00003332void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00003333 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003334 if (Enabled) {
3335 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003336 case AVX512F:
3337 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003338 case AVX2:
3339 Features["avx2"] = true;
3340 case AVX:
3341 Features["avx"] = true;
Craig Topperda9fe562015-10-15 05:23:38 +00003342 Features["xsave"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003343 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00003344 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003345 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00003346 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003347 case SSSE3:
3348 Features["ssse3"] = true;
3349 case SSE3:
3350 Features["sse3"] = true;
3351 case SSE2:
3352 Features["sse2"] = true;
3353 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00003354 Features["sse"] = true;
3355 case NoSSE:
3356 break;
3357 }
3358 return;
3359 }
3360
3361 switch (Level) {
3362 case NoSSE:
3363 case SSE1:
3364 Features["sse"] = false;
3365 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00003366 Features["sse2"] = Features["pclmul"] = Features["aes"] =
3367 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003368 case SSE3:
3369 Features["sse3"] = false;
3370 setXOPLevel(Features, NoXOP, false);
3371 case SSSE3:
3372 Features["ssse3"] = false;
3373 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00003374 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003375 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00003376 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003377 case AVX:
Craig Topperda9fe562015-10-15 05:23:38 +00003378 Features["fma"] = Features["avx"] = Features["f16c"] = Features["xsave"] =
3379 Features["xsaveopt"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00003380 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003381 case AVX2:
3382 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00003383 case AVX512F:
Eric Christopher917e9522014-11-18 22:36:15 +00003384 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
Craig Toppera31a5da2014-12-27 06:59:37 +00003385 Features["avx512pf"] = Features["avx512dq"] = Features["avx512bw"] =
Craig Topperb4f83a02016-02-29 06:51:38 +00003386 Features["avx512vl"] = Features["avx512vbmi"] =
3387 Features["avx512ifma"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003388 }
3389}
3390
3391void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00003392 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003393 if (Enabled) {
3394 switch (Level) {
3395 case AMD3DNowAthlon:
3396 Features["3dnowa"] = true;
3397 case AMD3DNow:
3398 Features["3dnow"] = true;
3399 case MMX:
3400 Features["mmx"] = true;
3401 case NoMMX3DNow:
3402 break;
3403 }
3404 return;
3405 }
3406
3407 switch (Level) {
3408 case NoMMX3DNow:
3409 case MMX:
3410 Features["mmx"] = false;
3411 case AMD3DNow:
3412 Features["3dnow"] = false;
3413 case AMD3DNowAthlon:
3414 Features["3dnowa"] = false;
3415 }
3416}
3417
3418void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00003419 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003420 if (Enabled) {
3421 switch (Level) {
3422 case XOP:
3423 Features["xop"] = true;
3424 case FMA4:
3425 Features["fma4"] = true;
3426 setSSELevel(Features, AVX, true);
3427 case SSE4A:
3428 Features["sse4a"] = true;
3429 setSSELevel(Features, SSE3, true);
3430 case NoXOP:
3431 break;
3432 }
3433 return;
3434 }
3435
3436 switch (Level) {
3437 case NoXOP:
3438 case SSE4A:
3439 Features["sse4a"] = false;
3440 case FMA4:
3441 Features["fma4"] = false;
3442 case XOP:
3443 Features["xop"] = false;
3444 }
3445}
3446
Craig Topper86d79ef2013-09-17 04:51:29 +00003447void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
3448 StringRef Name, bool Enabled) {
Eric Christopher298ac302015-07-01 00:08:32 +00003449 // This is a bit of a hack to deal with the sse4 target feature when used
3450 // as part of the target attribute. We handle sse4 correctly everywhere
3451 // else. See below for more information on how we handle the sse4 options.
3452 if (Name != "sse4")
3453 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00003454
Craig Topper29561122013-09-19 01:13:07 +00003455 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003456 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003457 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003458 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003459 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003460 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003461 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003462 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003463 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003464 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003465 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003466 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003467 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003468 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003469 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003470 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003471 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003472 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003473 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003474 if (Enabled)
3475 setSSELevel(Features, SSE2, Enabled);
3476 } else if (Name == "pclmul") {
3477 if (Enabled)
3478 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003479 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003480 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003481 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003482 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003483 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003484 setSSELevel(Features, AVX512F, Enabled);
Craig Topperb4f83a02016-02-29 06:51:38 +00003485 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf" ||
3486 Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl" ||
3487 Name == "avx512vbmi" || Name == "avx512ifma") {
Craig Topper679b53a2013-08-21 05:29:10 +00003488 if (Enabled)
3489 setSSELevel(Features, AVX512F, Enabled);
Craig Topper6c7ecc52016-11-09 04:51:03 +00003490 // Enable BWI instruction if VBMI is being enabled.
3491 if (Name == "avx512vbmi" && Enabled)
3492 Features["avx512bw"] = true;
3493 // Also disable VBMI if BWI is being disabled.
3494 if (Name == "avx512bw" && !Enabled)
3495 Features["avx512vbmi"] = false;
Craig Topper679b53a2013-08-21 05:29:10 +00003496 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003497 if (Enabled)
3498 setSSELevel(Features, AVX, Enabled);
3499 } else if (Name == "fma4") {
3500 setXOPLevel(Features, FMA4, Enabled);
3501 } else if (Name == "xop") {
3502 setXOPLevel(Features, XOP, Enabled);
3503 } else if (Name == "sse4a") {
3504 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00003505 } else if (Name == "f16c") {
3506 if (Enabled)
3507 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00003508 } else if (Name == "sha") {
3509 if (Enabled)
3510 setSSELevel(Features, SSE2, Enabled);
Eric Christopher298ac302015-07-01 00:08:32 +00003511 } else if (Name == "sse4") {
3512 // We can get here via the __target__ attribute since that's not controlled
3513 // via the -msse4/-mno-sse4 command line alias. Handle this the same way
3514 // here - turn on the sse4.2 if enabled, turn off the sse4.1 level if
3515 // disabled.
3516 if (Enabled)
3517 setSSELevel(Features, SSE42, Enabled);
3518 else
3519 setSSELevel(Features, SSE41, Enabled);
Craig Topperda9fe562015-10-15 05:23:38 +00003520 } else if (Name == "xsave") {
Craig Topper840927e2016-02-29 06:51:34 +00003521 if (!Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003522 Features["xsaveopt"] = false;
3523 } else if (Name == "xsaveopt" || Name == "xsavec" || Name == "xsaves") {
Craig Topper840927e2016-02-29 06:51:34 +00003524 if (Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003525 Features["xsave"] = true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003526 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003527}
3528
Eric Christopher3ff21b32013-10-16 21:26:26 +00003529/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003530/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00003531bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00003532 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00003533 for (const auto &Feature : Features) {
3534 if (Feature[0] != '+')
Daniel Dunbar979586e2009-11-11 09:38:56 +00003535 continue;
3536
Eric Christopher610fe112015-08-26 08:21:55 +00003537 if (Feature == "+aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00003538 HasAES = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003539 } else if (Feature == "+pclmul") {
Craig Topper3f122a72012-05-31 05:18:48 +00003540 HasPCLMUL = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003541 } else if (Feature == "+lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00003542 HasLZCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003543 } else if (Feature == "+rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00003544 HasRDRND = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003545 } else if (Feature == "+fsgsbase") {
Craig Topper8c7f2512014-11-03 06:51:41 +00003546 HasFSGSBASE = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003547 } else if (Feature == "+bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00003548 HasBMI = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003549 } else if (Feature == "+bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00003550 HasBMI2 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003551 } else if (Feature == "+popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00003552 HasPOPCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003553 } else if (Feature == "+rtm") {
Michael Liao625a8752012-11-10 05:17:46 +00003554 HasRTM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003555 } else if (Feature == "+prfchw") {
Michael Liao74f4eaf2013-03-26 17:52:08 +00003556 HasPRFCHW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003557 } else if (Feature == "+rdseed") {
Michael Liaoffaae352013-03-29 05:17:55 +00003558 HasRDSEED = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003559 } else if (Feature == "+adx") {
Robert Khasanov50e6f582014-09-19 09:53:48 +00003560 HasADX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003561 } else if (Feature == "+tbm") {
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003562 HasTBM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003563 } else if (Feature == "+fma") {
Craig Topperbba778b2012-06-03 21:46:30 +00003564 HasFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003565 } else if (Feature == "+f16c") {
Manman Rena45358c2012-10-11 00:59:55 +00003566 HasF16C = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003567 } else if (Feature == "+avx512cd") {
Craig Topper679b53a2013-08-21 05:29:10 +00003568 HasAVX512CD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003569 } else if (Feature == "+avx512er") {
Craig Topper679b53a2013-08-21 05:29:10 +00003570 HasAVX512ER = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003571 } else if (Feature == "+avx512pf") {
Craig Topper679b53a2013-08-21 05:29:10 +00003572 HasAVX512PF = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003573 } else if (Feature == "+avx512dq") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003574 HasAVX512DQ = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003575 } else if (Feature == "+avx512bw") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003576 HasAVX512BW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003577 } else if (Feature == "+avx512vl") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003578 HasAVX512VL = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003579 } else if (Feature == "+avx512vbmi") {
3580 HasAVX512VBMI = true;
3581 } else if (Feature == "+avx512ifma") {
3582 HasAVX512IFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003583 } else if (Feature == "+sha") {
Ben Langmuir58078d02013-09-19 13:22:04 +00003584 HasSHA = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003585 } else if (Feature == "+mpx") {
3586 HasMPX = true;
3587 } else if (Feature == "+movbe") {
3588 HasMOVBE = true;
3589 } else if (Feature == "+sgx") {
3590 HasSGX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003591 } else if (Feature == "+cx16") {
Nick Lewycky50e8f482013-10-05 20:14:27 +00003592 HasCX16 = true;
Craig Toppere33f51f2015-10-16 06:22:36 +00003593 } else if (Feature == "+fxsr") {
3594 HasFXSR = true;
Craig Topperda9fe562015-10-15 05:23:38 +00003595 } else if (Feature == "+xsave") {
3596 HasXSAVE = true;
3597 } else if (Feature == "+xsaveopt") {
3598 HasXSAVEOPT = true;
3599 } else if (Feature == "+xsavec") {
3600 HasXSAVEC = true;
3601 } else if (Feature == "+xsaves") {
3602 HasXSAVES = true;
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003603 } else if (Feature == "+mwaitx") {
3604 HasMWAITX = true;
Asaf Badouha9d1e182015-12-31 14:14:07 +00003605 } else if (Feature == "+pku") {
3606 HasPKU = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003607 } else if (Feature == "+clflushopt") {
3608 HasCLFLUSHOPT = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003609 } else if (Feature == "+clwb") {
3610 HasCLWB = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003611 } else if (Feature == "+prefetchwt1") {
3612 HasPREFETCHWT1 = true;
Craig Topper45742262017-02-09 06:10:14 +00003613 } else if (Feature == "+clzero") {
3614 HasCLZERO = true;
Nick Lewycky50e8f482013-10-05 20:14:27 +00003615 }
3616
Benjamin Kramer27402c62012-03-05 15:10:44 +00003617 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003618 .Case("+avx512f", AVX512F)
3619 .Case("+avx2", AVX2)
3620 .Case("+avx", AVX)
3621 .Case("+sse4.2", SSE42)
3622 .Case("+sse4.1", SSE41)
3623 .Case("+ssse3", SSSE3)
3624 .Case("+sse3", SSE3)
3625 .Case("+sse2", SSE2)
3626 .Case("+sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00003627 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003628 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003629
Eli Friedman33465822011-07-08 23:31:17 +00003630 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00003631 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003632 .Case("+3dnowa", AMD3DNowAthlon)
3633 .Case("+3dnow", AMD3DNow)
3634 .Case("+mmx", MMX)
Eli Friedman33465822011-07-08 23:31:17 +00003635 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00003636 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003637
3638 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003639 .Case("+xop", XOP)
3640 .Case("+fma4", FMA4)
3641 .Case("+sse4a", SSE4A)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003642 .Default(NoXOP);
3643 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003644 }
Eli Friedman33465822011-07-08 23:31:17 +00003645
Rafael Espindolaeb265472013-08-21 21:59:03 +00003646 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
3647 // matches the selected sse level.
Craig Topperd945d502015-10-20 00:00:17 +00003648 if ((FPMath == FP_SSE && SSELevel < SSE1) ||
3649 (FPMath == FP_387 && SSELevel >= SSE1)) {
3650 Diags.Report(diag::err_target_unsupported_fpmath) <<
3651 (FPMath == FP_SSE ? "sse" : "387");
Rafael Espindolaeb265472013-08-21 21:59:03 +00003652 return false;
3653 }
3654
Alexey Bataev00396512015-07-02 03:40:19 +00003655 SimdDefaultAlign =
Ahmed Bougacha68bf64e2015-08-27 22:24:56 +00003656 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Rafael Espindolaeb265472013-08-21 21:59:03 +00003657 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00003658}
Chris Lattnerecd49032009-03-02 22:27:17 +00003659
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003660/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
3661/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00003662void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003663 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00003664 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00003665 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003666 Builder.defineMacro("__amd64__");
3667 Builder.defineMacro("__amd64");
3668 Builder.defineMacro("__x86_64");
3669 Builder.defineMacro("__x86_64__");
Bob Wilsona2acb1e2014-08-08 23:46:28 +00003670 if (getTriple().getArchName() == "x86_64h") {
3671 Builder.defineMacro("__x86_64h");
3672 Builder.defineMacro("__x86_64h__");
3673 }
Chris Lattnerecd49032009-03-02 22:27:17 +00003674 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003675 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00003676 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003677
Chris Lattnerecd49032009-03-02 22:27:17 +00003678 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003679 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
3680 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00003681 switch (CPU) {
3682 case CK_Generic:
3683 break;
3684 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003685 // The rest are coming from the i386 define above.
3686 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003687 break;
3688 case CK_i486:
3689 case CK_WinChipC6:
3690 case CK_WinChip2:
3691 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003692 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00003693 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003694 case CK_PentiumMMX:
3695 Builder.defineMacro("__pentium_mmx__");
3696 Builder.defineMacro("__tune_pentium_mmx__");
3697 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003698 case CK_i586:
3699 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003700 defineCPUMacros(Builder, "i586");
3701 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00003702 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003703 case CK_Pentium3:
3704 case CK_Pentium3M:
3705 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003706 Builder.defineMacro("__tune_pentium3__");
3707 // Fallthrough
3708 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00003709 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003710 Builder.defineMacro("__tune_pentium2__");
3711 // Fallthrough
3712 case CK_PentiumPro:
3713 Builder.defineMacro("__tune_i686__");
3714 Builder.defineMacro("__tune_pentiumpro__");
3715 // Fallthrough
3716 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003717 Builder.defineMacro("__i686");
3718 Builder.defineMacro("__i686__");
3719 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
3720 Builder.defineMacro("__pentiumpro");
3721 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003722 break;
3723 case CK_Pentium4:
3724 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003725 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00003726 break;
3727 case CK_Yonah:
3728 case CK_Prescott:
3729 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003730 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00003731 break;
3732 case CK_Core2:
3733 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003734 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00003735 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003736 case CK_Bonnell:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003737 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00003738 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00003739 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00003740 defineCPUMacros(Builder, "slm");
3741 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003742 case CK_Nehalem:
3743 case CK_Westmere:
3744 case CK_SandyBridge:
3745 case CK_IvyBridge:
3746 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00003747 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003748 case CK_SkylakeClient:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003749 // FIXME: Historically, we defined this legacy name, it would be nice to
3750 // remove it at some point. We've never exposed fine-grained names for
3751 // recent primary x86 CPUs, and we should keep it that way.
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003752 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00003753 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003754 case CK_SkylakeServer:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003755 defineCPUMacros(Builder, "skx");
3756 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003757 case CK_Cannonlake:
3758 break;
Craig Topper449314e2013-08-20 07:09:39 +00003759 case CK_KNL:
3760 defineCPUMacros(Builder, "knl");
3761 break;
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003762 case CK_Lakemont:
3763 Builder.defineMacro("__tune_lakemont__");
3764 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003765 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003766 Builder.defineMacro("__k6_2__");
3767 Builder.defineMacro("__tune_k6_2__");
3768 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003769 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003770 if (CPU != CK_K6_2) { // In case of fallthrough
3771 // FIXME: GCC may be enabling these in cases where some other k6
3772 // architecture is specified but -m3dnow is explicitly provided. The
3773 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003774 Builder.defineMacro("__k6_3__");
3775 Builder.defineMacro("__tune_k6_3__");
3776 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003777 // Fallthrough
3778 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003779 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00003780 break;
3781 case CK_Athlon:
3782 case CK_AthlonThunderbird:
3783 case CK_Athlon4:
3784 case CK_AthlonXP:
3785 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003786 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003787 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003788 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003789 Builder.defineMacro("__tune_athlon_sse__");
3790 }
Chandler Carruth212334f2011-09-28 08:55:37 +00003791 break;
3792 case CK_K8:
3793 case CK_K8SSE3:
3794 case CK_x86_64:
3795 case CK_Opteron:
3796 case CK_OpteronSSE3:
3797 case CK_Athlon64:
3798 case CK_Athlon64SSE3:
3799 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003800 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00003801 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00003802 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003803 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00003804 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00003805 case CK_BTVER1:
3806 defineCPUMacros(Builder, "btver1");
3807 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003808 case CK_BTVER2:
3809 defineCPUMacros(Builder, "btver2");
3810 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003811 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003812 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003813 break;
3814 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003815 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003816 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003817 case CK_BDVER3:
3818 defineCPUMacros(Builder, "bdver3");
3819 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003820 case CK_BDVER4:
3821 defineCPUMacros(Builder, "bdver4");
3822 break;
Craig Topperc45744a2017-01-10 06:02:12 +00003823 case CK_ZNVER1:
3824 defineCPUMacros(Builder, "znver1");
3825 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003826 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003827 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00003828 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003829 }
Chris Lattner96e43572009-03-02 22:40:39 +00003830
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003831 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003832 Builder.defineMacro("__REGISTER_PREFIX__", "");
3833
Chris Lattner6df41af2009-04-19 17:32:33 +00003834 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
3835 // functions in glibc header files that use FP Stack inline asm which the
3836 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003837 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003838
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003839 if (HasAES)
3840 Builder.defineMacro("__AES__");
3841
Craig Topper3f122a72012-05-31 05:18:48 +00003842 if (HasPCLMUL)
3843 Builder.defineMacro("__PCLMUL__");
3844
Craig Topper22967d42011-12-25 05:06:45 +00003845 if (HasLZCNT)
3846 Builder.defineMacro("__LZCNT__");
3847
Benjamin Kramer1e250392012-07-07 09:39:18 +00003848 if (HasRDRND)
3849 Builder.defineMacro("__RDRND__");
3850
Craig Topper8c7f2512014-11-03 06:51:41 +00003851 if (HasFSGSBASE)
3852 Builder.defineMacro("__FSGSBASE__");
3853
Craig Topper22967d42011-12-25 05:06:45 +00003854 if (HasBMI)
3855 Builder.defineMacro("__BMI__");
3856
3857 if (HasBMI2)
3858 Builder.defineMacro("__BMI2__");
3859
Craig Topper1de83482011-12-29 16:10:46 +00003860 if (HasPOPCNT)
3861 Builder.defineMacro("__POPCNT__");
3862
Michael Liao625a8752012-11-10 05:17:46 +00003863 if (HasRTM)
3864 Builder.defineMacro("__RTM__");
3865
Michael Liao74f4eaf2013-03-26 17:52:08 +00003866 if (HasPRFCHW)
3867 Builder.defineMacro("__PRFCHW__");
3868
Michael Liaoffaae352013-03-29 05:17:55 +00003869 if (HasRDSEED)
3870 Builder.defineMacro("__RDSEED__");
3871
Robert Khasanov50e6f582014-09-19 09:53:48 +00003872 if (HasADX)
3873 Builder.defineMacro("__ADX__");
3874
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003875 if (HasTBM)
3876 Builder.defineMacro("__TBM__");
3877
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003878 if (HasMWAITX)
3879 Builder.defineMacro("__MWAITX__");
3880
Rafael Espindolae62e2792013-08-20 13:44:29 +00003881 switch (XOPLevel) {
3882 case XOP:
3883 Builder.defineMacro("__XOP__");
3884 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00003885 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00003886 case SSE4A:
3887 Builder.defineMacro("__SSE4A__");
3888 case NoXOP:
3889 break;
3890 }
Craig Topperffdb46c2011-12-30 07:33:42 +00003891
Craig Topperbba778b2012-06-03 21:46:30 +00003892 if (HasFMA)
3893 Builder.defineMacro("__FMA__");
3894
Manman Rena45358c2012-10-11 00:59:55 +00003895 if (HasF16C)
3896 Builder.defineMacro("__F16C__");
3897
Craig Topper679b53a2013-08-21 05:29:10 +00003898 if (HasAVX512CD)
3899 Builder.defineMacro("__AVX512CD__");
3900 if (HasAVX512ER)
3901 Builder.defineMacro("__AVX512ER__");
3902 if (HasAVX512PF)
3903 Builder.defineMacro("__AVX512PF__");
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003904 if (HasAVX512DQ)
3905 Builder.defineMacro("__AVX512DQ__");
3906 if (HasAVX512BW)
3907 Builder.defineMacro("__AVX512BW__");
3908 if (HasAVX512VL)
3909 Builder.defineMacro("__AVX512VL__");
Craig Topperb4f83a02016-02-29 06:51:38 +00003910 if (HasAVX512VBMI)
3911 Builder.defineMacro("__AVX512VBMI__");
3912 if (HasAVX512IFMA)
3913 Builder.defineMacro("__AVX512IFMA__");
Craig Topper679b53a2013-08-21 05:29:10 +00003914
Ben Langmuir58078d02013-09-19 13:22:04 +00003915 if (HasSHA)
3916 Builder.defineMacro("__SHA__");
3917
Craig Toppere33f51f2015-10-16 06:22:36 +00003918 if (HasFXSR)
3919 Builder.defineMacro("__FXSR__");
Craig Topperda9fe562015-10-15 05:23:38 +00003920 if (HasXSAVE)
3921 Builder.defineMacro("__XSAVE__");
3922 if (HasXSAVEOPT)
3923 Builder.defineMacro("__XSAVEOPT__");
3924 if (HasXSAVEC)
3925 Builder.defineMacro("__XSAVEC__");
3926 if (HasXSAVES)
3927 Builder.defineMacro("__XSAVES__");
Asaf Badouha9d1e182015-12-31 14:14:07 +00003928 if (HasPKU)
3929 Builder.defineMacro("__PKU__");
Nick Lewycky50e8f482013-10-05 20:14:27 +00003930 if (HasCX16)
3931 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
Craig Topper78b47872017-02-08 06:48:58 +00003932 if (HasCLFLUSHOPT)
3933 Builder.defineMacro("__CLFLUSHOPT__");
Craig Topper8c708cf2017-02-08 07:36:58 +00003934 if (HasCLWB)
3935 Builder.defineMacro("__CLWB__");
Craig Topperb16cb822017-02-08 07:56:42 +00003936 if (HasMPX)
3937 Builder.defineMacro("__MPX__");
Craig Topper204ecff2017-02-08 08:23:17 +00003938 if (HasSGX)
3939 Builder.defineMacro("__SGX__");
Craig Topperd2bf7b02017-02-08 08:23:40 +00003940 if (HasPREFETCHWT1)
3941 Builder.defineMacro("__PREFETCHWT1__");
Craig Topper45742262017-02-09 06:10:14 +00003942 if (HasCLZERO)
3943 Builder.defineMacro("__CLZERO__");
Nick Lewycky50e8f482013-10-05 20:14:27 +00003944
Chris Lattner96e43572009-03-02 22:40:39 +00003945 // Each case falls through to the previous one here.
3946 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003947 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00003948 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00003949 case AVX2:
3950 Builder.defineMacro("__AVX2__");
3951 case AVX:
3952 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00003953 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003954 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00003955 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003956 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00003957 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003958 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003959 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003960 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003961 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003962 Builder.defineMacro("__SSE2__");
3963 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00003964 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003965 Builder.defineMacro("__SSE__");
3966 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00003967 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00003968 break;
3969 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003970
Derek Schuffc7dd7222012-10-11 15:52:22 +00003971 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003972 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003973 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00003974 case AVX2:
3975 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003976 case SSE42:
3977 case SSE41:
3978 case SSSE3:
3979 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003980 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003981 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003982 break;
3983 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003984 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003985 break;
3986 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003987 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003988 }
3989 }
3990
Anders Carlssone437c682010-01-27 03:47:49 +00003991 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00003992 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00003993 case AMD3DNowAthlon:
3994 Builder.defineMacro("__3dNOW_A__");
3995 case AMD3DNow:
3996 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00003997 case MMX:
3998 Builder.defineMacro("__MMX__");
3999 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00004000 break;
4001 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00004002
4003 if (CPU >= CK_i486) {
4004 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
4005 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
4006 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
4007 }
4008 if (CPU >= CK_i586)
4009 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00004010}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004011
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004012bool X86TargetInfo::hasFeature(StringRef Feature) const {
4013 return llvm::StringSwitch<bool>(Feature)
4014 .Case("aes", HasAES)
4015 .Case("avx", SSELevel >= AVX)
4016 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00004017 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00004018 .Case("avx512cd", HasAVX512CD)
4019 .Case("avx512er", HasAVX512ER)
4020 .Case("avx512pf", HasAVX512PF)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00004021 .Case("avx512dq", HasAVX512DQ)
4022 .Case("avx512bw", HasAVX512BW)
4023 .Case("avx512vl", HasAVX512VL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00004024 .Case("avx512vbmi", HasAVX512VBMI)
4025 .Case("avx512ifma", HasAVX512IFMA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004026 .Case("bmi", HasBMI)
4027 .Case("bmi2", HasBMI2)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00004028 .Case("clflushopt", HasCLFLUSHOPT)
4029 .Case("clwb", HasCLWB)
Craig Topper45742262017-02-09 06:10:14 +00004030 .Case("clzero", HasCLZERO)
Nick Lewycky50e8f482013-10-05 20:14:27 +00004031 .Case("cx16", HasCX16)
4032 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00004033 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00004034 .Case("fma4", XOPLevel >= FMA4)
Craig Topper8c7f2512014-11-03 06:51:41 +00004035 .Case("fsgsbase", HasFSGSBASE)
Craig Toppere33f51f2015-10-16 06:22:36 +00004036 .Case("fxsr", HasFXSR)
Craig Topper8dbc5842014-11-03 07:05:26 +00004037 .Case("lzcnt", HasLZCNT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004038 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
4039 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
4040 .Case("mmx", MMX3DNowLevel >= MMX)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00004041 .Case("movbe", HasMOVBE)
4042 .Case("mpx", HasMPX)
Craig Topper3f122a72012-05-31 05:18:48 +00004043 .Case("pclmul", HasPCLMUL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00004044 .Case("pku", HasPKU)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004045 .Case("popcnt", HasPOPCNT)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00004046 .Case("prefetchwt1", HasPREFETCHWT1)
Michael Liao74f4eaf2013-03-26 17:52:08 +00004047 .Case("prfchw", HasPRFCHW)
Craig Topper8dbc5842014-11-03 07:05:26 +00004048 .Case("rdrnd", HasRDRND)
Michael Liaoffaae352013-03-29 05:17:55 +00004049 .Case("rdseed", HasRDSEED)
Craig Topper8dbc5842014-11-03 07:05:26 +00004050 .Case("rtm", HasRTM)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00004051 .Case("sgx", HasSGX)
Ben Langmuir58078d02013-09-19 13:22:04 +00004052 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004053 .Case("sse", SSELevel >= SSE1)
4054 .Case("sse2", SSELevel >= SSE2)
4055 .Case("sse3", SSELevel >= SSE3)
4056 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00004057 .Case("sse4.1", SSELevel >= SSE41)
4058 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00004059 .Case("sse4a", XOPLevel >= SSE4A)
Craig Topper8dbc5842014-11-03 07:05:26 +00004060 .Case("tbm", HasTBM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004061 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00004062 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
4063 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00004064 .Case("xop", XOPLevel >= XOP)
Craig Topperda9fe562015-10-15 05:23:38 +00004065 .Case("xsave", HasXSAVE)
4066 .Case("xsavec", HasXSAVEC)
4067 .Case("xsaves", HasXSAVES)
4068 .Case("xsaveopt", HasXSAVEOPT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004069 .Default(false);
4070}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004071
Eric Christopherd9832702015-06-29 21:00:05 +00004072// We can't use a generic validation scheme for the features accepted here
4073// versus subtarget features accepted in the target attribute because the
4074// bitfield structure that's initialized in the runtime only supports the
4075// below currently rather than the full range of subtarget features. (See
4076// X86TargetInfo::hasFeature for a somewhat comprehensive list).
4077bool X86TargetInfo::validateCpuSupports(StringRef FeatureStr) const {
4078 return llvm::StringSwitch<bool>(FeatureStr)
4079 .Case("cmov", true)
4080 .Case("mmx", true)
4081 .Case("popcnt", true)
4082 .Case("sse", true)
4083 .Case("sse2", true)
4084 .Case("sse3", true)
Benjamin Kramerf4c520d2016-05-20 15:21:08 +00004085 .Case("ssse3", true)
Eric Christopherd9832702015-06-29 21:00:05 +00004086 .Case("sse4.1", true)
4087 .Case("sse4.2", true)
4088 .Case("avx", true)
4089 .Case("avx2", true)
4090 .Case("sse4a", true)
4091 .Case("fma4", true)
4092 .Case("xop", true)
4093 .Case("fma", true)
4094 .Case("avx512f", true)
4095 .Case("bmi", true)
4096 .Case("bmi2", true)
Benjamin Kramerf4c520d2016-05-20 15:21:08 +00004097 .Case("aes", true)
4098 .Case("pclmul", true)
4099 .Case("avx512vl", true)
4100 .Case("avx512bw", true)
4101 .Case("avx512dq", true)
4102 .Case("avx512cd", true)
4103 .Case("avx512er", true)
4104 .Case("avx512pf", true)
4105 .Case("avx512vbmi", true)
4106 .Case("avx512ifma", true)
Eric Christopherd9832702015-06-29 21:00:05 +00004107 .Default(false);
4108}
4109
Eli Friedman3fd920a2008-08-20 02:34:37 +00004110bool
Anders Carlsson58436352009-02-28 17:11:49 +00004111X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00004112 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00004113 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004114 default: return false;
Alexey Bataev91e58602015-07-20 12:08:00 +00004115 // Constant constraints.
4116 case 'e': // 32-bit signed integer constant for use with sign-extending x86_64
4117 // instructions.
4118 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
4119 // x86_64 instructions.
4120 case 's':
4121 Info.setRequiresImmediate();
4122 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00004123 case 'I':
4124 Info.setRequiresImmediate(0, 31);
4125 return true;
4126 case 'J':
4127 Info.setRequiresImmediate(0, 63);
4128 return true;
4129 case 'K':
4130 Info.setRequiresImmediate(-128, 127);
4131 return true;
4132 case 'L':
Alexey Bataev91e58602015-07-20 12:08:00 +00004133 Info.setRequiresImmediate({ int(0xff), int(0xffff), int(0xffffffff) });
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00004134 return true;
4135 case 'M':
4136 Info.setRequiresImmediate(0, 3);
4137 return true;
4138 case 'N':
4139 Info.setRequiresImmediate(0, 255);
4140 return true;
4141 case 'O':
4142 Info.setRequiresImmediate(0, 127);
4143 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00004144 // Register constraints.
4145 case 'Y': // 'Y' is the first character for several 2-character constraints.
4146 // Shift the pointer to the second character of the constraint.
4147 Name++;
4148 switch (*Name) {
4149 default:
4150 return false;
4151 case '0': // First SSE register.
4152 case 't': // Any SSE register, when SSE2 is enabled.
4153 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
4154 case 'm': // Any MMX register, when inter-unit moves enabled.
Michael Zuckerman849a6a52016-10-31 17:23:52 +00004155 case 'k': // AVX512 arch mask registers: k1-k7.
Alexey Bataev91e58602015-07-20 12:08:00 +00004156 Info.setAllowsRegister();
4157 return true;
4158 }
4159 case 'f': // Any x87 floating point stack register.
Akira Hatanaka88ef7282014-07-18 23:30:30 +00004160 // Constraint 'f' cannot be used for output operands.
4161 if (Info.ConstraintStr[0] == '=')
4162 return false;
Akira Hatanaka88ef7282014-07-18 23:30:30 +00004163 Info.setAllowsRegister();
4164 return true;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004165 case 'a': // eax.
4166 case 'b': // ebx.
4167 case 'c': // ecx.
4168 case 'd': // edx.
4169 case 'S': // esi.
4170 case 'D': // edi.
4171 case 'A': // edx:eax.
Alexey Bataev91e58602015-07-20 12:08:00 +00004172 case 't': // Top of floating point stack.
4173 case 'u': // Second from top of floating point stack.
Eli Friedman3fd920a2008-08-20 02:34:37 +00004174 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00004175 case 'y': // Any MMX register.
Michael Zuckerman62f516f2016-11-01 13:16:44 +00004176 case 'v': // Any {X,Y,Z}MM register (Arch & context dependent)
Anders Carlsson5f7ee682008-10-06 19:17:39 +00004177 case 'x': // Any SSE register.
Michael Zuckerman849a6a52016-10-31 17:23:52 +00004178 case 'k': // Any AVX512 mask register (same as Yk, additionaly allows k0
4179 // for intermideate k reg operations).
Eli Friedman3fd920a2008-08-20 02:34:37 +00004180 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00004181 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
4182 case 'l': // "Index" registers: any general register that can be used as an
4183 // index in a base+index memory access.
4184 Info.setAllowsRegister();
4185 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00004186 // Floating point constant constraints.
Dale Johannesen46742a42010-08-24 22:33:12 +00004187 case 'C': // SSE floating point constant.
4188 case 'G': // x87 floating point constant.
Eli Friedman3fd920a2008-08-20 02:34:37 +00004189 return true;
4190 }
4191}
4192
Akira Hatanaka974131e2014-09-18 18:17:18 +00004193bool X86TargetInfo::validateOutputSize(StringRef Constraint,
4194 unsigned Size) const {
4195 // Strip off constraint modifiers.
4196 while (Constraint[0] == '=' ||
4197 Constraint[0] == '+' ||
4198 Constraint[0] == '&')
4199 Constraint = Constraint.substr(1);
4200
4201 return validateOperandSize(Constraint, Size);
4202}
4203
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004204bool X86TargetInfo::validateInputSize(StringRef Constraint,
4205 unsigned Size) const {
Akira Hatanaka974131e2014-09-18 18:17:18 +00004206 return validateOperandSize(Constraint, Size);
4207}
4208
4209bool X86TargetInfo::validateOperandSize(StringRef Constraint,
4210 unsigned Size) const {
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004211 switch (Constraint[0]) {
4212 default: break;
Michael Zuckerman849a6a52016-10-31 17:23:52 +00004213 case 'k':
4214 // Registers k0-k7 (AVX512) size limit is 64 bit.
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004215 case 'y':
4216 return Size <= 64;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004217 case 'f':
4218 case 't':
4219 case 'u':
4220 return Size <= 128;
Michael Zuckerman62f516f2016-11-01 13:16:44 +00004221 case 'v':
Hans Wennborg3c619a42014-09-18 20:24:04 +00004222 case 'x':
Alexey Bataev91e58602015-07-20 12:08:00 +00004223 if (SSELevel >= AVX512F)
4224 // 512-bit zmm registers can be used if target supports AVX512F.
4225 return Size <= 512U;
4226 else if (SSELevel >= AVX)
4227 // 256-bit ymm registers can be used if target supports AVX.
4228 return Size <= 256U;
4229 return Size <= 128U;
4230 case 'Y':
4231 // 'Y' is the first character for several 2-character constraints.
4232 switch (Constraint[1]) {
4233 default: break;
4234 case 'm':
4235 // 'Ym' is synonymous with 'y'.
Michael Zuckerman849a6a52016-10-31 17:23:52 +00004236 case 'k':
Alexey Bataev91e58602015-07-20 12:08:00 +00004237 return Size <= 64;
4238 case 'i':
4239 case 't':
4240 // 'Yi' and 'Yt' are synonymous with 'x' when SSE2 is enabled.
4241 if (SSELevel >= AVX512F)
4242 return Size <= 512U;
4243 else if (SSELevel >= AVX)
4244 return Size <= 256U;
4245 return SSELevel >= SSE2 && Size <= 128U;
4246 }
4247
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004248 }
4249
4250 return true;
4251}
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00004252
Eli Friedman3fd920a2008-08-20 02:34:37 +00004253std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004254X86TargetInfo::convertConstraint(const char *&Constraint) const {
4255 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004256 case 'a': return std::string("{ax}");
4257 case 'b': return std::string("{bx}");
4258 case 'c': return std::string("{cx}");
4259 case 'd': return std::string("{dx}");
4260 case 'S': return std::string("{si}");
4261 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00004262 case 'p': // address
4263 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00004264 case 't': // top of floating point stack.
4265 return std::string("{st}");
4266 case 'u': // second from top of floating point stack.
4267 return std::string("{st(1)}"); // second from top of floating point stack.
Michael Zuckerman849a6a52016-10-31 17:23:52 +00004268 case 'Y':
4269 switch (Constraint[1]) {
4270 default:
4271 // Break from inner switch and fall through (copy single char),
4272 // continue parsing after copying the current constraint into
4273 // the return string.
4274 break;
4275 case 'k':
4276 // "^" hints llvm that this is a 2 letter constraint.
4277 // "Constraint++" is used to promote the string iterator
4278 // to the next constraint.
4279 return std::string("^") + std::string(Constraint++, 2);
4280 }
4281 LLVM_FALLTHROUGH;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004282 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004283 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00004284 }
4285}
Chris Lattner5ba61f02006-10-14 07:39:34 +00004286
Eli Friedman3fd920a2008-08-20 02:34:37 +00004287// X86-32 generic target
4288class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00004289public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004290 X86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4291 : X86TargetInfo(Triple, Opts) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004292 DoubleAlign = LongLongAlign = 32;
4293 LongDoubleWidth = 96;
4294 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00004295 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00004296 resetDataLayout("e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128");
Eli Friedman32ca82a2009-03-29 20:31:09 +00004297 SizeType = UnsignedInt;
4298 PtrDiffType = SignedInt;
4299 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00004300 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00004301
4302 // Use fpret for all types.
4303 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
4304 (1 << TargetInfo::Double) |
4305 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004306
4307 // x86-32 has atomics up to 8 bytes
4308 // FIXME: Check that we actually have cmpxchg8b before setting
4309 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
4310 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004311 }
Craig Topper3164f332014-03-11 03:39:26 +00004312 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004313 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004314 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004315
Craig Topper3164f332014-03-11 03:39:26 +00004316 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00004317 if (RegNo == 0) return 0;
4318 if (RegNo == 1) return 2;
4319 return -1;
4320 }
Akira Hatanaka974131e2014-09-18 18:17:18 +00004321 bool validateOperandSize(StringRef Constraint,
4322 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00004323 switch (Constraint[0]) {
4324 default: break;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004325 case 'R':
4326 case 'q':
4327 case 'Q':
Bill Wendling887b4852012-11-12 06:42:51 +00004328 case 'a':
4329 case 'b':
4330 case 'c':
4331 case 'd':
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004332 case 'S':
4333 case 'D':
Bill Wendling3c7fed82012-11-12 18:52:32 +00004334 return Size <= 32;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004335 case 'A':
4336 return Size <= 64;
Bill Wendling887b4852012-11-12 06:42:51 +00004337 }
4338
Akira Hatanaka974131e2014-09-18 18:17:18 +00004339 return X86TargetInfo::validateOperandSize(Constraint, Size);
Bill Wendling887b4852012-11-12 06:42:51 +00004340 }
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00004341 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
4342 return llvm::makeArrayRef(BuiltinInfoX86, clang::X86::LastX86CommonBuiltin -
4343 Builtin::FirstTSBuiltin + 1);
4344 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004345};
Eli Friedman3fd920a2008-08-20 02:34:37 +00004346
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004347class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
4348public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004349 NetBSDI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4350 : NetBSDTargetInfo<X86_32TargetInfo>(Triple, Opts) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004351
Craig Topper3164f332014-03-11 03:39:26 +00004352 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00004353 unsigned Major, Minor, Micro;
4354 getTriple().getOSVersion(Major, Minor, Micro);
4355 // New NetBSD uses the default rounding mode.
4356 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
4357 return X86_32TargetInfo::getFloatEvalMethod();
4358 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004359 return 1;
4360 }
4361};
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004362
Eli Friedmane3aa4542009-07-05 18:47:56 +00004363class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
4364public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004365 OpenBSDI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4366 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00004367 SizeType = UnsignedLong;
4368 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004369 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00004370 }
4371};
Eli Friedmane3aa4542009-07-05 18:47:56 +00004372
Eli Friedman9fa28852012-08-08 23:57:20 +00004373class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
4374public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004375 BitrigI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4376 : BitrigTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman9fa28852012-08-08 23:57:20 +00004377 SizeType = UnsignedLong;
4378 IntPtrType = SignedLong;
4379 PtrDiffType = SignedLong;
4380 }
4381};
Eli Friedman9fa28852012-08-08 23:57:20 +00004382
Torok Edwinb2b37c62009-06-30 17:10:35 +00004383class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004384public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004385 DarwinI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4386 : DarwinTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004387 LongDoubleWidth = 128;
4388 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004389 SuitableAlign = 128;
Tim Northover5627d392015-10-30 16:30:45 +00004390 MaxVectorAlign = 256;
4391 // The watchOS simulator uses the builtin bool type for Objective-C.
4392 llvm::Triple T = llvm::Triple(Triple);
4393 if (T.isWatchOS())
4394 UseSignedCharForObjCBool = false;
Eli Friedman32ca82a2009-03-29 20:31:09 +00004395 SizeType = UnsignedLong;
4396 IntPtrType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00004397 resetDataLayout("e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128");
Daniel Dunbarbd606522010-05-27 00:35:16 +00004398 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00004399 }
4400
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004401 bool handleTargetFeatures(std::vector<std::string> &Features,
4402 DiagnosticsEngine &Diags) override {
4403 if (!DarwinTargetInfo<X86_32TargetInfo>::handleTargetFeatures(Features,
4404 Diags))
4405 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004406 // We now know the features we have: we can decide how to align vectors.
4407 MaxVectorAlign =
4408 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004409 return true;
4410 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004411};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004412
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004413// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004414class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004415public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004416 WindowsX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4417 : WindowsTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Chris Lattner46be2e12009-06-24 17:12:15 +00004418 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00004419 DoubleAlign = LongLongAlign = 64;
Reid Kleckner7510c092015-04-01 16:45:06 +00004420 bool IsWinCOFF =
4421 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
James Y Knightb214cbc2016-03-04 19:00:41 +00004422 resetDataLayout(IsWinCOFF
4423 ? "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
4424 : "e-m:e-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32");
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004425 }
Craig Topper3164f332014-03-11 03:39:26 +00004426 void getTargetDefines(const LangOptions &Opts,
4427 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004428 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
4429 }
4430};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004431
4432// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004433class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004434public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004435 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple,
4436 const TargetOptions &Opts)
4437 : WindowsX86_32TargetInfo(Triple, Opts) {
Eli Friedman015d6282011-03-22 21:25:11 +00004438 LongDoubleWidth = LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00004439 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004440 }
Craig Topper3164f332014-03-11 03:39:26 +00004441 void getTargetDefines(const LangOptions &Opts,
4442 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004443 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
4444 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
4445 // The value of the following reflects processor type.
4446 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
4447 // We lost the original triple, so we use the default.
4448 Builder.defineMacro("_M_IX86", "600");
4449 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004450};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004451
David Majnemerae1ed0e2015-05-28 04:36:18 +00004452static void addCygMingDefines(const LangOptions &Opts, MacroBuilder &Builder) {
Eric Christopherb093d692015-10-09 18:39:59 +00004453 // Mingw and cygwin define __declspec(a) to __attribute__((a)). Clang
4454 // supports __declspec natively under -fms-extensions, but we define a no-op
4455 // __declspec macro anyway for pre-processor compatibility.
Reid Kleckner47606832014-04-21 20:58:00 +00004456 if (Opts.MicrosoftExt)
4457 Builder.defineMacro("__declspec", "__declspec");
4458 else
4459 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
4460
4461 if (!Opts.MicrosoftExt) {
4462 // Provide macros for all the calling convention keywords. Provide both
4463 // single and double underscore prefixed variants. These are available on
4464 // x64 as well as x86, even though they have no effect.
4465 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
4466 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00004467 std::string GCCSpelling = "__attribute__((__";
4468 GCCSpelling += CC;
4469 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00004470 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
4471 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
4472 }
4473 }
4474}
4475
David Majnemerae1ed0e2015-05-28 04:36:18 +00004476static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
4477 Builder.defineMacro("__MSVCRT__");
4478 Builder.defineMacro("__MINGW32__");
4479 addCygMingDefines(Opts, Builder);
4480}
4481
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004482// x86-32 MinGW target
4483class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
4484public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004485 MinGWX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4486 : WindowsX86_32TargetInfo(Triple, Opts) {}
Craig Topper3164f332014-03-11 03:39:26 +00004487 void getTargetDefines(const LangOptions &Opts,
4488 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004489 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004490 DefineStd(Builder, "WIN32", Opts);
4491 DefineStd(Builder, "WINNT", Opts);
4492 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00004493 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004494 }
4495};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004496
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004497// x86-32 Cygwin target
4498class CygwinX86_32TargetInfo : public X86_32TargetInfo {
4499public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004500 CygwinX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4501 : X86_32TargetInfo(Triple, Opts) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004502 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004503 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00004504 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 +00004505 }
Craig Topper3164f332014-03-11 03:39:26 +00004506 void getTargetDefines(const LangOptions &Opts,
4507 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004508 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00004509 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004510 Builder.defineMacro("__CYGWIN__");
4511 Builder.defineMacro("__CYGWIN32__");
David Majnemerae1ed0e2015-05-28 04:36:18 +00004512 addCygMingDefines(Opts, Builder);
Saleem Abdulrasool56027092017-02-07 19:00:06 +00004513 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00004514 if (Opts.CPlusPlus)
4515 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00004516 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004517};
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004518
Chris Lattnerb986aba2010-04-11 19:29:39 +00004519// x86-32 Haiku target
Reid Kleckner330fb172016-05-11 16:19:05 +00004520class HaikuX86_32TargetInfo : public HaikuTargetInfo<X86_32TargetInfo> {
Chris Lattnerb986aba2010-04-11 19:29:39 +00004521public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004522 HaikuX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Reid Kleckner330fb172016-05-11 16:19:05 +00004523 : HaikuTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman04831922010-08-22 01:00:03 +00004524 }
Craig Topper3164f332014-03-11 03:39:26 +00004525 void getTargetDefines(const LangOptions &Opts,
4526 MacroBuilder &Builder) const override {
Reid Kleckner330fb172016-05-11 16:19:05 +00004527 HaikuTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
Chris Lattnerb986aba2010-04-11 19:29:39 +00004528 Builder.defineMacro("__INTEL__");
Chris Lattnerb986aba2010-04-11 19:29:39 +00004529 }
4530};
Chris Lattnerb986aba2010-04-11 19:29:39 +00004531
Alexey Bataevc99b0492015-11-25 09:24:26 +00004532// X86-32 MCU target
4533class MCUX86_32TargetInfo : public X86_32TargetInfo {
4534public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004535 MCUX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4536 : X86_32TargetInfo(Triple, Opts) {
Alexey Bataevc99b0492015-11-25 09:24:26 +00004537 LongDoubleWidth = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00004538 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
James Y Knightb214cbc2016-03-04 19:00:41 +00004539 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 +00004540 WIntType = UnsignedInt;
Alexey Bataevc99b0492015-11-25 09:24:26 +00004541 }
4542
4543 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
4544 // On MCU we support only C calling convention.
4545 return CC == CC_C ? CCCR_OK : CCCR_Warning;
4546 }
4547
4548 void getTargetDefines(const LangOptions &Opts,
4549 MacroBuilder &Builder) const override {
4550 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4551 Builder.defineMacro("__iamcu");
4552 Builder.defineMacro("__iamcu__");
4553 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00004554
4555 bool allowsLargerPreferedTypeAlignment() const override {
4556 return false;
4557 }
Alexey Bataevc99b0492015-11-25 09:24:26 +00004558};
4559
Douglas Gregor9fabd852011-07-01 22:41:14 +00004560// RTEMS Target
4561template<typename Target>
4562class RTEMSTargetInfo : public OSTargetInfo<Target> {
4563protected:
Craig Topper3164f332014-03-11 03:39:26 +00004564 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4565 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004566 // RTEMS defines; list based off of gcc output
4567
Douglas Gregor9fabd852011-07-01 22:41:14 +00004568 Builder.defineMacro("__rtems__");
4569 Builder.defineMacro("__ELF__");
4570 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004571
Douglas Gregor9fabd852011-07-01 22:41:14 +00004572public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004573 RTEMSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4574 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004575 switch (Triple.getArch()) {
4576 default:
4577 case llvm::Triple::x86:
4578 // this->MCountName = ".mcount";
4579 break;
4580 case llvm::Triple::mips:
4581 case llvm::Triple::mipsel:
4582 case llvm::Triple::ppc:
4583 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00004584 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004585 // this->MCountName = "_mcount";
4586 break;
4587 case llvm::Triple::arm:
4588 // this->MCountName = "__mcount";
4589 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004590 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004591 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00004592};
4593
Douglas Gregor9fabd852011-07-01 22:41:14 +00004594// x86-32 RTEMS target
4595class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
4596public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004597 RTEMSX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4598 : X86_32TargetInfo(Triple, Opts) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004599 SizeType = UnsignedLong;
4600 IntPtrType = SignedLong;
4601 PtrDiffType = SignedLong;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004602 }
Craig Topper3164f332014-03-11 03:39:26 +00004603 void getTargetDefines(const LangOptions &Opts,
4604 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004605 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4606 Builder.defineMacro("__INTEL__");
4607 Builder.defineMacro("__rtems__");
4608 }
4609};
Douglas Gregor9fabd852011-07-01 22:41:14 +00004610
Eli Friedman3fd920a2008-08-20 02:34:37 +00004611// x86-64 generic target
4612class X86_64TargetInfo : public X86TargetInfo {
4613public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004614 X86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4615 : X86TargetInfo(Triple, Opts) {
David Blaikie40f842d2014-07-10 18:46:15 +00004616 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
David Majnemer8fa8c382015-03-17 23:55:00 +00004617 bool IsWinCOFF =
4618 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Zinovy Nis1db95732014-07-10 15:27:19 +00004619 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00004620 LongDoubleWidth = 128;
4621 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00004622 LargeArrayMinWidth = 128;
4623 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004624 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00004625 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
4626 PtrDiffType = IsX32 ? SignedInt : SignedLong;
4627 IntPtrType = IsX32 ? SignedInt : SignedLong;
4628 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00004629 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00004630 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00004631
Eric Christopher917e9522014-11-18 22:36:15 +00004632 // Pointers are 32-bit in x32.
Eric Christopherf6ee1f32017-02-10 04:35:21 +00004633 resetDataLayout(IsX32
4634 ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128"
4635 : IsWinCOFF ? "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
4636 : "e-m:e-i64:64-f80:128-n8:16:32:64-S128");
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00004637
4638 // Use fpret only for long double.
4639 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004640
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00004641 // Use fp2ret for _Complex long double.
4642 ComplexLongDoubleUsesFP2Ret = true;
4643
Charles Davisc7d5c942015-09-17 20:55:33 +00004644 // Make __builtin_ms_va_list available.
4645 HasBuiltinMSVaList = true;
4646
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004647 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004648 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00004649 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00004650 }
Craig Topper3164f332014-03-11 03:39:26 +00004651 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004652 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00004653 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004654
Craig Topper3164f332014-03-11 03:39:26 +00004655 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00004656 if (RegNo == 0) return 0;
4657 if (RegNo == 1) return 1;
4658 return -1;
4659 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004660
Craig Topper3164f332014-03-11 03:39:26 +00004661 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00004662 switch (CC) {
4663 case CC_C:
4664 case CC_Swift:
4665 case CC_X86VectorCall:
4666 case CC_IntelOclBicc:
4667 case CC_X86_64Win64:
Roman Levenstein35aa5ce2016-03-16 18:00:46 +00004668 case CC_PreserveMost:
4669 case CC_PreserveAll:
Erich Keane757d3172016-11-02 18:29:35 +00004670 case CC_X86RegCall:
John McCall477f2bb2016-03-03 06:39:32 +00004671 return CCCR_OK;
4672 default:
4673 return CCCR_Warning;
4674 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004675 }
4676
Craig Topper3164f332014-03-11 03:39:26 +00004677 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00004678 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004679 }
4680
Pavel Chupinfd223e12014-08-04 12:39:43 +00004681 // for x32 we need it here explicitly
4682 bool hasInt128Type() const override { return true; }
Reid Klecknerf27e7522016-02-01 18:58:24 +00004683 unsigned getUnwindWordWidth() const override { return 64; }
4684 unsigned getRegisterWidth() const override { return 64; }
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00004685
4686 bool validateGlobalRegisterVariable(StringRef RegName,
4687 unsigned RegSize,
4688 bool &HasSizeMismatch) const override {
4689 // rsp and rbp are the only 64-bit registers the x86 backend can currently
4690 // handle.
4691 if (RegName.equals("rsp") || RegName.equals("rbp")) {
4692 // Check that the register size is 64-bit.
4693 HasSizeMismatch = RegSize != 64;
4694 return true;
4695 }
4696
4697 // Check if the register is a 32-bit register the backend can handle.
4698 return X86TargetInfo::validateGlobalRegisterVariable(RegName, RegSize,
4699 HasSizeMismatch);
4700 }
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00004701 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
4702 return llvm::makeArrayRef(BuiltinInfoX86,
4703 X86::LastTSBuiltin - Builtin::FirstTSBuiltin);
4704 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004705};
Eli Friedman3fd920a2008-08-20 02:34:37 +00004706
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004707// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004708class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004709public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004710 WindowsX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4711 : WindowsTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004712 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00004713 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004714 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004715 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004716 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00004717 SizeType = UnsignedLongLong;
4718 PtrDiffType = SignedLongLong;
4719 IntPtrType = SignedLongLong;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004720 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004721
Craig Topper3164f332014-03-11 03:39:26 +00004722 void getTargetDefines(const LangOptions &Opts,
4723 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004724 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004725 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004726 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004727
Craig Topper3164f332014-03-11 03:39:26 +00004728 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004729 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00004730 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004731
Craig Topper3164f332014-03-11 03:39:26 +00004732 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004733 switch (CC) {
4734 case CC_X86StdCall:
4735 case CC_X86ThisCall:
4736 case CC_X86FastCall:
4737 return CCCR_Ignore;
4738 case CC_C:
4739 case CC_X86VectorCall:
4740 case CC_IntelOclBicc:
4741 case CC_X86_64SysV:
Arnold Schwaighofer4fc955e2016-10-12 18:59:24 +00004742 case CC_Swift:
Erich Keane757d3172016-11-02 18:29:35 +00004743 case CC_X86RegCall:
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004744 return CCCR_OK;
4745 default:
4746 return CCCR_Warning;
4747 }
Charles Davisb5a214e2013-08-30 04:39:01 +00004748 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004749};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004750
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004751// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004752class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004753public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004754 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple,
4755 const TargetOptions &Opts)
4756 : WindowsX86_64TargetInfo(Triple, Opts) {
Eli Friedman015d6282011-03-22 21:25:11 +00004757 LongDoubleWidth = LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00004758 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004759 }
Craig Topper3164f332014-03-11 03:39:26 +00004760 void getTargetDefines(const LangOptions &Opts,
4761 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004762 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
4763 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
David Majnemerb856e8f2015-07-26 23:17:29 +00004764 Builder.defineMacro("_M_X64", "100");
4765 Builder.defineMacro("_M_AMD64", "100");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004766 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004767};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004768
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004769// x86-64 MinGW target
4770class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
4771public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004772 MinGWX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4773 : WindowsX86_64TargetInfo(Triple, Opts) {
Reid Kleckner11a17192015-10-28 22:29:52 +00004774 // Mingw64 rounds long double size and alignment up to 16 bytes, but sticks
4775 // with x86 FP ops. Weird.
4776 LongDoubleWidth = LongDoubleAlign = 128;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00004777 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended();
Reid Kleckner11a17192015-10-28 22:29:52 +00004778 }
4779
Craig Topper3164f332014-03-11 03:39:26 +00004780 void getTargetDefines(const LangOptions &Opts,
4781 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004782 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004783 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004784 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00004785 addMinGWDefines(Opts, Builder);
Reid Klecknere070b992014-11-14 02:01:10 +00004786
4787 // GCC defines this macro when it is using __gxx_personality_seh0.
4788 if (!Opts.SjLjExceptions)
4789 Builder.defineMacro("__SEH__");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004790 }
4791};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004792
Yaron Kerend030d112015-07-22 17:38:19 +00004793// x86-64 Cygwin target
4794class CygwinX86_64TargetInfo : public X86_64TargetInfo {
4795public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004796 CygwinX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4797 : X86_64TargetInfo(Triple, Opts) {
Yaron Kerend030d112015-07-22 17:38:19 +00004798 TLSSupported = false;
4799 WCharType = UnsignedShort;
4800 }
4801 void getTargetDefines(const LangOptions &Opts,
4802 MacroBuilder &Builder) const override {
4803 X86_64TargetInfo::getTargetDefines(Opts, Builder);
4804 Builder.defineMacro("__x86_64__");
4805 Builder.defineMacro("__CYGWIN__");
4806 Builder.defineMacro("__CYGWIN64__");
4807 addCygMingDefines(Opts, Builder);
Saleem Abdulrasool56027092017-02-07 19:00:06 +00004808 DefineStd(Builder, "unix", Opts);
Yaron Kerend030d112015-07-22 17:38:19 +00004809 if (Opts.CPlusPlus)
4810 Builder.defineMacro("_GNU_SOURCE");
4811
4812 // GCC defines this macro when it is using __gxx_personality_seh0.
4813 if (!Opts.SjLjExceptions)
4814 Builder.defineMacro("__SEH__");
4815 }
4816};
4817
Eli Friedman2857ccb2009-07-01 03:36:11 +00004818class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
4819public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004820 DarwinX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4821 : DarwinTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00004822 Int64Type = SignedLongLong;
Tim Northovera2ee4332014-03-29 15:09:45 +00004823 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
4824 llvm::Triple T = llvm::Triple(Triple);
Bob Wilson946c04c2014-10-19 02:19:27 +00004825 if (T.isiOS())
Tim Northovera2ee4332014-03-29 15:09:45 +00004826 UseSignedCharForObjCBool = false;
James Y Knightb214cbc2016-03-04 19:00:41 +00004827 resetDataLayout("e-m:o-i64:64-f80:128-n8:16:32:64-S128");
Eli Friedman2857ccb2009-07-01 03:36:11 +00004828 }
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004829
4830 bool handleTargetFeatures(std::vector<std::string> &Features,
4831 DiagnosticsEngine &Diags) override {
4832 if (!DarwinTargetInfo<X86_64TargetInfo>::handleTargetFeatures(Features,
4833 Diags))
4834 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004835 // We now know the features we have: we can decide how to align vectors.
4836 MaxVectorAlign =
4837 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004838 return true;
4839 }
Eli Friedman2857ccb2009-07-01 03:36:11 +00004840};
Eli Friedman2857ccb2009-07-01 03:36:11 +00004841
Eli Friedman245f2292009-07-05 22:31:18 +00004842class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
4843public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004844 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4845 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Eli Friedman245f2292009-07-05 22:31:18 +00004846 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004847 Int64Type = SignedLongLong;
4848 }
4849};
Eli Friedman245f2292009-07-05 22:31:18 +00004850
Eli Friedman9fa28852012-08-08 23:57:20 +00004851class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
4852public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004853 BitrigX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4854 : BitrigTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004855 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004856 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00004857 }
4858};
Tim Northover9bb857a2013-01-31 12:13:10 +00004859
Eli Friedmanf05b7722008-08-20 07:44:10 +00004860class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004861 // Possible FPU choices.
4862 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004863 VFP2FPU = (1 << 0),
4864 VFP3FPU = (1 << 1),
4865 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00004866 NeonFPU = (1 << 3),
4867 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004868 };
4869
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004870 // Possible HWDiv features.
4871 enum HWDivMode {
4872 HWDivThumb = (1 << 0),
4873 HWDivARM = (1 << 1)
4874 };
4875
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004876 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004877 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004878 }
4879
4880 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4881 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004882
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004883 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004884
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004885 StringRef CPUProfile;
4886 StringRef CPUAttr;
4887
Rafael Espindolaeb265472013-08-21 21:59:03 +00004888 enum {
4889 FP_Default,
4890 FP_VFP,
4891 FP_Neon
4892 } FPMath;
4893
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004894 unsigned ArchISA;
Renato Goline84b0002015-10-08 16:43:26 +00004895 unsigned ArchKind = llvm::ARM::AK_ARMV4T;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004896 unsigned ArchProfile;
4897 unsigned ArchVersion;
4898
Bernard Ogdenda13af32013-10-24 18:32:51 +00004899 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004900
Logan Chien57086ce2012-10-10 06:56:20 +00004901 unsigned IsAAPCS : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004902 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004903
4904 // Initialized via features.
4905 unsigned SoftFloat : 1;
4906 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004907
Bernard Ogden18b57012013-10-29 09:47:51 +00004908 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00004909 unsigned Crypto : 1;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004910 unsigned DSP : 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004911 unsigned Unaligned : 1;
4912
4913 enum {
4914 LDREX_B = (1 << 0), /// byte (8-bit)
4915 LDREX_H = (1 << 1), /// half (16-bit)
4916 LDREX_W = (1 << 2), /// word (32-bit)
4917 LDREX_D = (1 << 3), /// double (64-bit)
4918 };
4919
4920 uint32_t LDREX;
Bernard Ogden18b57012013-10-29 09:47:51 +00004921
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004922 // ACLE 6.5.1 Hardware floating point
4923 enum {
4924 HW_FP_HP = (1 << 1), /// half (16-bit)
4925 HW_FP_SP = (1 << 2), /// single (32-bit)
4926 HW_FP_DP = (1 << 3), /// double (64-bit)
4927 };
4928 uint32_t HW_FP;
4929
Chris Lattner5cc15e02010-03-03 19:03:45 +00004930 static const Builtin::Info BuiltinInfo[];
4931
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004932 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004933 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004934
4935 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00004936 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004937
Renato Golin0201a9e2016-09-22 19:28:20 +00004938 // size_t is unsigned long on MachO-derived environments, NetBSD,
4939 // OpenBSD and Bitrig.
Renato Golin9ba39232015-02-27 16:35:48 +00004940 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD ||
Renato Golin0201a9e2016-09-22 19:28:20 +00004941 T.getOS() == llvm::Triple::OpenBSD ||
Renato Golin9ba39232015-02-27 16:35:48 +00004942 T.getOS() == llvm::Triple::Bitrig)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004943 SizeType = UnsignedLong;
4944 else
4945 SizeType = UnsignedInt;
4946
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004947 switch (T.getOS()) {
4948 case llvm::Triple::NetBSD:
Renato Golin0201a9e2016-09-22 19:28:20 +00004949 case llvm::Triple::OpenBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004950 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004951 break;
4952 case llvm::Triple::Win32:
4953 WCharType = UnsignedShort;
4954 break;
4955 case llvm::Triple::Linux:
4956 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004957 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
4958 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004959 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004960 }
4961
4962 UseBitFieldTypeAlignment = true;
4963
4964 ZeroLengthBitfieldBoundary = 0;
4965
Tim Northover147cd2f2014-10-14 22:12:21 +00004966 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
4967 // so set preferred for small types to 32.
4968 if (T.isOSBinFormatMachO()) {
James Y Knightb214cbc2016-03-04 19:00:41 +00004969 resetDataLayout(BigEndian
4970 ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4971 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Tim Northover147cd2f2014-10-14 22:12:21 +00004972 } else if (T.isOSWindows()) {
Tim Northover147cd2f2014-10-14 22:12:21 +00004973 assert(!BigEndian && "Windows on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004974 resetDataLayout("e"
4975 "-m:w"
4976 "-p:32:32"
4977 "-i64:64"
4978 "-v128:64:128"
4979 "-a:0:32"
4980 "-n32"
4981 "-S64");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00004982 } else if (T.isOSNaCl()) {
4983 assert(!BigEndian && "NaCl on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004984 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004985 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00004986 resetDataLayout(BigEndian
4987 ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4988 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004989 }
4990
4991 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004992 }
4993
Tim Northover5627d392015-10-30 16:30:45 +00004994 void setABIAPCS(bool IsAAPCS16) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00004995 const llvm::Triple &T = getTriple();
4996
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004997 IsAAPCS = false;
4998
Tim Northover5627d392015-10-30 16:30:45 +00004999 if (IsAAPCS16)
5000 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
5001 else
5002 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00005003
Rafael Espindolad6c2b722013-12-18 19:47:32 +00005004 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00005005 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00005006 SizeType = UnsignedInt;
5007 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00005008 SizeType = UnsignedLong;
5009
5010 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
5011 WCharType = SignedInt;
5012
5013 // Do not respect the alignment of bit-field types when laying out
5014 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
5015 UseBitFieldTypeAlignment = false;
5016
5017 /// gcc forces the alignment to 4 bytes, regardless of the type of the
5018 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
5019 /// gcc.
5020 ZeroLengthBitfieldBoundary = 32;
5021
Tim Northover5627d392015-10-30 16:30:45 +00005022 if (T.isOSBinFormatMachO() && IsAAPCS16) {
5023 assert(!BigEndian && "AAPCS16 does not support big-endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00005024 resetDataLayout("e-m:o-p:32:32-i64:64-a:0:32-n32-S128");
Tim Northover5627d392015-10-30 16:30:45 +00005025 } else if (T.isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00005026 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00005027 BigEndian
5028 ? "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 +00005029 : "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 +00005030 else
James Y Knightb214cbc2016-03-04 19:00:41 +00005031 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00005032 BigEndian
5033 ? "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 +00005034 : "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 +00005035
5036 // FIXME: Override "preferred align" for double and long long.
5037 }
5038
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005039 void setArchInfo() {
5040 StringRef ArchName = getTriple().getArchName();
5041
Renato Goline84b0002015-10-08 16:43:26 +00005042 ArchISA = llvm::ARM::parseArchISA(ArchName);
5043 CPU = llvm::ARM::getDefaultCPU(ArchName);
5044 unsigned AK = llvm::ARM::parseArch(ArchName);
5045 if (AK != llvm::ARM::AK_INVALID)
5046 ArchKind = AK;
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005047 setArchInfo(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005048 }
5049
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005050 void setArchInfo(unsigned Kind) {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005051 StringRef SubArch;
5052
5053 // cache TargetParser info
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005054 ArchKind = Kind;
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00005055 SubArch = llvm::ARM::getSubArch(ArchKind);
5056 ArchProfile = llvm::ARM::parseArchProfile(SubArch);
5057 ArchVersion = llvm::ARM::parseArchVersion(SubArch);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005058
5059 // cache CPU related strings
5060 CPUAttr = getCPUAttr();
5061 CPUProfile = getCPUProfile();
5062 }
5063
5064 void setAtomic() {
Eric Christopherb093d692015-10-09 18:39:59 +00005065 // when triple does not specify a sub arch,
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005066 // then we are not using inline atomics
Renato Goline84b0002015-10-08 16:43:26 +00005067 bool ShouldUseInlineAtomic =
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005068 (ArchISA == llvm::ARM::IK_ARM && ArchVersion >= 6) ||
5069 (ArchISA == llvm::ARM::IK_THUMB && ArchVersion >= 7);
Eric Christopherb093d692015-10-09 18:39:59 +00005070 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005071 if (ArchProfile == llvm::ARM::PK_M) {
5072 MaxAtomicPromoteWidth = 32;
5073 if (ShouldUseInlineAtomic)
5074 MaxAtomicInlineWidth = 32;
5075 }
5076 else {
5077 MaxAtomicPromoteWidth = 64;
5078 if (ShouldUseInlineAtomic)
5079 MaxAtomicInlineWidth = 64;
Eric Christopherb093d692015-10-09 18:39:59 +00005080 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005081 }
5082
5083 bool isThumb() const {
5084 return (ArchISA == llvm::ARM::IK_THUMB);
5085 }
5086
5087 bool supportsThumb() const {
5088 return CPUAttr.count('T') || ArchVersion >= 6;
5089 }
5090
5091 bool supportsThumb2() const {
Bradley Smithf4affc12016-03-03 13:52:22 +00005092 return CPUAttr.equals("6T2") ||
5093 (ArchVersion >= 7 && !CPUAttr.equals("8M_BASE"));
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005094 }
5095
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005096 StringRef getCPUAttr() const {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005097 // For most sub-arches, the build attribute CPU name is enough.
5098 // For Cortex variants, it's slightly different.
5099 switch(ArchKind) {
5100 default:
Chandler Carruthd96f37a2015-08-30 07:51:18 +00005101 return llvm::ARM::getCPUAttr(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005102 case llvm::ARM::AK_ARMV6M:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005103 return "6M";
Tim Northover525c73c2015-07-21 21:47:33 +00005104 case llvm::ARM::AK_ARMV7S:
5105 return "7S";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005106 case llvm::ARM::AK_ARMV7A:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005107 return "7A";
5108 case llvm::ARM::AK_ARMV7R:
5109 return "7R";
5110 case llvm::ARM::AK_ARMV7M:
5111 return "7M";
5112 case llvm::ARM::AK_ARMV7EM:
5113 return "7EM";
George Burgess IVfc970562017-02-09 23:30:10 +00005114 case llvm::ARM::AK_ARMV7VE:
5115 return "7VE";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005116 case llvm::ARM::AK_ARMV8A:
5117 return "8A";
5118 case llvm::ARM::AK_ARMV8_1A:
5119 return "8_1A";
Oliver Stannard3086c042016-02-11 16:05:52 +00005120 case llvm::ARM::AK_ARMV8_2A:
5121 return "8_2A";
Bradley Smithf4affc12016-03-03 13:52:22 +00005122 case llvm::ARM::AK_ARMV8MBaseline:
5123 return "8M_BASE";
5124 case llvm::ARM::AK_ARMV8MMainline:
5125 return "8M_MAIN";
Javed Absar00b74442016-10-07 12:08:41 +00005126 case llvm::ARM::AK_ARMV8R:
5127 return "8R";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005128 }
5129 }
5130
5131 StringRef getCPUProfile() const {
5132 switch(ArchProfile) {
5133 case llvm::ARM::PK_A:
5134 return "A";
5135 case llvm::ARM::PK_R:
5136 return "R";
5137 case llvm::ARM::PK_M:
5138 return "M";
5139 default:
5140 return "";
5141 }
5142 }
5143
Chris Lattner17df24e2008-04-21 18:56:49 +00005144public:
Matt Arsenaultf333de32016-09-07 07:08:02 +00005145 ARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005146 : TargetInfo(Triple), FPMath(FP_Default), IsAAPCS(true), LDREX(0),
5147 HW_FP(0) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005148
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00005149 switch (getTriple().getOS()) {
5150 case llvm::Triple::NetBSD:
Renato Golin0201a9e2016-09-22 19:28:20 +00005151 case llvm::Triple::OpenBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00005152 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00005153 break;
5154 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00005155 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00005156 break;
5157 }
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00005158
Renato Goline84b0002015-10-08 16:43:26 +00005159 // Cache arch related info.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005160 setArchInfo();
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00005161
Chris Lattner1a8f3942010-04-23 16:29:58 +00005162 // {} in inline assembly are neon specifiers, not assembly variant
5163 // specifiers.
5164 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005165
Eric Christopher0e261882014-12-05 01:06:59 +00005166 // FIXME: This duplicates code from the driver that sets the -target-abi
5167 // option - this code is used if -target-abi isn't passed and should
5168 // be unified in some way.
5169 if (Triple.isOSBinFormatMachO()) {
5170 // The backend is hardwired to assume AAPCS for M-class processors, ensure
5171 // the frontend matches that.
5172 if (Triple.getEnvironment() == llvm::Triple::EABI ||
5173 Triple.getOS() == llvm::Triple::UnknownOS ||
Zijiao Ma56a83722016-08-17 02:13:33 +00005174 ArchProfile == llvm::ARM::PK_M) {
Eric Christopher0e261882014-12-05 01:06:59 +00005175 setABI("aapcs");
Tim Northoverd88ecb32016-01-27 19:32:40 +00005176 } else if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00005177 setABI("aapcs16");
Eric Christopher0e261882014-12-05 01:06:59 +00005178 } else {
5179 setABI("apcs-gnu");
5180 }
5181 } else if (Triple.isOSWindows()) {
5182 // FIXME: this is invalid for WindowsCE
5183 setABI("aapcs");
5184 } else {
5185 // Select the default based on the platform.
5186 switch (Triple.getEnvironment()) {
5187 case llvm::Triple::Android:
5188 case llvm::Triple::GNUEABI:
5189 case llvm::Triple::GNUEABIHF:
Rafael Espindola0fa66802016-06-24 21:35:06 +00005190 case llvm::Triple::MuslEABI:
5191 case llvm::Triple::MuslEABIHF:
Eric Christopher0e261882014-12-05 01:06:59 +00005192 setABI("aapcs-linux");
5193 break;
5194 case llvm::Triple::EABIHF:
5195 case llvm::Triple::EABI:
5196 setABI("aapcs");
5197 break;
Eric Christopher560cc4f2014-12-18 02:08:55 +00005198 case llvm::Triple::GNU:
Renato Goline84b0002015-10-08 16:43:26 +00005199 setABI("apcs-gnu");
5200 break;
Eric Christopher0e261882014-12-05 01:06:59 +00005201 default:
5202 if (Triple.getOS() == llvm::Triple::NetBSD)
5203 setABI("apcs-gnu");
Brad Smith3d648b32017-02-28 03:20:26 +00005204 else if (Triple.getOS() == llvm::Triple::OpenBSD)
5205 setABI("aapcs-linux");
Eric Christopher0e261882014-12-05 01:06:59 +00005206 else
5207 setABI("aapcs");
5208 break;
5209 }
5210 }
John McCall86353412010-08-21 22:46:04 +00005211
5212 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00005213 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005214
Renato Golin15b86152015-07-03 16:41:13 +00005215 // ARM has atomics up to 8 bytes
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005216 setAtomic();
Rafael Espindola5ab8e2e2015-07-02 15:14:10 +00005217
James Molloya7139222012-03-12 09:14:10 +00005218 // Do force alignment of members that follow zero length bitfields. If
Eric Christopher917e9522014-11-18 22:36:15 +00005219 // the alignment of the zero-length bitfield is greater than the member
5220 // that follows it, `bar', `bar' will be aligned as the type of the
James Molloya7139222012-03-12 09:14:10 +00005221 // zero length bitfield.
5222 UseZeroLengthBitfieldAlignment = true;
Saleem Abdulrasool9b5ba542016-04-10 03:19:47 +00005223
5224 if (Triple.getOS() == llvm::Triple::Linux ||
5225 Triple.getOS() == llvm::Triple::UnknownOS)
5226 this->MCountName =
5227 Opts.EABIVersion == "gnu" ? "\01__gnu_mcount_nc" : "\01mcount";
Eli Friedmanb5366062008-05-20 14:21:01 +00005228 }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00005229
Alp Toker4925ba72014-06-07 23:30:42 +00005230 StringRef getABI() const override { return ABI; }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00005231
Craig Topper3164f332014-03-11 03:39:26 +00005232 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00005233 ABI = Name;
5234
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00005235 // The defaults (above) are for AAPCS, check if we need to change them.
5236 //
5237 // FIXME: We need support for -meabi... we could just mangle it into the
5238 // name.
Tim Northover756447a2015-10-30 16:30:36 +00005239 if (Name == "apcs-gnu" || Name == "aapcs16") {
Tim Northover5627d392015-10-30 16:30:45 +00005240 setABIAPCS(Name == "aapcs16");
Rafael Espindolad6c2b722013-12-18 19:47:32 +00005241 return true;
5242 }
5243 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
5244 setABIAAPCS();
5245 return true;
5246 }
5247 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00005248 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00005249
Renato Golinf5c4dec2015-05-27 13:33:00 +00005250 // FIXME: This should be based on Arch attributes, not CPU names.
Eric Christopher8c47b422015-10-09 18:39:55 +00005251 bool
5252 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
5253 StringRef CPU,
5254 const std::vector<std::string> &FeaturesVec) const override {
5255
Mehdi Aminia0016ec2016-10-07 08:37:29 +00005256 std::vector<StringRef> TargetFeatures;
Bradley Smithb3501962015-11-16 11:16:36 +00005257 unsigned Arch = llvm::ARM::parseArch(getTriple().getArchName());
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005258
5259 // get default FPU features
Bradley Smithb3501962015-11-16 11:16:36 +00005260 unsigned FPUKind = llvm::ARM::getDefaultFPU(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005261 llvm::ARM::getFPUFeatures(FPUKind, TargetFeatures);
5262
5263 // get default Extension features
Bradley Smithb3501962015-11-16 11:16:36 +00005264 unsigned Extensions = llvm::ARM::getDefaultExtensions(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005265 llvm::ARM::getExtensionFeatures(Extensions, TargetFeatures);
5266
Mehdi Aminia0016ec2016-10-07 08:37:29 +00005267 for (auto Feature : TargetFeatures)
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005268 if (Feature[0] == '+')
Mehdi Aminia0016ec2016-10-07 08:37:29 +00005269 Features[Feature.drop_front(1)] = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005270
Eric Christopher007b0a02015-08-28 22:32:01 +00005271 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005272 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005273
Craig Topper3164f332014-03-11 03:39:26 +00005274 bool handleTargetFeatures(std::vector<std::string> &Features,
5275 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005276 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00005277 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00005278 Crypto = 0;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005279 DSP = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005280 Unaligned = 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005281 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005282 HWDiv = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005283
Ranjeet Singhac08e532015-06-24 23:39:25 +00005284 // This does not diagnose illegal cases like having both
5285 // "+vfpv2" and "+vfpv3" or having "+neon" and "+fp-only-sp".
5286 uint32_t HW_FP_remove = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005287 for (const auto &Feature : Features) {
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005288 if (Feature == "+soft-float") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00005289 SoftFloat = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005290 } else if (Feature == "+soft-float-abi") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00005291 SoftFloatABI = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005292 } else if (Feature == "+vfp2") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005293 FPU |= VFP2FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005294 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005295 } else if (Feature == "+vfp3") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005296 FPU |= VFP3FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005297 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005298 } else if (Feature == "+vfp4") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005299 FPU |= VFP4FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005300 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005301 } else if (Feature == "+fp-armv8") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00005302 FPU |= FPARMV8;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005303 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005304 } else if (Feature == "+neon") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005305 FPU |= NeonFPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005306 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005307 } else if (Feature == "+hwdiv") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005308 HWDiv |= HWDivThumb;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005309 } else if (Feature == "+hwdiv-arm") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005310 HWDiv |= HWDivARM;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005311 } else if (Feature == "+crc") {
Bernard Ogden18b57012013-10-29 09:47:51 +00005312 CRC = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005313 } else if (Feature == "+crypto") {
Tim Northover02e38602014-02-03 17:28:04 +00005314 Crypto = 1;
Artyom Skrobov05d85ae2015-10-23 17:19:02 +00005315 } else if (Feature == "+dsp") {
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005316 DSP = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005317 } else if (Feature == "+fp-only-sp") {
Matt Arsenault250024f2016-06-08 01:56:42 +00005318 HW_FP_remove |= HW_FP_DP;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005319 } else if (Feature == "+strict-align") {
5320 Unaligned = 0;
5321 } else if (Feature == "+fp16") {
5322 HW_FP |= HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005323 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00005324 }
Ranjeet Singhac08e532015-06-24 23:39:25 +00005325 HW_FP &= ~HW_FP_remove;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005326
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005327 switch (ArchVersion) {
5328 case 6:
5329 if (ArchProfile == llvm::ARM::PK_M)
5330 LDREX = 0;
5331 else if (ArchKind == llvm::ARM::AK_ARMV6K)
5332 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5333 else
5334 LDREX = LDREX_W;
5335 break;
5336 case 7:
5337 if (ArchProfile == llvm::ARM::PK_M)
5338 LDREX = LDREX_W | LDREX_H | LDREX_B ;
5339 else
5340 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5341 break;
5342 case 8:
5343 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5344 }
5345
Rafael Espindolaeb265472013-08-21 21:59:03 +00005346 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
5347 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
5348 return false;
5349 }
5350
5351 if (FPMath == FP_Neon)
5352 Features.push_back("+neonfp");
5353 else if (FPMath == FP_VFP)
5354 Features.push_back("-neonfp");
5355
Daniel Dunbar893d4752009-12-19 04:15:38 +00005356 // Remove front-end specific options which the backend handles differently.
Eric Christopher9e172d22015-05-12 01:26:21 +00005357 auto Feature =
5358 std::find(Features.begin(), Features.end(), "+soft-float-abi");
5359 if (Feature != Features.end())
5360 Features.erase(Feature);
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005361
Rafael Espindolaeb265472013-08-21 21:59:03 +00005362 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005363 }
5364
Craig Topper3164f332014-03-11 03:39:26 +00005365 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005366 return llvm::StringSwitch<bool>(Feature)
5367 .Case("arm", true)
Ben Langmuir587aeaf2015-08-07 01:59:56 +00005368 .Case("aarch32", true)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005369 .Case("softfloat", SoftFloat)
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005370 .Case("thumb", isThumb())
Amara Emerson8c3de542013-09-16 18:07:35 +00005371 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005372 .Case("hwdiv", HWDiv & HWDivThumb)
5373 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005374 .Default(false);
5375 }
Renato Golin15b86152015-07-03 16:41:13 +00005376
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005377 bool setCPU(const std::string &Name) override {
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005378 if (Name != "generic")
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00005379 setArchInfo(llvm::ARM::parseCPUArch(Name));
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005380
Renato Golin15b86152015-07-03 16:41:13 +00005381 if (ArchKind == llvm::ARM::AK_INVALID)
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005382 return false;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005383 setAtomic();
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005384 CPU = Name;
5385 return true;
5386 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005387
Craig Topper3164f332014-03-11 03:39:26 +00005388 bool setFPMath(StringRef Name) override;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005389
Craig Topper3164f332014-03-11 03:39:26 +00005390 void getTargetDefines(const LangOptions &Opts,
5391 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00005392 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005393 Builder.defineMacro("__arm");
5394 Builder.defineMacro("__arm__");
Weiming Zhaob0613132016-04-18 16:25:46 +00005395 // For bare-metal none-eabi.
5396 if (getTriple().getOS() == llvm::Triple::UnknownOS &&
5397 getTriple().getEnvironment() == llvm::Triple::EABI)
5398 Builder.defineMacro("__ELF__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00005399
Chris Lattnerecd49032009-03-02 22:27:17 +00005400 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005401 Builder.defineMacro("__REGISTER_PREFIX__", "");
Tim Northover5627d392015-10-30 16:30:45 +00005402
5403 // Unfortunately, __ARM_ARCH_7K__ is now more of an ABI descriptor. The CPU
5404 // happens to be Cortex-A7 though, so it should still get __ARM_ARCH_7A__.
Tim Northoverd88ecb32016-01-27 19:32:40 +00005405 if (getTriple().isWatchABI())
Tim Northover5627d392015-10-30 16:30:45 +00005406 Builder.defineMacro("__ARM_ARCH_7K__", "2");
5407
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005408 if (!CPUAttr.empty())
5409 Builder.defineMacro("__ARM_ARCH_" + CPUAttr + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005410
5411 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005412 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
Benjamin Kramerb42d9a52015-12-24 10:07:37 +00005413 Builder.defineMacro("__ARM_ARCH", Twine(ArchVersion));
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005414
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005415 if (ArchVersion >= 8) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005416 // ACLE 6.5.7 Crypto Extension
5417 if (Crypto)
5418 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
5419 // ACLE 6.5.8 CRC32 Extension
5420 if (CRC)
5421 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
5422 // ACLE 6.5.10 Numeric Maximum and Minimum
5423 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
5424 // ACLE 6.5.9 Directed Rounding
5425 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
James Molloy0ffb0932014-09-15 11:25:38 +00005426 }
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005427
5428 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
5429 // is not defined for the M-profile.
Bradley Smithf4affc12016-03-03 13:52:22 +00005430 // NOTE that the default profile is assumed to be 'A'
5431 if (CPUProfile.empty() || ArchProfile != llvm::ARM::PK_M)
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005432 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
5433
Bradley Smithf4affc12016-03-03 13:52:22 +00005434 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supports the original
5435 // Thumb ISA (including v6-M and v8-M Baseline). It is set to 2 if the
5436 // core supports the Thumb-2 ISA as found in the v6T2 architecture and all
5437 // v7 and v8 architectures excluding v8-M Baseline.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005438 if (supportsThumb2())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005439 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005440 else if (supportsThumb())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005441 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
5442
5443 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
5444 // instruction set such as ARM or Thumb.
5445 Builder.defineMacro("__ARM_32BIT_STATE", "1");
5446
5447 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
5448
5449 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005450 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005451 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00005452
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005453 // ACLE 6.4.3 Unaligned access supported in hardware
Eric Christopherb093d692015-10-09 18:39:59 +00005454 if (Unaligned)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005455 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Eric Christopherb093d692015-10-09 18:39:59 +00005456
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005457 // ACLE 6.4.4 LDREX/STREX
5458 if (LDREX)
5459 Builder.defineMacro("__ARM_FEATURE_LDREX", "0x" + llvm::utohexstr(LDREX));
5460
5461 // ACLE 6.4.5 CLZ
Eric Christopherb093d692015-10-09 18:39:59 +00005462 if (ArchVersion == 5 ||
5463 (ArchVersion == 6 && CPUProfile != "M") ||
5464 ArchVersion > 6)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005465 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
5466
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005467 // ACLE 6.5.1 Hardware Floating Point
5468 if (HW_FP)
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +00005469 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005470
Yi Konga44c4d72014-06-27 21:25:42 +00005471 // ACLE predefines.
5472 Builder.defineMacro("__ARM_ACLE", "200");
5473
Oliver Stannarddc2854c2015-09-03 12:40:58 +00005474 // FP16 support (we currently only support IEEE format).
5475 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
5476 Builder.defineMacro("__ARM_FP16_ARGS", "1");
5477
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005478 // ACLE 6.5.3 Fused multiply-accumulate (FMA)
Silviu Baranga632fdc52016-04-28 11:29:08 +00005479 if (ArchVersion >= 7 && (FPU & VFP4FPU))
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005480 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
5481
Mike Stump9d54bd72009-04-08 02:07:04 +00005482 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005483
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005484 // FIXME: It's more complicated than this and we don't really support
5485 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005486 // Windows on ARM does not "support" interworking
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005487 if (5 <= ArchVersion && ArchVersion <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005488 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005489
David Tweed8f676532012-10-25 13:33:01 +00005490 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00005491 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005492 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
Tim Northover862eaf82016-05-13 21:26:45 +00005493 if (!getTriple().isOSBinFormatMachO() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00005494 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005495 Builder.defineMacro("__ARM_PCS", "1");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005496 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005497
Tim Northover28fc0e12016-04-28 13:59:55 +00005498 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp" ||
5499 ABI == "aapcs16")
5500 Builder.defineMacro("__ARM_PCS_VFP", "1");
5501
Daniel Dunbar893d4752009-12-19 04:15:38 +00005502 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005503 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005504
Zijiao Ma56a83722016-08-17 02:13:33 +00005505 if (ArchKind == llvm::ARM::AK_XSCALE)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005506 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005507
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005508 if (isThumb()) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005509 Builder.defineMacro("__THUMBEL__");
5510 Builder.defineMacro("__thumb__");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005511 if (supportsThumb2())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005512 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005513 }
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005514
5515 // ACLE 6.4.9 32-bit SIMD instructions
5516 if (ArchVersion >= 6 && (CPUProfile != "M" || CPUAttr == "7EM"))
5517 Builder.defineMacro("__ARM_FEATURE_SIMD32", "1");
5518
5519 // ACLE 6.4.10 Hardware Integer Divide
Eric Christopherb093d692015-10-09 18:39:59 +00005520 if (((HWDiv & HWDivThumb) && isThumb()) ||
5521 ((HWDiv & HWDivARM) && !isThumb())) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005522 Builder.defineMacro("__ARM_FEATURE_IDIV", "1");
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005523 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005524 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005525
5526 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005527 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005528
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005529 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005530 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005531 if (FPU & VFP2FPU)
5532 Builder.defineMacro("__ARM_VFPV2__");
5533 if (FPU & VFP3FPU)
5534 Builder.defineMacro("__ARM_VFPV3__");
5535 if (FPU & VFP4FPU)
5536 Builder.defineMacro("__ARM_VFPV4__");
Tim Northoverc67803f2016-12-21 20:49:43 +00005537 if (FPU & FPARMV8)
5538 Builder.defineMacro("__ARM_FPV5__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005539 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00005540
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005541 // This only gets set when Neon instructions are actually available, unlike
5542 // the VFP define, hence the soft float and arch check. This is subtly
5543 // different from gcc, we follow the intent which was that it should be set
5544 // when Neon instructions are actually available.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005545 if ((FPU & NeonFPU) && !SoftFloat && ArchVersion >= 7) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005546 Builder.defineMacro("__ARM_NEON", "1");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005547 Builder.defineMacro("__ARM_NEON__");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005548 // current AArch32 NEON implementations do not support double-precision
5549 // floating-point even when it is present in VFP.
Eric Christopherb093d692015-10-09 18:39:59 +00005550 Builder.defineMacro("__ARM_NEON_FP",
5551 "0x" + llvm::utohexstr(HW_FP & ~HW_FP_DP));
Tim Northover5bb34ca2013-11-21 12:36:34 +00005552 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00005553
Bradley Smith0f28f0c2014-01-20 10:52:00 +00005554 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
5555 Opts.ShortWChar ? "2" : "4");
5556
5557 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5558 Opts.ShortEnums ? "1" : "4");
5559
Bradley Smithf4affc12016-03-03 13:52:22 +00005560 if (ArchVersion >= 6 && CPUAttr != "6M" && CPUAttr != "8M_BASE") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00005561 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5562 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5563 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5564 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
5565 }
Sergey Dmitrouk745f5302014-11-25 08:57:36 +00005566
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005567 // ACLE 6.4.7 DSP instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005568 if (DSP) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005569 Builder.defineMacro("__ARM_FEATURE_DSP", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005570 }
5571
5572 // ACLE 6.4.8 Saturation instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005573 bool SAT = false;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005574 if ((ArchVersion == 6 && CPUProfile != "M") || ArchVersion > 6 ) {
5575 Builder.defineMacro("__ARM_FEATURE_SAT", "1");
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005576 SAT = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005577 }
5578
5579 // ACLE 6.4.6 Q (saturation) flag
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005580 if (DSP || SAT)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005581 Builder.defineMacro("__ARM_FEATURE_QBIT", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005582
5583 if (Opts.UnsafeFPMath)
5584 Builder.defineMacro("__ARM_FP_FAST", "1");
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005585
5586 if (ArchKind == llvm::ARM::AK_ARMV8_1A)
5587 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
Chris Lattner17df24e2008-04-21 18:56:49 +00005588 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005589
Craig Topper6c03a542015-10-19 04:51:35 +00005590 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5591 return llvm::makeArrayRef(BuiltinInfo,
5592 clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner17df24e2008-04-21 18:56:49 +00005593 }
Craig Topper3164f332014-03-11 03:39:26 +00005594 bool isCLZForZeroUndef() const override { return false; }
5595 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northover5627d392015-10-30 16:30:45 +00005596 return IsAAPCS
5597 ? AAPCSABIBuiltinVaList
Tim Northoverd88ecb32016-01-27 19:32:40 +00005598 : (getTriple().isWatchABI() ? TargetInfo::CharPtrBuiltinVaList
5599 : TargetInfo::VoidPtrBuiltinVaList);
Chris Lattner17df24e2008-04-21 18:56:49 +00005600 }
Craig Topperf054e3a2015-10-19 03:52:27 +00005601 ArrayRef<const char *> getGCCRegNames() const override;
5602 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00005603 bool validateAsmConstraint(const char *&Name,
5604 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00005605 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00005606 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00005607 case 'l': // r0-r7
5608 case 'h': // r8-r15
JF Bastien750caef2016-02-19 06:54:45 +00005609 case 't': // VFP Floating point register single precision
5610 case 'w': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00005611 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00005612 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005613 case 'I':
5614 case 'J':
5615 case 'K':
5616 case 'L':
5617 case 'M':
5618 // FIXME
5619 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00005620 case 'Q': // A memory address that is a single base register.
5621 Info.setAllowsMemory();
5622 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005623 case 'U': // a memory reference...
5624 switch (Name[1]) {
5625 case 'q': // ...ARMV4 ldrsb
5626 case 'v': // ...VFP load/store (reg+constant offset)
5627 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00005628 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00005629 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00005630 case 'n': // valid address for Neon doubleword vector load/store
5631 case 'm': // valid address for Neon element and structure load/store
5632 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00005633 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005634 Info.setAllowsMemory();
5635 Name++;
5636 return true;
5637 }
Nate Begeman2908fa02008-04-22 05:03:19 +00005638 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005639 return false;
5640 }
Craig Topper3164f332014-03-11 03:39:26 +00005641 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005642 std::string R;
5643 switch (*Constraint) {
5644 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00005645 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005646 Constraint++;
5647 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00005648 case 'p': // 'p' should be translated to 'r' by default.
5649 R = std::string("r");
5650 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005651 default:
5652 return std::string(1, *Constraint);
5653 }
5654 return R;
5655 }
Akira Hatanaka987f1862014-08-22 06:05:21 +00005656 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005657 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005658 std::string &SuggestedModifier) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00005659 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00005660 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00005661
Bill Wendling9d1ee112012-10-25 23:28:48 +00005662 // Strip off constraint modifiers.
5663 while (Constraint[0] == '=' ||
5664 Constraint[0] == '+' ||
5665 Constraint[0] == '&')
5666 Constraint = Constraint.substr(1);
5667
5668 switch (Constraint[0]) {
5669 default: break;
5670 case 'r': {
5671 switch (Modifier) {
5672 default:
Tim Northover8f24b172013-12-08 15:24:55 +00005673 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00005674 case 'q':
5675 // A register of size 32 cannot fit a vector type.
5676 return false;
5677 }
5678 }
5679 }
5680
5681 return true;
5682 }
Craig Topper3164f332014-03-11 03:39:26 +00005683 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00005684 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00005685 return "";
5686 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005687
Craig Topper3164f332014-03-11 03:39:26 +00005688 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00005689 switch (CC) {
5690 case CC_AAPCS:
5691 case CC_AAPCS_VFP:
5692 case CC_Swift:
5693 return CCCR_OK;
5694 default:
5695 return CCCR_Warning;
5696 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005697 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00005698
Craig Topper3164f332014-03-11 03:39:26 +00005699 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00005700 if (RegNo == 0) return 0;
5701 if (RegNo == 1) return 1;
5702 return -1;
5703 }
Matthias Braund1e2fad2015-07-17 00:15:22 +00005704
5705 bool hasSjLjLowering() const override {
5706 return true;
5707 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005708};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005709
Rafael Espindolaeb265472013-08-21 21:59:03 +00005710bool ARMTargetInfo::setFPMath(StringRef Name) {
5711 if (Name == "neon") {
5712 FPMath = FP_Neon;
5713 return true;
5714 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
5715 Name == "vfp4") {
5716 FPMath = FP_VFP;
5717 return true;
5718 }
5719 return false;
5720}
5721
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005722const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005723 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005724 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005725 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
5726
5727 // Float registers
5728 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
5729 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
5730 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005731 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005732
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005733 // Double registers
5734 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
5735 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005736 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
5737 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005738
5739 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005740 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
5741 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005742};
5743
Craig Topperf054e3a2015-10-19 03:52:27 +00005744ArrayRef<const char *> ARMTargetInfo::getGCCRegNames() const {
5745 return llvm::makeArrayRef(GCCRegNames);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005746}
5747
5748const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005749 { { "a1" }, "r0" },
5750 { { "a2" }, "r1" },
5751 { { "a3" }, "r2" },
5752 { { "a4" }, "r3" },
5753 { { "v1" }, "r4" },
5754 { { "v2" }, "r5" },
5755 { { "v3" }, "r6" },
5756 { { "v4" }, "r7" },
5757 { { "v5" }, "r8" },
5758 { { "v6", "rfp" }, "r9" },
5759 { { "sl" }, "r10" },
5760 { { "fp" }, "r11" },
5761 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00005762 { { "r13" }, "sp" },
5763 { { "r14" }, "lr" },
5764 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005765 // The S, D and Q registers overlap, but aren't really aliases; we
5766 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005767};
5768
Craig Topperf054e3a2015-10-19 03:52:27 +00005769ArrayRef<TargetInfo::GCCRegAlias> ARMTargetInfo::getGCCRegAliases() const {
5770 return llvm::makeArrayRef(GCCRegAliases);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005771}
Chris Lattner5cc15e02010-03-03 19:03:45 +00005772
5773const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00005774#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005775 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005776#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5777 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00005778#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00005779
Craig Topper07d3b622015-08-07 05:14:44 +00005780#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005781 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005782#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005783 { #ID, TYPE, ATTRS, nullptr, LANG, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005784#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5785 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Albert Gutowski2a0621e2016-10-12 22:01:05 +00005786#define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANGS, FEATURE) \
5787 { #ID, TYPE, ATTRS, HEADER, LANGS, FEATURE },
Chris Lattner5cc15e02010-03-03 19:03:45 +00005788#include "clang/Basic/BuiltinsARM.def"
5789};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005790
5791class ARMleTargetInfo : public ARMTargetInfo {
5792public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005793 ARMleTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Matt Arsenaultf333de32016-09-07 07:08:02 +00005794 : ARMTargetInfo(Triple, Opts) {}
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005795 void getTargetDefines(const LangOptions &Opts,
5796 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005797 Builder.defineMacro("__ARMEL__");
5798 ARMTargetInfo::getTargetDefines(Opts, Builder);
5799 }
5800};
5801
5802class ARMbeTargetInfo : public ARMTargetInfo {
5803public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005804 ARMbeTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Matt Arsenaultf333de32016-09-07 07:08:02 +00005805 : ARMTargetInfo(Triple, Opts) {}
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005806 void getTargetDefines(const LangOptions &Opts,
5807 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005808 Builder.defineMacro("__ARMEB__");
5809 Builder.defineMacro("__ARM_BIG_ENDIAN");
5810 ARMTargetInfo::getTargetDefines(Opts, Builder);
5811 }
5812};
Chris Lattner17df24e2008-04-21 18:56:49 +00005813
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005814class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
5815 const llvm::Triple Triple;
5816public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005817 WindowsARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5818 : WindowsTargetInfo<ARMleTargetInfo>(Triple, Opts), Triple(Triple) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005819 WCharType = UnsignedShort;
5820 SizeType = UnsignedInt;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005821 }
5822 void getVisualStudioDefines(const LangOptions &Opts,
5823 MacroBuilder &Builder) const {
5824 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
5825
5826 // FIXME: this is invalid for WindowsCE
5827 Builder.defineMacro("_M_ARM_NT", "1");
5828 Builder.defineMacro("_M_ARMT", "_M_ARM");
5829 Builder.defineMacro("_M_THUMB", "_M_ARM");
5830
5831 assert((Triple.getArch() == llvm::Triple::arm ||
5832 Triple.getArch() == llvm::Triple::thumb) &&
5833 "invalid architecture for Windows ARM target info");
5834 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
5835 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
5836
5837 // TODO map the complete set of values
5838 // 31: VFPv3 40: VFPv4
5839 Builder.defineMacro("_M_ARM_FP", "31");
5840 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00005841 BuiltinVaListKind getBuiltinVaListKind() const override {
5842 return TargetInfo::CharPtrBuiltinVaList;
5843 }
Martell Malone7ccda3c2015-08-14 18:00:09 +00005844 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5845 switch (CC) {
5846 case CC_X86StdCall:
5847 case CC_X86ThisCall:
5848 case CC_X86FastCall:
5849 case CC_X86VectorCall:
5850 return CCCR_Ignore;
5851 case CC_C:
5852 return CCCR_OK;
5853 default:
5854 return CCCR_Warning;
5855 }
5856 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005857};
5858
5859// Windows ARM + Itanium C++ ABI Target
5860class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
5861public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005862 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple,
5863 const TargetOptions &Opts)
5864 : WindowsARMTargetInfo(Triple, Opts) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005865 TheCXXABI.set(TargetCXXABI::GenericARM);
5866 }
5867
5868 void getTargetDefines(const LangOptions &Opts,
5869 MacroBuilder &Builder) const override {
5870 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5871
5872 if (Opts.MSVCCompat)
5873 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5874 }
5875};
5876
5877// Windows ARM, MS (C++) ABI
5878class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
5879public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005880 MicrosoftARMleTargetInfo(const llvm::Triple &Triple,
5881 const TargetOptions &Opts)
5882 : WindowsARMTargetInfo(Triple, Opts) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005883 TheCXXABI.set(TargetCXXABI::Microsoft);
5884 }
5885
5886 void getTargetDefines(const LangOptions &Opts,
5887 MacroBuilder &Builder) const override {
5888 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5889 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5890 }
5891};
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005892
Yaron Keren321249c2015-07-15 13:32:23 +00005893// ARM MinGW target
5894class MinGWARMTargetInfo : public WindowsARMTargetInfo {
5895public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005896 MinGWARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5897 : WindowsARMTargetInfo(Triple, Opts) {
Yaron Keren321249c2015-07-15 13:32:23 +00005898 TheCXXABI.set(TargetCXXABI::GenericARM);
5899 }
5900
5901 void getTargetDefines(const LangOptions &Opts,
5902 MacroBuilder &Builder) const override {
5903 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5904 DefineStd(Builder, "WIN32", Opts);
5905 DefineStd(Builder, "WINNT", Opts);
5906 Builder.defineMacro("_ARM_");
5907 addMinGWDefines(Opts, Builder);
5908 }
5909};
5910
5911// ARM Cygwin target
5912class CygwinARMTargetInfo : public ARMleTargetInfo {
5913public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005914 CygwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5915 : ARMleTargetInfo(Triple, Opts) {
Yaron Keren321249c2015-07-15 13:32:23 +00005916 TLSSupported = false;
5917 WCharType = UnsignedShort;
5918 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00005919 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Yaron Keren321249c2015-07-15 13:32:23 +00005920 }
5921 void getTargetDefines(const LangOptions &Opts,
5922 MacroBuilder &Builder) const override {
5923 ARMleTargetInfo::getTargetDefines(Opts, Builder);
5924 Builder.defineMacro("_ARM_");
5925 Builder.defineMacro("__CYGWIN__");
5926 Builder.defineMacro("__CYGWIN32__");
Saleem Abdulrasool56027092017-02-07 19:00:06 +00005927 DefineStd(Builder, "unix", Opts);
Yaron Keren321249c2015-07-15 13:32:23 +00005928 if (Opts.CPlusPlus)
5929 Builder.defineMacro("_GNU_SOURCE");
5930 }
5931};
5932
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005933class DarwinARMTargetInfo : public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00005934protected:
Craig Topper3164f332014-03-11 03:39:26 +00005935 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5936 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00005937 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00005938 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005939
Torok Edwinb2b37c62009-06-30 17:10:35 +00005940public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005941 DarwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5942 : DarwinTargetInfo<ARMleTargetInfo>(Triple, Opts) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005943 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005944 // iOS always has 64-bit atomic instructions.
Eric Christopher917e9522014-11-18 22:36:15 +00005945 // FIXME: This should be based off of the target features in
5946 // ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005947 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00005948
Tim Northoverd88ecb32016-01-27 19:32:40 +00005949 if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00005950 // Darwin on iOS uses a variant of the ARM C++ ABI.
5951 TheCXXABI.set(TargetCXXABI::WatchOS);
5952
5953 // The 32-bit ABI is silent on what ptrdiff_t should be, but given that
5954 // size_t is long, it's a bit weird for it to be int.
5955 PtrDiffType = SignedLong;
5956
5957 // BOOL should be a real boolean on the new ABI
5958 UseSignedCharForObjCBool = false;
5959 } else
5960 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005961 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005962};
Eli Friedmanf05b7722008-08-20 07:44:10 +00005963
Tim Northover573cbee2014-05-24 12:52:07 +00005964class AArch64TargetInfo : public TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00005965 virtual void setDataLayout() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00005966 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5967 static const char *const GCCRegNames[];
5968
James Molloy75f5f9e2014-04-16 15:33:48 +00005969 enum FPUModeEnum {
5970 FPUMode,
5971 NeonMode
5972 };
5973
5974 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00005975 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00005976 unsigned Crypto;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005977 unsigned Unaligned;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005978 unsigned V8_1A;
James Molloy75f5f9e2014-04-16 15:33:48 +00005979
Tim Northovera2ee4332014-03-29 15:09:45 +00005980 static const Builtin::Info BuiltinInfo[];
5981
5982 std::string ABI;
5983
5984public:
Saleem Abdulrasool9b5ba542016-04-10 03:19:47 +00005985 AArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Tim Northovera2ee4332014-03-29 15:09:45 +00005986 : TargetInfo(Triple), ABI("aapcs") {
Brad Smith9aa2bf22017-02-21 23:13:09 +00005987 if (getTriple().getOS() == llvm::Triple::NetBSD ||
5988 getTriple().getOS() == llvm::Triple::OpenBSD) {
Tim Northover25e8a672014-05-24 12:51:25 +00005989 WCharType = SignedInt;
5990
5991 // NetBSD apparently prefers consistency across ARM targets to consistency
5992 // across 64-bit targets.
5993 Int64Type = SignedLongLong;
5994 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005995 } else {
5996 WCharType = UnsignedInt;
5997 Int64Type = SignedLong;
5998 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005999 }
6000
Tim Northovera2ee4332014-03-29 15:09:45 +00006001 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00006002 MaxVectorAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00006003 MaxAtomicInlineWidth = 128;
6004 MaxAtomicPromoteWidth = 128;
6005
Tim Northovera6a19f12015-02-06 01:25:07 +00006006 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 128;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00006007 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Tim Northovera2ee4332014-03-29 15:09:45 +00006008
Tim Northovera2ee4332014-03-29 15:09:45 +00006009 // {} in inline assembly are neon specifiers, not assembly variant
6010 // specifiers.
6011 NoAsmVariants = true;
6012
Tim Northover7ad87af2015-01-16 18:44:04 +00006013 // AAPCS gives rules for bitfields. 7.1.7 says: "The container type
6014 // contributes to the alignment of the containing aggregate in the same way
6015 // a plain (non bit-field) member of that type would, without exception for
6016 // zero-sized or anonymous bit-fields."
Tim Northover5627d392015-10-30 16:30:45 +00006017 assert(UseBitFieldTypeAlignment && "bitfields affect type alignment");
Tim Northover7ad87af2015-01-16 18:44:04 +00006018 UseZeroLengthBitfieldAlignment = true;
6019
Tim Northover573cbee2014-05-24 12:52:07 +00006020 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00006021 TheCXXABI.set(TargetCXXABI::GenericAArch64);
Saleem Abdulrasoolc066d9c2016-04-12 03:05:03 +00006022
Eric Christopherfb834a82017-02-28 17:22:05 +00006023 if (Triple.getOS() == llvm::Triple::Linux)
6024 this->MCountName = "\01_mcount";
6025 else if (Triple.getOS() == llvm::Triple::UnknownOS)
Saleem Abdulrasoolc066d9c2016-04-12 03:05:03 +00006026 this->MCountName = Opts.EABIVersion == "gnu" ? "\01_mcount" : "mcount";
Tim Northovera2ee4332014-03-29 15:09:45 +00006027 }
6028
Alp Toker4925ba72014-06-07 23:30:42 +00006029 StringRef getABI() const override { return ABI; }
David Blaikie1cbb9712014-11-14 19:09:44 +00006030 bool setABI(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006031 if (Name != "aapcs" && Name != "darwinpcs")
6032 return false;
6033
6034 ABI = Name;
6035 return true;
6036 }
6037
David Blaikie1cbb9712014-11-14 19:09:44 +00006038 bool setCPU(const std::string &Name) override {
Zijiao Ma33e95212016-07-28 06:24:48 +00006039 return Name == "generic" ||
6040 llvm::AArch64::parseCPUArch(Name) !=
6041 static_cast<unsigned>(llvm::AArch64::ArchKind::AK_INVALID);
Tim Northovera2ee4332014-03-29 15:09:45 +00006042 }
6043
Alexander Kornienko34eb2072015-04-11 02:00:23 +00006044 void getTargetDefines(const LangOptions &Opts,
6045 MacroBuilder &Builder) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006046 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00006047 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00006048
6049 // Target properties.
6050 Builder.defineMacro("_LP64");
6051 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00006052
6053 // ACLE predefines. Many can only have one possible value on v8 AArch64.
6054 Builder.defineMacro("__ARM_ACLE", "200");
6055 Builder.defineMacro("__ARM_ARCH", "8");
6056 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
6057
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006058 Builder.defineMacro("__ARM_64BIT_STATE", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00006059 Builder.defineMacro("__ARM_PCS_AAPCS64", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006060 Builder.defineMacro("__ARM_ARCH_ISA_A64", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00006061
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006062 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
6063 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
6064 Builder.defineMacro("__ARM_FEATURE_LDREX", "0xF");
6065 Builder.defineMacro("__ARM_FEATURE_IDIV", "1"); // As specified in ACLE
James Molloy0ffb0932014-09-15 11:25:38 +00006066 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006067 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
6068 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00006069
6070 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
6071
6072 // 0xe implies support for half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006073 Builder.defineMacro("__ARM_FP", "0xE");
Tim Northovera2ee4332014-03-29 15:09:45 +00006074
6075 // PCS specifies this for SysV variants, which is all we support. Other ABIs
6076 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006077 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
6078 Builder.defineMacro("__ARM_FP16_ARGS", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00006079
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00006080 if (Opts.UnsafeFPMath)
6081 Builder.defineMacro("__ARM_FP_FAST", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00006082
6083 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
6084
6085 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
6086 Opts.ShortEnums ? "1" : "4");
6087
James Molloy75f5f9e2014-04-16 15:33:48 +00006088 if (FPU == NeonMode) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006089 Builder.defineMacro("__ARM_NEON", "1");
James Molloy75f5f9e2014-04-16 15:33:48 +00006090 // 64-bit NEON supports half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006091 Builder.defineMacro("__ARM_NEON_FP", "0xE");
James Molloy75f5f9e2014-04-16 15:33:48 +00006092 }
Tim Northovera2ee4332014-03-29 15:09:45 +00006093
Bradley Smith418c5932014-05-02 15:17:51 +00006094 if (CRC)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006095 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
Bradley Smith418c5932014-05-02 15:17:51 +00006096
James Molloy75f5f9e2014-04-16 15:33:48 +00006097 if (Crypto)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006098 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
6099
6100 if (Unaligned)
6101 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Reid Klecknerd167d422015-05-06 15:31:46 +00006102
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00006103 if (V8_1A)
6104 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
6105
Reid Klecknerd167d422015-05-06 15:31:46 +00006106 // All of the __sync_(bool|val)_compare_and_swap_(1|2|4|8) builtins work.
6107 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
6108 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
6109 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
6110 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Tim Northovera2ee4332014-03-29 15:09:45 +00006111 }
6112
Craig Topper6c03a542015-10-19 04:51:35 +00006113 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6114 return llvm::makeArrayRef(BuiltinInfo,
6115 clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin);
Tim Northovera2ee4332014-03-29 15:09:45 +00006116 }
6117
David Blaikie1cbb9712014-11-14 19:09:44 +00006118 bool hasFeature(StringRef Feature) const override {
James Molloy75f5f9e2014-04-16 15:33:48 +00006119 return Feature == "aarch64" ||
6120 Feature == "arm64" ||
Ben Langmuir587aeaf2015-08-07 01:59:56 +00006121 Feature == "arm" ||
James Molloy75f5f9e2014-04-16 15:33:48 +00006122 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00006123 }
6124
James Molloy5e73df52014-04-16 15:06:20 +00006125 bool handleTargetFeatures(std::vector<std::string> &Features,
6126 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00006127 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00006128 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00006129 Crypto = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006130 Unaligned = 1;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00006131 V8_1A = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006132
Eric Christopher610fe112015-08-26 08:21:55 +00006133 for (const auto &Feature : Features) {
6134 if (Feature == "+neon")
James Molloy75f5f9e2014-04-16 15:33:48 +00006135 FPU = NeonMode;
Eric Christopher610fe112015-08-26 08:21:55 +00006136 if (Feature == "+crc")
Bradley Smith418c5932014-05-02 15:17:51 +00006137 CRC = 1;
Eric Christopher610fe112015-08-26 08:21:55 +00006138 if (Feature == "+crypto")
James Molloy75f5f9e2014-04-16 15:33:48 +00006139 Crypto = 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006140 if (Feature == "+strict-align")
6141 Unaligned = 0;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00006142 if (Feature == "+v8.1a")
6143 V8_1A = 1;
James Molloy75f5f9e2014-04-16 15:33:48 +00006144 }
6145
James Y Knightb214cbc2016-03-04 19:00:41 +00006146 setDataLayout();
James Molloy5e73df52014-04-16 15:06:20 +00006147
6148 return true;
6149 }
6150
John McCall477f2bb2016-03-03 06:39:32 +00006151 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
6152 switch (CC) {
6153 case CC_C:
6154 case CC_Swift:
Roman Levenstein35aa5ce2016-03-16 18:00:46 +00006155 case CC_PreserveMost:
6156 case CC_PreserveAll:
John McCall477f2bb2016-03-03 06:39:32 +00006157 return CCCR_OK;
6158 default:
6159 return CCCR_Warning;
6160 }
6161 }
6162
David Blaikie1cbb9712014-11-14 19:09:44 +00006163 bool isCLZForZeroUndef() const override { return false; }
Tim Northovera2ee4332014-03-29 15:09:45 +00006164
David Blaikie1cbb9712014-11-14 19:09:44 +00006165 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006166 return TargetInfo::AArch64ABIBuiltinVaList;
6167 }
6168
Craig Topperf054e3a2015-10-19 03:52:27 +00006169 ArrayRef<const char *> getGCCRegNames() const override;
6170 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00006171
Alexander Kornienko34eb2072015-04-11 02:00:23 +00006172 bool validateAsmConstraint(const char *&Name,
6173 TargetInfo::ConstraintInfo &Info) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006174 switch (*Name) {
6175 default:
6176 return false;
6177 case 'w': // Floating point and SIMD registers (V0-V31)
6178 Info.setAllowsRegister();
6179 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00006180 case 'I': // Constant that can be used with an ADD instruction
6181 case 'J': // Constant that can be used with a SUB instruction
6182 case 'K': // Constant that can be used with a 32-bit logical instruction
6183 case 'L': // Constant that can be used with a 64-bit logical instruction
6184 case 'M': // Constant that can be used as a 32-bit MOV immediate
6185 case 'N': // Constant that can be used as a 64-bit MOV immediate
6186 case 'Y': // Floating point constant zero
6187 case 'Z': // Integer constant zero
6188 return true;
6189 case 'Q': // A memory reference with base register and no offset
6190 Info.setAllowsMemory();
6191 return true;
6192 case 'S': // A symbolic address
6193 Info.setAllowsRegister();
6194 return true;
6195 case 'U':
Eric Christopher917e9522014-11-18 22:36:15 +00006196 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
6197 // Utf: A memory address suitable for ldp/stp in TF mode.
6198 // Usa: An absolute symbolic address.
6199 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
6200 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
Tim Northovera2ee4332014-03-29 15:09:45 +00006201 case 'z': // Zero register, wzr or xzr
6202 Info.setAllowsRegister();
6203 return true;
6204 case 'x': // Floating point and SIMD registers (V0-V15)
6205 Info.setAllowsRegister();
6206 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00006207 }
6208 return false;
6209 }
6210
Akira Hatanaka987f1862014-08-22 06:05:21 +00006211 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00006212 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00006213 std::string &SuggestedModifier) const override {
James Molloy8a157bf2014-07-25 10:19:47 +00006214 // Strip off constraint modifiers.
6215 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
6216 Constraint = Constraint.substr(1);
6217
6218 switch (Constraint[0]) {
6219 default:
6220 return true;
6221 case 'z':
6222 case 'r': {
6223 switch (Modifier) {
6224 case 'x':
6225 case 'w':
6226 // For now assume that the person knows what they're
6227 // doing with the modifier.
6228 return true;
6229 default:
6230 // By default an 'r' constraint will be in the 'x'
6231 // registers.
Akira Hatanaka987f1862014-08-22 06:05:21 +00006232 if (Size == 64)
6233 return true;
6234
6235 SuggestedModifier = "w";
6236 return false;
James Molloy8a157bf2014-07-25 10:19:47 +00006237 }
6238 }
6239 }
6240 }
6241
David Blaikie1cbb9712014-11-14 19:09:44 +00006242 const char *getClobbers() const override { return ""; }
Tim Northovera2ee4332014-03-29 15:09:45 +00006243
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00006244 int getEHDataRegisterNumber(unsigned RegNo) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006245 if (RegNo == 0)
6246 return 0;
6247 if (RegNo == 1)
6248 return 1;
6249 return -1;
6250 }
6251};
6252
Tim Northover573cbee2014-05-24 12:52:07 +00006253const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00006254 // 32-bit Integer registers
6255 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
6256 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
6257 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
6258
6259 // 64-bit Integer registers
6260 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
6261 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
6262 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
6263
6264 // 32-bit floating point regsisters
6265 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
6266 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
6267 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
6268
6269 // 64-bit floating point regsisters
6270 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
6271 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
6272 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
6273
6274 // Vector registers
6275 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
6276 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
6277 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
6278};
6279
Craig Topperf054e3a2015-10-19 03:52:27 +00006280ArrayRef<const char *> AArch64TargetInfo::getGCCRegNames() const {
6281 return llvm::makeArrayRef(GCCRegNames);
Tim Northovera2ee4332014-03-29 15:09:45 +00006282}
6283
Tim Northover573cbee2014-05-24 12:52:07 +00006284const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00006285 { { "w31" }, "wsp" },
6286 { { "x29" }, "fp" },
6287 { { "x30" }, "lr" },
6288 { { "x31" }, "sp" },
6289 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
6290 // don't want to substitute one of these for a different-sized one.
6291};
6292
Craig Topperf054e3a2015-10-19 03:52:27 +00006293ArrayRef<TargetInfo::GCCRegAlias> AArch64TargetInfo::getGCCRegAliases() const {
6294 return llvm::makeArrayRef(GCCRegAliases);
Tim Northovera2ee4332014-03-29 15:09:45 +00006295}
6296
Tim Northover573cbee2014-05-24 12:52:07 +00006297const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00006298#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006299 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00006300#include "clang/Basic/BuiltinsNEON.def"
6301
6302#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006303 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northover573cbee2014-05-24 12:52:07 +00006304#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00006305};
James Molloy5e73df52014-04-16 15:06:20 +00006306
Tim Northover573cbee2014-05-24 12:52:07 +00006307class AArch64leTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00006308 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00006309 if (getTriple().isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00006310 resetDataLayout("e-m:o-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006311 else
Chad Rosier4c077aa2016-07-07 20:02:25 +00006312 resetDataLayout("e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006313 }
6314
6315public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006316 AArch64leTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6317 : AArch64TargetInfo(Triple, Opts) {
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006318 }
James Molloy5e73df52014-04-16 15:06:20 +00006319 void getTargetDefines(const LangOptions &Opts,
6320 MacroBuilder &Builder) const override {
6321 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00006322 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00006323 }
6324};
6325
Tim Northover573cbee2014-05-24 12:52:07 +00006326class AArch64beTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00006327 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00006328 assert(!getTriple().isOSBinFormatMachO());
Chad Rosier4c077aa2016-07-07 20:02:25 +00006329 resetDataLayout("E-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006330 }
6331
6332public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006333 AArch64beTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6334 : AArch64TargetInfo(Triple, Opts) {}
James Molloy5e73df52014-04-16 15:06:20 +00006335 void getTargetDefines(const LangOptions &Opts,
6336 MacroBuilder &Builder) const override {
6337 Builder.defineMacro("__AARCH64EB__");
6338 Builder.defineMacro("__AARCH_BIG_ENDIAN");
6339 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00006340 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00006341 }
6342};
Tim Northovera2ee4332014-03-29 15:09:45 +00006343
Tim Northover573cbee2014-05-24 12:52:07 +00006344class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00006345protected:
6346 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
6347 MacroBuilder &Builder) const override {
6348 Builder.defineMacro("__AARCH64_SIMD__");
6349 Builder.defineMacro("__ARM64_ARCH_8__");
6350 Builder.defineMacro("__ARM_NEON__");
6351 Builder.defineMacro("__LITTLE_ENDIAN__");
6352 Builder.defineMacro("__REGISTER_PREFIX__", "");
6353 Builder.defineMacro("__arm64", "1");
6354 Builder.defineMacro("__arm64__", "1");
6355
6356 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
6357 }
6358
Tim Northovera2ee4332014-03-29 15:09:45 +00006359public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006360 DarwinAArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6361 : DarwinTargetInfo<AArch64leTargetInfo>(Triple, Opts) {
Tim Northovera2ee4332014-03-29 15:09:45 +00006362 Int64Type = SignedLongLong;
6363 WCharType = SignedInt;
6364 UseSignedCharForObjCBool = false;
6365
Tim Northovera6a19f12015-02-06 01:25:07 +00006366 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00006367 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Tim Northovera2ee4332014-03-29 15:09:45 +00006368
6369 TheCXXABI.set(TargetCXXABI::iOS64);
6370 }
6371
David Blaikie1cbb9712014-11-14 19:09:44 +00006372 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006373 return TargetInfo::CharPtrBuiltinVaList;
6374 }
6375};
Tim Northovera2ee4332014-03-29 15:09:45 +00006376
Tony Linthicum76329bf2011-12-12 21:14:55 +00006377// Hexagon abstract base class
6378class HexagonTargetInfo : public TargetInfo {
6379 static const Builtin::Info BuiltinInfo[];
6380 static const char * const GCCRegNames[];
6381 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6382 std::string CPU;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006383 bool HasHVX, HasHVXDouble;
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006384 bool UseLongCalls;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006385
Tony Linthicum76329bf2011-12-12 21:14:55 +00006386public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006387 HexagonTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6388 : TargetInfo(Triple) {
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00006389 // Specify the vector alignment explicitly. For v512x1, the calculated
6390 // alignment would be 512*alignment(i1), which is 512 bytes, instead of
6391 // the required minimum of 64 bytes.
James Y Knightb214cbc2016-03-04 19:00:41 +00006392 resetDataLayout("e-m:e-p:32:32:32-a:0-n16:32-"
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00006393 "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 +00006394 "v32:32:32-v64:64:64-v512:512:512-v1024:1024:1024-v2048:2048:2048");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006395 SizeType = UnsignedInt;
6396 PtrDiffType = SignedInt;
6397 IntPtrType = SignedInt;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006398
6399 // {} in inline assembly are packet specifiers, not assembly variant
6400 // specifiers.
6401 NoAsmVariants = true;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006402
6403 LargeArrayMinWidth = 64;
6404 LargeArrayAlign = 64;
6405 UseBitFieldTypeAlignment = true;
6406 ZeroLengthBitfieldBoundary = 32;
6407 HasHVX = HasHVXDouble = false;
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006408 UseLongCalls = false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006409 }
6410
Craig Topper6c03a542015-10-19 04:51:35 +00006411 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6412 return llvm::makeArrayRef(BuiltinInfo,
6413 clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006414 }
6415
Craig Topper3164f332014-03-11 03:39:26 +00006416 bool validateAsmConstraint(const char *&Name,
6417 TargetInfo::ConstraintInfo &Info) const override {
Krzysztof Parzyszeke0026e42016-05-18 14:56:14 +00006418 switch (*Name) {
6419 case 'v':
6420 case 'q':
6421 if (HasHVX) {
6422 Info.setAllowsRegister();
6423 return true;
6424 }
6425 break;
Krzysztof Parzyszek89fb4412016-05-20 13:50:32 +00006426 case 's':
6427 // Relocatable constant.
6428 return true;
Krzysztof Parzyszeke0026e42016-05-18 14:56:14 +00006429 }
6430 return false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006431 }
6432
Craig Topper3164f332014-03-11 03:39:26 +00006433 void getTargetDefines(const LangOptions &Opts,
6434 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006435
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006436 bool isCLZForZeroUndef() const override { return false; }
6437
Craig Topper3164f332014-03-11 03:39:26 +00006438 bool hasFeature(StringRef Feature) const override {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006439 return llvm::StringSwitch<bool>(Feature)
6440 .Case("hexagon", true)
6441 .Case("hvx", HasHVX)
6442 .Case("hvx-double", HasHVXDouble)
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006443 .Case("long-calls", UseLongCalls)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006444 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006445 }
Craig Topper3164f332014-03-11 03:39:26 +00006446
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006447 bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6448 StringRef CPU, const std::vector<std::string> &FeaturesVec)
6449 const override;
6450
6451 bool handleTargetFeatures(std::vector<std::string> &Features,
6452 DiagnosticsEngine &Diags) override;
6453
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006454 void setFeatureEnabled(llvm::StringMap<bool> &Features, StringRef Name,
6455 bool Enabled) const override;
6456
Craig Topper3164f332014-03-11 03:39:26 +00006457 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006458 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006459 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006460 ArrayRef<const char *> getGCCRegNames() const override;
6461 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00006462 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006463 return "";
6464 }
Sebastian Pop86500282012-01-13 20:37:10 +00006465
6466 static const char *getHexagonCPUSuffix(StringRef Name) {
6467 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00006468 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006469 .Case("hexagonv5", "5")
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006470 .Case("hexagonv55", "55")
6471 .Case("hexagonv60", "60")
Krzysztof Parzyszekff7f6672017-03-14 20:29:23 +00006472 .Case("hexagonv62", "62")
Craig Topperf1186c52014-05-08 06:41:40 +00006473 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00006474 }
6475
Craig Topper3164f332014-03-11 03:39:26 +00006476 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00006477 if (!getHexagonCPUSuffix(Name))
6478 return false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006479 CPU = Name;
6480 return true;
6481 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006482
6483 int getEHDataRegisterNumber(unsigned RegNo) const override {
6484 return RegNo < 2 ? RegNo : -1;
6485 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006486};
6487
6488void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006489 MacroBuilder &Builder) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006490 Builder.defineMacro("__qdsp6__", "1");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006491 Builder.defineMacro("__hexagon__", "1");
6492
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006493 if (CPU == "hexagonv4") {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006494 Builder.defineMacro("__HEXAGON_V4__");
6495 Builder.defineMacro("__HEXAGON_ARCH__", "4");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006496 if (Opts.HexagonQdsp6Compat) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006497 Builder.defineMacro("__QDSP6_V4__");
6498 Builder.defineMacro("__QDSP6_ARCH__", "4");
6499 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006500 } else if (CPU == "hexagonv5") {
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006501 Builder.defineMacro("__HEXAGON_V5__");
6502 Builder.defineMacro("__HEXAGON_ARCH__", "5");
6503 if(Opts.HexagonQdsp6Compat) {
6504 Builder.defineMacro("__QDSP6_V5__");
6505 Builder.defineMacro("__QDSP6_ARCH__", "5");
6506 }
Krzysztof Parzyszeka58ff512016-04-21 14:30:04 +00006507 } else if (CPU == "hexagonv55") {
6508 Builder.defineMacro("__HEXAGON_V55__");
6509 Builder.defineMacro("__HEXAGON_ARCH__", "55");
6510 Builder.defineMacro("__QDSP6_V55__");
6511 Builder.defineMacro("__QDSP6_ARCH__", "55");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006512 } else if (CPU == "hexagonv60") {
6513 Builder.defineMacro("__HEXAGON_V60__");
6514 Builder.defineMacro("__HEXAGON_ARCH__", "60");
6515 Builder.defineMacro("__QDSP6_V60__");
6516 Builder.defineMacro("__QDSP6_ARCH__", "60");
Krzysztof Parzyszekff7f6672017-03-14 20:29:23 +00006517 } else if (CPU == "hexagonv62") {
6518 Builder.defineMacro("__HEXAGON_V62__");
6519 Builder.defineMacro("__HEXAGON_ARCH__", "62");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006520 }
Krzysztof Parzyszek7f0756c2016-04-18 18:38:11 +00006521
6522 if (hasFeature("hvx")) {
6523 Builder.defineMacro("__HVX__");
6524 if (hasFeature("hvx-double"))
6525 Builder.defineMacro("__HVXDBL__");
6526 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006527}
6528
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006529bool HexagonTargetInfo::initFeatureMap(llvm::StringMap<bool> &Features,
6530 DiagnosticsEngine &Diags, StringRef CPU,
6531 const std::vector<std::string> &FeaturesVec) const {
6532 // Default for v60: -hvx, -hvx-double.
6533 Features["hvx"] = false;
6534 Features["hvx-double"] = false;
6535 Features["long-calls"] = false;
6536
6537 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
6538}
6539
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006540bool HexagonTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
6541 DiagnosticsEngine &Diags) {
6542 for (auto &F : Features) {
6543 if (F == "+hvx")
6544 HasHVX = true;
6545 else if (F == "-hvx")
6546 HasHVX = HasHVXDouble = false;
6547 else if (F == "+hvx-double")
6548 HasHVX = HasHVXDouble = true;
6549 else if (F == "-hvx-double")
6550 HasHVXDouble = false;
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006551
6552 if (F == "+long-calls")
6553 UseLongCalls = true;
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006554 else if (F == "-long-calls")
6555 UseLongCalls = false;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006556 }
6557 return true;
6558}
6559
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006560void HexagonTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
6561 StringRef Name, bool Enabled) const {
6562 if (Enabled) {
6563 if (Name == "hvx-double")
6564 Features["hvx"] = true;
6565 } else {
6566 if (Name == "hvx")
6567 Features["hvx-double"] = false;
6568 }
6569 Features[Name] = Enabled;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006570}
6571
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006572const char *const HexagonTargetInfo::GCCRegNames[] = {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006573 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6574 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6575 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6576 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
6577 "p0", "p1", "p2", "p3",
6578 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
6579};
6580
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006581ArrayRef<const char*> HexagonTargetInfo::getGCCRegNames() const {
Craig Topperf054e3a2015-10-19 03:52:27 +00006582 return llvm::makeArrayRef(GCCRegNames);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006583}
6584
Tony Linthicum76329bf2011-12-12 21:14:55 +00006585const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
6586 { { "sp" }, "r29" },
6587 { { "fp" }, "r30" },
6588 { { "lr" }, "r31" },
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006589};
Tony Linthicum76329bf2011-12-12 21:14:55 +00006590
Craig Topperf054e3a2015-10-19 03:52:27 +00006591ArrayRef<TargetInfo::GCCRegAlias> HexagonTargetInfo::getGCCRegAliases() const {
6592 return llvm::makeArrayRef(GCCRegAliases);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006593}
6594
6595
6596const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00006597#define BUILTIN(ID, TYPE, ATTRS) \
6598 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
6599#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
6600 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tony Linthicum76329bf2011-12-12 21:14:55 +00006601#include "clang/Basic/BuiltinsHexagon.def"
6602};
Tony Linthicum76329bf2011-12-12 21:14:55 +00006603
Jacques Pienaard964cc22016-03-28 21:02:54 +00006604class LanaiTargetInfo : public TargetInfo {
6605 // Class for Lanai (32-bit).
6606 // The CPU profiles supported by the Lanai backend
6607 enum CPUKind {
6608 CK_NONE,
6609 CK_V11,
6610 } CPU;
6611
6612 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6613 static const char *const GCCRegNames[];
6614
6615public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006616 LanaiTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6617 : TargetInfo(Triple) {
Jacques Pienaard964cc22016-03-28 21:02:54 +00006618 // Description string has to be kept in sync with backend.
6619 resetDataLayout("E" // Big endian
6620 "-m:e" // ELF name manging
6621 "-p:32:32" // 32 bit pointers, 32 bit aligned
6622 "-i64:64" // 64 bit integers, 64 bit aligned
6623 "-a:0:32" // 32 bit alignment of objects of aggregate type
6624 "-n32" // 32 bit native integer width
6625 "-S64" // 64 bit natural stack alignment
6626 );
6627
6628 // Setting RegParmMax equal to what mregparm was set to in the old
6629 // toolchain
6630 RegParmMax = 4;
6631
6632 // Set the default CPU to V11
6633 CPU = CK_V11;
6634
6635 // Temporary approach to make everything at least word-aligned and allow for
6636 // safely casting between pointers with different alignment requirements.
6637 // TODO: Remove this when there are no more cast align warnings on the
6638 // firmware.
6639 MinGlobalAlign = 32;
6640 }
6641
6642 void getTargetDefines(const LangOptions &Opts,
6643 MacroBuilder &Builder) const override {
6644 // Define __lanai__ when building for target lanai.
6645 Builder.defineMacro("__lanai__");
6646
6647 // Set define for the CPU specified.
6648 switch (CPU) {
6649 case CK_V11:
6650 Builder.defineMacro("__LANAI_V11__");
6651 break;
6652 case CK_NONE:
6653 llvm_unreachable("Unhandled target CPU");
6654 }
6655 }
6656
6657 bool setCPU(const std::string &Name) override {
6658 CPU = llvm::StringSwitch<CPUKind>(Name)
6659 .Case("v11", CK_V11)
6660 .Default(CK_NONE);
6661
6662 return CPU != CK_NONE;
6663 }
6664
6665 bool hasFeature(StringRef Feature) const override {
6666 return llvm::StringSwitch<bool>(Feature).Case("lanai", true).Default(false);
6667 }
6668
6669 ArrayRef<const char *> getGCCRegNames() const override;
6670
6671 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
6672
6673 BuiltinVaListKind getBuiltinVaListKind() const override {
6674 return TargetInfo::VoidPtrBuiltinVaList;
6675 }
6676
6677 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
6678
6679 bool validateAsmConstraint(const char *&Name,
6680 TargetInfo::ConstraintInfo &info) const override {
6681 return false;
6682 }
6683
6684 const char *getClobbers() const override { return ""; }
6685};
6686
6687const char *const LanaiTargetInfo::GCCRegNames[] = {
6688 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10",
6689 "r11", "r12", "r13", "r14", "r15", "r16", "r17", "r18", "r19", "r20", "r21",
6690 "r22", "r23", "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"};
6691
6692ArrayRef<const char *> LanaiTargetInfo::getGCCRegNames() const {
6693 return llvm::makeArrayRef(GCCRegNames);
6694}
6695
6696const TargetInfo::GCCRegAlias LanaiTargetInfo::GCCRegAliases[] = {
6697 {{"pc"}, "r2"},
6698 {{"sp"}, "r4"},
6699 {{"fp"}, "r5"},
6700 {{"rv"}, "r8"},
6701 {{"rr1"}, "r10"},
6702 {{"rr2"}, "r11"},
6703 {{"rca"}, "r15"},
6704};
6705
6706ArrayRef<TargetInfo::GCCRegAlias> LanaiTargetInfo::getGCCRegAliases() const {
6707 return llvm::makeArrayRef(GCCRegAliases);
6708}
6709
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006710// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
6711class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00006712 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6713 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006714 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00006715public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006716 SparcTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
James Y Knighta3518ad2016-01-27 01:04:51 +00006717 : TargetInfo(Triple), SoftFloat(false) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006718
Joerg Sonnenbergerd0be8dc2016-03-07 17:19:15 +00006719 int getEHDataRegisterNumber(unsigned RegNo) const override {
6720 if (RegNo == 0) return 24;
6721 if (RegNo == 1) return 25;
6722 return -1;
6723 }
6724
Craig Topper3164f332014-03-11 03:39:26 +00006725 bool handleTargetFeatures(std::vector<std::string> &Features,
6726 DiagnosticsEngine &Diags) override {
Jacob Baungard Hansen13a49372016-05-24 08:30:08 +00006727 // Check if software floating point is enabled
Eric Christopherfb481a42015-04-29 23:32:17 +00006728 auto Feature = std::find(Features.begin(), Features.end(), "+soft-float");
6729 if (Feature != Features.end()) {
6730 SoftFloat = true;
Eric Christopherfb481a42015-04-29 23:32:17 +00006731 }
Rafael Espindolaeb265472013-08-21 21:59:03 +00006732 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006733 }
Craig Topper3164f332014-03-11 03:39:26 +00006734 void getTargetDefines(const LangOptions &Opts,
6735 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006736 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006737 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006738
6739 if (SoftFloat)
6740 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00006741 }
Craig Topper3164f332014-03-11 03:39:26 +00006742
6743 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006744 return llvm::StringSwitch<bool>(Feature)
6745 .Case("softfloat", SoftFloat)
6746 .Case("sparc", true)
6747 .Default(false);
6748 }
Craig Topper3164f332014-03-11 03:39:26 +00006749
Chris Dewhurst0381cd72016-06-15 12:44:47 +00006750 bool hasSjLjLowering() const override {
6751 return true;
6752 }
6753
Craig Topper6c03a542015-10-19 04:51:35 +00006754 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006755 // FIXME: Implement!
Craig Topper6c03a542015-10-19 04:51:35 +00006756 return None;
Gabor Greif49991682008-02-21 16:29:08 +00006757 }
Craig Topper3164f332014-03-11 03:39:26 +00006758 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006759 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00006760 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006761 ArrayRef<const char *> getGCCRegNames() const override;
6762 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00006763 bool validateAsmConstraint(const char *&Name,
6764 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006765 // FIXME: Implement!
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00006766 switch (*Name) {
6767 case 'I': // Signed 13-bit constant
6768 case 'J': // Zero
6769 case 'K': // 32-bit constant with the low 12 bits clear
6770 case 'L': // A constant in the range supported by movcc (11-bit signed imm)
6771 case 'M': // A constant in the range supported by movrcc (19-bit signed imm)
6772 case 'N': // Same as 'K' but zext (required for SIMode)
6773 case 'O': // The constant 4096
6774 return true;
6775 }
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006776 return false;
Gabor Greif49991682008-02-21 16:29:08 +00006777 }
Craig Topper3164f332014-03-11 03:39:26 +00006778 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006779 // FIXME: Implement!
6780 return "";
Gabor Greif49991682008-02-21 16:29:08 +00006781 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006782
6783 // No Sparc V7 for now, the backend doesn't support it anyway.
6784 enum CPUKind {
6785 CK_GENERIC,
6786 CK_V8,
6787 CK_SUPERSPARC,
6788 CK_SPARCLITE,
6789 CK_F934,
6790 CK_HYPERSPARC,
6791 CK_SPARCLITE86X,
6792 CK_SPARCLET,
6793 CK_TSC701,
6794 CK_V9,
6795 CK_ULTRASPARC,
6796 CK_ULTRASPARC3,
6797 CK_NIAGARA,
6798 CK_NIAGARA2,
6799 CK_NIAGARA3,
Douglas Katzman6871afc2016-03-15 22:34:02 +00006800 CK_NIAGARA4,
Douglas Katzman87da5f42016-07-25 16:36:02 +00006801 CK_MYRIAD2100,
6802 CK_MYRIAD2150,
6803 CK_MYRIAD2450,
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006804 CK_LEON2,
6805 CK_LEON2_AT697E,
6806 CK_LEON2_AT697F,
6807 CK_LEON3,
6808 CK_LEON3_UT699,
6809 CK_LEON3_GR712RC,
6810 CK_LEON4,
6811 CK_LEON4_GR740
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006812 } CPU = CK_GENERIC;
6813
6814 enum CPUGeneration {
6815 CG_V8,
6816 CG_V9,
6817 };
6818
6819 CPUGeneration getCPUGeneration(CPUKind Kind) const {
6820 switch (Kind) {
6821 case CK_GENERIC:
6822 case CK_V8:
6823 case CK_SUPERSPARC:
6824 case CK_SPARCLITE:
6825 case CK_F934:
6826 case CK_HYPERSPARC:
6827 case CK_SPARCLITE86X:
6828 case CK_SPARCLET:
6829 case CK_TSC701:
Douglas Katzman87da5f42016-07-25 16:36:02 +00006830 case CK_MYRIAD2100:
6831 case CK_MYRIAD2150:
6832 case CK_MYRIAD2450:
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006833 case CK_LEON2:
6834 case CK_LEON2_AT697E:
6835 case CK_LEON2_AT697F:
6836 case CK_LEON3:
6837 case CK_LEON3_UT699:
6838 case CK_LEON3_GR712RC:
6839 case CK_LEON4:
6840 case CK_LEON4_GR740:
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006841 return CG_V8;
6842 case CK_V9:
6843 case CK_ULTRASPARC:
6844 case CK_ULTRASPARC3:
6845 case CK_NIAGARA:
6846 case CK_NIAGARA2:
6847 case CK_NIAGARA3:
6848 case CK_NIAGARA4:
6849 return CG_V9;
6850 }
Aaron Ballmana9a72852015-11-11 13:42:02 +00006851 llvm_unreachable("Unexpected CPU kind");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006852 }
6853
6854 CPUKind getCPUKind(StringRef Name) const {
6855 return llvm::StringSwitch<CPUKind>(Name)
6856 .Case("v8", CK_V8)
6857 .Case("supersparc", CK_SUPERSPARC)
6858 .Case("sparclite", CK_SPARCLITE)
6859 .Case("f934", CK_F934)
6860 .Case("hypersparc", CK_HYPERSPARC)
6861 .Case("sparclite86x", CK_SPARCLITE86X)
6862 .Case("sparclet", CK_SPARCLET)
6863 .Case("tsc701", CK_TSC701)
6864 .Case("v9", CK_V9)
6865 .Case("ultrasparc", CK_ULTRASPARC)
6866 .Case("ultrasparc3", CK_ULTRASPARC3)
6867 .Case("niagara", CK_NIAGARA)
6868 .Case("niagara2", CK_NIAGARA2)
6869 .Case("niagara3", CK_NIAGARA3)
6870 .Case("niagara4", CK_NIAGARA4)
Douglas Katzman87da5f42016-07-25 16:36:02 +00006871 .Case("ma2100", CK_MYRIAD2100)
6872 .Case("ma2150", CK_MYRIAD2150)
6873 .Case("ma2450", CK_MYRIAD2450)
6874 // FIXME: the myriad2[.n] spellings are obsolete,
6875 // but a grace period is needed to allow updating dependent builds.
6876 .Case("myriad2", CK_MYRIAD2100)
6877 .Case("myriad2.1", CK_MYRIAD2100)
6878 .Case("myriad2.2", CK_MYRIAD2150)
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006879 .Case("leon2", CK_LEON2)
6880 .Case("at697e", CK_LEON2_AT697E)
6881 .Case("at697f", CK_LEON2_AT697F)
6882 .Case("leon3", CK_LEON3)
6883 .Case("ut699", CK_LEON3_UT699)
6884 .Case("gr712rc", CK_LEON3_GR712RC)
6885 .Case("leon4", CK_LEON4)
6886 .Case("gr740", CK_LEON4_GR740)
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006887 .Default(CK_GENERIC);
6888 }
6889
6890 bool setCPU(const std::string &Name) override {
6891 CPU = getCPUKind(Name);
6892 return CPU != CK_GENERIC;
6893 }
Gabor Greif49991682008-02-21 16:29:08 +00006894};
6895
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006896const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00006897 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6898 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6899 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6900 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
6901};
6902
Craig Topperf054e3a2015-10-19 03:52:27 +00006903ArrayRef<const char *> SparcTargetInfo::getGCCRegNames() const {
6904 return llvm::makeArrayRef(GCCRegNames);
Chris Lattner9b415d62009-01-27 01:58:38 +00006905}
6906
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006907const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00006908 { { "g0" }, "r0" },
6909 { { "g1" }, "r1" },
6910 { { "g2" }, "r2" },
6911 { { "g3" }, "r3" },
6912 { { "g4" }, "r4" },
6913 { { "g5" }, "r5" },
6914 { { "g6" }, "r6" },
6915 { { "g7" }, "r7" },
6916 { { "o0" }, "r8" },
6917 { { "o1" }, "r9" },
6918 { { "o2" }, "r10" },
6919 { { "o3" }, "r11" },
6920 { { "o4" }, "r12" },
6921 { { "o5" }, "r13" },
6922 { { "o6", "sp" }, "r14" },
6923 { { "o7" }, "r15" },
6924 { { "l0" }, "r16" },
6925 { { "l1" }, "r17" },
6926 { { "l2" }, "r18" },
6927 { { "l3" }, "r19" },
6928 { { "l4" }, "r20" },
6929 { { "l5" }, "r21" },
6930 { { "l6" }, "r22" },
6931 { { "l7" }, "r23" },
6932 { { "i0" }, "r24" },
6933 { { "i1" }, "r25" },
6934 { { "i2" }, "r26" },
6935 { { "i3" }, "r27" },
6936 { { "i4" }, "r28" },
6937 { { "i5" }, "r29" },
6938 { { "i6", "fp" }, "r30" },
6939 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00006940};
6941
Craig Topperf054e3a2015-10-19 03:52:27 +00006942ArrayRef<TargetInfo::GCCRegAlias> SparcTargetInfo::getGCCRegAliases() const {
6943 return llvm::makeArrayRef(GCCRegAliases);
Chris Lattner9b415d62009-01-27 01:58:38 +00006944}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006945
6946// SPARC v8 is the 32-bit mode selected by Triple::sparc.
6947class SparcV8TargetInfo : public SparcTargetInfo {
6948public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006949 SparcV8TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6950 : SparcTargetInfo(Triple, Opts) {
James Y Knightb214cbc2016-03-04 19:00:41 +00006951 resetDataLayout("E-m:e-p:32:32-i64:64-f128:64-n32-S64");
Brad Smith73859112015-08-13 21:45:57 +00006952 // NetBSD / OpenBSD use long (same as llvm default); everyone else uses int.
6953 switch (getTriple().getOS()) {
6954 default:
James Y Knight4b4d19e2015-06-04 15:36:29 +00006955 SizeType = UnsignedInt;
6956 IntPtrType = SignedInt;
6957 PtrDiffType = SignedInt;
Brad Smith73859112015-08-13 21:45:57 +00006958 break;
6959 case llvm::Triple::NetBSD:
6960 case llvm::Triple::OpenBSD:
6961 SizeType = UnsignedLong;
6962 IntPtrType = SignedLong;
6963 PtrDiffType = SignedLong;
6964 break;
Brad Smith56495d52015-08-13 22:00:53 +00006965 }
Douglas Katzman13f4a912016-11-09 15:43:51 +00006966 // Up to 32 bits are lock-free atomic, but we're willing to do atomic ops
6967 // on up to 64 bits.
6968 MaxAtomicPromoteWidth = 64;
6969 MaxAtomicInlineWidth = 32;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006970 }
6971
Craig Topper3164f332014-03-11 03:39:26 +00006972 void getTargetDefines(const LangOptions &Opts,
6973 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006974 SparcTargetInfo::getTargetDefines(Opts, Builder);
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006975 switch (getCPUGeneration(CPU)) {
6976 case CG_V8:
6977 Builder.defineMacro("__sparcv8");
6978 if (getTriple().getOS() != llvm::Triple::Solaris)
6979 Builder.defineMacro("__sparcv8__");
6980 break;
6981 case CG_V9:
6982 Builder.defineMacro("__sparcv9");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00006983 if (getTriple().getOS() != llvm::Triple::Solaris) {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006984 Builder.defineMacro("__sparcv9__");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00006985 Builder.defineMacro("__sparc_v9__");
6986 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006987 break;
6988 }
Douglas Katzman6871afc2016-03-15 22:34:02 +00006989 if (getTriple().getVendor() == llvm::Triple::Myriad) {
Douglas Katzman87da5f42016-07-25 16:36:02 +00006990 std::string MyriadArchValue, Myriad2Value;
6991 Builder.defineMacro("__sparc_v8__");
6992 Builder.defineMacro("__leon__");
Douglas Katzman6871afc2016-03-15 22:34:02 +00006993 switch (CPU) {
Douglas Katzman87da5f42016-07-25 16:36:02 +00006994 case CK_MYRIAD2150:
6995 MyriadArchValue = "__ma2150";
6996 Myriad2Value = "2";
Douglas Katzman6871afc2016-03-15 22:34:02 +00006997 break;
Douglas Katzman87da5f42016-07-25 16:36:02 +00006998 case CK_MYRIAD2450:
6999 MyriadArchValue = "__ma2450";
7000 Myriad2Value = "2";
Douglas Katzman6871afc2016-03-15 22:34:02 +00007001 break;
7002 default:
Douglas Katzman87da5f42016-07-25 16:36:02 +00007003 MyriadArchValue = "__ma2100";
7004 Myriad2Value = "1";
Douglas Katzman6871afc2016-03-15 22:34:02 +00007005 break;
7006 }
Douglas Katzman87da5f42016-07-25 16:36:02 +00007007 Builder.defineMacro(MyriadArchValue, "1");
7008 Builder.defineMacro(MyriadArchValue+"__", "1");
7009 Builder.defineMacro("__myriad2__", Myriad2Value);
7010 Builder.defineMacro("__myriad2", Myriad2Value);
Douglas Katzman6871afc2016-03-15 22:34:02 +00007011 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007012 }
Chris Dewhurst69fa1922016-05-04 09:33:30 +00007013
7014 bool hasSjLjLowering() const override {
7015 return true;
7016 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007017};
7018
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007019// SPARCV8el is the 32-bit little-endian mode selected by Triple::sparcel.
7020class SparcV8elTargetInfo : public SparcV8TargetInfo {
7021 public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007022 SparcV8elTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7023 : SparcV8TargetInfo(Triple, Opts) {
7024 resetDataLayout("e-m:e-p:32:32-i64:64-f128:64-n32-S64");
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007025 }
7026};
7027
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007028// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
7029class SparcV9TargetInfo : public SparcTargetInfo {
7030public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007031 SparcV9TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7032 : SparcTargetInfo(Triple, Opts) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007033 // FIXME: Support Sparc quad-precision long double?
James Y Knightb214cbc2016-03-04 19:00:41 +00007034 resetDataLayout("E-m:e-i64:64-n32:64-S128");
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00007035 // This is an LP64 platform.
7036 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00007037
7038 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00007039 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00007040 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00007041 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00007042 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00007043 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00007044
7045 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
7046 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
7047 LongDoubleWidth = 128;
7048 LongDoubleAlign = 128;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007049 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00007050 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007051 }
7052
Craig Topper3164f332014-03-11 03:39:26 +00007053 void getTargetDefines(const LangOptions &Opts,
7054 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007055 SparcTargetInfo::getTargetDefines(Opts, Builder);
7056 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00007057 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00007058 // Solaris doesn't need these variants, but the BSDs do.
7059 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00007060 Builder.defineMacro("__sparc64__");
7061 Builder.defineMacro("__sparc_v9__");
7062 Builder.defineMacro("__sparcv9__");
7063 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007064 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00007065
Craig Topper3164f332014-03-11 03:39:26 +00007066 bool setCPU(const std::string &Name) override {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00007067 if (!SparcTargetInfo::setCPU(Name))
7068 return false;
7069 return getCPUGeneration(CPU) == CG_V9;
Roman Divackyb1ae3d42014-02-25 18:35:30 +00007070 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007071};
7072
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007073class SystemZTargetInfo : public TargetInfo {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007074 static const Builtin::Info BuiltinInfo[];
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007075 static const char *const GCCRegNames[];
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007076 std::string CPU;
7077 bool HasTransactionalExecution;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007078 bool HasVector;
Ulrich Weigand47445072013-05-06 16:26:41 +00007079
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007080public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007081 SystemZTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Eric Christopherb093d692015-10-09 18:39:59 +00007082 : TargetInfo(Triple), CPU("z10"), HasTransactionalExecution(false),
7083 HasVector(false) {
Ulrich Weigand881497a2015-03-30 13:50:21 +00007084 IntMaxType = SignedLong;
7085 Int64Type = SignedLong;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007086 TLSSupported = true;
7087 IntWidth = IntAlign = 32;
7088 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
7089 PointerWidth = PointerAlign = 64;
7090 LongDoubleWidth = 128;
7091 LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007092 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Ulrich Weigandca3cb7f2015-04-21 17:29:35 +00007093 DefaultAlignForAttributeAligned = 64;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007094 MinGlobalAlign = 16;
James Y Knightb214cbc2016-03-04 19:00:41 +00007095 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 +00007096 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
7097 }
7098 void getTargetDefines(const LangOptions &Opts,
7099 MacroBuilder &Builder) const override {
7100 Builder.defineMacro("__s390__");
7101 Builder.defineMacro("__s390x__");
7102 Builder.defineMacro("__zarch__");
7103 Builder.defineMacro("__LONG_DOUBLE_128__");
Ulrich Weigandb038a522016-02-05 21:34:28 +00007104
Ulrich Weigand82a86cb2017-02-06 17:04:22 +00007105 const std::string ISARev = llvm::StringSwitch<std::string>(CPU)
7106 .Cases("arch8", "z10", "8")
7107 .Cases("arch9", "z196", "9")
7108 .Cases("arch10", "zEC12", "10")
7109 .Cases("arch11", "z13", "11")
7110 .Default("");
7111 if (!ISARev.empty())
7112 Builder.defineMacro("__ARCH__", ISARev);
7113
Ulrich Weigandb038a522016-02-05 21:34:28 +00007114 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
7115 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
7116 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
7117 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
7118
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007119 if (HasTransactionalExecution)
7120 Builder.defineMacro("__HTM__");
Ulrich Weigand82a86cb2017-02-06 17:04:22 +00007121 if (HasVector)
7122 Builder.defineMacro("__VX__");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00007123 if (Opts.ZVector)
7124 Builder.defineMacro("__VEC__", "10301");
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007125 }
Craig Topper6c03a542015-10-19 04:51:35 +00007126 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7127 return llvm::makeArrayRef(BuiltinInfo,
7128 clang::SystemZ::LastTSBuiltin-Builtin::FirstTSBuiltin);
Ulrich Weigand47445072013-05-06 16:26:41 +00007129 }
7130
Craig Topperf054e3a2015-10-19 03:52:27 +00007131 ArrayRef<const char *> getGCCRegNames() const override;
7132 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007133 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00007134 return None;
Ulrich Weigand47445072013-05-06 16:26:41 +00007135 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007136 bool validateAsmConstraint(const char *&Name,
7137 TargetInfo::ConstraintInfo &info) const override;
7138 const char *getClobbers() const override {
7139 // FIXME: Is this really right?
7140 return "";
7141 }
7142 BuiltinVaListKind getBuiltinVaListKind() const override {
7143 return TargetInfo::SystemZBuiltinVaList;
7144 }
7145 bool setCPU(const std::string &Name) override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007146 CPU = Name;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007147 bool CPUKnown = llvm::StringSwitch<bool>(Name)
7148 .Case("z10", true)
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007149 .Case("arch8", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007150 .Case("z196", true)
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007151 .Case("arch9", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007152 .Case("zEC12", true)
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007153 .Case("arch10", true)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007154 .Case("z13", true)
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007155 .Case("arch11", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007156 .Default(false);
7157
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007158 return CPUKnown;
7159 }
Eric Christopher8c47b422015-10-09 18:39:55 +00007160 bool
7161 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7162 StringRef CPU,
7163 const std::vector<std::string> &FeaturesVec) const override {
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007164 if (CPU == "zEC12" || CPU == "arch10")
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007165 Features["transactional-execution"] = true;
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007166 if (CPU == "z13" || CPU == "arch11") {
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007167 Features["transactional-execution"] = true;
7168 Features["vector"] = true;
7169 }
Eric Christopher007b0a02015-08-28 22:32:01 +00007170 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007171 }
7172
7173 bool handleTargetFeatures(std::vector<std::string> &Features,
7174 DiagnosticsEngine &Diags) override {
7175 HasTransactionalExecution = false;
Eric Christopher610fe112015-08-26 08:21:55 +00007176 for (const auto &Feature : Features) {
7177 if (Feature == "+transactional-execution")
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007178 HasTransactionalExecution = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007179 else if (Feature == "+vector")
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007180 HasVector = true;
7181 }
7182 // If we use the vector ABI, vector types are 64-bit aligned.
7183 if (HasVector) {
7184 MaxVectorAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00007185 resetDataLayout("E-m:e-i1:8:16-i8:8:16-i64:64-f128:64"
7186 "-v128:64-a:8:16-n32:64");
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007187 }
7188 return true;
7189 }
7190
7191 bool hasFeature(StringRef Feature) const override {
7192 return llvm::StringSwitch<bool>(Feature)
Ulrich Weigandcc673442015-04-01 14:15:35 +00007193 .Case("systemz", true)
7194 .Case("htm", HasTransactionalExecution)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007195 .Case("vx", HasVector)
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007196 .Default(false);
7197 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007198
Bryan Chane3f1ed52016-04-28 13:56:43 +00007199 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
7200 switch (CC) {
7201 case CC_C:
7202 case CC_Swift:
7203 return CCCR_OK;
7204 default:
7205 return CCCR_Warning;
7206 }
7207 }
7208
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007209 StringRef getABI() const override {
7210 if (HasVector)
7211 return "vector";
7212 return "";
7213 }
Ulrich Weigand47fd2532015-06-16 15:21:47 +00007214
7215 bool useFloat128ManglingForLongDouble() const override {
7216 return true;
7217 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007218};
7219
7220const Builtin::Info SystemZTargetInfo::BuiltinInfo[] = {
7221#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00007222 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Jonas Paulsson3ace74a2016-03-30 15:51:24 +00007223#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
7224 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007225#include "clang/Basic/BuiltinsSystemZ.def"
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007226};
7227
7228const char *const SystemZTargetInfo::GCCRegNames[] = {
7229 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
7230 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
7231 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
7232 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
7233};
7234
Craig Topperf054e3a2015-10-19 03:52:27 +00007235ArrayRef<const char *> SystemZTargetInfo::getGCCRegNames() const {
7236 return llvm::makeArrayRef(GCCRegNames);
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007237}
7238
7239bool SystemZTargetInfo::
7240validateAsmConstraint(const char *&Name,
7241 TargetInfo::ConstraintInfo &Info) const {
7242 switch (*Name) {
7243 default:
7244 return false;
7245
7246 case 'a': // Address register
7247 case 'd': // Data register (equivalent to 'r')
7248 case 'f': // Floating-point register
7249 Info.setAllowsRegister();
7250 return true;
7251
7252 case 'I': // Unsigned 8-bit constant
7253 case 'J': // Unsigned 12-bit constant
7254 case 'K': // Signed 16-bit constant
7255 case 'L': // Signed 20-bit displacement (on all targets we support)
7256 case 'M': // 0x7fffffff
7257 return true;
7258
7259 case 'Q': // Memory with base and unsigned 12-bit displacement
7260 case 'R': // Likewise, plus an index
7261 case 'S': // Memory with base and signed 20-bit displacement
7262 case 'T': // Likewise, plus an index
7263 Info.setAllowsMemory();
7264 return true;
7265 }
7266}
Ulrich Weigand47445072013-05-06 16:26:41 +00007267
Eric Christopherc48497a2015-09-18 21:26:24 +00007268class MSP430TargetInfo : public TargetInfo {
7269 static const char *const GCCRegNames[];
Anton Korobeynikova0f54372009-05-03 13:43:08 +00007270
Eric Christopherc48497a2015-09-18 21:26:24 +00007271public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007272 MSP430TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7273 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007274 TLSSupported = false;
7275 IntWidth = 16;
7276 IntAlign = 16;
7277 LongWidth = 32;
7278 LongLongWidth = 64;
7279 LongAlign = LongLongAlign = 16;
7280 PointerWidth = 16;
7281 PointerAlign = 16;
7282 SuitableAlign = 16;
7283 SizeType = UnsignedInt;
7284 IntMaxType = SignedLongLong;
7285 IntPtrType = SignedInt;
7286 PtrDiffType = SignedInt;
7287 SigAtomicType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00007288 resetDataLayout("e-m:e-p:16:16-i32:16:32-a:16-n8:16");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00007289 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007290 void getTargetDefines(const LangOptions &Opts,
7291 MacroBuilder &Builder) const override {
7292 Builder.defineMacro("MSP430");
7293 Builder.defineMacro("__MSP430__");
7294 // FIXME: defines for different 'flavours' of MCU
7295 }
Craig Topper6c03a542015-10-19 04:51:35 +00007296 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00007297 // FIXME: Implement.
Craig Topper6c03a542015-10-19 04:51:35 +00007298 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00007299 }
7300 bool hasFeature(StringRef Feature) const override {
7301 return Feature == "msp430";
7302 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007303 ArrayRef<const char *> getGCCRegNames() const override;
7304 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00007305 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00007306 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00007307 }
7308 bool validateAsmConstraint(const char *&Name,
7309 TargetInfo::ConstraintInfo &info) const override {
7310 // FIXME: implement
7311 switch (*Name) {
7312 case 'K': // the constant 1
7313 case 'L': // constant -1^20 .. 1^19
7314 case 'M': // constant 1-4:
Eli Friedmana9c3d712009-08-19 20:47:07 +00007315 return true;
7316 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007317 // No target constraints for now.
7318 return false;
7319 }
7320 const char *getClobbers() const override {
7321 // FIXME: Is this really right?
7322 return "";
7323 }
7324 BuiltinVaListKind getBuiltinVaListKind() const override {
7325 // FIXME: implement
7326 return TargetInfo::CharPtrBuiltinVaList;
7327 }
7328};
7329
7330const char *const MSP430TargetInfo::GCCRegNames[] = {
7331 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
7332 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"};
7333
Craig Topperf054e3a2015-10-19 03:52:27 +00007334ArrayRef<const char *> MSP430TargetInfo::getGCCRegNames() const {
7335 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00007336}
7337
7338// LLVM and Clang cannot be used directly to output native binaries for
7339// target, but is used to compile C code to llvm bitcode with correct
7340// type and alignment information.
7341//
7342// TCE uses the llvm bitcode as input and uses it for generating customized
7343// target processor and program binary. TCE co-design environment is
7344// publicly available in http://tce.cs.tut.fi
7345
7346static const unsigned TCEOpenCLAddrSpaceMap[] = {
7347 3, // opencl_global
7348 4, // opencl_local
7349 5, // opencl_constant
7350 // FIXME: generic has to be added to the target
7351 0, // opencl_generic
7352 0, // cuda_device
7353 0, // cuda_constant
7354 0 // cuda_shared
7355};
7356
7357class TCETargetInfo : public TargetInfo {
7358public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007359 TCETargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7360 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007361 TLSSupported = false;
7362 IntWidth = 32;
7363 LongWidth = LongLongWidth = 32;
7364 PointerWidth = 32;
7365 IntAlign = 32;
7366 LongAlign = LongLongAlign = 32;
7367 PointerAlign = 32;
7368 SuitableAlign = 32;
7369 SizeType = UnsignedInt;
7370 IntMaxType = SignedLong;
7371 IntPtrType = SignedInt;
7372 PtrDiffType = SignedInt;
7373 FloatWidth = 32;
7374 FloatAlign = 32;
7375 DoubleWidth = 32;
7376 DoubleAlign = 32;
7377 LongDoubleWidth = 32;
7378 LongDoubleAlign = 32;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007379 FloatFormat = &llvm::APFloat::IEEEsingle();
7380 DoubleFormat = &llvm::APFloat::IEEEsingle();
7381 LongDoubleFormat = &llvm::APFloat::IEEEsingle();
Pekka Jaaskelainen67354482016-11-16 15:22:31 +00007382 resetDataLayout("E-p:32:32:32-i1:8:8-i8:8:32-"
7383 "i16:16:32-i32:32:32-i64:32:32-"
7384 "f32:32:32-f64:32:32-v64:32:32-"
7385 "v128:32:32-v256:32:32-v512:32:32-"
7386 "v1024:32:32-a0:0:32-n32");
Eric Christopherc48497a2015-09-18 21:26:24 +00007387 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
7388 UseAddrSpaceMapMangling = true;
7389 }
7390
7391 void getTargetDefines(const LangOptions &Opts,
7392 MacroBuilder &Builder) const override {
7393 DefineStd(Builder, "tce", Opts);
7394 Builder.defineMacro("__TCE__");
7395 Builder.defineMacro("__TCE_V1__");
7396 }
7397 bool hasFeature(StringRef Feature) const override { return Feature == "tce"; }
7398
Craig Topper6c03a542015-10-19 04:51:35 +00007399 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007400 const char *getClobbers() const override { return ""; }
7401 BuiltinVaListKind getBuiltinVaListKind() const override {
7402 return TargetInfo::VoidPtrBuiltinVaList;
7403 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007404 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007405 bool validateAsmConstraint(const char *&Name,
7406 TargetInfo::ConstraintInfo &info) const override {
7407 return true;
7408 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007409 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7410 return None;
7411 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007412};
Eli Friedmana9c3d712009-08-19 20:47:07 +00007413
Pekka Jaaskelainen67354482016-11-16 15:22:31 +00007414class TCELETargetInfo : public TCETargetInfo {
7415public:
7416 TCELETargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7417 : TCETargetInfo(Triple, Opts) {
7418 BigEndian = false;
7419
7420 resetDataLayout("e-p:32:32:32-i1:8:8-i8:8:32-"
7421 "i16:16:32-i32:32:32-i64:32:32-"
7422 "f32:32:32-f64:32:32-v64:32:32-"
7423 "v128:32:32-v256:32:32-v512:32:32-"
7424 "v1024:32:32-a0:0:32-n32");
7425
7426 }
7427
7428 virtual void getTargetDefines(const LangOptions &Opts,
7429 MacroBuilder &Builder) const {
7430 DefineStd(Builder, "tcele", Opts);
7431 Builder.defineMacro("__TCE__");
7432 Builder.defineMacro("__TCE_V1__");
7433 Builder.defineMacro("__TCELE__");
7434 Builder.defineMacro("__TCELE_V1__");
7435 }
7436
7437};
7438
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007439class BPFTargetInfo : public TargetInfo {
7440public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007441 BPFTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7442 : TargetInfo(Triple) {
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007443 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
7444 SizeType = UnsignedLong;
7445 PtrDiffType = SignedLong;
7446 IntPtrType = SignedLong;
7447 IntMaxType = SignedLong;
7448 Int64Type = SignedLong;
7449 RegParmMax = 5;
7450 if (Triple.getArch() == llvm::Triple::bpfeb) {
James Y Knightb214cbc2016-03-04 19:00:41 +00007451 resetDataLayout("E-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007452 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00007453 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007454 }
7455 MaxAtomicPromoteWidth = 64;
7456 MaxAtomicInlineWidth = 64;
7457 TLSSupported = false;
7458 }
7459 void getTargetDefines(const LangOptions &Opts,
7460 MacroBuilder &Builder) const override {
7461 DefineStd(Builder, "bpf", Opts);
7462 Builder.defineMacro("__BPF__");
7463 }
7464 bool hasFeature(StringRef Feature) const override {
7465 return Feature == "bpf";
7466 }
7467
Craig Topper6c03a542015-10-19 04:51:35 +00007468 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007469 const char *getClobbers() const override {
7470 return "";
7471 }
7472 BuiltinVaListKind getBuiltinVaListKind() const override {
7473 return TargetInfo::VoidPtrBuiltinVaList;
7474 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007475 ArrayRef<const char *> getGCCRegNames() const override {
7476 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007477 }
7478 bool validateAsmConstraint(const char *&Name,
7479 TargetInfo::ConstraintInfo &info) const override {
7480 return true;
7481 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007482 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7483 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007484 }
7485};
7486
Daniel Sanders4672af62016-05-27 11:51:02 +00007487class MipsTargetInfo : public TargetInfo {
7488 void setDataLayout() {
Daniel Sanders55e40692016-06-03 10:11:01 +00007489 StringRef Layout;
7490
7491 if (ABI == "o32")
7492 Layout = "m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
7493 else if (ABI == "n32")
Daniel Sanders6a738832016-07-19 10:49:03 +00007494 Layout = "m:e-p:32:32-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Daniel Sanders55e40692016-06-03 10:11:01 +00007495 else if (ABI == "n64")
Daniel Sanders6a738832016-07-19 10:49:03 +00007496 Layout = "m:e-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Daniel Sanders55e40692016-06-03 10:11:01 +00007497 else
7498 llvm_unreachable("Invalid ABI");
7499
7500 if (BigEndian)
7501 resetDataLayout(("E-" + Layout).str());
7502 else
7503 resetDataLayout(("e-" + Layout).str());
Daniel Sanders4672af62016-05-27 11:51:02 +00007504 }
7505
Akira Hatanaka9064e362013-10-29 18:30:33 +00007506
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00007507 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007508 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00007509 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00007510 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007511 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00007512 bool IsSingleFloat;
Simon Dardisdf827a72017-02-21 16:01:00 +00007513 bool IsNoABICalls;
7514 bool CanUseBSDABICalls;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007515 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00007516 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007517 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007518 enum DspRevEnum {
7519 NoDSP, DSP1, DSP2
7520 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00007521 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007522
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007523protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00007524 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007525 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007526
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007527public:
Daniel Sanders4672af62016-05-27 11:51:02 +00007528 MipsTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007529 : TargetInfo(Triple), IsMips16(false), IsMicromips(false),
Simon Dardisdf827a72017-02-21 16:01:00 +00007530 IsNan2008(false), IsSingleFloat(false), IsNoABICalls(false),
7531 CanUseBSDABICalls(false), FloatABI(HardFloat), DspRev(NoDSP),
7532 HasMSA(false), HasFP64(false) {
Zoran Jovanovic26a12162015-02-18 15:21:35 +00007533 TheCXXABI.set(TargetCXXABI::GenericMIPS);
Daniel Sanders4672af62016-05-27 11:51:02 +00007534
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007535 setABI((getTriple().getArch() == llvm::Triple::mips ||
7536 getTriple().getArch() == llvm::Triple::mipsel)
7537 ? "o32"
7538 : "n64");
7539
7540 CPU = ABI == "o32" ? "mips32r2" : "mips64r2";
Simon Dardisdf827a72017-02-21 16:01:00 +00007541
7542 CanUseBSDABICalls = Triple.getOS() == llvm::Triple::FreeBSD ||
7543 Triple.getOS() == llvm::Triple::OpenBSD;
Zoran Jovanovic26a12162015-02-18 15:21:35 +00007544 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007545
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007546 bool isNaN2008Default() const {
7547 return CPU == "mips32r6" || CPU == "mips64r6";
7548 }
7549
7550 bool isFP64Default() const {
7551 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
7552 }
7553
Petar Jovanovicd55ae6b2015-02-26 18:19:22 +00007554 bool isNan2008() const override {
7555 return IsNan2008;
7556 }
7557
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007558 bool processorSupportsGPR64() const {
7559 return llvm::StringSwitch<bool>(CPU)
7560 .Case("mips3", true)
7561 .Case("mips4", true)
7562 .Case("mips5", true)
7563 .Case("mips64", true)
7564 .Case("mips64r2", true)
7565 .Case("mips64r3", true)
7566 .Case("mips64r5", true)
7567 .Case("mips64r6", true)
7568 .Case("octeon", true)
7569 .Default(false);
7570 return false;
7571 }
7572
Alp Toker4925ba72014-06-07 23:30:42 +00007573 StringRef getABI() const override { return ABI; }
Daniel Sanders4672af62016-05-27 11:51:02 +00007574 bool setABI(const std::string &Name) override {
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007575 if (Name == "o32") {
7576 setO32ABITypes();
7577 ABI = Name;
7578 return true;
Daniel Sanders4672af62016-05-27 11:51:02 +00007579 }
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007580
7581 if (Name == "n32") {
7582 setN32ABITypes();
7583 ABI = Name;
7584 return true;
7585 }
7586 if (Name == "n64") {
7587 setN64ABITypes();
7588 ABI = Name;
7589 return true;
Daniel Sanders4672af62016-05-27 11:51:02 +00007590 }
7591 return false;
7592 }
7593
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007594 void setO32ABITypes() {
7595 Int64Type = SignedLongLong;
7596 IntMaxType = Int64Type;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007597 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007598 LongDoubleWidth = LongDoubleAlign = 64;
7599 LongWidth = LongAlign = 32;
7600 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
7601 PointerWidth = PointerAlign = 32;
7602 PtrDiffType = SignedInt;
7603 SizeType = UnsignedInt;
7604 SuitableAlign = 64;
7605 }
7606
7607 void setN32N64ABITypes() {
7608 LongDoubleWidth = LongDoubleAlign = 128;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007609 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007610 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
7611 LongDoubleWidth = LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007612 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007613 }
7614 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
7615 SuitableAlign = 128;
7616 }
7617
Daniel Sanders4672af62016-05-27 11:51:02 +00007618 void setN64ABITypes() {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007619 setN32N64ABITypes();
Brad Smith8e55bd52017-03-06 23:48:31 +00007620 if (getTriple().getOS() == llvm::Triple::OpenBSD) {
7621 Int64Type = SignedLongLong;
7622 } else {
7623 Int64Type = SignedLong;
7624 }
Daniel Sanders4672af62016-05-27 11:51:02 +00007625 IntMaxType = Int64Type;
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007626 LongWidth = LongAlign = 64;
7627 PointerWidth = PointerAlign = 64;
7628 PtrDiffType = SignedLong;
7629 SizeType = UnsignedLong;
Daniel Sanders4672af62016-05-27 11:51:02 +00007630 }
7631
7632 void setN32ABITypes() {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007633 setN32N64ABITypes();
Daniel Sanders4672af62016-05-27 11:51:02 +00007634 Int64Type = SignedLongLong;
7635 IntMaxType = Int64Type;
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007636 LongWidth = LongAlign = 32;
7637 PointerWidth = PointerAlign = 32;
7638 PtrDiffType = SignedInt;
7639 SizeType = UnsignedInt;
Daniel Sanders4672af62016-05-27 11:51:02 +00007640 }
7641
Craig Topper3164f332014-03-11 03:39:26 +00007642 bool setCPU(const std::string &Name) override {
Eric Christopher0b26a612010-03-02 02:41:08 +00007643 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007644 return llvm::StringSwitch<bool>(Name)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007645 .Case("mips1", true)
7646 .Case("mips2", true)
Simon Atanasyan26610c52014-07-04 12:36:56 +00007647 .Case("mips3", true)
7648 .Case("mips4", true)
7649 .Case("mips5", true)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007650 .Case("mips32", true)
7651 .Case("mips32r2", true)
7652 .Case("mips32r3", true)
7653 .Case("mips32r5", true)
7654 .Case("mips32r6", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007655 .Case("mips64", true)
7656 .Case("mips64r2", true)
Simon Atanasyan162feb52015-02-20 23:37:40 +00007657 .Case("mips64r3", true)
7658 .Case("mips64r5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007659 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00007660 .Case("octeon", true)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007661 .Case("p5600", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007662 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00007663 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00007664 const std::string& getCPU() const { return CPU; }
Eric Christopher8c47b422015-10-09 18:39:55 +00007665 bool
7666 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7667 StringRef CPU,
7668 const std::vector<std::string> &FeaturesVec) const override {
Bhushan D. Attardebacb988732016-03-04 06:56:29 +00007669 if (CPU.empty())
7670 CPU = getCPU();
Simon Atanasyan4e16a422014-07-04 12:37:04 +00007671 if (CPU == "octeon")
7672 Features["mips64r2"] = Features["cnmips"] = true;
7673 else
7674 Features[CPU] = true;
Eric Christopher007b0a02015-08-28 22:32:01 +00007675 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Eric Christopher0b26a612010-03-02 02:41:08 +00007676 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007677
Craig Topper3164f332014-03-11 03:39:26 +00007678 void getTargetDefines(const LangOptions &Opts,
7679 MacroBuilder &Builder) const override {
Daniel Sanders4672af62016-05-27 11:51:02 +00007680 if (BigEndian) {
7681 DefineStd(Builder, "MIPSEB", Opts);
7682 Builder.defineMacro("_MIPSEB");
7683 } else {
7684 DefineStd(Builder, "MIPSEL", Opts);
7685 Builder.defineMacro("_MIPSEL");
7686 }
7687
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007688 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00007689 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007690 if (Opts.GNUMode)
7691 Builder.defineMacro("mips");
7692
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007693 if (ABI == "o32") {
Daniel Sanders4672af62016-05-27 11:51:02 +00007694 Builder.defineMacro("__mips", "32");
7695 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
7696 } else {
7697 Builder.defineMacro("__mips", "64");
7698 Builder.defineMacro("__mips64");
7699 Builder.defineMacro("__mips64__");
7700 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
7701 }
7702
7703 const std::string ISARev = llvm::StringSwitch<std::string>(getCPU())
7704 .Cases("mips32", "mips64", "1")
7705 .Cases("mips32r2", "mips64r2", "2")
7706 .Cases("mips32r3", "mips64r3", "3")
7707 .Cases("mips32r5", "mips64r5", "5")
7708 .Cases("mips32r6", "mips64r6", "6")
7709 .Default("");
7710 if (!ISARev.empty())
7711 Builder.defineMacro("__mips_isa_rev", ISARev);
7712
7713 if (ABI == "o32") {
7714 Builder.defineMacro("__mips_o32");
7715 Builder.defineMacro("_ABIO32", "1");
7716 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
Daniel Sanders07c86542016-05-27 14:30:23 +00007717 } else if (ABI == "n32") {
Daniel Sanders4672af62016-05-27 11:51:02 +00007718 Builder.defineMacro("__mips_n32");
7719 Builder.defineMacro("_ABIN32", "2");
7720 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
7721 } else if (ABI == "n64") {
7722 Builder.defineMacro("__mips_n64");
7723 Builder.defineMacro("_ABI64", "3");
7724 Builder.defineMacro("_MIPS_SIM", "_ABI64");
7725 } else
7726 llvm_unreachable("Invalid ABI.");
7727
Simon Dardisdf827a72017-02-21 16:01:00 +00007728 if (!IsNoABICalls) {
7729 Builder.defineMacro("__mips_abicalls");
7730 if (CanUseBSDABICalls)
7731 Builder.defineMacro("__ABICALLS__");
7732 }
7733
Simon Atanasyan683535b2012-08-29 19:14:58 +00007734 Builder.defineMacro("__REGISTER_PREFIX__", "");
7735
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007736 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007737 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00007738 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007739 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007740 case SoftFloat:
7741 Builder.defineMacro("__mips_soft_float", Twine(1));
7742 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00007743 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00007744
Simon Atanasyan16071912013-04-14 14:07:30 +00007745 if (IsSingleFloat)
7746 Builder.defineMacro("__mips_single_float", Twine(1));
7747
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007748 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
7749 Builder.defineMacro("_MIPS_FPSET",
7750 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
7751
Simon Atanasyan72244b62012-07-05 16:06:06 +00007752 if (IsMips16)
7753 Builder.defineMacro("__mips16", Twine(1));
7754
Simon Atanasyan60777612013-04-14 14:07:51 +00007755 if (IsMicromips)
7756 Builder.defineMacro("__mips_micromips", Twine(1));
7757
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007758 if (IsNan2008)
7759 Builder.defineMacro("__mips_nan2008", Twine(1));
7760
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007761 switch (DspRev) {
7762 default:
7763 break;
7764 case DSP1:
7765 Builder.defineMacro("__mips_dsp_rev", Twine(1));
7766 Builder.defineMacro("__mips_dsp", Twine(1));
7767 break;
7768 case DSP2:
7769 Builder.defineMacro("__mips_dsp_rev", Twine(2));
7770 Builder.defineMacro("__mips_dspr2", Twine(1));
7771 Builder.defineMacro("__mips_dsp", Twine(1));
7772 break;
7773 }
7774
Jack Carter44ff1e52013-08-12 17:20:29 +00007775 if (HasMSA)
7776 Builder.defineMacro("__mips_msa", Twine(1));
7777
Simon Atanasyan26f19672012-04-05 19:28:31 +00007778 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
7779 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
7780 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00007781
7782 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
7783 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Daniel Sanders5176f7e2015-12-22 12:59:30 +00007784
7785 // These shouldn't be defined for MIPS-I but there's no need to check
7786 // for that since MIPS-I isn't supported.
7787 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
7788 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
7789 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007790
7791 // 32-bit MIPS processors don't have the necessary lld/scd instructions
7792 // found in 64-bit processors. In the case of O32 on a 64-bit processor,
7793 // the instructions exist but using them violates the ABI since they
7794 // require 64-bit GPRs and O32 only supports 32-bit GPRs.
7795 if (ABI == "n32" || ABI == "n64")
Daniel Sanders4672af62016-05-27 11:51:02 +00007796 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007797 }
7798
Craig Topper6c03a542015-10-19 04:51:35 +00007799 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7800 return llvm::makeArrayRef(BuiltinInfo,
7801 clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin);
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007802 }
Craig Topper3164f332014-03-11 03:39:26 +00007803 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00007804 return llvm::StringSwitch<bool>(Feature)
7805 .Case("mips", true)
7806 .Case("fp64", HasFP64)
7807 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00007808 }
Craig Topper3164f332014-03-11 03:39:26 +00007809 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00007810 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007811 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007812 ArrayRef<const char *> getGCCRegNames() const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00007813 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00007814 // CPU register names
7815 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007816 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
7817 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
7818 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00007819 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
7820 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007821 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
7822 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
7823 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
7824 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00007825 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007826 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Hrvoje Varga14c42ee2016-03-29 12:46:16 +00007827 "$fcc5","$fcc6","$fcc7","$ac1hi","$ac1lo","$ac2hi","$ac2lo",
7828 "$ac3hi","$ac3lo",
Daniel Sanders8b59af12013-11-12 12:56:01 +00007829 // MSA register names
7830 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
7831 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
7832 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
7833 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
7834 // MSA control register names
7835 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
7836 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007837 };
Craig Topperf054e3a2015-10-19 03:52:27 +00007838 return llvm::makeArrayRef(GCCRegNames);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007839 }
Craig Topper3164f332014-03-11 03:39:26 +00007840 bool validateAsmConstraint(const char *&Name,
7841 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007842 switch (*Name) {
7843 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00007844 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007845 case 'r': // CPU registers.
7846 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00007847 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007848 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00007849 case 'c': // $25 for indirect jumps
7850 case 'l': // lo register
7851 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007852 Info.setAllowsRegister();
7853 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00007854 case 'I': // Signed 16-bit constant
7855 case 'J': // Integer 0
7856 case 'K': // Unsigned 16-bit constant
7857 case 'L': // Signed 32-bit constant, lower 16-bit zeros (for lui)
7858 case 'M': // Constants not loadable via lui, addiu, or ori
7859 case 'N': // Constant -1 to -65535
7860 case 'O': // A signed 15-bit constant
7861 case 'P': // A constant between 1 go 65535
7862 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00007863 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00007864 Info.setAllowsMemory();
7865 return true;
Daniel Sanders48fa39e2015-03-30 13:47:23 +00007866 case 'Z':
7867 if (Name[1] == 'C') { // An address usable by ll, and sc.
7868 Info.setAllowsMemory();
7869 Name++; // Skip over 'Z'.
7870 return true;
7871 }
7872 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007873 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007874 }
7875
Daniel Sanders48fa39e2015-03-30 13:47:23 +00007876 std::string convertConstraint(const char *&Constraint) const override {
7877 std::string R;
7878 switch (*Constraint) {
7879 case 'Z': // Two-character constraint; add "^" hint for later parsing.
7880 if (Constraint[1] == 'C') {
7881 R = std::string("^") + std::string(Constraint, 2);
7882 Constraint++;
7883 return R;
7884 }
7885 break;
7886 }
7887 return TargetInfo::convertConstraint(Constraint);
7888 }
7889
Craig Topper3164f332014-03-11 03:39:26 +00007890 const char *getClobbers() const override {
Toma Tabacucfab40f2015-01-12 14:41:30 +00007891 // In GCC, $1 is not widely used in generated code (it's used only in a few
7892 // specific situations), so there is no real need for users to add it to
7893 // the clobbers list if they want to use it in their inline assembly code.
7894 //
7895 // In LLVM, $1 is treated as a normal GPR and is always allocatable during
7896 // code generation, so using it in inline assembly without adding it to the
7897 // clobbers list can cause conflicts between the inline assembly code and
7898 // the surrounding generated code.
7899 //
7900 // Another problem is that LLVM is allowed to choose $1 for inline assembly
7901 // operands, which will conflict with the ".set at" assembler option (which
7902 // we use only for inline assembly, in order to maintain compatibility with
7903 // GCC) and will also conflict with the user's usage of $1.
7904 //
7905 // The easiest way to avoid these conflicts and keep $1 as an allocatable
7906 // register for generated code is to automatically clobber $1 for all inline
7907 // assembly code.
7908 //
7909 // FIXME: We should automatically clobber $1 only for inline assembly code
7910 // which actually uses it. This would allow LLVM to use $1 for inline
7911 // assembly operands if the user's assembly code doesn't use it.
Toma Tabacu99411952014-12-17 12:02:58 +00007912 return "~{$1}";
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007913 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007914
Craig Topper3164f332014-03-11 03:39:26 +00007915 bool handleTargetFeatures(std::vector<std::string> &Features,
7916 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00007917 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00007918 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007919 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00007920 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007921 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007922 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007923 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007924
Eric Christopher610fe112015-08-26 08:21:55 +00007925 for (const auto &Feature : Features) {
7926 if (Feature == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00007927 IsSingleFloat = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007928 else if (Feature == "+soft-float")
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007929 FloatABI = SoftFloat;
Eric Christopher610fe112015-08-26 08:21:55 +00007930 else if (Feature == "+mips16")
Simon Atanasyan72244b62012-07-05 16:06:06 +00007931 IsMips16 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007932 else if (Feature == "+micromips")
Simon Atanasyan60777612013-04-14 14:07:51 +00007933 IsMicromips = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007934 else if (Feature == "+dsp")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007935 DspRev = std::max(DspRev, DSP1);
Eric Christopher610fe112015-08-26 08:21:55 +00007936 else if (Feature == "+dspr2")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007937 DspRev = std::max(DspRev, DSP2);
Eric Christopher610fe112015-08-26 08:21:55 +00007938 else if (Feature == "+msa")
Jack Carter44ff1e52013-08-12 17:20:29 +00007939 HasMSA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007940 else if (Feature == "+fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007941 HasFP64 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007942 else if (Feature == "-fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007943 HasFP64 = false;
Eric Christopher610fe112015-08-26 08:21:55 +00007944 else if (Feature == "+nan2008")
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007945 IsNan2008 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007946 else if (Feature == "-nan2008")
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007947 IsNan2008 = false;
Simon Dardisdf827a72017-02-21 16:01:00 +00007948 else if (Feature == "+noabicalls")
7949 IsNoABICalls = true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007950 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007951
James Y Knightb214cbc2016-03-04 19:00:41 +00007952 setDataLayout();
Akira Hatanaka9064e362013-10-29 18:30:33 +00007953
Rafael Espindolaeb265472013-08-21 21:59:03 +00007954 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007955 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00007956
Craig Topper3164f332014-03-11 03:39:26 +00007957 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00007958 if (RegNo == 0) return 4;
7959 if (RegNo == 1) return 5;
7960 return -1;
7961 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00007962
7963 bool isCLZForZeroUndef() const override { return false; }
Daniel Sanders4672af62016-05-27 11:51:02 +00007964
7965 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7966 static const TargetInfo::GCCRegAlias O32RegAliases[] = {
7967 {{"at"}, "$1"}, {{"v0"}, "$2"}, {{"v1"}, "$3"},
7968 {{"a0"}, "$4"}, {{"a1"}, "$5"}, {{"a2"}, "$6"},
7969 {{"a3"}, "$7"}, {{"t0"}, "$8"}, {{"t1"}, "$9"},
7970 {{"t2"}, "$10"}, {{"t3"}, "$11"}, {{"t4"}, "$12"},
7971 {{"t5"}, "$13"}, {{"t6"}, "$14"}, {{"t7"}, "$15"},
7972 {{"s0"}, "$16"}, {{"s1"}, "$17"}, {{"s2"}, "$18"},
7973 {{"s3"}, "$19"}, {{"s4"}, "$20"}, {{"s5"}, "$21"},
7974 {{"s6"}, "$22"}, {{"s7"}, "$23"}, {{"t8"}, "$24"},
7975 {{"t9"}, "$25"}, {{"k0"}, "$26"}, {{"k1"}, "$27"},
7976 {{"gp"}, "$28"}, {{"sp", "$sp"}, "$29"}, {{"fp", "$fp"}, "$30"},
7977 {{"ra"}, "$31"}};
7978 static const TargetInfo::GCCRegAlias NewABIRegAliases[] = {
7979 {{"at"}, "$1"}, {{"v0"}, "$2"}, {{"v1"}, "$3"},
7980 {{"a0"}, "$4"}, {{"a1"}, "$5"}, {{"a2"}, "$6"},
7981 {{"a3"}, "$7"}, {{"a4"}, "$8"}, {{"a5"}, "$9"},
7982 {{"a6"}, "$10"}, {{"a7"}, "$11"}, {{"t0"}, "$12"},
7983 {{"t1"}, "$13"}, {{"t2"}, "$14"}, {{"t3"}, "$15"},
7984 {{"s0"}, "$16"}, {{"s1"}, "$17"}, {{"s2"}, "$18"},
7985 {{"s3"}, "$19"}, {{"s4"}, "$20"}, {{"s5"}, "$21"},
7986 {{"s6"}, "$22"}, {{"s7"}, "$23"}, {{"t8"}, "$24"},
7987 {{"t9"}, "$25"}, {{"k0"}, "$26"}, {{"k1"}, "$27"},
7988 {{"gp"}, "$28"}, {{"sp", "$sp"}, "$29"}, {{"fp", "$fp"}, "$30"},
7989 {{"ra"}, "$31"}};
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007990 if (ABI == "o32")
Daniel Sanders4672af62016-05-27 11:51:02 +00007991 return llvm::makeArrayRef(O32RegAliases);
7992 return llvm::makeArrayRef(NewABIRegAliases);
7993 }
7994
7995 bool hasInt128Type() const override {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007996 return ABI == "n32" || ABI == "n64";
Daniel Sanders4672af62016-05-27 11:51:02 +00007997 }
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007998
7999 bool validateTarget(DiagnosticsEngine &Diags) const override {
8000 // FIXME: It's valid to use O32 on a 64-bit CPU but the backend can't handle
8001 // this yet. It's better to fail here than on the backend assertion.
8002 if (processorSupportsGPR64() && ABI == "o32") {
8003 Diags.Report(diag::err_target_unsupported_abi) << ABI << CPU;
8004 return false;
8005 }
8006
8007 // 64-bit ABI's require 64-bit CPU's.
8008 if (!processorSupportsGPR64() && (ABI == "n32" || ABI == "n64")) {
8009 Diags.Report(diag::err_target_unsupported_abi) << ABI << CPU;
8010 return false;
8011 }
8012
8013 // FIXME: It's valid to use O32 on a mips64/mips64el triple but the backend
8014 // can't handle this yet. It's better to fail here than on the
8015 // backend assertion.
8016 if ((getTriple().getArch() == llvm::Triple::mips64 ||
8017 getTriple().getArch() == llvm::Triple::mips64el) &&
8018 ABI == "o32") {
8019 Diags.Report(diag::err_target_unsupported_abi_for_triple)
8020 << ABI << getTriple().str();
8021 return false;
8022 }
8023
8024 // FIXME: It's valid to use N32/N64 on a mips/mipsel triple but the backend
8025 // can't handle this yet. It's better to fail here than on the
8026 // backend assertion.
8027 if ((getTriple().getArch() == llvm::Triple::mips ||
8028 getTriple().getArch() == llvm::Triple::mipsel) &&
8029 (ABI == "n32" || ABI == "n64")) {
8030 Diags.Report(diag::err_target_unsupported_abi_for_triple)
8031 << ABI << getTriple().str();
8032 return false;
8033 }
8034
8035 return true;
8036 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008037};
8038
Daniel Sanders4672af62016-05-27 11:51:02 +00008039const Builtin::Info MipsTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00008040#define BUILTIN(ID, TYPE, ATTRS) \
8041 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
8042#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
8043 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00008044#include "clang/Basic/BuiltinsMips.def"
8045};
8046
Ivan Krasindd7403e2011-08-24 20:22:22 +00008047class PNaClTargetInfo : public TargetInfo {
8048public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008049 PNaClTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8050 : TargetInfo(Triple) {
Ivan Krasindd7403e2011-08-24 20:22:22 +00008051 this->LongAlign = 32;
8052 this->LongWidth = 32;
8053 this->PointerAlign = 32;
8054 this->PointerWidth = 32;
8055 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00008056 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00008057 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00008058 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00008059 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00008060 this->SizeType = TargetInfo::UnsignedInt;
8061 this->PtrDiffType = TargetInfo::SignedInt;
8062 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00008063 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00008064 }
8065
Craig Toppere6f17d02014-03-11 04:07:52 +00008066 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00008067 Builder.defineMacro("__le32__");
8068 Builder.defineMacro("__pnacl__");
8069 }
Craig Topper3164f332014-03-11 03:39:26 +00008070 void getTargetDefines(const LangOptions &Opts,
8071 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00008072 getArchDefines(Opts, Builder);
8073 }
Craig Topper3164f332014-03-11 03:39:26 +00008074 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00008075 return Feature == "pnacl";
8076 }
Craig Topper6c03a542015-10-19 04:51:35 +00008077 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Craig Topper3164f332014-03-11 03:39:26 +00008078 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00008079 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00008080 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008081 ArrayRef<const char *> getGCCRegNames() const override;
8082 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00008083 bool validateAsmConstraint(const char *&Name,
8084 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00008085 return false;
8086 }
8087
Craig Topper3164f332014-03-11 03:39:26 +00008088 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00008089 return "";
8090 }
8091};
8092
Craig Topperf054e3a2015-10-19 03:52:27 +00008093ArrayRef<const char *> PNaClTargetInfo::getGCCRegNames() const {
8094 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00008095}
8096
Craig Topperf054e3a2015-10-19 03:52:27 +00008097ArrayRef<TargetInfo::GCCRegAlias> PNaClTargetInfo::getGCCRegAliases() const {
8098 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00008099}
Ivan Krasindd7403e2011-08-24 20:22:22 +00008100
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008101// We attempt to use PNaCl (le32) frontend and Mips32EL backend.
Daniel Sanders4672af62016-05-27 11:51:02 +00008102class NaClMips32TargetInfo : public MipsTargetInfo {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008103public:
Daniel Sanders4672af62016-05-27 11:51:02 +00008104 NaClMips32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8105 : MipsTargetInfo(Triple, Opts) {}
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008106
8107 BuiltinVaListKind getBuiltinVaListKind() const override {
8108 return TargetInfo::PNaClABIBuiltinVaList;
8109 }
8110};
8111
JF Bastien643817d2014-09-12 17:52:47 +00008112class Le64TargetInfo : public TargetInfo {
8113 static const Builtin::Info BuiltinInfo[];
8114
8115public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008116 Le64TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
8117 : TargetInfo(Triple) {
JF Bastien643817d2014-09-12 17:52:47 +00008118 NoAsmVariants = true;
8119 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
8120 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00008121 resetDataLayout("e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128");
JF Bastien643817d2014-09-12 17:52:47 +00008122 }
8123
8124 void getTargetDefines(const LangOptions &Opts,
8125 MacroBuilder &Builder) const override {
Saleem Abdulrasool56027092017-02-07 19:00:06 +00008126 DefineStd(Builder, "unix", Opts);
JF Bastien643817d2014-09-12 17:52:47 +00008127 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
8128 Builder.defineMacro("__ELF__");
8129 }
Craig Topper6c03a542015-10-19 04:51:35 +00008130 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
8131 return llvm::makeArrayRef(BuiltinInfo,
8132 clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin);
JF Bastien643817d2014-09-12 17:52:47 +00008133 }
8134 BuiltinVaListKind getBuiltinVaListKind() const override {
8135 return TargetInfo::PNaClABIBuiltinVaList;
8136 }
8137 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00008138 ArrayRef<const char *> getGCCRegNames() const override {
8139 return None;
JF Bastien643817d2014-09-12 17:52:47 +00008140 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008141 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8142 return None;
JF Bastien643817d2014-09-12 17:52:47 +00008143 }
8144 bool validateAsmConstraint(const char *&Name,
8145 TargetInfo::ConstraintInfo &Info) const override {
8146 return false;
8147 }
8148
8149 bool hasProtectedVisibility() const override { return false; }
JF Bastien643817d2014-09-12 17:52:47 +00008150};
Dan Gohmanc2853072015-09-03 22:51:53 +00008151
8152class WebAssemblyTargetInfo : public TargetInfo {
8153 static const Builtin::Info BuiltinInfo[];
8154
8155 enum SIMDEnum {
8156 NoSIMD,
8157 SIMD128,
8158 } SIMDLevel;
8159
8160public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008161 explicit WebAssemblyTargetInfo(const llvm::Triple &T, const TargetOptions &)
Dan Gohmanc2853072015-09-03 22:51:53 +00008162 : TargetInfo(T), SIMDLevel(NoSIMD) {
Dan Gohmanc2853072015-09-03 22:51:53 +00008163 NoAsmVariants = true;
8164 SuitableAlign = 128;
8165 LargeArrayMinWidth = 128;
8166 LargeArrayAlign = 128;
8167 SimdDefaultAlign = 128;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00008168 SigAtomicType = SignedLong;
Dan Gohman6db46402015-11-10 21:01:46 +00008169 LongDoubleWidth = LongDoubleAlign = 128;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00008170 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Derek Schuffacdc8e62016-09-01 22:38:37 +00008171 SizeType = UnsignedInt;
8172 PtrDiffType = SignedInt;
8173 IntPtrType = SignedInt;
Dan Gohmanc2853072015-09-03 22:51:53 +00008174 }
8175
8176protected:
8177 void getTargetDefines(const LangOptions &Opts,
8178 MacroBuilder &Builder) const override {
8179 defineCPUMacros(Builder, "wasm", /*Tuning=*/false);
8180 if (SIMDLevel >= SIMD128)
8181 Builder.defineMacro("__wasm_simd128__");
8182 }
8183
8184private:
Eric Christopher8c47b422015-10-09 18:39:55 +00008185 bool
8186 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
8187 StringRef CPU,
8188 const std::vector<std::string> &FeaturesVec) const override {
Dan Gohmanc2853072015-09-03 22:51:53 +00008189 if (CPU == "bleeding-edge")
8190 Features["simd128"] = true;
8191 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
8192 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00008193 bool hasFeature(StringRef Feature) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00008194 return llvm::StringSwitch<bool>(Feature)
8195 .Case("simd128", SIMDLevel >= SIMD128)
8196 .Default(false);
8197 }
8198 bool handleTargetFeatures(std::vector<std::string> &Features,
Hans Wennborg7eb54642015-09-10 17:07:54 +00008199 DiagnosticsEngine &Diags) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00008200 for (const auto &Feature : Features) {
8201 if (Feature == "+simd128") {
8202 SIMDLevel = std::max(SIMDLevel, SIMD128);
8203 continue;
8204 }
8205 if (Feature == "-simd128") {
8206 SIMDLevel = std::min(SIMDLevel, SIMDEnum(SIMD128 - 1));
8207 continue;
8208 }
8209
8210 Diags.Report(diag::err_opt_not_valid_with_opt) << Feature
8211 << "-target-feature";
8212 return false;
8213 }
8214 return true;
8215 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00008216 bool setCPU(const std::string &Name) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00008217 return llvm::StringSwitch<bool>(Name)
8218 .Case("mvp", true)
8219 .Case("bleeding-edge", true)
8220 .Case("generic", true)
8221 .Default(false);
8222 }
Craig Topper6c03a542015-10-19 04:51:35 +00008223 ArrayRef<Builtin::Info> getTargetBuiltins() const final {
8224 return llvm::makeArrayRef(BuiltinInfo,
8225 clang::WebAssembly::LastTSBuiltin - Builtin::FirstTSBuiltin);
Dan Gohmanc2853072015-09-03 22:51:53 +00008226 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00008227 BuiltinVaListKind getBuiltinVaListKind() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00008228 return VoidPtrBuiltinVaList;
8229 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008230 ArrayRef<const char *> getGCCRegNames() const final {
8231 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00008232 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008233 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const final {
8234 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00008235 }
8236 bool
8237 validateAsmConstraint(const char *&Name,
Hans Wennborg7eb54642015-09-10 17:07:54 +00008238 TargetInfo::ConstraintInfo &Info) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00008239 return false;
8240 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00008241 const char *getClobbers() const final { return ""; }
8242 bool isCLZForZeroUndef() const final { return false; }
8243 bool hasInt128Type() const final { return true; }
Dan Gohmanab0e31f2015-09-14 21:49:41 +00008244 IntType getIntTypeByWidth(unsigned BitWidth,
8245 bool IsSigned) const final {
8246 // WebAssembly prefers long long for explicitly 64-bit integers.
8247 return BitWidth == 64 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
8248 : TargetInfo::getIntTypeByWidth(BitWidth, IsSigned);
8249 }
8250 IntType getLeastIntTypeByWidth(unsigned BitWidth,
8251 bool IsSigned) const final {
8252 // WebAssembly uses long long for int_least64_t and int_fast64_t.
8253 return BitWidth == 64
8254 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
8255 : TargetInfo::getLeastIntTypeByWidth(BitWidth, IsSigned);
8256 }
Dan Gohmanc2853072015-09-03 22:51:53 +00008257};
8258
8259const Builtin::Info WebAssemblyTargetInfo::BuiltinInfo[] = {
8260#define BUILTIN(ID, TYPE, ATTRS) \
8261 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
8262#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
8263 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
8264#include "clang/Basic/BuiltinsWebAssembly.def"
8265};
8266
8267class WebAssembly32TargetInfo : public WebAssemblyTargetInfo {
8268public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008269 explicit WebAssembly32TargetInfo(const llvm::Triple &T,
8270 const TargetOptions &Opts)
8271 : WebAssemblyTargetInfo(T, Opts) {
Dan Gohmanf1c34e62015-09-14 21:56:37 +00008272 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
James Y Knightb214cbc2016-03-04 19:00:41 +00008273 resetDataLayout("e-m:e-p:32:32-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00008274 }
8275
8276protected:
8277 void getTargetDefines(const LangOptions &Opts,
8278 MacroBuilder &Builder) const override {
8279 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
8280 defineCPUMacros(Builder, "wasm32", /*Tuning=*/false);
8281 }
8282};
8283
8284class WebAssembly64TargetInfo : public WebAssemblyTargetInfo {
8285public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008286 explicit WebAssembly64TargetInfo(const llvm::Triple &T,
8287 const TargetOptions &Opts)
8288 : WebAssemblyTargetInfo(T, Opts) {
Dan Gohmanc2853072015-09-03 22:51:53 +00008289 LongAlign = LongWidth = 64;
8290 PointerAlign = PointerWidth = 64;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00008291 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Derek Schuffacdc8e62016-09-01 22:38:37 +00008292 SizeType = UnsignedLong;
8293 PtrDiffType = SignedLong;
8294 IntPtrType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00008295 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00008296 }
8297
8298protected:
8299 void getTargetDefines(const LangOptions &Opts,
8300 MacroBuilder &Builder) const override {
8301 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
8302 defineCPUMacros(Builder, "wasm64", /*Tuning=*/false);
8303 }
8304};
8305
JF Bastien643817d2014-09-12 17:52:47 +00008306const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
8307#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00008308 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
JF Bastien643817d2014-09-12 17:52:47 +00008309#include "clang/Basic/BuiltinsLe64.def"
8310};
8311
Eric Christopherc48497a2015-09-18 21:26:24 +00008312static const unsigned SPIRAddrSpaceMap[] = {
8313 1, // opencl_global
8314 3, // opencl_local
8315 2, // opencl_constant
8316 4, // opencl_generic
8317 0, // cuda_device
8318 0, // cuda_constant
8319 0 // cuda_shared
8320};
8321class SPIRTargetInfo : public TargetInfo {
8322public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008323 SPIRTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
8324 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00008325 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
8326 "SPIR target must use unknown OS");
8327 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
8328 "SPIR target must use unknown environment type");
Eric Christopherc48497a2015-09-18 21:26:24 +00008329 TLSSupported = false;
8330 LongWidth = LongAlign = 64;
8331 AddrSpaceMap = &SPIRAddrSpaceMap;
8332 UseAddrSpaceMapMangling = true;
8333 // Define available target features
8334 // These must be defined in sorted order!
8335 NoAsmVariants = true;
8336 }
8337 void getTargetDefines(const LangOptions &Opts,
8338 MacroBuilder &Builder) const override {
8339 DefineStd(Builder, "SPIR", Opts);
8340 }
8341 bool hasFeature(StringRef Feature) const override {
8342 return Feature == "spir";
8343 }
Craig Topper3164f332014-03-11 03:39:26 +00008344
Craig Topper6c03a542015-10-19 04:51:35 +00008345 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00008346 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00008347 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00008348 bool validateAsmConstraint(const char *&Name,
8349 TargetInfo::ConstraintInfo &info) const override {
8350 return true;
8351 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008352 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8353 return None;
8354 }
Eric Christopherc48497a2015-09-18 21:26:24 +00008355 BuiltinVaListKind getBuiltinVaListKind() const override {
8356 return TargetInfo::VoidPtrBuiltinVaList;
8357 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00008358
Eric Christopherc48497a2015-09-18 21:26:24 +00008359 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Nikolay Haustov8c6538b2016-06-30 09:06:33 +00008360 return (CC == CC_SpirFunction || CC == CC_OpenCLKernel) ? CCCR_OK
8361 : CCCR_Warning;
Eric Christopherc48497a2015-09-18 21:26:24 +00008362 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00008363
Eric Christopherc48497a2015-09-18 21:26:24 +00008364 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
8365 return CC_SpirFunction;
8366 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00008367
8368 void setSupportedOpenCLOpts() override {
8369 // Assume all OpenCL extensions and optional core features are supported
8370 // for SPIR since it is a generic target.
Yaxun Liu5b746652016-12-18 05:18:55 +00008371 getSupportedOpenCLOpts().supportAll();
Yaxun Liu39cf40f2016-05-16 17:06:34 +00008372 }
Eric Christopherc48497a2015-09-18 21:26:24 +00008373};
Guy Benyeib798fc92012-12-11 21:38:14 +00008374
Eric Christopherc48497a2015-09-18 21:26:24 +00008375class SPIR32TargetInfo : public SPIRTargetInfo {
8376public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008377 SPIR32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8378 : SPIRTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00008379 PointerWidth = PointerAlign = 32;
8380 SizeType = TargetInfo::UnsignedInt;
8381 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +00008382 resetDataLayout("e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
8383 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00008384 }
8385 void getTargetDefines(const LangOptions &Opts,
8386 MacroBuilder &Builder) const override {
8387 DefineStd(Builder, "SPIR32", Opts);
8388 }
8389};
Guy Benyeib798fc92012-12-11 21:38:14 +00008390
Eric Christopherc48497a2015-09-18 21:26:24 +00008391class SPIR64TargetInfo : public SPIRTargetInfo {
8392public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008393 SPIR64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8394 : SPIRTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00008395 PointerWidth = PointerAlign = 64;
8396 SizeType = TargetInfo::UnsignedLong;
8397 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00008398 resetDataLayout("e-i64:64-v16:16-v24:32-v32:32-v48:64-"
8399 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00008400 }
8401 void getTargetDefines(const LangOptions &Opts,
8402 MacroBuilder &Builder) const override {
8403 DefineStd(Builder, "SPIR64", Opts);
8404 }
8405};
Guy Benyeib798fc92012-12-11 21:38:14 +00008406
Robert Lytton0e076492013-08-13 09:43:10 +00008407class XCoreTargetInfo : public TargetInfo {
8408 static const Builtin::Info BuiltinInfo[];
8409public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008410 XCoreTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
8411 : TargetInfo(Triple) {
Robert Lytton0e076492013-08-13 09:43:10 +00008412 NoAsmVariants = true;
8413 LongLongAlign = 32;
8414 SuitableAlign = 32;
8415 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00008416 SizeType = UnsignedInt;
8417 PtrDiffType = SignedInt;
8418 IntPtrType = SignedInt;
8419 WCharType = UnsignedChar;
8420 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00008421 UseZeroLengthBitfieldAlignment = true;
James Y Knightb214cbc2016-03-04 19:00:41 +00008422 resetDataLayout("e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32"
8423 "-f64:32-a:0:32-n32");
Robert Lytton0e076492013-08-13 09:43:10 +00008424 }
Craig Topper3164f332014-03-11 03:39:26 +00008425 void getTargetDefines(const LangOptions &Opts,
8426 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008427 Builder.defineMacro("__XS1B__");
8428 }
Craig Topper6c03a542015-10-19 04:51:35 +00008429 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
8430 return llvm::makeArrayRef(BuiltinInfo,
8431 clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin);
Robert Lytton0e076492013-08-13 09:43:10 +00008432 }
Craig Topper3164f332014-03-11 03:39:26 +00008433 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008434 return TargetInfo::VoidPtrBuiltinVaList;
8435 }
Craig Topper3164f332014-03-11 03:39:26 +00008436 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008437 return "";
8438 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008439 ArrayRef<const char *> getGCCRegNames() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008440 static const char * const GCCRegNames[] = {
8441 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
8442 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
8443 };
Craig Topperf054e3a2015-10-19 03:52:27 +00008444 return llvm::makeArrayRef(GCCRegNames);
Robert Lytton0e076492013-08-13 09:43:10 +00008445 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008446 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8447 return None;
Robert Lytton0e076492013-08-13 09:43:10 +00008448 }
Craig Topper3164f332014-03-11 03:39:26 +00008449 bool validateAsmConstraint(const char *&Name,
8450 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008451 return false;
8452 }
Craig Topper3164f332014-03-11 03:39:26 +00008453 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00008454 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
8455 return (RegNo < 2)? RegNo : -1;
8456 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00008457 bool allowsLargerPreferedTypeAlignment() const override {
8458 return false;
8459 }
Robert Lytton0e076492013-08-13 09:43:10 +00008460};
8461
8462const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00008463#define BUILTIN(ID, TYPE, ATTRS) \
8464 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
8465#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
8466 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Robert Lytton0e076492013-08-13 09:43:10 +00008467#include "clang/Basic/BuiltinsXCore.def"
8468};
Robert Lytton0e076492013-08-13 09:43:10 +00008469
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008470// x86_32 Android target
8471class AndroidX86_32TargetInfo : public LinuxTargetInfo<X86_32TargetInfo> {
8472public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008473 AndroidX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8474 : LinuxTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008475 SuitableAlign = 32;
8476 LongDoubleWidth = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00008477 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008478 }
8479};
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008480
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008481// x86_64 Android target
8482class AndroidX86_64TargetInfo : public LinuxTargetInfo<X86_64TargetInfo> {
8483public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008484 AndroidX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8485 : LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Stephan Bergmann17c7f702016-12-14 11:57:17 +00008486 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008487 }
Chih-Hung Hsieh0b0eeaa2015-07-24 18:12:54 +00008488
8489 bool useFloat128ManglingForLongDouble() const override {
8490 return true;
8491 }
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008492};
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008493
8494// 32-bit RenderScript is armv7 with width and align of 'long' set to 8-bytes
8495class RenderScript32TargetInfo : public ARMleTargetInfo {
8496public:
8497 RenderScript32TargetInfo(const llvm::Triple &Triple,
8498 const TargetOptions &Opts)
8499 : ARMleTargetInfo(llvm::Triple("armv7", Triple.getVendorName(),
8500 Triple.getOSName(),
8501 Triple.getEnvironmentName()),
8502 Opts) {
Pirama Arumuga Nainarbb846a32016-07-27 19:01:51 +00008503 IsRenderScriptTarget = true;
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008504 LongWidth = LongAlign = 64;
8505 }
8506 void getTargetDefines(const LangOptions &Opts,
8507 MacroBuilder &Builder) const override {
8508 Builder.defineMacro("__RENDERSCRIPT__");
8509 ARMleTargetInfo::getTargetDefines(Opts, Builder);
8510 }
8511};
8512
8513// 64-bit RenderScript is aarch64
8514class RenderScript64TargetInfo : public AArch64leTargetInfo {
8515public:
8516 RenderScript64TargetInfo(const llvm::Triple &Triple,
8517 const TargetOptions &Opts)
8518 : AArch64leTargetInfo(llvm::Triple("aarch64", Triple.getVendorName(),
8519 Triple.getOSName(),
8520 Triple.getEnvironmentName()),
Pirama Arumuga Nainarbb846a32016-07-27 19:01:51 +00008521 Opts) {
8522 IsRenderScriptTarget = true;
8523 }
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008524
8525 void getTargetDefines(const LangOptions &Opts,
8526 MacroBuilder &Builder) const override {
8527 Builder.defineMacro("__RENDERSCRIPT__");
8528 AArch64leTargetInfo::getTargetDefines(Opts, Builder);
8529 }
8530};
8531
Dylan McKayecb6e7b2017-02-07 06:04:18 +00008532/// Information about a specific microcontroller.
8533struct MCUInfo {
8534 const char *Name;
8535 const char *DefineName;
8536};
8537
8538// This list should be kept up-to-date with AVRDevices.td in LLVM.
8539static ArrayRef<MCUInfo> AVRMcus = {
8540 { "at90s1200", "__AVR_AT90S1200__" },
Dylan McKay315edb02017-02-11 21:06:07 +00008541 { "attiny11", "__AVR_ATtiny11__" },
8542 { "attiny12", "__AVR_ATtiny12__" },
8543 { "attiny15", "__AVR_ATtiny15__" },
8544 { "attiny28", "__AVR_ATtiny28__" },
8545 { "at90s2313", "__AVR_AT90S2313__" },
8546 { "at90s2323", "__AVR_AT90S2323__" },
8547 { "at90s2333", "__AVR_AT90S2333__" },
8548 { "at90s2343", "__AVR_AT90S2343__" },
8549 { "attiny22", "__AVR_ATtiny22__" },
8550 { "attiny26", "__AVR_ATtiny26__" },
8551 { "at86rf401", "__AVR_AT86RF401__" },
8552 { "at90s4414", "__AVR_AT90S4414__" },
8553 { "at90s4433", "__AVR_AT90S4433__" },
8554 { "at90s4434", "__AVR_AT90S4434__" },
8555 { "at90s8515", "__AVR_AT90S8515__" },
8556 { "at90c8534", "__AVR_AT90c8534__" },
8557 { "at90s8535", "__AVR_AT90S8535__" },
8558 { "ata5272", "__AVR_ATA5272__" },
8559 { "attiny13", "__AVR_ATtiny13__" },
8560 { "attiny13a", "__AVR_ATtiny13A__" },
8561 { "attiny2313", "__AVR_ATtiny2313__" },
8562 { "attiny2313a", "__AVR_ATtiny2313A__" },
8563 { "attiny24", "__AVR_ATtiny24__" },
8564 { "attiny24a", "__AVR_ATtiny24A__" },
8565 { "attiny4313", "__AVR_ATtiny4313__" },
8566 { "attiny44", "__AVR_ATtiny44__" },
8567 { "attiny44a", "__AVR_ATtiny44A__" },
8568 { "attiny84", "__AVR_ATtiny84__" },
8569 { "attiny84a", "__AVR_ATtiny84A__" },
8570 { "attiny25", "__AVR_ATtiny25__" },
8571 { "attiny45", "__AVR_ATtiny45__" },
8572 { "attiny85", "__AVR_ATtiny85__" },
8573 { "attiny261", "__AVR_ATtiny261__" },
8574 { "attiny261a", "__AVR_ATtiny261A__" },
8575 { "attiny461", "__AVR_ATtiny461__" },
8576 { "attiny461a", "__AVR_ATtiny461A__" },
8577 { "attiny861", "__AVR_ATtiny861__" },
8578 { "attiny861a", "__AVR_ATtiny861A__" },
8579 { "attiny87", "__AVR_ATtiny87__" },
8580 { "attiny43u", "__AVR_ATtiny43U__" },
8581 { "attiny48", "__AVR_ATtiny48__" },
8582 { "attiny88", "__AVR_ATtiny88__" },
8583 { "attiny828", "__AVR_ATtiny828__" },
8584 { "at43usb355", "__AVR_AT43USB355__" },
8585 { "at76c711", "__AVR_AT76C711__" },
8586 { "atmega103", "__AVR_ATmega103__" },
8587 { "at43usb320", "__AVR_AT43USB320__" },
8588 { "attiny167", "__AVR_ATtiny167__" },
8589 { "at90usb82", "__AVR_AT90USB82__" },
8590 { "at90usb162", "__AVR_AT90USB162__" },
8591 { "ata5505", "__AVR_ATA5505__" },
8592 { "atmega8u2", "__AVR_ATmega8U2__" },
8593 { "atmega16u2", "__AVR_ATmega16U2__" },
8594 { "atmega32u2", "__AVR_ATmega32U2__" },
8595 { "attiny1634", "__AVR_ATtiny1634__" },
8596 { "atmega8", "__AVR_ATmega8__" },
8597 { "ata6289", "__AVR_ATA6289__" },
8598 { "atmega8a", "__AVR_ATmega8A__" },
8599 { "ata6285", "__AVR_ATA6285__" },
8600 { "ata6286", "__AVR_ATA6286__" },
8601 { "atmega48", "__AVR_ATmega48__" },
8602 { "atmega48a", "__AVR_ATmega48A__" },
8603 { "atmega48pa", "__AVR_ATmega48PA__" },
8604 { "atmega48p", "__AVR_ATmega48P__" },
8605 { "atmega88", "__AVR_ATmega88__" },
8606 { "atmega88a", "__AVR_ATmega88A__" },
8607 { "atmega88p", "__AVR_ATmega88P__" },
8608 { "atmega88pa", "__AVR_ATmega88PA__" },
8609 { "atmega8515", "__AVR_ATmega8515__" },
8610 { "atmega8535", "__AVR_ATmega8535__" },
8611 { "atmega8hva", "__AVR_ATmega8HVA__" },
8612 { "at90pwm1", "__AVR_AT90PWM1__" },
8613 { "at90pwm2", "__AVR_AT90PWM2__" },
8614 { "at90pwm2b", "__AVR_AT90PWM2B__" },
8615 { "at90pwm3", "__AVR_AT90PWM3__" },
8616 { "at90pwm3b", "__AVR_AT90PWM3B__" },
8617 { "at90pwm81", "__AVR_AT90PWM81__" },
8618 { "ata5790", "__AVR_ATA5790__" },
8619 { "ata5795", "__AVR_ATA5795__" },
8620 { "atmega16", "__AVR_ATmega16__" },
8621 { "atmega16a", "__AVR_ATmega16A__" },
8622 { "atmega161", "__AVR_ATmega161__" },
8623 { "atmega162", "__AVR_ATmega162__" },
8624 { "atmega163", "__AVR_ATmega163__" },
8625 { "atmega164a", "__AVR_ATmega164A__" },
8626 { "atmega164p", "__AVR_ATmega164P__" },
8627 { "atmega164pa", "__AVR_ATmega164PA__" },
8628 { "atmega165", "__AVR_ATmega165__" },
8629 { "atmega165a", "__AVR_ATmega165A__" },
8630 { "atmega165p", "__AVR_ATmega165P__" },
8631 { "atmega165pa", "__AVR_ATmega165PA__" },
8632 { "atmega168", "__AVR_ATmega168__" },
8633 { "atmega168a", "__AVR_ATmega168A__" },
8634 { "atmega168p", "__AVR_ATmega168P__" },
8635 { "atmega168pa", "__AVR_ATmega168PA__" },
8636 { "atmega169", "__AVR_ATmega169__" },
8637 { "atmega169a", "__AVR_ATmega169A__" },
8638 { "atmega169p", "__AVR_ATmega169P__" },
8639 { "atmega169pa", "__AVR_ATmega169PA__" },
8640 { "atmega32", "__AVR_ATmega32__" },
8641 { "atmega32a", "__AVR_ATmega32A__" },
8642 { "atmega323", "__AVR_ATmega323__" },
8643 { "atmega324a", "__AVR_ATmega324A__" },
8644 { "atmega324p", "__AVR_ATmega324P__" },
8645 { "atmega324pa", "__AVR_ATmega324PA__" },
8646 { "atmega325", "__AVR_ATmega325__" },
8647 { "atmega325a", "__AVR_ATmega325A__" },
8648 { "atmega325p", "__AVR_ATmega325P__" },
8649 { "atmega325pa", "__AVR_ATmega325PA__" },
8650 { "atmega3250", "__AVR_ATmega3250__" },
8651 { "atmega3250a", "__AVR_ATmega3250A__" },
8652 { "atmega3250p", "__AVR_ATmega3250P__" },
8653 { "atmega3250pa", "__AVR_ATmega3250PA__" },
8654 { "atmega328", "__AVR_ATmega328__" },
8655 { "atmega328p", "__AVR_ATmega328P__" },
8656 { "atmega329", "__AVR_ATmega329__" },
8657 { "atmega329a", "__AVR_ATmega329A__" },
8658 { "atmega329p", "__AVR_ATmega329P__" },
8659 { "atmega329pa", "__AVR_ATmega329PA__" },
8660 { "atmega3290", "__AVR_ATmega3290__" },
8661 { "atmega3290a", "__AVR_ATmega3290A__" },
8662 { "atmega3290p", "__AVR_ATmega3290P__" },
8663 { "atmega3290pa", "__AVR_ATmega3290PA__" },
8664 { "atmega406", "__AVR_ATmega406__" },
8665 { "atmega64", "__AVR_ATmega64__" },
8666 { "atmega64a", "__AVR_ATmega64A__" },
8667 { "atmega640", "__AVR_ATmega640__" },
8668 { "atmega644", "__AVR_ATmega644__" },
8669 { "atmega644a", "__AVR_ATmega644A__" },
8670 { "atmega644p", "__AVR_ATmega644P__" },
8671 { "atmega644pa", "__AVR_ATmega644PA__" },
8672 { "atmega645", "__AVR_ATmega645__" },
8673 { "atmega645a", "__AVR_ATmega645A__" },
8674 { "atmega645p", "__AVR_ATmega645P__" },
8675 { "atmega649", "__AVR_ATmega649__" },
8676 { "atmega649a", "__AVR_ATmega649A__" },
8677 { "atmega649p", "__AVR_ATmega649P__" },
8678 { "atmega6450", "__AVR_ATmega6450__" },
8679 { "atmega6450a", "__AVR_ATmega6450A__" },
8680 { "atmega6450p", "__AVR_ATmega6450P__" },
8681 { "atmega6490", "__AVR_ATmega6490__" },
8682 { "atmega6490a", "__AVR_ATmega6490A__" },
8683 { "atmega6490p", "__AVR_ATmega6490P__" },
8684 { "atmega64rfr2", "__AVR_ATmega64RFR2__" },
8685 { "atmega644rfr2", "__AVR_ATmega644RFR2__" },
8686 { "atmega16hva", "__AVR_ATmega16HVA__" },
8687 { "atmega16hva2", "__AVR_ATmega16HVA2__" },
8688 { "atmega16hvb", "__AVR_ATmega16HVB__" },
8689 { "atmega16hvbrevb", "__AVR_ATmega16HVBREVB__" },
8690 { "atmega32hvb", "__AVR_ATmega32HVB__" },
8691 { "atmega32hvbrevb", "__AVR_ATmega32HVBREVB__" },
8692 { "atmega64hve", "__AVR_ATmega64HVE__" },
8693 { "at90can32", "__AVR_AT90CAN32__" },
8694 { "at90can64", "__AVR_AT90CAN64__" },
8695 { "at90pwm161", "__AVR_AT90PWM161__" },
8696 { "at90pwm216", "__AVR_AT90PWM216__" },
8697 { "at90pwm316", "__AVR_AT90PWM316__" },
8698 { "atmega32c1", "__AVR_ATmega32C1__" },
8699 { "atmega64c1", "__AVR_ATmega64C1__" },
8700 { "atmega16m1", "__AVR_ATmega16M1__" },
8701 { "atmega32m1", "__AVR_ATmega32M1__" },
8702 { "atmega64m1", "__AVR_ATmega64M1__" },
8703 { "atmega16u4", "__AVR_ATmega16U4__" },
8704 { "atmega32u4", "__AVR_ATmega32U4__" },
8705 { "atmega32u6", "__AVR_ATmega32U6__" },
8706 { "at90usb646", "__AVR_AT90USB646__" },
8707 { "at90usb647", "__AVR_AT90USB647__" },
8708 { "at90scr100", "__AVR_AT90SCR100__" },
8709 { "at94k", "__AVR_AT94K__" },
8710 { "m3000", "__AVR_AT000__" },
8711 { "atmega128", "__AVR_ATmega128__" },
8712 { "atmega128a", "__AVR_ATmega128A__" },
8713 { "atmega1280", "__AVR_ATmega1280__" },
8714 { "atmega1281", "__AVR_ATmega1281__" },
8715 { "atmega1284", "__AVR_ATmega1284__" },
8716 { "atmega1284p", "__AVR_ATmega1284P__" },
8717 { "atmega128rfa1", "__AVR_ATmega128RFA1__" },
8718 { "atmega128rfr2", "__AVR_ATmega128RFR2__" },
8719 { "atmega1284rfr2", "__AVR_ATmega1284RFR2__" },
8720 { "at90can128", "__AVR_AT90CAN128__" },
8721 { "at90usb1286", "__AVR_AT90USB1286__" },
8722 { "at90usb1287", "__AVR_AT90USB1287__" },
8723 { "atmega2560", "__AVR_ATmega2560__" },
8724 { "atmega2561", "__AVR_ATmega2561__" },
8725 { "atmega256rfr2", "__AVR_ATmega256RFR2__" },
8726 { "atmega2564rfr2", "__AVR_ATmega2564RFR2__" },
8727 { "atxmega16a4", "__AVR_ATxmega16A4__" },
8728 { "atxmega16a4u", "__AVR_ATxmega16a4U__" },
8729 { "atxmega16c4", "__AVR_ATxmega16C4__" },
8730 { "atxmega16d4", "__AVR_ATxmega16D4__" },
8731 { "atxmega32a4", "__AVR_ATxmega32A4__" },
8732 { "atxmega32a4u", "__AVR_ATxmega32A4U__" },
8733 { "atxmega32c4", "__AVR_ATxmega32C4__" },
8734 { "atxmega32d4", "__AVR_ATxmega32D4__" },
8735 { "atxmega32e5", "__AVR_ATxmega32E5__" },
8736 { "atxmega16e5", "__AVR_ATxmega16E5__" },
8737 { "atxmega8e5", "__AVR_ATxmega8E5__" },
8738 { "atxmega32x1", "__AVR_ATxmega32X1__" },
8739 { "atxmega64a3", "__AVR_ATxmega64A3__" },
8740 { "atxmega64a3u", "__AVR_ATxmega64A3U__" },
8741 { "atxmega64a4u", "__AVR_ATxmega64A4U__" },
8742 { "atxmega64b1", "__AVR_ATxmega64B1__" },
8743 { "atxmega64b3", "__AVR_ATxmega64B3__" },
8744 { "atxmega64c3", "__AVR_ATxmega64C3__" },
8745 { "atxmega64d3", "__AVR_ATxmega64D3__" },
8746 { "atxmega64d4", "__AVR_ATxmega64D4__" },
8747 { "atxmega64a1", "__AVR_ATxmega64A1__" },
8748 { "atxmega64a1u", "__AVR_ATxmega64A1U__" },
8749 { "atxmega128a3", "__AVR_ATxmega128A3__" },
8750 { "atxmega128a3u", "__AVR_ATxmega128A3U__" },
8751 { "atxmega128b1", "__AVR_ATxmega128B1__" },
8752 { "atxmega128b3", "__AVR_ATxmega128B3__" },
8753 { "atxmega128c3", "__AVR_ATxmega128C3__" },
8754 { "atxmega128d3", "__AVR_ATxmega128D3__" },
8755 { "atxmega128d4", "__AVR_ATxmega128D4__" },
8756 { "atxmega192a3", "__AVR_ATxmega192A3__" },
8757 { "atxmega192a3u", "__AVR_ATxmega192A3U__" },
8758 { "atxmega192c3", "__AVR_ATxmega192C3__" },
8759 { "atxmega192d3", "__AVR_ATxmega192D3__" },
8760 { "atxmega256a3", "__AVR_ATxmega256A3__" },
8761 { "atxmega256a3u", "__AVR_ATxmega256A3U__" },
8762 { "atxmega256a3b", "__AVR_ATxmega256A3B__" },
8763 { "atxmega256a3bu", "__AVR_ATxmega256A3BU__" },
8764 { "atxmega256c3", "__AVR_ATxmega256C3__" },
8765 { "atxmega256d3", "__AVR_ATxmega256D3__" },
8766 { "atxmega384c3", "__AVR_ATxmega384C3__" },
8767 { "atxmega384d3", "__AVR_ATxmega384D3__" },
8768 { "atxmega128a1", "__AVR_ATxmega128A1__" },
8769 { "atxmega128a1u", "__AVR_ATxmega128A1U__" },
8770 { "atxmega128a4u", "__AVR_ATxmega128a4U__" },
8771 { "attiny4", "__AVR_ATtiny4__" },
8772 { "attiny5", "__AVR_ATtiny5__" },
8773 { "attiny9", "__AVR_ATtiny9__" },
8774 { "attiny10", "__AVR_ATtiny10__" },
8775 { "attiny20", "__AVR_ATtiny20__" },
8776 { "attiny40", "__AVR_ATtiny40__" },
8777 { "attiny102", "__AVR_ATtiny102__" },
8778 { "attiny104", "__AVR_ATtiny104__" },
Dylan McKayecb6e7b2017-02-07 06:04:18 +00008779};
Dylan McKay924fa3a2017-01-05 05:20:27 +00008780
8781// AVR Target
8782class AVRTargetInfo : public TargetInfo {
8783public:
8784 AVRTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
8785 : TargetInfo(Triple) {
8786 TLSSupported = false;
8787 PointerWidth = 16;
8788 PointerAlign = 8;
8789 IntWidth = 16;
8790 IntAlign = 8;
8791 LongWidth = 32;
8792 LongAlign = 8;
8793 LongLongWidth = 64;
8794 LongLongAlign = 8;
8795 SuitableAlign = 8;
8796 DefaultAlignForAttributeAligned = 8;
8797 HalfWidth = 16;
8798 HalfAlign = 8;
8799 FloatWidth = 32;
8800 FloatAlign = 8;
8801 DoubleWidth = 32;
8802 DoubleAlign = 8;
8803 DoubleFormat = &llvm::APFloat::IEEEsingle();
8804 LongDoubleWidth = 32;
8805 LongDoubleAlign = 8;
8806 LongDoubleFormat = &llvm::APFloat::IEEEsingle();
8807 SizeType = UnsignedInt;
8808 PtrDiffType = SignedInt;
8809 IntPtrType = SignedInt;
8810 Char16Type = UnsignedInt;
8811 WCharType = SignedInt;
8812 WIntType = SignedInt;
8813 Char32Type = UnsignedLong;
8814 SigAtomicType = SignedChar;
8815 resetDataLayout("e-p:16:16:16-i8:8:8-i16:16:16-i32:32:32-i64:64:64"
8816 "-f32:32:32-f64:64:64-n8");
8817 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008818
Dylan McKay924fa3a2017-01-05 05:20:27 +00008819 void getTargetDefines(const LangOptions &Opts,
8820 MacroBuilder &Builder) const override {
Dylan McKayecb6e7b2017-02-07 06:04:18 +00008821 Builder.defineMacro("AVR");
8822 Builder.defineMacro("__AVR");
Dylan McKay924fa3a2017-01-05 05:20:27 +00008823 Builder.defineMacro("__AVR__");
Dylan McKayecb6e7b2017-02-07 06:04:18 +00008824
8825 if (!this->CPU.empty()) {
8826 auto It = std::find_if(AVRMcus.begin(), AVRMcus.end(),
8827 [&](const MCUInfo &Info) { return Info.Name == this->CPU; });
8828
8829 if (It != AVRMcus.end())
8830 Builder.defineMacro(It->DefineName);
8831 }
Dylan McKay924fa3a2017-01-05 05:20:27 +00008832 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008833
Dylan McKay924fa3a2017-01-05 05:20:27 +00008834 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
8835 return None;
8836 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008837
Dylan McKay924fa3a2017-01-05 05:20:27 +00008838 BuiltinVaListKind getBuiltinVaListKind() const override {
8839 return TargetInfo::VoidPtrBuiltinVaList;
8840 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008841
Dylan McKay924fa3a2017-01-05 05:20:27 +00008842 const char *getClobbers() const override {
8843 return "";
8844 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008845
Dylan McKay924fa3a2017-01-05 05:20:27 +00008846 ArrayRef<const char *> getGCCRegNames() const override {
8847 static const char * const GCCRegNames[] = {
8848 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
8849 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
8850 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
Dylan McKay95aa2652017-01-05 07:17:46 +00008851 "r24", "r25", "X", "Y", "Z", "SP"
Dylan McKay924fa3a2017-01-05 05:20:27 +00008852 };
8853 return llvm::makeArrayRef(GCCRegNames);
8854 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008855
Dylan McKay924fa3a2017-01-05 05:20:27 +00008856 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8857 return None;
8858 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008859
Dylan McKay924fa3a2017-01-05 05:20:27 +00008860 ArrayRef<TargetInfo::AddlRegName> getGCCAddlRegNames() const override {
8861 static const TargetInfo::AddlRegName AddlRegNames[] = {
8862 { { "r26", "r27"}, 26 },
8863 { { "r28", "r29"}, 27 },
8864 { { "r30", "r31"}, 28 },
8865 { { "SPL", "SPH"}, 29 },
8866 };
8867 return llvm::makeArrayRef(AddlRegNames);
8868 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008869
Dylan McKay924fa3a2017-01-05 05:20:27 +00008870 bool validateAsmConstraint(const char *&Name,
8871 TargetInfo::ConstraintInfo &Info) const override {
Dylan McKayd31534c2017-02-06 09:01:59 +00008872 // There aren't any multi-character AVR specific constraints.
8873 if (StringRef(Name).size() > 1) return false;
8874
8875 switch (*Name) {
8876 default: return false;
8877 case 'a': // Simple upper registers
8878 case 'b': // Base pointer registers pairs
8879 case 'd': // Upper register
8880 case 'l': // Lower registers
8881 case 'e': // Pointer register pairs
8882 case 'q': // Stack pointer register
8883 case 'r': // Any register
8884 case 'w': // Special upper register pairs
8885 case 't': // Temporary register
8886 case 'x': case 'X': // Pointer register pair X
8887 case 'y': case 'Y': // Pointer register pair Y
8888 case 'z': case 'Z': // Pointer register pair Z
8889 Info.setAllowsRegister();
8890 return true;
8891 case 'I': // 6-bit positive integer constant
8892 Info.setRequiresImmediate(0, 63);
8893 return true;
8894 case 'J': // 6-bit negative integer constant
8895 Info.setRequiresImmediate(-63, 0);
8896 return true;
8897 case 'K': // Integer constant (Range: 2)
8898 Info.setRequiresImmediate(2);
8899 return true;
8900 case 'L': // Integer constant (Range: 0)
8901 Info.setRequiresImmediate(0);
8902 return true;
8903 case 'M': // 8-bit integer constant
8904 Info.setRequiresImmediate(0, 0xff);
8905 return true;
8906 case 'N': // Integer constant (Range: -1)
8907 Info.setRequiresImmediate(-1);
8908 return true;
8909 case 'O': // Integer constant (Range: 8, 16, 24)
8910 Info.setRequiresImmediate({8, 16, 24});
8911 return true;
8912 case 'P': // Integer constant (Range: 1)
8913 Info.setRequiresImmediate(1);
8914 return true;
8915 case 'R': // Integer constant (Range: -6 to 5)
8916 Info.setRequiresImmediate(-6, 5);
8917 return true;
8918 case 'G': // Floating point constant
8919 case 'Q': // A memory address based on Y or Z pointer with displacement.
8920 return true;
8921 }
8922
Dylan McKay924fa3a2017-01-05 05:20:27 +00008923 return false;
8924 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008925
Dylan McKay924fa3a2017-01-05 05:20:27 +00008926 IntType getIntTypeByWidth(unsigned BitWidth,
8927 bool IsSigned) const final {
8928 // AVR prefers int for 16-bit integers.
8929 return BitWidth == 16 ? (IsSigned ? SignedInt : UnsignedInt)
8930 : TargetInfo::getIntTypeByWidth(BitWidth, IsSigned);
8931 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008932
Dylan McKay924fa3a2017-01-05 05:20:27 +00008933 IntType getLeastIntTypeByWidth(unsigned BitWidth,
8934 bool IsSigned) const final {
8935 // AVR uses int for int_least16_t and int_fast16_t.
8936 return BitWidth == 16
8937 ? (IsSigned ? SignedInt : UnsignedInt)
8938 : TargetInfo::getLeastIntTypeByWidth(BitWidth, IsSigned);
8939 }
Dylan McKayecb6e7b2017-02-07 06:04:18 +00008940
8941 bool setCPU(const std::string &Name) override {
8942 bool IsFamily = llvm::StringSwitch<bool>(Name)
8943 .Case("avr1", true)
8944 .Case("avr2", true)
8945 .Case("avr25", true)
8946 .Case("avr3", true)
8947 .Case("avr31", true)
8948 .Case("avr35", true)
8949 .Case("avr4", true)
8950 .Case("avr5", true)
8951 .Case("avr51", true)
8952 .Case("avr6", true)
8953 .Case("avrxmega1", true)
8954 .Case("avrxmega2", true)
8955 .Case("avrxmega3", true)
8956 .Case("avrxmega4", true)
8957 .Case("avrxmega5", true)
8958 .Case("avrxmega6", true)
8959 .Case("avrxmega7", true)
8960 .Case("avrtiny", true)
8961 .Default(false);
8962
8963 if (IsFamily) this->CPU = Name;
8964
8965 bool IsMCU = std::find_if(AVRMcus.begin(), AVRMcus.end(),
8966 [&](const MCUInfo &Info) { return Info.Name == Name; }) != AVRMcus.end();
8967
8968 if (IsMCU) this->CPU = Name;
8969
8970 return IsFamily || IsMCU;
8971 }
8972
8973protected:
8974 std::string CPU;
Dylan McKay924fa3a2017-01-05 05:20:27 +00008975};
8976
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008977} // end anonymous namespace
8978
Chris Lattner5ba61f02006-10-14 07:39:34 +00008979//===----------------------------------------------------------------------===//
8980// Driver code
8981//===----------------------------------------------------------------------===//
8982
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008983static TargetInfo *AllocateTarget(const llvm::Triple &Triple,
8984 const TargetOptions &Opts) {
Daniel Dunbar52322032009-08-18 05:47:58 +00008985 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00008986
Daniel Dunbar52322032009-08-18 05:47:58 +00008987 switch (Triple.getArch()) {
8988 default:
Craig Topperf1186c52014-05-08 06:41:40 +00008989 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00008990
Tim Northover2a0783d2014-05-30 14:14:07 +00008991 case llvm::Triple::xcore:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008992 return new XCoreTargetInfo(Triple, Opts);
Tim Northover2a0783d2014-05-30 14:14:07 +00008993
8994 case llvm::Triple::hexagon:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008995 return new HexagonTargetInfo(Triple, Opts);
Tim Northover2a0783d2014-05-30 14:14:07 +00008996
Jacques Pienaard964cc22016-03-28 21:02:54 +00008997 case llvm::Triple::lanai:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008998 return new LanaiTargetInfo(Triple, Opts);
Jacques Pienaard964cc22016-03-28 21:02:54 +00008999
Tim Northover2a0783d2014-05-30 14:14:07 +00009000 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00009001 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009002 return new DarwinAArch64TargetInfo(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00009003
9004 switch (os) {
Ed Schoutenea9448e2015-10-15 15:07:07 +00009005 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009006 return new CloudABITargetInfo<AArch64leTargetInfo>(Triple, Opts);
Ed Maste6a9eda52014-11-13 16:55:42 +00009007 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009008 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Petr Hosek9834fcd2016-10-24 22:55:57 +00009009 case llvm::Triple::Fuchsia:
9010 return new FuchsiaTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00009011 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009012 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple, Opts);
James Molloy5e73df52014-04-16 15:06:20 +00009013 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009014 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Brad Smith9aa2bf22017-02-21 23:13:09 +00009015 case llvm::Triple::OpenBSD:
9016 return new OpenBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00009017 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009018 return new AArch64leTargetInfo(Triple, Opts);
James Molloy5e73df52014-04-16 15:06:20 +00009019 }
9020
Christian Pirker9b019ae2014-02-25 13:51:00 +00009021 case llvm::Triple::aarch64_be:
9022 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00009023 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009024 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Petr Hosek9834fcd2016-10-24 22:55:57 +00009025 case llvm::Triple::Fuchsia:
9026 return new FuchsiaTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00009027 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009028 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00009029 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009030 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00009031 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009032 return new AArch64beTargetInfo(Triple, Opts);
Tim Northover9bb857a2013-01-31 12:13:10 +00009033 }
9034
Daniel Dunbar52322032009-08-18 05:47:58 +00009035 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00009036 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00009037 if (Triple.isOSBinFormatMachO())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009038 return new DarwinARMTargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00009039
Daniel Dunbar52322032009-08-18 05:47:58 +00009040 switch (os) {
Ed Schoutenc6d1a732016-09-05 18:38:34 +00009041 case llvm::Triple::CloudABI:
9042 return new CloudABITargetInfo<ARMleTargetInfo>(Triple, Opts);
Rafael Espindolaad8fed52010-06-10 00:46:51 +00009043 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009044 return new LinuxTargetInfo<ARMleTargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009045 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009046 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009047 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009048 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00009049 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009050 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00009051 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009052 return new BitrigTargetInfo<ARMleTargetInfo>(Triple, Opts);
Douglas Gregor9fabd852011-07-01 22:41:14 +00009053 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009054 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00009055 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009056 return new NaClTargetInfo<ARMleTargetInfo>(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00009057 case llvm::Triple::Win32:
9058 switch (Triple.getEnvironment()) {
Yaron Keren321249c2015-07-15 13:32:23 +00009059 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009060 return new CygwinARMTargetInfo(Triple, Opts);
Yaron Keren321249c2015-07-15 13:32:23 +00009061 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009062 return new MinGWARMTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00009063 case llvm::Triple::Itanium:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009064 return new ItaniumWindowsARMleTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00009065 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00009066 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009067 return new MicrosoftARMleTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00009068 }
Daniel Dunbar52322032009-08-18 05:47:58 +00009069 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009070 return new ARMleTargetInfo(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009071 }
9072
9073 case llvm::Triple::armeb:
9074 case llvm::Triple::thumbeb:
9075 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009076 return new DarwinARMTargetInfo(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009077
9078 switch (os) {
9079 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009080 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009081 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009082 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009083 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009084 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009085 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009086 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009087 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009088 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009089 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009090 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009091 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009092 return new NaClTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009093 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009094 return new ARMbeTargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009095 }
Eli Friedmanb5366062008-05-20 14:21:01 +00009096
Dylan McKay924fa3a2017-01-05 05:20:27 +00009097 case llvm::Triple::avr:
9098 return new AVRTargetInfo(Triple, Opts);
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00009099 case llvm::Triple::bpfeb:
9100 case llvm::Triple::bpfel:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009101 return new BPFTargetInfo(Triple, Opts);
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00009102
Daniel Dunbar52322032009-08-18 05:47:58 +00009103 case llvm::Triple::msp430:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009104 return new MSP430TargetInfo(Triple, Opts);
Eli Friedmanb5366062008-05-20 14:21:01 +00009105
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00009106 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009107 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009108 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00009109 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009110 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00009111 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009112 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009113 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009114 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009115 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009116 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00009117 return new MipsTargetInfo(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009118 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00009119
9120 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009121 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009122 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00009123 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009124 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00009125 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009126 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009127 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009128 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009129 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00009130 case llvm::Triple::NaCl:
Daniel Sanders4672af62016-05-27 11:51:02 +00009131 return new NaClTargetInfo<NaClMips32TargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009132 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00009133 return new MipsTargetInfo(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009134 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00009135
Akira Hatanakabef17452011-09-20 19:21:49 +00009136 case llvm::Triple::mips64:
9137 switch (os) {
9138 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00009139 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009140 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00009141 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009142 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009143 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009144 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009145 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00009146 case llvm::Triple::OpenBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009147 return new OpenBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009148 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00009149 return new MipsTargetInfo(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009150 }
9151
9152 case llvm::Triple::mips64el:
9153 switch (os) {
9154 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00009155 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009156 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00009157 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009158 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009159 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009160 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009161 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00009162 case llvm::Triple::OpenBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009163 return new OpenBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009164 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00009165 return new MipsTargetInfo(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009166 }
9167
Ivan Krasindd7403e2011-08-24 20:22:22 +00009168 case llvm::Triple::le32:
9169 switch (os) {
Douglas Katzman78d7c542015-05-12 21:18:10 +00009170 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009171 return new NaClTargetInfo<PNaClTargetInfo>(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00009172 default:
9173 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00009174 }
9175
JF Bastien643817d2014-09-12 17:52:47 +00009176 case llvm::Triple::le64:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009177 return new Le64TargetInfo(Triple, Opts);
JF Bastien643817d2014-09-12 17:52:47 +00009178
Daniel Dunbar52322032009-08-18 05:47:58 +00009179 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00009180 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009181 return new DarwinPPC32TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009182 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00009183 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009184 return new LinuxTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009185 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009186 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009187 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009188 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00009189 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009190 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009191 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009192 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009193 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009194 return new PPC32TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009195 }
Daniel Dunbar52322032009-08-18 05:47:58 +00009196
9197 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00009198 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009199 return new DarwinPPC64TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009200 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00009201 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009202 return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009203 case llvm::Triple::Lv2:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009204 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009205 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009206 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009207 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009208 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009209 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009210 return new PPC64TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009211 }
Daniel Dunbar52322032009-08-18 05:47:58 +00009212
Bill Schmidt778d3872013-07-26 01:36:11 +00009213 case llvm::Triple::ppc64le:
9214 switch (os) {
9215 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009216 return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger22a2d992015-04-10 20:53:48 +00009217 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009218 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Bill Schmidt778d3872013-07-26 01:36:11 +00009219 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009220 return new PPC64TargetInfo(Triple, Opts);
Bill Schmidt778d3872013-07-26 01:36:11 +00009221 }
9222
Peter Collingbournec947aae2012-05-20 23:28:41 +00009223 case llvm::Triple::nvptx:
Justin Lebarb6626592017-01-05 16:53:21 +00009224 return new NVPTXTargetInfo(Triple, Opts, /*TargetPointerWidth=*/32);
Peter Collingbournec947aae2012-05-20 23:28:41 +00009225 case llvm::Triple::nvptx64:
Justin Lebarb6626592017-01-05 16:53:21 +00009226 return new NVPTXTargetInfo(Triple, Opts, /*TargetPointerWidth=*/64);
Peter Collingbournec947aae2012-05-20 23:28:41 +00009227
Tom Stellardd8e38a32015-01-06 20:34:47 +00009228 case llvm::Triple::amdgcn:
Eli Friedmand13b41e2012-10-12 23:32:00 +00009229 case llvm::Triple::r600:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009230 return new AMDGPUTargetInfo(Triple, Opts);
Eli Friedmand13b41e2012-10-12 23:32:00 +00009231
Daniel Dunbar52322032009-08-18 05:47:58 +00009232 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009233 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00009234 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009235 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009236 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009237 return new SolarisTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009238 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009239 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00009240 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009241 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009242 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009243 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009244 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009245 return new SparcV8TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009246 }
Daniel Dunbar52322032009-08-18 05:47:58 +00009247
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009248 // The 'sparcel' architecture copies all the above cases except for Solaris.
9249 case llvm::Triple::sparcel:
9250 switch (os) {
9251 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009252 return new LinuxTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009253 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009254 return new NetBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009255 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009256 return new OpenBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009257 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009258 return new RTEMSTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009259 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009260 return new SparcV8elTargetInfo(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009261 }
9262
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009263 case llvm::Triple::sparcv9:
9264 switch (os) {
9265 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009266 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009267 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009268 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009269 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009270 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009271 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009272 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009273 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009274 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009275 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009276 return new SparcV9TargetInfo(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009277 }
9278
Ulrich Weigand47445072013-05-06 16:26:41 +00009279 case llvm::Triple::systemz:
9280 switch (os) {
9281 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009282 return new LinuxTargetInfo<SystemZTargetInfo>(Triple, Opts);
Ulrich Weigand47445072013-05-06 16:26:41 +00009283 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009284 return new SystemZTargetInfo(Triple, Opts);
Ulrich Weigand47445072013-05-06 16:26:41 +00009285 }
9286
Eli Friedmana9c3d712009-08-19 20:47:07 +00009287 case llvm::Triple::tce:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009288 return new TCETargetInfo(Triple, Opts);
Eli Friedmana9c3d712009-08-19 20:47:07 +00009289
Pekka Jaaskelainen67354482016-11-16 15:22:31 +00009290 case llvm::Triple::tcele:
9291 return new TCELETargetInfo(Triple, Opts);
9292
Daniel Dunbar52322032009-08-18 05:47:58 +00009293 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00009294 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009295 return new DarwinI386TargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00009296
Daniel Dunbar52322032009-08-18 05:47:58 +00009297 switch (os) {
Ed Schouten7893e682015-06-13 21:33:49 +00009298 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009299 return new CloudABITargetInfo<X86_32TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009300 case llvm::Triple::Linux: {
9301 switch (Triple.getEnvironment()) {
9302 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009303 return new LinuxTargetInfo<X86_32TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009304 case llvm::Triple::Android:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009305 return new AndroidX86_32TargetInfo(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009306 }
9307 }
Daniel Dunbar52322032009-08-18 05:47:58 +00009308 case llvm::Triple::DragonFly:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009309 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009310 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009311 return new NetBSDI386TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009312 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009313 return new OpenBSDI386TargetInfo(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00009314 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009315 return new BitrigI386TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009316 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009317 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00009318 case llvm::Triple::KFreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009319 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009320 case llvm::Triple::Minix:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009321 return new MinixTargetInfo<X86_32TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009322 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009323 return new SolarisTargetInfo<X86_32TargetInfo>(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009324 case llvm::Triple::Win32: {
9325 switch (Triple.getEnvironment()) {
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009326 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009327 return new CygwinX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009328 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009329 return new MinGWX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00009330 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009331 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00009332 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009333 return new MicrosoftX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009334 }
9335 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00009336 case llvm::Triple::Haiku:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009337 return new HaikuX86_32TargetInfo(Triple, Opts);
Douglas Gregor9fabd852011-07-01 22:41:14 +00009338 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009339 return new RTEMSX86_32TargetInfo(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00009340 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009341 return new NaClTargetInfo<X86_32TargetInfo>(Triple, Opts);
Alexey Bataevc99b0492015-11-25 09:24:26 +00009342 case llvm::Triple::ELFIAMCU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009343 return new MCUX86_32TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009344 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009345 return new X86_32TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009346 }
9347
9348 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009349 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009350 return new DarwinX86_64TargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00009351
Daniel Dunbar52322032009-08-18 05:47:58 +00009352 switch (os) {
Ed Schoutenf33c6072015-03-11 08:42:46 +00009353 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009354 return new CloudABITargetInfo<X86_64TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009355 case llvm::Triple::Linux: {
9356 switch (Triple.getEnvironment()) {
9357 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009358 return new LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009359 case llvm::Triple::Android:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009360 return new AndroidX86_64TargetInfo(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009361 }
9362 }
Chris Lattner002ba6b2010-01-09 05:41:14 +00009363 case llvm::Triple::DragonFly:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009364 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009365 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009366 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009367 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009368 return new OpenBSDX86_64TargetInfo(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00009369 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009370 return new BitrigX86_64TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009371 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009372 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Petr Hosek9834fcd2016-10-24 22:55:57 +00009373 case llvm::Triple::Fuchsia:
9374 return new FuchsiaTargetInfo<X86_64TargetInfo>(Triple, Opts);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00009375 case llvm::Triple::KFreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009376 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009377 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009378 return new SolarisTargetInfo<X86_64TargetInfo>(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009379 case llvm::Triple::Win32: {
9380 switch (Triple.getEnvironment()) {
Yaron Kerend030d112015-07-22 17:38:19 +00009381 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009382 return new CygwinX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009383 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009384 return new MinGWX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009385 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00009386 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009387 return new MicrosoftX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009388 }
9389 }
Reid Kleckner330fb172016-05-11 16:19:05 +00009390 case llvm::Triple::Haiku:
9391 return new HaikuTargetInfo<X86_64TargetInfo>(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00009392 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009393 return new NaClTargetInfo<X86_64TargetInfo>(Triple, Opts);
Alex Rosenberg12207fa2015-01-27 14:47:44 +00009394 case llvm::Triple::PS4:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009395 return new PS4OSTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009396 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009397 return new X86_64TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009398 }
Guy Benyeib798fc92012-12-11 21:38:14 +00009399
Douglas Katzman78d7c542015-05-12 21:18:10 +00009400 case llvm::Triple::spir: {
9401 if (Triple.getOS() != llvm::Triple::UnknownOS ||
9402 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
9403 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009404 return new SPIR32TargetInfo(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00009405 }
9406 case llvm::Triple::spir64: {
9407 if (Triple.getOS() != llvm::Triple::UnknownOS ||
9408 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
9409 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009410 return new SPIR64TargetInfo(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00009411 }
Dan Gohmanc2853072015-09-03 22:51:53 +00009412 case llvm::Triple::wasm32:
Dan Gohman839f2152017-01-17 21:46:38 +00009413 if (Triple.getSubArch() != llvm::Triple::NoSubArch ||
9414 Triple.getVendor() != llvm::Triple::UnknownVendor ||
9415 Triple.getOS() != llvm::Triple::UnknownOS ||
9416 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment ||
9417 !(Triple.isOSBinFormatELF() || Triple.isOSBinFormatWasm()))
Dan Gohmanc2853072015-09-03 22:51:53 +00009418 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009419 return new WebAssemblyOSTargetInfo<WebAssembly32TargetInfo>(Triple, Opts);
Dan Gohmanc2853072015-09-03 22:51:53 +00009420 case llvm::Triple::wasm64:
Dan Gohman839f2152017-01-17 21:46:38 +00009421 if (Triple.getSubArch() != llvm::Triple::NoSubArch ||
9422 Triple.getVendor() != llvm::Triple::UnknownVendor ||
9423 Triple.getOS() != llvm::Triple::UnknownOS ||
9424 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment ||
9425 !(Triple.isOSBinFormatELF() || Triple.isOSBinFormatWasm()))
Dan Gohmanc2853072015-09-03 22:51:53 +00009426 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009427 return new WebAssemblyOSTargetInfo<WebAssembly64TargetInfo>(Triple, Opts);
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00009428
9429 case llvm::Triple::renderscript32:
9430 return new LinuxTargetInfo<RenderScript32TargetInfo>(Triple, Opts);
9431 case llvm::Triple::renderscript64:
9432 return new LinuxTargetInfo<RenderScript64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009433 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00009434}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009435
9436/// CreateTargetInfo - Return the target info object for the specified target
Eric Christophere4f73b32015-08-07 19:07:08 +00009437/// options.
Alp Toker80758082014-07-06 05:26:44 +00009438TargetInfo *
9439TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
Saleem Abdulrasool10a49722016-04-08 16:52:00 +00009440 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00009441 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009442
9443 // Construct the target
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009444 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple, *Opts));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009445 if (!Target) {
9446 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00009447 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009448 }
Alp Toker80758082014-07-06 05:26:44 +00009449 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009450
Daniel Dunbaracde99e2009-12-18 18:42:37 +00009451 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00009452 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
9453 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00009454 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00009455 }
9456
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009457 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00009458 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
9459 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00009460 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009461 }
9462
Rafael Espindolaeb265472013-08-21 21:59:03 +00009463 // Set the fp math unit.
9464 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
9465 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00009466 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00009467 }
9468
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009469 // Compute the default target features, we need the target to handle this
9470 // because features may have dependencies on one another.
9471 llvm::StringMap<bool> Features;
Eric Christopher007b0a02015-08-28 22:32:01 +00009472 if (!Target->initFeatureMap(Features, Diags, Opts->CPU,
9473 Opts->FeaturesAsWritten))
Eric Christopher6b454372015-08-25 13:45:24 +00009474 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009475
9476 // Add the features to the compile options.
Douglas Gregorf8715de2012-11-16 04:24:59 +00009477 Opts->Features.clear();
Aaron Ballmanb226d3d2015-08-12 13:38:59 +00009478 for (const auto &F : Features)
9479 Opts->Features.push_back((F.getValue() ? "+" : "-") + F.getKey().str());
9480
Eric Christopher3ff21b32013-10-16 21:26:26 +00009481 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00009482 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009483
Yaxun Liu39cf40f2016-05-16 17:06:34 +00009484 Target->setSupportedOpenCLOpts();
Alexey Bader0ea07532016-11-01 15:50:52 +00009485 Target->setOpenCLExtensionOpts();
Yaxun Liu39cf40f2016-05-16 17:06:34 +00009486
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00009487 if (!Target->validateTarget(Diags))
9488 return nullptr;
9489
Ahmed Charles9a16beb2014-03-07 19:33:25 +00009490 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009491}