blob: f03e7e192480ac02e71caf57493b9f7c9a5d52eb [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");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000548 }
549public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000550 OpenBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
551 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000552 this->TLSSupported = false;
Eli Friedman3715d1f2011-12-15 02:15:56 +0000553
Eli Friedman3715d1f2011-12-15 02:15:56 +0000554 switch (Triple.getArch()) {
555 default:
556 case llvm::Triple::x86:
557 case llvm::Triple::x86_64:
558 case llvm::Triple::arm:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000559 case llvm::Triple::sparc:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000560 this->MCountName = "__mcount";
561 break;
562 case llvm::Triple::mips64:
563 case llvm::Triple::mips64el:
564 case llvm::Triple::ppc:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000565 case llvm::Triple::sparcv9:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000566 this->MCountName = "_mcount";
567 break;
568 }
569 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000570};
571
Eli Friedman9fa28852012-08-08 23:57:20 +0000572// Bitrig Target
573template<typename Target>
574class BitrigTargetInfo : public OSTargetInfo<Target> {
575protected:
Craig Topper3164f332014-03-11 03:39:26 +0000576 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
577 MacroBuilder &Builder) const override {
Eli Friedman9fa28852012-08-08 23:57:20 +0000578 // Bitrig defines; list based off of gcc output
579
580 Builder.defineMacro("__Bitrig__");
Saleem Abdulrasool56027092017-02-07 19:00:06 +0000581 DefineStd(Builder, "unix", Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +0000582 Builder.defineMacro("__ELF__");
583 if (Opts.POSIXThreads)
584 Builder.defineMacro("_REENTRANT");
Renato Golin9ba39232015-02-27 16:35:48 +0000585
586 switch (Triple.getArch()) {
587 default:
588 break;
589 case llvm::Triple::arm:
590 case llvm::Triple::armeb:
591 case llvm::Triple::thumb:
592 case llvm::Triple::thumbeb:
593 Builder.defineMacro("__ARM_DWARF_EH__");
594 break;
595 }
Eli Friedman9fa28852012-08-08 23:57:20 +0000596 }
597public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000598 BitrigTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
599 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000600 this->MCountName = "__mcount";
Eli Friedman9fa28852012-08-08 23:57:20 +0000601 }
602};
603
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000604// PSP Target
605template<typename Target>
606class PSPTargetInfo : public OSTargetInfo<Target> {
607protected:
Craig Topper3164f332014-03-11 03:39:26 +0000608 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
609 MacroBuilder &Builder) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000610 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000611 Builder.defineMacro("PSP");
612 Builder.defineMacro("_PSP");
613 Builder.defineMacro("__psp__");
614 Builder.defineMacro("__ELF__");
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000615 }
616public:
James Y Knightb214cbc2016-03-04 19:00:41 +0000617 PSPTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {}
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000618};
619
John Thompsone467e192009-11-19 17:18:50 +0000620// PS3 PPU Target
621template<typename Target>
622class PS3PPUTargetInfo : public OSTargetInfo<Target> {
623protected:
Craig Topper3164f332014-03-11 03:39:26 +0000624 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
625 MacroBuilder &Builder) const override {
John Thompsone467e192009-11-19 17:18:50 +0000626 // PS3 PPU defines.
John Thompson957816f2010-03-25 16:18:32 +0000627 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000628 Builder.defineMacro("__PPU__");
629 Builder.defineMacro("__CELLOS_LV2__");
630 Builder.defineMacro("__ELF__");
631 Builder.defineMacro("__LP32__");
John Thompson07a61a42010-06-24 22:44:13 +0000632 Builder.defineMacro("_ARCH_PPC64");
633 Builder.defineMacro("__powerpc64__");
John Thompsone467e192009-11-19 17:18:50 +0000634 }
635public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000636 PS3PPUTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
637 : OSTargetInfo<Target>(Triple, Opts) {
Nick Lewyckyc0a61732011-12-16 22:32:39 +0000638 this->LongWidth = this->LongAlign = 32;
639 this->PointerWidth = this->PointerAlign = 32;
John Thompson07a61a42010-06-24 22:44:13 +0000640 this->IntMaxType = TargetInfo::SignedLongLong;
John Thompson07a61a42010-06-24 22:44:13 +0000641 this->Int64Type = TargetInfo::SignedLongLong;
John Thompson6f8dba72009-12-18 14:21:08 +0000642 this->SizeType = TargetInfo::UnsignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +0000643 this->resetDataLayout("E-m:e-p:32:32-i64:64-n32:64");
John Thompsone467e192009-11-19 17:18:50 +0000644 }
645};
646
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000647template <typename Target>
648class PS4OSTargetInfo : public OSTargetInfo<Target> {
649protected:
650 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
651 MacroBuilder &Builder) const override {
652 Builder.defineMacro("__FreeBSD__", "9");
653 Builder.defineMacro("__FreeBSD_cc_version", "900001");
654 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
Saleem Abdulrasool56027092017-02-07 19:00:06 +0000655 DefineStd(Builder, "unix", Opts);
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000656 Builder.defineMacro("__ELF__");
Paul Robinson9d613612016-05-16 17:22:25 +0000657 Builder.defineMacro("__ORBIS__");
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000658 }
659public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000660 PS4OSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
661 : OSTargetInfo<Target>(Triple, Opts) {
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000662 this->WCharType = this->UnsignedShort;
663
Paul Robinsond30e2ee2015-07-14 20:52:32 +0000664 // On PS4, TLS variable cannot be aligned to more than 32 bytes (256 bits).
665 this->MaxTLSAlign = 256;
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000666
Sunil Srivastava0ce2f222016-02-05 20:50:02 +0000667 // On PS4, do not honor explicit bit field alignment,
668 // as in "__attribute__((aligned(2))) int b : 1;".
669 this->UseExplicitBitFieldAlignment = false;
670
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000671 switch (Triple.getArch()) {
672 default:
673 case llvm::Triple::x86_64:
674 this->MCountName = ".mcount";
675 break;
676 }
677 }
678};
679
Torok Edwinb2b37c62009-06-30 17:10:35 +0000680// Solaris target
681template<typename Target>
682class SolarisTargetInfo : public OSTargetInfo<Target> {
683protected:
Craig Topper3164f332014-03-11 03:39:26 +0000684 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
685 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000686 DefineStd(Builder, "sun", Opts);
Saleem Abdulrasool56027092017-02-07 19:00:06 +0000687 DefineStd(Builder, "unix", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000688 Builder.defineMacro("__ELF__");
689 Builder.defineMacro("__svr4__");
690 Builder.defineMacro("__SVR4");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000691 // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and
692 // newer, but to 500 for everything else. feature_test.h has a check to
693 // ensure that you are not using C99 with an old version of X/Open or C89
Richard Smithab506ad2014-10-20 23:26:58 +0000694 // with a new version.
695 if (Opts.C99)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000696 Builder.defineMacro("_XOPEN_SOURCE", "600");
697 else
698 Builder.defineMacro("_XOPEN_SOURCE", "500");
David Chisnalle04307e2012-03-02 10:49:52 +0000699 if (Opts.CPlusPlus)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000700 Builder.defineMacro("__C99FEATURES__");
David Chisnall0c1941cb2012-02-17 18:35:11 +0000701 Builder.defineMacro("_LARGEFILE_SOURCE");
702 Builder.defineMacro("_LARGEFILE64_SOURCE");
703 Builder.defineMacro("__EXTENSIONS__");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000704 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000705 }
706public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000707 SolarisTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
708 : OSTargetInfo<Target>(Triple, Opts) {
David Chisnallb526e932012-03-28 18:04:14 +0000709 this->WCharType = this->SignedInt;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000710 // FIXME: WIntType should be SignedLong
711 }
712};
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000713
714// Windows target
715template<typename Target>
716class WindowsTargetInfo : public OSTargetInfo<Target> {
717protected:
Craig Topper3164f332014-03-11 03:39:26 +0000718 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
719 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000720 Builder.defineMacro("_WIN32");
721 }
722 void getVisualStudioDefines(const LangOptions &Opts,
723 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000724 if (Opts.CPlusPlus) {
David Majnemerf6072342014-07-01 22:24:56 +0000725 if (Opts.RTTIData)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000726 Builder.defineMacro("_CPPRTTI");
727
Reid Kleckner16514352015-01-30 21:42:55 +0000728 if (Opts.CXXExceptions)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000729 Builder.defineMacro("_CPPUNWIND");
730 }
731
David Majnemer6a658902015-07-22 22:36:26 +0000732 if (Opts.Bool)
733 Builder.defineMacro("__BOOL_DEFINED");
734
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000735 if (!Opts.CharIsSigned)
736 Builder.defineMacro("_CHAR_UNSIGNED");
737
738 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
739 // but it works for now.
740 if (Opts.POSIXThreads)
741 Builder.defineMacro("_MT");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000742
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +0000743 if (Opts.MSCompatibilityVersion) {
744 Builder.defineMacro("_MSC_VER",
745 Twine(Opts.MSCompatibilityVersion / 100000));
746 Builder.defineMacro("_MSC_FULL_VER", Twine(Opts.MSCompatibilityVersion));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000747 // FIXME We cannot encode the revision information into 32-bits
748 Builder.defineMacro("_MSC_BUILD", Twine(1));
David Majnemeraaf2b842015-03-18 07:53:18 +0000749
David Majnemerb710a932015-05-11 03:57:49 +0000750 if (Opts.CPlusPlus11 && Opts.isCompatibleWithMSVC(LangOptions::MSVC2015))
David Majnemeraaf2b842015-03-18 07:53:18 +0000751 Builder.defineMacro("_HAS_CHAR16_T_LANGUAGE_SUPPORT", Twine(1));
David Majnemer017cf352016-06-28 03:13:16 +0000752
753 if (Opts.isCompatibleWithMSVC(LangOptions::MSVC2015)) {
754 if (Opts.CPlusPlus1z)
755 Builder.defineMacro("_MSVC_LANG", "201403L");
756 else if (Opts.CPlusPlus14)
757 Builder.defineMacro("_MSVC_LANG", "201402L");
758 }
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000759 }
Reid Kleckner6f6e76d2014-04-16 20:10:16 +0000760
761 if (Opts.MicrosoftExt) {
762 Builder.defineMacro("_MSC_EXTENSIONS");
763
764 if (Opts.CPlusPlus11) {
765 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
766 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
767 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
768 }
769 }
770
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000771 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000772 }
773
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000774public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000775 WindowsTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
776 : OSTargetInfo<Target>(Triple, Opts) {}
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000777};
778
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000779template <typename Target>
780class NaClTargetInfo : public OSTargetInfo<Target> {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000781protected:
Craig Topper3164f332014-03-11 03:39:26 +0000782 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
783 MacroBuilder &Builder) const override {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000784 if (Opts.POSIXThreads)
785 Builder.defineMacro("_REENTRANT");
786 if (Opts.CPlusPlus)
787 Builder.defineMacro("_GNU_SOURCE");
788
Saleem Abdulrasool56027092017-02-07 19:00:06 +0000789 DefineStd(Builder, "unix", Opts);
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000790 Builder.defineMacro("__ELF__");
791 Builder.defineMacro("__native_client__");
792 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000793
794public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000795 NaClTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
796 : OSTargetInfo<Target>(Triple, Opts) {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000797 this->LongAlign = 32;
798 this->LongWidth = 32;
799 this->PointerAlign = 32;
800 this->PointerWidth = 32;
801 this->IntMaxType = TargetInfo::SignedLongLong;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000802 this->Int64Type = TargetInfo::SignedLongLong;
803 this->DoubleAlign = 64;
804 this->LongDoubleWidth = 64;
805 this->LongDoubleAlign = 64;
Jan Wen Voung1f9c4ee2014-01-15 21:42:41 +0000806 this->LongLongWidth = 64;
807 this->LongLongAlign = 64;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000808 this->SizeType = TargetInfo::UnsignedInt;
809 this->PtrDiffType = TargetInfo::SignedInt;
810 this->IntPtrType = TargetInfo::SignedInt;
Guy Blank294cbbd2016-08-18 08:44:33 +0000811 // RegParmMax is inherited from the underlying architecture.
Stephan Bergmann17c7f702016-12-14 11:57:17 +0000812 this->LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Rafael Espindola1c09b262013-12-18 23:41:04 +0000813 if (Triple.getArch() == llvm::Triple::arm) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +0000814 // Handled in ARM's setABI().
Rafael Espindola1c09b262013-12-18 23:41:04 +0000815 } else if (Triple.getArch() == llvm::Triple::x86) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000816 this->resetDataLayout("e-m:e-p:32:32-i64:64-n8:16:32-S128");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000817 } else if (Triple.getArch() == llvm::Triple::x86_64) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000818 this->resetDataLayout("e-m:e-p:32:32-i64:64-n8:16:32:64-S128");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000819 } else if (Triple.getArch() == llvm::Triple::mipsel) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000820 // Handled on mips' setDataLayout.
Rafael Espindola1c09b262013-12-18 23:41:04 +0000821 } else {
822 assert(Triple.getArch() == llvm::Triple::le32);
James Y Knightb214cbc2016-03-04 19:00:41 +0000823 this->resetDataLayout("e-p:32:32-i64:64");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000824 }
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000825 }
826};
Torok Edwinb2b37c62009-06-30 17:10:35 +0000827
Petr Hosek62e1d232016-10-06 06:08:09 +0000828// Fuchsia Target
829template<typename Target>
830class FuchsiaTargetInfo : public OSTargetInfo<Target> {
831protected:
832 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
833 MacroBuilder &Builder) const override {
834 Builder.defineMacro("__Fuchsia__");
835 Builder.defineMacro("__ELF__");
836 if (Opts.POSIXThreads)
837 Builder.defineMacro("_REENTRANT");
838 // Required by the libc++ locale support.
839 if (Opts.CPlusPlus)
840 Builder.defineMacro("_GNU_SOURCE");
841 }
842public:
843 FuchsiaTargetInfo(const llvm::Triple &Triple,
844 const TargetOptions &Opts)
845 : OSTargetInfo<Target>(Triple, Opts) {
846 this->MCountName = "__mcount";
847 }
848};
849
Dan Gohmanc2853072015-09-03 22:51:53 +0000850// WebAssembly target
851template <typename Target>
852class WebAssemblyOSTargetInfo : public OSTargetInfo<Target> {
853 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Hans Wennborg7eb54642015-09-10 17:07:54 +0000854 MacroBuilder &Builder) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +0000855 // A common platform macro.
856 if (Opts.POSIXThreads)
857 Builder.defineMacro("_REENTRANT");
858 // Follow g++ convention and predefine _GNU_SOURCE for C++.
859 if (Opts.CPlusPlus)
860 Builder.defineMacro("_GNU_SOURCE");
861 }
862
863 // As an optimization, group static init code together in a section.
Hans Wennborg7eb54642015-09-10 17:07:54 +0000864 const char *getStaticInitSectionSpecifier() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +0000865 return ".text.__startup";
866 }
867
868public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000869 explicit WebAssemblyOSTargetInfo(const llvm::Triple &Triple,
870 const TargetOptions &Opts)
871 : OSTargetInfo<Target>(Triple, Opts) {
Dan Gohmanc2853072015-09-03 22:51:53 +0000872 this->MCountName = "__mcount";
Dan Gohmanc2853072015-09-03 22:51:53 +0000873 this->TheCXXABI.set(TargetCXXABI::WebAssembly);
874 }
875};
Dan Gohmanc2853072015-09-03 22:51:53 +0000876
Chris Lattner09d98f52008-10-05 21:50:58 +0000877//===----------------------------------------------------------------------===//
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000878// Specific target implementations.
879//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000880
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000881// PPC abstract base class
882class PPCTargetInfo : public TargetInfo {
883 static const Builtin::Info BuiltinInfo[];
884 static const char * const GCCRegNames[];
885 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Hal Finkel8eb59282012-06-11 22:35:19 +0000886 std::string CPU;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000887
888 // Target cpu features.
889 bool HasVSX;
Bill Schmidt8c184e32014-10-10 17:21:23 +0000890 bool HasP8Vector;
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +0000891 bool HasP8Crypto;
Nemanja Ivanovic35458c22015-04-11 10:43:36 +0000892 bool HasDirectMove;
Hal Finkel0d0a1a52015-03-11 19:14:15 +0000893 bool HasQPX;
Kit Barton8246f282015-03-25 19:41:41 +0000894 bool HasHTM;
Nemanja Ivanovic239eec72015-04-09 23:58:16 +0000895 bool HasBPERMD;
896 bool HasExtDiv;
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +0000897 bool HasP9Vector;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000898
Ulrich Weigand8afad612014-07-28 13:17:52 +0000899protected:
900 std::string ABI;
901
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000902public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000903 PPCTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Saleem Abdulrasool10a49722016-04-08 16:52:00 +0000904 : TargetInfo(Triple), HasVSX(false), HasP8Vector(false),
905 HasP8Crypto(false), HasDirectMove(false), HasQPX(false), HasHTM(false),
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +0000906 HasBPERMD(false), HasExtDiv(false), HasP9Vector(false) {
Alexey Bataev00396512015-07-02 03:40:19 +0000907 SimdDefaultAlign = 128;
Nico Weber3435ede2012-01-31 02:07:33 +0000908 LongDoubleWidth = LongDoubleAlign = 128;
Stephan Bergmann17c7f702016-12-14 11:57:17 +0000909 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble();
Nico Weber3435ede2012-01-31 02:07:33 +0000910 }
Eli Friedman9ffd4a92009-06-05 07:05:05 +0000911
Hal Finkel6b984f02012-07-03 16:51:04 +0000912 /// \brief Flags for architecture specific defines.
913 typedef enum {
914 ArchDefineNone = 0,
915 ArchDefineName = 1 << 0, // <name> is substituted for arch name.
916 ArchDefinePpcgr = 1 << 1,
917 ArchDefinePpcsq = 1 << 2,
918 ArchDefine440 = 1 << 3,
919 ArchDefine603 = 1 << 4,
920 ArchDefine604 = 1 << 5,
921 ArchDefinePwr4 = 1 << 6,
Bill Schmidt38378a02013-02-01 20:23:10 +0000922 ArchDefinePwr5 = 1 << 7,
923 ArchDefinePwr5x = 1 << 8,
924 ArchDefinePwr6 = 1 << 9,
925 ArchDefinePwr6x = 1 << 10,
926 ArchDefinePwr7 = 1 << 11,
Will Schmidtf0487512014-06-26 13:34:10 +0000927 ArchDefinePwr8 = 1 << 12,
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +0000928 ArchDefinePwr9 = 1 << 13,
929 ArchDefineA2 = 1 << 14,
930 ArchDefineA2q = 1 << 15
Hal Finkel6b984f02012-07-03 16:51:04 +0000931 } ArchDefineTypes;
932
Bill Schmidt38378a02013-02-01 20:23:10 +0000933 // Note: GCC recognizes the following additional cpus:
934 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
935 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
936 // titan, rs64.
Craig Topper3164f332014-03-11 03:39:26 +0000937 bool setCPU(const std::string &Name) override {
Hal Finkel8eb59282012-06-11 22:35:19 +0000938 bool CPUKnown = llvm::StringSwitch<bool>(Name)
939 .Case("generic", true)
940 .Case("440", true)
941 .Case("450", true)
942 .Case("601", true)
943 .Case("602", true)
944 .Case("603", true)
945 .Case("603e", true)
946 .Case("603ev", true)
947 .Case("604", true)
948 .Case("604e", true)
949 .Case("620", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000950 .Case("630", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000951 .Case("g3", true)
952 .Case("7400", true)
953 .Case("g4", true)
954 .Case("7450", true)
955 .Case("g4+", true)
956 .Case("750", true)
957 .Case("970", true)
958 .Case("g5", true)
959 .Case("a2", true)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +0000960 .Case("a2q", true)
Hal Finkelf6d6cb02012-09-18 22:25:03 +0000961 .Case("e500mc", true)
962 .Case("e5500", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000963 .Case("power3", true)
964 .Case("pwr3", true)
965 .Case("power4", true)
966 .Case("pwr4", true)
967 .Case("power5", true)
968 .Case("pwr5", true)
969 .Case("power5x", true)
970 .Case("pwr5x", true)
971 .Case("power6", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000972 .Case("pwr6", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000973 .Case("power6x", true)
974 .Case("pwr6x", true)
975 .Case("power7", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000976 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +0000977 .Case("power8", true)
978 .Case("pwr8", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +0000979 .Case("power9", true)
980 .Case("pwr9", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000981 .Case("powerpc", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000982 .Case("ppc", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000983 .Case("powerpc64", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000984 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +0000985 .Case("powerpc64le", true)
986 .Case("ppc64le", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000987 .Default(false);
988
989 if (CPUKnown)
990 CPU = Name;
991
992 return CPUKnown;
993 }
994
Ulrich Weigand8afad612014-07-28 13:17:52 +0000995
996 StringRef getABI() const override { return ABI; }
997
Craig Topper6c03a542015-10-19 04:51:35 +0000998 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
999 return llvm::makeArrayRef(BuiltinInfo,
1000 clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner10a5b382007-01-29 05:24:35 +00001001 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001002
Craig Topper3164f332014-03-11 03:39:26 +00001003 bool isCLZForZeroUndef() const override { return false; }
Bob Wilson19a2f2b2012-01-28 18:02:29 +00001004
Craig Topper3164f332014-03-11 03:39:26 +00001005 void getTargetDefines(const LangOptions &Opts,
1006 MacroBuilder &Builder) const override;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001007
Eric Christopher8c47b422015-10-09 18:39:55 +00001008 bool
1009 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
1010 StringRef CPU,
1011 const std::vector<std::string> &FeaturesVec) const override;
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001012
Craig Topper3164f332014-03-11 03:39:26 +00001013 bool handleTargetFeatures(std::vector<std::string> &Features,
1014 DiagnosticsEngine &Diags) override;
1015 bool hasFeature(StringRef Feature) const override;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001016 void setFeatureEnabled(llvm::StringMap<bool> &Features, StringRef Name,
1017 bool Enabled) const override;
Craig Topper3164f332014-03-11 03:39:26 +00001018
Craig Topperf054e3a2015-10-19 03:52:27 +00001019 ArrayRef<const char *> getGCCRegNames() const override;
1020 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00001021 bool validateAsmConstraint(const char *&Name,
1022 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00001023 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +00001024 default: return false;
1025 case 'O': // Zero
John Thompson07a61a42010-06-24 22:44:13 +00001026 break;
Anders Carlssonf511f642007-11-27 04:11:28 +00001027 case 'b': // Base register
1028 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +00001029 Info.setAllowsRegister();
John Thompson07a61a42010-06-24 22:44:13 +00001030 break;
1031 // FIXME: The following are added to allow parsing.
1032 // I just took a guess at what the actions should be.
1033 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001034 case 'd': // Floating point register (containing 64-bit value)
John Thompson07a61a42010-06-24 22:44:13 +00001035 case 'v': // Altivec vector register
1036 Info.setAllowsRegister();
1037 break;
1038 case 'w':
1039 switch (Name[1]) {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001040 case 'd':// VSX vector register to hold vector double data
1041 case 'f':// VSX vector register to hold vector float data
1042 case 's':// VSX vector register to hold scalar float data
1043 case 'a':// Any VSX register
Hal Finkelf7a07a52014-03-02 18:24:18 +00001044 case 'c':// An individual CR bit
John Thompson07a61a42010-06-24 22:44:13 +00001045 break;
1046 default:
1047 return false;
1048 }
1049 Info.setAllowsRegister();
1050 Name++; // Skip over 'w'.
1051 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001052 case 'h': // `MQ', `CTR', or `LINK' register
1053 case 'q': // `MQ' register
1054 case 'c': // `CTR' register
1055 case 'l': // `LINK' register
1056 case 'x': // `CR' register (condition register) number 0
1057 case 'y': // `CR' register (condition register)
1058 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson07a61a42010-06-24 22:44:13 +00001059 Info.setAllowsRegister();
1060 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001061 case 'I': // Signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +00001062 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001063 // (use `L' instead for SImode constants)
1064 case 'K': // Unsigned 16-bit constant
1065 case 'L': // Signed 16-bit constant shifted left 16 bits
1066 case 'M': // Constant larger than 31
1067 case 'N': // Exact power of 2
1068 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +00001069 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001070 // register with one instruction per word
John Thompson07a61a42010-06-24 22:44:13 +00001071 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001072 // into a register using three instructions
John Thompson07a61a42010-06-24 22:44:13 +00001073 break;
1074 case 'm': // Memory operand. Note that on PowerPC targets, m can
1075 // include addresses that update the base register. It
1076 // is therefore only safe to use `m' in an asm statement
1077 // if that asm statement accesses the operand exactly once.
1078 // The asm statement must also use `%U<opno>' as a
Sebastian Redldd008712010-08-17 22:42:34 +00001079 // placeholder for the "update" flag in the corresponding
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001080 // load or store instruction. For example:
John Thompson07a61a42010-06-24 22:44:13 +00001081 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001082 // is correct but:
John Thompson07a61a42010-06-24 22:44:13 +00001083 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
1084 // is not. Use es rather than m if you don't want the base
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001085 // register to be updated.
1086 case 'e':
John Thompsonceebdf12010-06-25 00:02:05 +00001087 if (Name[1] != 's')
1088 return false;
Sebastian Redldd008712010-08-17 22:42:34 +00001089 // es: A "stable" memory operand; that is, one which does not
John Thompson07a61a42010-06-24 22:44:13 +00001090 // include any automodification of the base register. Unlike
1091 // `m', this constraint can be used in asm statements that
1092 // might access the operand several times, or that might not
John Thompsonceebdf12010-06-25 00:02:05 +00001093 // access it at all.
John Thompson07a61a42010-06-24 22:44:13 +00001094 Info.setAllowsMemory();
John Thompsonceebdf12010-06-25 00:02:05 +00001095 Name++; // Skip over 'e'.
John Thompson07a61a42010-06-24 22:44:13 +00001096 break;
1097 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001098 // usually better to use `m' or `es' in asm statements)
John Thompson07a61a42010-06-24 22:44:13 +00001099 case 'Z': // Memory operand that is an indexed or indirect from a
1100 // register (it is usually better to use `m' or `es' in
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001101 // asm statements)
John Thompson07a61a42010-06-24 22:44:13 +00001102 Info.setAllowsMemory();
1103 Info.setAllowsRegister();
1104 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001105 case 'R': // AIX TOC entry
John Thompson07a61a42010-06-24 22:44:13 +00001106 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001107 // register (`p' is preferable for asm statements)
1108 case 'S': // Constant suitable as a 64-bit mask operand
1109 case 'T': // Constant suitable as a 32-bit mask operand
1110 case 'U': // System V Release 4 small data area reference
John Thompson07a61a42010-06-24 22:44:13 +00001111 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001112 // instructions
1113 case 'W': // Vector constant that does not require memory
1114 case 'j': // Vector constant that is all zeros.
John Thompson07a61a42010-06-24 22:44:13 +00001115 break;
1116 // End FIXME.
Anders Carlssonf511f642007-11-27 04:11:28 +00001117 }
John Thompson07a61a42010-06-24 22:44:13 +00001118 return true;
Anders Carlssonf511f642007-11-27 04:11:28 +00001119 }
Craig Topper3164f332014-03-11 03:39:26 +00001120 std::string convertConstraint(const char *&Constraint) const override {
Hal Finkelf7a07a52014-03-02 18:24:18 +00001121 std::string R;
1122 switch (*Constraint) {
1123 case 'e':
1124 case 'w':
1125 // Two-character constraint; add "^" hint for later parsing.
1126 R = std::string("^") + std::string(Constraint, 2);
1127 Constraint++;
1128 break;
1129 default:
1130 return TargetInfo::convertConstraint(Constraint);
1131 }
1132 return R;
1133 }
Craig Topper3164f332014-03-11 03:39:26 +00001134 const char *getClobbers() const override {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001135 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +00001136 }
Craig Topper3164f332014-03-11 03:39:26 +00001137 int getEHDataRegisterNumber(unsigned RegNo) const override {
Adhemerval Zanella5d874ae2013-01-22 20:02:45 +00001138 if (RegNo == 0) return 3;
1139 if (RegNo == 1) return 4;
1140 return -1;
1141 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00001142
1143 bool hasSjLjLowering() const override {
1144 return true;
1145 }
David Majnemer2617ea62015-06-09 18:05:33 +00001146
1147 bool useFloat128ManglingForLongDouble() const override {
1148 return LongDoubleWidth == 128 &&
Stephan Bergmann17c7f702016-12-14 11:57:17 +00001149 LongDoubleFormat == &llvm::APFloat::PPCDoubleDouble() &&
David Majnemer2617ea62015-06-09 18:05:33 +00001150 getTriple().isOSBinFormatELF();
1151 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001152};
Anders Carlssonf511f642007-11-27 04:11:28 +00001153
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001154const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00001155#define BUILTIN(ID, TYPE, ATTRS) \
1156 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1157#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1158 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5abdec72009-06-14 01:05:48 +00001159#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001160};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001161
Eric Christopher917e9522014-11-18 22:36:15 +00001162/// handleTargetFeatures - Perform initialization based on the user
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001163/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00001164bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001165 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00001166 for (const auto &Feature : Features) {
1167 if (Feature == "+vsx") {
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001168 HasVSX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001169 } else if (Feature == "+bpermd") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001170 HasBPERMD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001171 } else if (Feature == "+extdiv") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001172 HasExtDiv = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001173 } else if (Feature == "+power8-vector") {
Bill Schmidt8c184e32014-10-10 17:21:23 +00001174 HasP8Vector = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001175 } else if (Feature == "+crypto") {
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001176 HasP8Crypto = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001177 } else if (Feature == "+direct-move") {
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001178 HasDirectMove = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001179 } else if (Feature == "+qpx") {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001180 HasQPX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001181 } else if (Feature == "+htm") {
Kit Barton8246f282015-03-25 19:41:41 +00001182 HasHTM = true;
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001183 } else if (Feature == "+float128") {
1184 HasFloat128 = true;
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001185 } else if (Feature == "+power9-vector") {
1186 HasP9Vector = true;
Kit Barton8246f282015-03-25 19:41:41 +00001187 }
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001188 // TODO: Finish this list and add an assert that we've handled them
1189 // all.
1190 }
Eric Christopher02c33352015-08-25 00:59:11 +00001191
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001192 return true;
1193}
1194
Chris Lattnerecd49032009-03-02 22:27:17 +00001195/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
1196/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001197void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001198 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00001199 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001200 Builder.defineMacro("__ppc__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001201 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001202 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001203 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001204 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001205 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001206 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001207 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001208 Builder.defineMacro("__ppc64__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001209 Builder.defineMacro("__PPC64__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001210 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001211
Chris Lattnerecd49032009-03-02 22:27:17 +00001212 // Target properties.
Bill Schmidt778d3872013-07-26 01:36:11 +00001213 if (getTriple().getArch() == llvm::Triple::ppc64le) {
1214 Builder.defineMacro("_LITTLE_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001215 } else {
1216 if (getTriple().getOS() != llvm::Triple::NetBSD &&
1217 getTriple().getOS() != llvm::Triple::OpenBSD)
1218 Builder.defineMacro("_BIG_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001219 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001220
Ulrich Weigand8afad612014-07-28 13:17:52 +00001221 // ABI options.
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001222 if (ABI == "elfv1" || ABI == "elfv1-qpx")
Ulrich Weigand8afad612014-07-28 13:17:52 +00001223 Builder.defineMacro("_CALL_ELF", "1");
1224 if (ABI == "elfv2")
1225 Builder.defineMacro("_CALL_ELF", "2");
1226
Chris Lattnerecd49032009-03-02 22:27:17 +00001227 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001228 Builder.defineMacro("__NATURAL_ALIGNMENT__");
1229 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001230
Chris Lattnerecd49032009-03-02 22:27:17 +00001231 // FIXME: Should be controlled by command line option.
Roman Divacky13b586f2013-07-03 19:45:54 +00001232 if (LongDoubleWidth == 128)
1233 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001234
John Thompsone467e192009-11-19 17:18:50 +00001235 if (Opts.AltiVec) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001236 Builder.defineMacro("__VEC__", "10206");
1237 Builder.defineMacro("__ALTIVEC__");
John Thompsone467e192009-11-19 17:18:50 +00001238 }
Hal Finkel8eb59282012-06-11 22:35:19 +00001239
1240 // CPU identification.
Hal Finkel6b984f02012-07-03 16:51:04 +00001241 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
1242 .Case("440", ArchDefineName)
1243 .Case("450", ArchDefineName | ArchDefine440)
1244 .Case("601", ArchDefineName)
1245 .Case("602", ArchDefineName | ArchDefinePpcgr)
1246 .Case("603", ArchDefineName | ArchDefinePpcgr)
1247 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1248 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1249 .Case("604", ArchDefineName | ArchDefinePpcgr)
1250 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
1251 .Case("620", ArchDefineName | ArchDefinePpcgr)
Bill Schmidt38378a02013-02-01 20:23:10 +00001252 .Case("630", ArchDefineName | ArchDefinePpcgr)
Hal Finkel6b984f02012-07-03 16:51:04 +00001253 .Case("7400", ArchDefineName | ArchDefinePpcgr)
1254 .Case("7450", ArchDefineName | ArchDefinePpcgr)
1255 .Case("750", ArchDefineName | ArchDefinePpcgr)
1256 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1257 | ArchDefinePpcsq)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001258 .Case("a2", ArchDefineA2)
1259 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
Bill Schmidt38378a02013-02-01 20:23:10 +00001260 .Case("pwr3", ArchDefinePpcgr)
1261 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
1262 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1263 | ArchDefinePpcsq)
1264 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4
1265 | ArchDefinePpcgr | ArchDefinePpcsq)
1266 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5
1267 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1268 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x
1269 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1270 | ArchDefinePpcsq)
1271 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6
1272 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001273 | ArchDefinePpcgr | ArchDefinePpcsq)
1274 .Case("pwr8", ArchDefineName | ArchDefinePwr7 | ArchDefinePwr6x
1275 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1276 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001277 .Case("pwr9", ArchDefineName | ArchDefinePwr8 | ArchDefinePwr7
1278 | ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1279 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1280 | ArchDefinePpcsq)
Bill Schmidt38378a02013-02-01 20:23:10 +00001281 .Case("power3", ArchDefinePpcgr)
1282 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1283 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1284 | ArchDefinePpcsq)
1285 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1286 | ArchDefinePpcgr | ArchDefinePpcsq)
1287 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1288 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1289 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1290 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1291 | ArchDefinePpcsq)
1292 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6
1293 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001294 | ArchDefinePpcgr | ArchDefinePpcsq)
1295 .Case("power8", ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr6x
1296 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1297 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001298 .Case("power9", ArchDefinePwr9 | ArchDefinePwr8 | ArchDefinePwr7
1299 | ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1300 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1301 | ArchDefinePpcsq)
Hal Finkel6b984f02012-07-03 16:51:04 +00001302 .Default(ArchDefineNone);
1303
1304 if (defs & ArchDefineName)
1305 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
1306 if (defs & ArchDefinePpcgr)
1307 Builder.defineMacro("_ARCH_PPCGR");
1308 if (defs & ArchDefinePpcsq)
1309 Builder.defineMacro("_ARCH_PPCSQ");
1310 if (defs & ArchDefine440)
Hal Finkel8eb59282012-06-11 22:35:19 +00001311 Builder.defineMacro("_ARCH_440");
Hal Finkel6b984f02012-07-03 16:51:04 +00001312 if (defs & ArchDefine603)
1313 Builder.defineMacro("_ARCH_603");
1314 if (defs & ArchDefine604)
1315 Builder.defineMacro("_ARCH_604");
Bill Schmidt38378a02013-02-01 20:23:10 +00001316 if (defs & ArchDefinePwr4)
Hal Finkel6b984f02012-07-03 16:51:04 +00001317 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt38378a02013-02-01 20:23:10 +00001318 if (defs & ArchDefinePwr5)
Hal Finkel6b984f02012-07-03 16:51:04 +00001319 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt38378a02013-02-01 20:23:10 +00001320 if (defs & ArchDefinePwr5x)
1321 Builder.defineMacro("_ARCH_PWR5X");
1322 if (defs & ArchDefinePwr6)
Hal Finkel8eb59282012-06-11 22:35:19 +00001323 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt38378a02013-02-01 20:23:10 +00001324 if (defs & ArchDefinePwr6x)
1325 Builder.defineMacro("_ARCH_PWR6X");
1326 if (defs & ArchDefinePwr7)
1327 Builder.defineMacro("_ARCH_PWR7");
Will Schmidtf0487512014-06-26 13:34:10 +00001328 if (defs & ArchDefinePwr8)
1329 Builder.defineMacro("_ARCH_PWR8");
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001330 if (defs & ArchDefinePwr9)
1331 Builder.defineMacro("_ARCH_PWR9");
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001332 if (defs & ArchDefineA2)
1333 Builder.defineMacro("_ARCH_A2");
1334 if (defs & ArchDefineA2q) {
1335 Builder.defineMacro("_ARCH_A2Q");
1336 Builder.defineMacro("_ARCH_QP");
1337 }
1338
1339 if (getTriple().getVendor() == llvm::Triple::BGQ) {
1340 Builder.defineMacro("__bg__");
1341 Builder.defineMacro("__THW_BLUEGENE__");
1342 Builder.defineMacro("__bgq__");
1343 Builder.defineMacro("__TOS_BGQ__");
1344 }
Bill Schmidt38378a02013-02-01 20:23:10 +00001345
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001346 if (HasVSX)
1347 Builder.defineMacro("__VSX__");
Bill Schmidt8c184e32014-10-10 17:21:23 +00001348 if (HasP8Vector)
Bill Schmidt59eb7672014-10-10 15:09:43 +00001349 Builder.defineMacro("__POWER8_VECTOR__");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001350 if (HasP8Crypto)
1351 Builder.defineMacro("__CRYPTO__");
Kit Barton8246f282015-03-25 19:41:41 +00001352 if (HasHTM)
1353 Builder.defineMacro("__HTM__");
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001354 if (HasFloat128)
1355 Builder.defineMacro("__FLOAT128__");
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001356 if (HasP9Vector)
1357 Builder.defineMacro("__POWER9_VECTOR__");
Hal Finkela57b8902015-10-01 13:39:49 +00001358
1359 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
1360 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
1361 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
1362 if (PointerWidth == 64)
1363 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001364
Bill Schmidt38378a02013-02-01 20:23:10 +00001365 // FIXME: The following are not yet generated here by Clang, but are
1366 // generated by GCC:
1367 //
1368 // _SOFT_FLOAT_
1369 // __RECIP_PRECISION__
1370 // __APPLE_ALTIVEC__
Bill Schmidt38378a02013-02-01 20:23:10 +00001371 // __RECIP__
1372 // __RECIPF__
1373 // __RSQRTE__
1374 // __RSQRTEF__
1375 // _SOFT_DOUBLE_
1376 // __NO_LWSYNC__
1377 // __HAVE_BSWAP__
1378 // __LONGDOUBLE128
1379 // __CMODEL_MEDIUM__
1380 // __CMODEL_LARGE__
1381 // _CALL_SYSV
1382 // _CALL_DARWIN
1383 // __NO_FPRS__
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001384}
1385
Eric Christophera8a14c32015-08-31 18:39:16 +00001386// Handle explicit options being passed to the compiler here: if we've
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001387// explicitly turned off vsx and turned on any of:
1388// - power8-vector
1389// - direct-move
1390// - float128
1391// - power9-vector
1392// then go ahead and error since the customer has expressed an incompatible
Eric Christophera8a14c32015-08-31 18:39:16 +00001393// set of options.
1394static bool ppcUserFeaturesCheck(DiagnosticsEngine &Diags,
Eric Christopher8c47b422015-10-09 18:39:55 +00001395 const std::vector<std::string> &FeaturesVec) {
Eric Christophera8a14c32015-08-31 18:39:16 +00001396
1397 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "-vsx") !=
1398 FeaturesVec.end()) {
1399 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+power8-vector") !=
1400 FeaturesVec.end()) {
1401 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mpower8-vector"
1402 << "-mno-vsx";
1403 return false;
1404 }
1405
1406 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+direct-move") !=
1407 FeaturesVec.end()) {
1408 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mdirect-move"
1409 << "-mno-vsx";
1410 return false;
1411 }
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001412
1413 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+float128") !=
1414 FeaturesVec.end()) {
1415 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mfloat128"
1416 << "-mno-vsx";
1417 return false;
1418 }
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001419
1420 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+power9-vector") !=
1421 FeaturesVec.end()) {
1422 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mpower9-vector"
1423 << "-mno-vsx";
1424 return false;
1425 }
Eric Christophera8a14c32015-08-31 18:39:16 +00001426 }
1427
1428 return true;
1429}
1430
Eric Christopher8c47b422015-10-09 18:39:55 +00001431bool PPCTargetInfo::initFeatureMap(
1432 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
1433 const std::vector<std::string> &FeaturesVec) const {
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001434 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1435 .Case("7400", true)
1436 .Case("g4", true)
1437 .Case("7450", true)
1438 .Case("g4+", true)
1439 .Case("970", true)
1440 .Case("g5", true)
1441 .Case("pwr6", true)
1442 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +00001443 .Case("pwr8", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001444 .Case("pwr9", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001445 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +00001446 .Case("ppc64le", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001447 .Default(false);
Hal Finkelb58ce852013-02-01 18:44:19 +00001448
1449 Features["qpx"] = (CPU == "a2q");
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001450 Features["power9-vector"] = (CPU == "pwr9");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001451 Features["crypto"] = llvm::StringSwitch<bool>(CPU)
1452 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001453 .Case("pwr9", true)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001454 .Case("pwr8", true)
1455 .Default(false);
1456 Features["power8-vector"] = llvm::StringSwitch<bool>(CPU)
1457 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001458 .Case("pwr9", true)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001459 .Case("pwr8", true)
1460 .Default(false);
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001461 Features["bpermd"] = llvm::StringSwitch<bool>(CPU)
1462 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001463 .Case("pwr9", true)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001464 .Case("pwr8", true)
1465 .Case("pwr7", true)
1466 .Default(false);
1467 Features["extdiv"] = llvm::StringSwitch<bool>(CPU)
1468 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001469 .Case("pwr9", true)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001470 .Case("pwr8", true)
1471 .Case("pwr7", true)
1472 .Default(false);
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001473 Features["direct-move"] = llvm::StringSwitch<bool>(CPU)
1474 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001475 .Case("pwr9", true)
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001476 .Case("pwr8", true)
1477 .Default(false);
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001478 Features["vsx"] = llvm::StringSwitch<bool>(CPU)
1479 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001480 .Case("pwr9", true)
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001481 .Case("pwr8", true)
1482 .Case("pwr7", true)
1483 .Default(false);
Eric Christopheref1e2952015-08-28 02:13:58 +00001484
Eric Christophera8a14c32015-08-31 18:39:16 +00001485 if (!ppcUserFeaturesCheck(Diags, FeaturesVec))
1486 return false;
Eric Christopher007b0a02015-08-28 22:32:01 +00001487
Eric Christopher007b0a02015-08-28 22:32:01 +00001488 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001489}
1490
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001491bool PPCTargetInfo::hasFeature(StringRef Feature) const {
Bill Schmidte6e9d152014-11-02 14:56:41 +00001492 return llvm::StringSwitch<bool>(Feature)
1493 .Case("powerpc", true)
1494 .Case("vsx", HasVSX)
1495 .Case("power8-vector", HasP8Vector)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001496 .Case("crypto", HasP8Crypto)
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001497 .Case("direct-move", HasDirectMove)
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001498 .Case("qpx", HasQPX)
Kit Barton8246f282015-03-25 19:41:41 +00001499 .Case("htm", HasHTM)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001500 .Case("bpermd", HasBPERMD)
1501 .Case("extdiv", HasExtDiv)
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001502 .Case("float128", HasFloat128)
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001503 .Case("power9-vector", HasP9Vector)
Bill Schmidte6e9d152014-11-02 14:56:41 +00001504 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001505}
Chris Lattner17df24e2008-04-21 18:56:49 +00001506
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001507void PPCTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
1508 StringRef Name, bool Enabled) const {
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001509 // If we're enabling direct-move or power8-vector go ahead and enable vsx
1510 // as well. Do the inverse if we're disabling vsx. We'll diagnose any user
1511 // incompatible options.
1512 if (Enabled) {
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001513 if (Name == "direct-move" ||
1514 Name == "power8-vector" ||
1515 Name == "float128" ||
1516 Name == "power9-vector") {
1517 // power9-vector is really a superset of power8-vector so encode that.
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001518 Features[Name] = Features["vsx"] = true;
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001519 if (Name == "power9-vector")
1520 Features["power8-vector"] = true;
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001521 } else {
1522 Features[Name] = true;
1523 }
1524 } else {
1525 if (Name == "vsx") {
1526 Features[Name] = Features["direct-move"] = Features["power8-vector"] =
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001527 Features["float128"] = Features["power9-vector"] = false;
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001528 } else {
1529 Features[Name] = false;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001530 }
1531 }
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001532}
1533
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001534const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001535 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1536 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1537 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1538 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1539 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1540 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1541 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1542 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001543 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001544 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001545 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001546 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1547 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1548 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1549 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001550 "vrsave", "vscr",
1551 "spe_acc", "spefscr",
1552 "sfp"
1553};
Chris Lattner10a5b382007-01-29 05:24:35 +00001554
Craig Topperf054e3a2015-10-19 03:52:27 +00001555ArrayRef<const char*> PPCTargetInfo::getGCCRegNames() const {
1556 return llvm::makeArrayRef(GCCRegNames);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001557}
Chris Lattner5ba61f02006-10-14 07:39:34 +00001558
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001559const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1560 // While some of these aliases do map to different registers
1561 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001562 { { "0" }, "r0" },
1563 { { "1"}, "r1" },
1564 { { "2" }, "r2" },
1565 { { "3" }, "r3" },
1566 { { "4" }, "r4" },
1567 { { "5" }, "r5" },
1568 { { "6" }, "r6" },
1569 { { "7" }, "r7" },
1570 { { "8" }, "r8" },
1571 { { "9" }, "r9" },
1572 { { "10" }, "r10" },
1573 { { "11" }, "r11" },
1574 { { "12" }, "r12" },
1575 { { "13" }, "r13" },
1576 { { "14" }, "r14" },
1577 { { "15" }, "r15" },
1578 { { "16" }, "r16" },
1579 { { "17" }, "r17" },
1580 { { "18" }, "r18" },
1581 { { "19" }, "r19" },
1582 { { "20" }, "r20" },
1583 { { "21" }, "r21" },
1584 { { "22" }, "r22" },
1585 { { "23" }, "r23" },
1586 { { "24" }, "r24" },
1587 { { "25" }, "r25" },
1588 { { "26" }, "r26" },
1589 { { "27" }, "r27" },
1590 { { "28" }, "r28" },
1591 { { "29" }, "r29" },
1592 { { "30" }, "r30" },
1593 { { "31" }, "r31" },
1594 { { "fr0" }, "f0" },
1595 { { "fr1" }, "f1" },
1596 { { "fr2" }, "f2" },
1597 { { "fr3" }, "f3" },
1598 { { "fr4" }, "f4" },
1599 { { "fr5" }, "f5" },
1600 { { "fr6" }, "f6" },
1601 { { "fr7" }, "f7" },
1602 { { "fr8" }, "f8" },
1603 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +00001604 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001605 { { "fr11" }, "f11" },
1606 { { "fr12" }, "f12" },
1607 { { "fr13" }, "f13" },
1608 { { "fr14" }, "f14" },
1609 { { "fr15" }, "f15" },
1610 { { "fr16" }, "f16" },
1611 { { "fr17" }, "f17" },
1612 { { "fr18" }, "f18" },
1613 { { "fr19" }, "f19" },
1614 { { "fr20" }, "f20" },
1615 { { "fr21" }, "f21" },
1616 { { "fr22" }, "f22" },
1617 { { "fr23" }, "f23" },
1618 { { "fr24" }, "f24" },
1619 { { "fr25" }, "f25" },
1620 { { "fr26" }, "f26" },
1621 { { "fr27" }, "f27" },
1622 { { "fr28" }, "f28" },
1623 { { "fr29" }, "f29" },
1624 { { "fr30" }, "f30" },
1625 { { "fr31" }, "f31" },
1626 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001627};
1628
Craig Topperf054e3a2015-10-19 03:52:27 +00001629ArrayRef<TargetInfo::GCCRegAlias> PPCTargetInfo::getGCCRegAliases() const {
1630 return llvm::makeArrayRef(GCCRegAliases);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001631}
Chris Lattner02dffbd2006-10-14 07:50:21 +00001632
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001633class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001634public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001635 PPC32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1636 : PPCTargetInfo(Triple, Opts) {
James Y Knightb214cbc2016-03-04 19:00:41 +00001637 resetDataLayout("E-m:e-p:32:32-i64:64-n32");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001638
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001639 switch (getTriple().getOS()) {
Nico Weber3435ede2012-01-31 02:07:33 +00001640 case llvm::Triple::Linux:
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001641 case llvm::Triple::FreeBSD:
1642 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001643 SizeType = UnsignedInt;
Hal Finkel26908382012-03-02 20:54:36 +00001644 PtrDiffType = SignedInt;
1645 IntPtrType = SignedInt;
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001646 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +00001647 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001648 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001649 }
Roman Divacky816dcd12012-03-13 16:53:54 +00001650
Roman Divacky3ffe7462012-03-13 19:20:17 +00001651 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1652 LongDoubleWidth = LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00001653 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Roman Divacky3ffe7462012-03-13 19:20:17 +00001654 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001655
1656 // PPC32 supports atomics up to 4 bytes.
1657 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divacky965b0b72011-01-06 08:27:10 +00001658 }
1659
Craig Topper3164f332014-03-11 03:39:26 +00001660 BuiltinVaListKind getBuiltinVaListKind() const override {
Roman Divacky965b0b72011-01-06 08:27:10 +00001661 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Inge5d3fb222012-06-16 03:34:49 +00001662 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman873f65a2008-08-21 00:13:15 +00001663 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001664};
Chris Lattner5ba61f02006-10-14 07:39:34 +00001665
Bill Schmidt778d3872013-07-26 01:36:11 +00001666// Note: ABI differences may eventually require us to have a separate
1667// TargetInfo for little endian.
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001668class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001669public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001670 PPC64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1671 : PPCTargetInfo(Triple, Opts) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001672 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001673 IntMaxType = SignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001674 Int64Type = SignedLong;
Roman Divacky816dcd12012-03-13 16:53:54 +00001675
Eric Christopherf6ee1f32017-02-10 04:35:21 +00001676 if ((Triple.getArch() == llvm::Triple::ppc64le)) {
1677 resetDataLayout("e-m:e-i64:64-n32:64");
Eric Christopher4855ba82017-02-10 03:32:34 +00001678 ABI = "elfv2";
Eric Christopherf6ee1f32017-02-10 04:35:21 +00001679 } else {
1680 resetDataLayout("E-m:e-i64:64-n32:64");
Eric Christopher4855ba82017-02-10 03:32:34 +00001681 ABI = "elfv1";
Eric Christopherf6ee1f32017-02-10 04:35:21 +00001682 }
Eric Christopher4855ba82017-02-10 03:32:34 +00001683
Eric Christopherf6ee1f32017-02-10 04:35:21 +00001684 switch (getTriple().getOS()) {
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001685 case llvm::Triple::FreeBSD:
Roman Divacky3ffe7462012-03-13 19:20:17 +00001686 LongDoubleWidth = LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00001687 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001688 break;
Joerg Sonnenbergeraac82c42014-10-15 19:52:03 +00001689 case llvm::Triple::NetBSD:
1690 IntMaxType = SignedLongLong;
1691 Int64Type = SignedLongLong;
1692 break;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001693 default:
1694 break;
Ulrich Weigand8afad612014-07-28 13:17:52 +00001695 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001696
1697 // PPC64 supports atomics up to 8 bytes.
1698 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001699 }
Craig Topper3164f332014-03-11 03:39:26 +00001700 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001701 return TargetInfo::CharPtrBuiltinVaList;
Roman Divacky965b0b72011-01-06 08:27:10 +00001702 }
Eric Christophere6b7cf42015-07-10 18:25:52 +00001703 // PPC64 Linux-specific ABI options.
Ulrich Weigand8afad612014-07-28 13:17:52 +00001704 bool setABI(const std::string &Name) override {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001705 if (Name == "elfv1" || Name == "elfv1-qpx" || Name == "elfv2") {
Ulrich Weigand8afad612014-07-28 13:17:52 +00001706 ABI = Name;
1707 return true;
1708 }
1709 return false;
1710 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001711};
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001712
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001713class DarwinPPC32TargetInfo : public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001714public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001715 DarwinPPC32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1716 : DarwinTargetInfo<PPC32TargetInfo>(Triple, Opts) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001717 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +00001718 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Eric Christopher917e9522014-11-18 22:36:15 +00001719 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev68d773c2012-01-17 22:40:00 +00001720 LongLongAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001721 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00001722 resetDataLayout("E-m:o-p:32:32-f64:32:64-n32");
Roman Divacky965b0b72011-01-06 08:27:10 +00001723 }
Craig Topper3164f332014-03-11 03:39:26 +00001724 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001725 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001726 }
1727};
1728
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001729class DarwinPPC64TargetInfo : public DarwinTargetInfo<PPC64TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001730public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001731 DarwinPPC64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1732 : DarwinTargetInfo<PPC64TargetInfo>(Triple, Opts) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001733 HasAlignMac68kSupport = true;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001734 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00001735 resetDataLayout("E-m:o-i64:64-n32:64");
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001736 }
1737};
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001738
Eric Christopherc48497a2015-09-18 21:26:24 +00001739static const unsigned NVPTXAddrSpaceMap[] = {
1740 1, // opencl_global
1741 3, // opencl_local
1742 4, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00001743 // FIXME: generic has to be added to the target
Eric Christopherc48497a2015-09-18 21:26:24 +00001744 0, // opencl_generic
1745 1, // cuda_device
1746 4, // cuda_constant
1747 3, // cuda_shared
1748};
1749
1750class NVPTXTargetInfo : public TargetInfo {
1751 static const char *const GCCRegNames[];
1752 static const Builtin::Info BuiltinInfo[];
Justin Lebar62907612016-07-06 21:21:39 +00001753 CudaArch GPU;
Justin Lebarb6626592017-01-05 16:53:21 +00001754 std::unique_ptr<TargetInfo> HostTarget;
Reid Klecknerbbc01782014-12-03 21:53:36 +00001755
Eric Christopherc48497a2015-09-18 21:26:24 +00001756public:
Justin Lebarb6626592017-01-05 16:53:21 +00001757 NVPTXTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts,
1758 unsigned TargetPointerWidth)
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001759 : TargetInfo(Triple) {
Justin Lebarb6626592017-01-05 16:53:21 +00001760 assert((TargetPointerWidth == 32 || TargetPointerWidth == 64) &&
1761 "NVPTX only supports 32- and 64-bit modes.");
1762
Eric Christopherc48497a2015-09-18 21:26:24 +00001763 TLSSupported = false;
Eric Christopherc48497a2015-09-18 21:26:24 +00001764 AddrSpaceMap = &NVPTXAddrSpaceMap;
1765 UseAddrSpaceMapMangling = true;
Justin Lebarb6626592017-01-05 16:53:21 +00001766
Eric Christopherc48497a2015-09-18 21:26:24 +00001767 // Define available target features
1768 // These must be defined in sorted order!
1769 NoAsmVariants = true;
Justin Lebar62907612016-07-06 21:21:39 +00001770 GPU = CudaArch::SM_20;
Justin Lebar76945b22016-04-29 23:05:19 +00001771
Justin Lebarb6626592017-01-05 16:53:21 +00001772 if (TargetPointerWidth == 32)
1773 resetDataLayout("e-p:32:32-i64:64-v16:16-v32:32-n16:32:64");
1774 else
1775 resetDataLayout("e-i64:64-v16:16-v32:32-n16:32:64");
1776
Justin Lebar76945b22016-04-29 23:05:19 +00001777 // If possible, get a TargetInfo for our host triple, so we can match its
1778 // types.
1779 llvm::Triple HostTriple(Opts.HostTriple);
Justin Lebarb6626592017-01-05 16:53:21 +00001780 if (!HostTriple.isNVPTX())
1781 HostTarget.reset(AllocateTarget(llvm::Triple(Opts.HostTriple), Opts));
1782
1783 // If no host target, make some guesses about the data layout and return.
Justin Lebar76945b22016-04-29 23:05:19 +00001784 if (!HostTarget) {
Justin Lebarb6626592017-01-05 16:53:21 +00001785 LongWidth = LongAlign = TargetPointerWidth;
1786 PointerWidth = PointerAlign = TargetPointerWidth;
1787 switch (TargetPointerWidth) {
1788 case 32:
1789 SizeType = TargetInfo::UnsignedInt;
1790 PtrDiffType = TargetInfo::SignedInt;
1791 IntPtrType = TargetInfo::SignedInt;
1792 break;
1793 case 64:
1794 SizeType = TargetInfo::UnsignedLong;
1795 PtrDiffType = TargetInfo::SignedLong;
1796 IntPtrType = TargetInfo::SignedLong;
1797 break;
1798 default:
1799 llvm_unreachable("TargetPointerWidth must be 32 or 64");
1800 }
Justin Lebar76945b22016-04-29 23:05:19 +00001801 return;
1802 }
1803
Justin Lebarb6626592017-01-05 16:53:21 +00001804 // Copy properties from host target.
Justin Lebar76945b22016-04-29 23:05:19 +00001805 PointerWidth = HostTarget->getPointerWidth(/* AddrSpace = */ 0);
1806 PointerAlign = HostTarget->getPointerAlign(/* AddrSpace = */ 0);
1807 BoolWidth = HostTarget->getBoolWidth();
1808 BoolAlign = HostTarget->getBoolAlign();
1809 IntWidth = HostTarget->getIntWidth();
1810 IntAlign = HostTarget->getIntAlign();
1811 HalfWidth = HostTarget->getHalfWidth();
1812 HalfAlign = HostTarget->getHalfAlign();
1813 FloatWidth = HostTarget->getFloatWidth();
1814 FloatAlign = HostTarget->getFloatAlign();
1815 DoubleWidth = HostTarget->getDoubleWidth();
1816 DoubleAlign = HostTarget->getDoubleAlign();
1817 LongWidth = HostTarget->getLongWidth();
1818 LongAlign = HostTarget->getLongAlign();
1819 LongLongWidth = HostTarget->getLongLongWidth();
1820 LongLongAlign = HostTarget->getLongLongAlign();
1821 MinGlobalAlign = HostTarget->getMinGlobalAlign();
Richard Smith59139022016-09-30 22:41:36 +00001822 NewAlign = HostTarget->getNewAlign();
Justin Lebar76945b22016-04-29 23:05:19 +00001823 DefaultAlignForAttributeAligned =
1824 HostTarget->getDefaultAlignForAttributeAligned();
1825 SizeType = HostTarget->getSizeType();
1826 IntMaxType = HostTarget->getIntMaxType();
1827 PtrDiffType = HostTarget->getPtrDiffType(/* AddrSpace = */ 0);
1828 IntPtrType = HostTarget->getIntPtrType();
1829 WCharType = HostTarget->getWCharType();
1830 WIntType = HostTarget->getWIntType();
1831 Char16Type = HostTarget->getChar16Type();
1832 Char32Type = HostTarget->getChar32Type();
1833 Int64Type = HostTarget->getInt64Type();
1834 SigAtomicType = HostTarget->getSigAtomicType();
1835 ProcessIDType = HostTarget->getProcessIDType();
1836
1837 UseBitFieldTypeAlignment = HostTarget->useBitFieldTypeAlignment();
1838 UseZeroLengthBitfieldAlignment =
1839 HostTarget->useZeroLengthBitfieldAlignment();
1840 UseExplicitBitFieldAlignment = HostTarget->useExplicitBitFieldAlignment();
1841 ZeroLengthBitfieldBoundary = HostTarget->getZeroLengthBitfieldBoundary();
1842
Justin Lebar5057f172016-09-09 20:35:43 +00001843 // This is a bit of a lie, but it controls __GCC_ATOMIC_XXX_LOCK_FREE, and
1844 // we need those macros to be identical on host and device, because (among
1845 // other things) they affect which standard library classes are defined, and
1846 // we need all classes to be defined on both the host and device.
1847 MaxAtomicInlineWidth = HostTarget->getMaxAtomicInlineWidth();
1848
Justin Lebar76945b22016-04-29 23:05:19 +00001849 // Properties intentionally not copied from host:
1850 // - LargeArrayMinWidth, LargeArrayAlign: Not visible across the
1851 // host/device boundary.
1852 // - SuitableAlign: Not visible across the host/device boundary, and may
1853 // correctly be different on host/device, e.g. if host has wider vector
1854 // types than device.
1855 // - LongDoubleWidth, LongDoubleAlign: nvptx's long double type is the same
1856 // as its double type, but that's not necessarily true on the host.
1857 // TODO: nvcc emits a warning when using long double on device; we should
1858 // do the same.
Eric Christopherc48497a2015-09-18 21:26:24 +00001859 }
1860 void getTargetDefines(const LangOptions &Opts,
1861 MacroBuilder &Builder) const override {
1862 Builder.defineMacro("__PTX__");
1863 Builder.defineMacro("__NVPTX__");
1864 if (Opts.CUDAIsDevice) {
1865 // Set __CUDA_ARCH__ for the GPU specified.
Justin Lebaref1aaac2016-07-06 21:21:14 +00001866 std::string CUDAArchCode = [this] {
1867 switch (GPU) {
Simon Pilgrim13dff572016-07-07 22:32:26 +00001868 case CudaArch::UNKNOWN:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001869 assert(false && "No GPU arch when compiling CUDA device code.");
1870 return "";
Justin Lebar62907612016-07-06 21:21:39 +00001871 case CudaArch::SM_20:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001872 return "200";
Justin Lebar62907612016-07-06 21:21:39 +00001873 case CudaArch::SM_21:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001874 return "210";
Justin Lebar62907612016-07-06 21:21:39 +00001875 case CudaArch::SM_30:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001876 return "300";
Justin Lebar62907612016-07-06 21:21:39 +00001877 case CudaArch::SM_32:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001878 return "320";
Justin Lebar62907612016-07-06 21:21:39 +00001879 case CudaArch::SM_35:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001880 return "350";
Justin Lebar62907612016-07-06 21:21:39 +00001881 case CudaArch::SM_37:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001882 return "370";
Justin Lebar62907612016-07-06 21:21:39 +00001883 case CudaArch::SM_50:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001884 return "500";
Justin Lebar62907612016-07-06 21:21:39 +00001885 case CudaArch::SM_52:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001886 return "520";
Justin Lebar62907612016-07-06 21:21:39 +00001887 case CudaArch::SM_53:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001888 return "530";
Justin Lebar62907612016-07-06 21:21:39 +00001889 case CudaArch::SM_60:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001890 return "600";
Justin Lebar62907612016-07-06 21:21:39 +00001891 case CudaArch::SM_61:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001892 return "610";
Justin Lebar62907612016-07-06 21:21:39 +00001893 case CudaArch::SM_62:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001894 return "620";
1895 }
Simon Pilgrim13dff572016-07-07 22:32:26 +00001896 llvm_unreachable("unhandled CudaArch");
Justin Lebaref1aaac2016-07-06 21:21:14 +00001897 }();
Eric Christopherc48497a2015-09-18 21:26:24 +00001898 Builder.defineMacro("__CUDA_ARCH__", CUDAArchCode);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001899 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001900 }
Craig Topper6c03a542015-10-19 04:51:35 +00001901 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
1902 return llvm::makeArrayRef(BuiltinInfo,
1903 clang::NVPTX::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eric Christopherc48497a2015-09-18 21:26:24 +00001904 }
Artem Belevichfda99052016-09-28 17:47:35 +00001905 bool
1906 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
1907 StringRef CPU,
1908 const std::vector<std::string> &FeaturesVec) const override {
1909 Features["satom"] = GPU >= CudaArch::SM_60;
1910 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
1911 }
1912
Eric Christopherc48497a2015-09-18 21:26:24 +00001913 bool hasFeature(StringRef Feature) const override {
Artem Belevichfda99052016-09-28 17:47:35 +00001914 return llvm::StringSwitch<bool>(Feature)
1915 .Cases("ptx", "nvptx", true)
1916 .Case("satom", GPU >= CudaArch::SM_60) // Atomics w/ scope.
1917 .Default(false);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001918 }
1919
Craig Topperf054e3a2015-10-19 03:52:27 +00001920 ArrayRef<const char *> getGCCRegNames() const override;
1921 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00001922 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00001923 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00001924 }
1925 bool validateAsmConstraint(const char *&Name,
1926 TargetInfo::ConstraintInfo &Info) const override {
1927 switch (*Name) {
1928 default:
1929 return false;
1930 case 'c':
1931 case 'h':
1932 case 'r':
1933 case 'l':
1934 case 'f':
1935 case 'd':
1936 Info.setAllowsRegister();
1937 return true;
Eli Bendersky13467172015-04-01 20:29:18 +00001938 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001939 }
1940 const char *getClobbers() const override {
1941 // FIXME: Is this really right?
1942 return "";
1943 }
1944 BuiltinVaListKind getBuiltinVaListKind() const override {
1945 // FIXME: implement
1946 return TargetInfo::CharPtrBuiltinVaList;
1947 }
1948 bool setCPU(const std::string &Name) override {
Justin Lebar62907612016-07-06 21:21:39 +00001949 GPU = StringToCudaArch(Name);
1950 return GPU != CudaArch::UNKNOWN;
Eric Christopherc48497a2015-09-18 21:26:24 +00001951 }
Jan Vesely9674bd42016-06-17 19:02:14 +00001952 void setSupportedOpenCLOpts() override {
1953 auto &Opts = getSupportedOpenCLOpts();
Yaxun Liu5b746652016-12-18 05:18:55 +00001954 Opts.support("cl_clang_storage_class_specifiers");
1955 Opts.support("cl_khr_gl_sharing");
1956 Opts.support("cl_khr_icd");
Jan Vesely9674bd42016-06-17 19:02:14 +00001957
Yaxun Liu5b746652016-12-18 05:18:55 +00001958 Opts.support("cl_khr_fp64");
1959 Opts.support("cl_khr_byte_addressable_store");
1960 Opts.support("cl_khr_global_int32_base_atomics");
1961 Opts.support("cl_khr_global_int32_extended_atomics");
1962 Opts.support("cl_khr_local_int32_base_atomics");
1963 Opts.support("cl_khr_local_int32_extended_atomics");
Jan Vesely9674bd42016-06-17 19:02:14 +00001964 }
Justin Lebar86c4e632017-01-05 16:53:38 +00001965
1966 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
1967 // CUDA compilations support all of the host's calling conventions.
1968 //
1969 // TODO: We should warn if you apply a non-default CC to anything other than
1970 // a host function.
1971 if (HostTarget)
1972 return HostTarget->checkCallingConvention(CC);
1973 return CCCR_Warning;
1974 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001975};
1976
1977const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1978#define BUILTIN(ID, TYPE, ATTRS) \
1979 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1980#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1981 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Artem Belevichfda99052016-09-28 17:47:35 +00001982#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
1983 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Eric Christopherc48497a2015-09-18 21:26:24 +00001984#include "clang/Basic/BuiltinsNVPTX.def"
1985};
1986
1987const char *const NVPTXTargetInfo::GCCRegNames[] = {"r0"};
1988
Craig Topperf054e3a2015-10-19 03:52:27 +00001989ArrayRef<const char *> NVPTXTargetInfo::getGCCRegNames() const {
1990 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00001991}
1992
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001993static const unsigned AMDGPUAddrSpaceMap[] = {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001994 1, // opencl_global
1995 3, // opencl_local
1996 2, // opencl_constant
Matt Arsenaultbfe25b22014-12-01 16:46:03 +00001997 4, // opencl_generic
Eli Friedmand13b41e2012-10-12 23:32:00 +00001998 1, // cuda_device
1999 2, // cuda_constant
2000 3 // cuda_shared
2001};
2002
Tom Stellarda96344b2014-08-21 13:58:40 +00002003// If you edit the description strings, make sure you update
2004// getPointerWidthV().
2005
Craig Topper273dbc62015-10-18 05:29:26 +00002006static const char *const DataLayoutStringR600 =
Rafael Espindola29db13a2014-01-03 18:13:17 +00002007 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
2008 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00002009
Craig Topper273dbc62015-10-18 05:29:26 +00002010static const char *const DataLayoutStringSI =
Matt Arsenault6dc455f2016-05-31 16:58:18 +00002011 "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 +00002012 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
2013 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00002014
Matt Arsenault250024f2016-06-08 01:56:42 +00002015class AMDGPUTargetInfo final : public TargetInfo {
Matt Arsenault56f008d2014-06-24 20:45:01 +00002016 static const Builtin::Info BuiltinInfo[];
Tom Stellard7b1059b2015-04-14 14:36:56 +00002017 static const char * const GCCRegNames[];
Matt Arsenault56f008d2014-06-24 20:45:01 +00002018
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002019 /// \brief The GPU profiles supported by the AMDGPU target.
Tom Stellardc74b1e02013-03-04 17:40:53 +00002020 enum GPUKind {
2021 GK_NONE,
2022 GK_R600,
2023 GK_R600_DOUBLE_OPS,
2024 GK_R700,
2025 GK_R700_DOUBLE_OPS,
2026 GK_EVERGREEN,
2027 GK_EVERGREEN_DOUBLE_OPS,
2028 GK_NORTHERN_ISLANDS,
2029 GK_CAYMAN,
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002030 GK_GFX6,
2031 GK_GFX7,
2032 GK_GFX8
Tom Stellardc74b1e02013-03-04 17:40:53 +00002033 } GPU;
2034
Jan Veselyeebeaea2015-05-04 19:53:36 +00002035 bool hasFP64:1;
2036 bool hasFMAF:1;
2037 bool hasLDEXPF:1;
Yaxun Liud3e85b92016-09-13 17:37:09 +00002038 bool hasFullSpeedFP32Denorms:1;
Jan Veselya3abd6d2015-05-01 17:38:13 +00002039
Matt Arsenault250024f2016-06-08 01:56:42 +00002040 static bool isAMDGCN(const llvm::Triple &TT) {
2041 return TT.getArch() == llvm::Triple::amdgcn;
2042 }
2043
Eli Friedmand13b41e2012-10-12 23:32:00 +00002044public:
Yaxun Liu2c17e822016-08-09 19:43:38 +00002045 AMDGPUTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Matt Arsenault250024f2016-06-08 01:56:42 +00002046 : TargetInfo(Triple) ,
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002047 GPU(isAMDGCN(Triple) ? GK_GFX6 : GK_R600),
Matt Arsenault250024f2016-06-08 01:56:42 +00002048 hasFP64(false),
2049 hasFMAF(false),
Yaxun Liu2c17e822016-08-09 19:43:38 +00002050 hasLDEXPF(false),
Yaxun Liud3e85b92016-09-13 17:37:09 +00002051 hasFullSpeedFP32Denorms(false){
Matt Arsenault250024f2016-06-08 01:56:42 +00002052 if (getTriple().getArch() == llvm::Triple::amdgcn) {
Jan Veselya3abd6d2015-05-01 17:38:13 +00002053 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00002054 hasFMAF = true;
2055 hasLDEXPF = true;
Tom Stellardd99fb952015-01-28 15:38:44 +00002056 }
Matt Arsenault250024f2016-06-08 01:56:42 +00002057
2058 resetDataLayout(getTriple().getArch() == llvm::Triple::amdgcn ?
2059 DataLayoutStringSI : DataLayoutStringR600);
2060
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002061 AddrSpaceMap = &AMDGPUAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00002062 UseAddrSpaceMapMangling = true;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002063 }
2064
Tom Stellarda96344b2014-08-21 13:58:40 +00002065 uint64_t getPointerWidthV(unsigned AddrSpace) const override {
2066 if (GPU <= GK_CAYMAN)
2067 return 32;
2068
2069 switch(AddrSpace) {
2070 default:
2071 return 64;
2072 case 0:
2073 case 3:
2074 case 5:
2075 return 32;
2076 }
2077 }
2078
Yaxun Liu26f75662016-08-19 05:17:25 +00002079 uint64_t getMaxPointerWidth() const override {
2080 return getTriple().getArch() == llvm::Triple::amdgcn ? 64 : 32;
2081 }
2082
Craig Topper3164f332014-03-11 03:39:26 +00002083 const char * getClobbers() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00002084 return "";
2085 }
2086
Craig Topperf054e3a2015-10-19 03:52:27 +00002087 ArrayRef<const char *> getGCCRegNames() const override;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002088
Craig Topperf054e3a2015-10-19 03:52:27 +00002089 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
2090 return None;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002091 }
2092
Craig Topper3164f332014-03-11 03:39:26 +00002093 bool validateAsmConstraint(const char *&Name,
Tom Stellardd097e942015-11-19 22:11:58 +00002094 TargetInfo::ConstraintInfo &Info) const override {
2095 switch (*Name) {
2096 default: break;
2097 case 'v': // vgpr
2098 case 's': // sgpr
2099 Info.setAllowsRegister();
2100 return true;
2101 }
2102 return false;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002103 }
2104
Matt Arsenault250024f2016-06-08 01:56:42 +00002105 bool initFeatureMap(llvm::StringMap<bool> &Features,
2106 DiagnosticsEngine &Diags, StringRef CPU,
2107 const std::vector<std::string> &FeatureVec) const override;
2108
Yaxun Liu2c17e822016-08-09 19:43:38 +00002109 void adjustTargetOptions(const CodeGenOptions &CGOpts,
2110 TargetOptions &TargetOpts) const override {
Yaxun Liu2c17e822016-08-09 19:43:38 +00002111 bool hasFP32Denormals = false;
2112 bool hasFP64Denormals = false;
2113 for (auto &I : TargetOpts.FeaturesAsWritten) {
2114 if (I == "+fp32-denormals" || I == "-fp32-denormals")
2115 hasFP32Denormals = true;
Matt Arsenault09cca092017-01-23 22:31:14 +00002116 if (I == "+fp64-fp16-denormals" || I == "-fp64-fp16-denormals")
Yaxun Liu2c17e822016-08-09 19:43:38 +00002117 hasFP64Denormals = true;
2118 }
2119 if (!hasFP32Denormals)
Yaxun Liud3e85b92016-09-13 17:37:09 +00002120 TargetOpts.Features.push_back((Twine(hasFullSpeedFP32Denorms &&
2121 !CGOpts.FlushDenorm ? '+' : '-') + Twine("fp32-denormals")).str());
Matt Arsenault09cca092017-01-23 22:31:14 +00002122 // Always do not flush fp64 or fp16 denorms.
Yaxun Liu2c17e822016-08-09 19:43:38 +00002123 if (!hasFP64Denormals && hasFP64)
Matt Arsenault09cca092017-01-23 22:31:14 +00002124 TargetOpts.Features.push_back("+fp64-fp16-denormals");
Yaxun Liu2c17e822016-08-09 19:43:38 +00002125 }
2126
Craig Topper6c03a542015-10-19 04:51:35 +00002127 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
2128 return llvm::makeArrayRef(BuiltinInfo,
2129 clang::AMDGPU::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eli Friedmand13b41e2012-10-12 23:32:00 +00002130 }
2131
Craig Topper3164f332014-03-11 03:39:26 +00002132 void getTargetDefines(const LangOptions &Opts,
2133 MacroBuilder &Builder) const override {
Matt Arsenault5e020b22016-02-27 09:06:26 +00002134 if (getTriple().getArch() == llvm::Triple::amdgcn)
2135 Builder.defineMacro("__AMDGCN__");
2136 else
2137 Builder.defineMacro("__R600__");
2138
Jan Veselyeebeaea2015-05-04 19:53:36 +00002139 if (hasFMAF)
2140 Builder.defineMacro("__HAS_FMAF__");
2141 if (hasLDEXPF)
2142 Builder.defineMacro("__HAS_LDEXPF__");
Jan Vesely211ba782016-06-17 02:25:03 +00002143 if (hasFP64)
2144 Builder.defineMacro("__HAS_FP64__");
Eli Friedmand13b41e2012-10-12 23:32:00 +00002145 }
2146
Craig Topper3164f332014-03-11 03:39:26 +00002147 BuiltinVaListKind getBuiltinVaListKind() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00002148 return TargetInfo::CharPtrBuiltinVaList;
2149 }
2150
Matt Arsenault250024f2016-06-08 01:56:42 +00002151 static GPUKind parseR600Name(StringRef Name) {
2152 return llvm::StringSwitch<GPUKind>(Name)
Tom Stellardc74b1e02013-03-04 17:40:53 +00002153 .Case("r600" , GK_R600)
2154 .Case("rv610", GK_R600)
2155 .Case("rv620", GK_R600)
2156 .Case("rv630", GK_R600)
2157 .Case("rv635", GK_R600)
2158 .Case("rs780", GK_R600)
2159 .Case("rs880", GK_R600)
2160 .Case("rv670", GK_R600_DOUBLE_OPS)
2161 .Case("rv710", GK_R700)
2162 .Case("rv730", GK_R700)
2163 .Case("rv740", GK_R700_DOUBLE_OPS)
2164 .Case("rv770", GK_R700_DOUBLE_OPS)
2165 .Case("palm", GK_EVERGREEN)
2166 .Case("cedar", GK_EVERGREEN)
2167 .Case("sumo", GK_EVERGREEN)
2168 .Case("sumo2", GK_EVERGREEN)
2169 .Case("redwood", GK_EVERGREEN)
2170 .Case("juniper", GK_EVERGREEN)
2171 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
2172 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
2173 .Case("barts", GK_NORTHERN_ISLANDS)
2174 .Case("turks", GK_NORTHERN_ISLANDS)
2175 .Case("caicos", GK_NORTHERN_ISLANDS)
2176 .Case("cayman", GK_CAYMAN)
2177 .Case("aruba", GK_CAYMAN)
Matt Arsenault250024f2016-06-08 01:56:42 +00002178 .Default(GK_NONE);
2179 }
2180
2181 static GPUKind parseAMDGCNName(StringRef Name) {
2182 return llvm::StringSwitch<GPUKind>(Name)
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002183 .Case("tahiti", GK_GFX6)
2184 .Case("pitcairn", GK_GFX6)
2185 .Case("verde", GK_GFX6)
2186 .Case("oland", GK_GFX6)
2187 .Case("hainan", GK_GFX6)
2188 .Case("bonaire", GK_GFX7)
2189 .Case("kabini", GK_GFX7)
2190 .Case("kaveri", GK_GFX7)
2191 .Case("hawaii", GK_GFX7)
2192 .Case("mullins", GK_GFX7)
Yaxun Liue59a0bc2016-10-26 16:40:21 +00002193 .Case("gfx700", GK_GFX7)
2194 .Case("gfx701", GK_GFX7)
2195 .Case("gfx702", GK_GFX7)
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002196 .Case("tonga", GK_GFX8)
2197 .Case("iceland", GK_GFX8)
2198 .Case("carrizo", GK_GFX8)
2199 .Case("fiji", GK_GFX8)
2200 .Case("stoney", GK_GFX8)
2201 .Case("polaris10", GK_GFX8)
2202 .Case("polaris11", GK_GFX8)
Yaxun Liue59a0bc2016-10-26 16:40:21 +00002203 .Case("gfx800", GK_GFX8)
2204 .Case("gfx801", GK_GFX8)
2205 .Case("gfx802", GK_GFX8)
2206 .Case("gfx803", GK_GFX8)
2207 .Case("gfx804", GK_GFX8)
2208 .Case("gfx810", GK_GFX8)
Tom Stellardc74b1e02013-03-04 17:40:53 +00002209 .Default(GK_NONE);
Matt Arsenault250024f2016-06-08 01:56:42 +00002210 }
Tom Stellardc74b1e02013-03-04 17:40:53 +00002211
Matt Arsenault250024f2016-06-08 01:56:42 +00002212 bool setCPU(const std::string &Name) override {
2213 if (getTriple().getArch() == llvm::Triple::amdgcn)
2214 GPU = parseAMDGCNName(Name);
2215 else
2216 GPU = parseR600Name(Name);
Tom Stellardc74b1e02013-03-04 17:40:53 +00002217
Matt Arsenault250024f2016-06-08 01:56:42 +00002218 return GPU != GK_NONE;
Tom Stellardc74b1e02013-03-04 17:40:53 +00002219 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002220
Jan Vesely211ba782016-06-17 02:25:03 +00002221 void setSupportedOpenCLOpts() override {
2222 auto &Opts = getSupportedOpenCLOpts();
Yaxun Liu5b746652016-12-18 05:18:55 +00002223 Opts.support("cl_clang_storage_class_specifiers");
2224 Opts.support("cl_khr_icd");
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002225
Jan Vesely211ba782016-06-17 02:25:03 +00002226 if (hasFP64)
Yaxun Liu5b746652016-12-18 05:18:55 +00002227 Opts.support("cl_khr_fp64");
Jan Vesely211ba782016-06-17 02:25:03 +00002228 if (GPU >= GK_EVERGREEN) {
Yaxun Liu5b746652016-12-18 05:18:55 +00002229 Opts.support("cl_khr_byte_addressable_store");
2230 Opts.support("cl_khr_global_int32_base_atomics");
2231 Opts.support("cl_khr_global_int32_extended_atomics");
2232 Opts.support("cl_khr_local_int32_base_atomics");
2233 Opts.support("cl_khr_local_int32_extended_atomics");
Jan Vesely211ba782016-06-17 02:25:03 +00002234 }
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002235 if (GPU >= GK_GFX6) {
Yaxun Liu5b746652016-12-18 05:18:55 +00002236 Opts.support("cl_khr_fp16");
2237 Opts.support("cl_khr_int64_base_atomics");
2238 Opts.support("cl_khr_int64_extended_atomics");
2239 Opts.support("cl_khr_mipmap_image");
2240 Opts.support("cl_khr_subgroups");
2241 Opts.support("cl_khr_3d_image_writes");
2242 Opts.support("cl_amd_media_ops");
2243 Opts.support("cl_amd_media_ops2");
Jan Vesely211ba782016-06-17 02:25:03 +00002244 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002245 }
Nikolay Haustov8c6538b2016-06-30 09:06:33 +00002246
Yaxun Liu99444cb2016-08-03 20:38:06 +00002247 LangAS::ID getOpenCLImageAddrSpace() const override {
2248 return LangAS::opencl_constant;
2249 }
2250
Nikolay Haustov8c6538b2016-06-30 09:06:33 +00002251 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
2252 switch (CC) {
2253 default:
2254 return CCCR_Warning;
2255 case CC_C:
2256 case CC_OpenCLKernel:
2257 return CCCR_OK;
2258 }
2259 }
Yaxun Liu402804b2016-12-15 08:09:08 +00002260
2261 // In amdgcn target the null pointer in global, constant, and generic
2262 // address space has value 0 but in private and local address space has
2263 // value ~0.
2264 uint64_t getNullPointerValue(unsigned AS) const override {
2265 return AS != LangAS::opencl_local && AS != 0 ? 0 : ~0;
2266 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00002267};
2268
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002269const Builtin::Info AMDGPUTargetInfo::BuiltinInfo[] = {
Matt Arsenault56f008d2014-06-24 20:45:01 +00002270#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00002271 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Matt Arsenault250024f2016-06-08 01:56:42 +00002272#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
2273 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002274#include "clang/Basic/BuiltinsAMDGPU.def"
Matt Arsenault56f008d2014-06-24 20:45:01 +00002275};
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002276const char * const AMDGPUTargetInfo::GCCRegNames[] = {
Tom Stellard7b1059b2015-04-14 14:36:56 +00002277 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
2278 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
2279 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
2280 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
2281 "v32", "v33", "v34", "v35", "v36", "v37", "v38", "v39",
2282 "v40", "v41", "v42", "v43", "v44", "v45", "v46", "v47",
2283 "v48", "v49", "v50", "v51", "v52", "v53", "v54", "v55",
2284 "v56", "v57", "v58", "v59", "v60", "v61", "v62", "v63",
2285 "v64", "v65", "v66", "v67", "v68", "v69", "v70", "v71",
2286 "v72", "v73", "v74", "v75", "v76", "v77", "v78", "v79",
2287 "v80", "v81", "v82", "v83", "v84", "v85", "v86", "v87",
2288 "v88", "v89", "v90", "v91", "v92", "v93", "v94", "v95",
2289 "v96", "v97", "v98", "v99", "v100", "v101", "v102", "v103",
2290 "v104", "v105", "v106", "v107", "v108", "v109", "v110", "v111",
2291 "v112", "v113", "v114", "v115", "v116", "v117", "v118", "v119",
2292 "v120", "v121", "v122", "v123", "v124", "v125", "v126", "v127",
2293 "v128", "v129", "v130", "v131", "v132", "v133", "v134", "v135",
2294 "v136", "v137", "v138", "v139", "v140", "v141", "v142", "v143",
2295 "v144", "v145", "v146", "v147", "v148", "v149", "v150", "v151",
2296 "v152", "v153", "v154", "v155", "v156", "v157", "v158", "v159",
2297 "v160", "v161", "v162", "v163", "v164", "v165", "v166", "v167",
2298 "v168", "v169", "v170", "v171", "v172", "v173", "v174", "v175",
2299 "v176", "v177", "v178", "v179", "v180", "v181", "v182", "v183",
2300 "v184", "v185", "v186", "v187", "v188", "v189", "v190", "v191",
2301 "v192", "v193", "v194", "v195", "v196", "v197", "v198", "v199",
2302 "v200", "v201", "v202", "v203", "v204", "v205", "v206", "v207",
2303 "v208", "v209", "v210", "v211", "v212", "v213", "v214", "v215",
2304 "v216", "v217", "v218", "v219", "v220", "v221", "v222", "v223",
2305 "v224", "v225", "v226", "v227", "v228", "v229", "v230", "v231",
2306 "v232", "v233", "v234", "v235", "v236", "v237", "v238", "v239",
2307 "v240", "v241", "v242", "v243", "v244", "v245", "v246", "v247",
2308 "v248", "v249", "v250", "v251", "v252", "v253", "v254", "v255",
2309 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
2310 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
2311 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
2312 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
2313 "s32", "s33", "s34", "s35", "s36", "s37", "s38", "s39",
2314 "s40", "s41", "s42", "s43", "s44", "s45", "s46", "s47",
2315 "s48", "s49", "s50", "s51", "s52", "s53", "s54", "s55",
2316 "s56", "s57", "s58", "s59", "s60", "s61", "s62", "s63",
2317 "s64", "s65", "s66", "s67", "s68", "s69", "s70", "s71",
2318 "s72", "s73", "s74", "s75", "s76", "s77", "s78", "s79",
2319 "s80", "s81", "s82", "s83", "s84", "s85", "s86", "s87",
2320 "s88", "s89", "s90", "s91", "s92", "s93", "s94", "s95",
2321 "s96", "s97", "s98", "s99", "s100", "s101", "s102", "s103",
2322 "s104", "s105", "s106", "s107", "s108", "s109", "s110", "s111",
2323 "s112", "s113", "s114", "s115", "s116", "s117", "s118", "s119",
Etienne Bergerone8ae26f2016-03-24 18:29:24 +00002324 "s120", "s121", "s122", "s123", "s124", "s125", "s126", "s127",
Matt Arsenaultb015d622016-02-27 09:06:22 +00002325 "exec", "vcc", "scc", "m0", "flat_scratch", "exec_lo", "exec_hi",
2326 "vcc_lo", "vcc_hi", "flat_scratch_lo", "flat_scratch_hi"
Tom Stellard7b1059b2015-04-14 14:36:56 +00002327};
2328
Craig Topperf054e3a2015-10-19 03:52:27 +00002329ArrayRef<const char *> AMDGPUTargetInfo::getGCCRegNames() const {
2330 return llvm::makeArrayRef(GCCRegNames);
Tom Stellard7b1059b2015-04-14 14:36:56 +00002331}
Matt Arsenault56f008d2014-06-24 20:45:01 +00002332
Matt Arsenault250024f2016-06-08 01:56:42 +00002333bool AMDGPUTargetInfo::initFeatureMap(
2334 llvm::StringMap<bool> &Features,
2335 DiagnosticsEngine &Diags, StringRef CPU,
2336 const std::vector<std::string> &FeatureVec) const {
2337
2338 // XXX - What does the member GPU mean if device name string passed here?
2339 if (getTriple().getArch() == llvm::Triple::amdgcn) {
2340 if (CPU.empty())
2341 CPU = "tahiti";
2342
2343 switch (parseAMDGCNName(CPU)) {
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002344 case GK_GFX6:
2345 case GK_GFX7:
Matt Arsenault250024f2016-06-08 01:56:42 +00002346 break;
2347
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002348 case GK_GFX8:
Matt Arsenault250024f2016-06-08 01:56:42 +00002349 Features["s-memrealtime"] = true;
2350 Features["16-bit-insts"] = true;
2351 break;
2352
2353 case GK_NONE:
2354 return false;
2355 default:
2356 llvm_unreachable("unhandled subtarget");
2357 }
2358 } else {
2359 if (CPU.empty())
2360 CPU = "r600";
2361
2362 switch (parseR600Name(CPU)) {
2363 case GK_R600:
2364 case GK_R700:
2365 case GK_EVERGREEN:
2366 case GK_NORTHERN_ISLANDS:
2367 break;
2368 case GK_R600_DOUBLE_OPS:
2369 case GK_R700_DOUBLE_OPS:
2370 case GK_EVERGREEN_DOUBLE_OPS:
2371 case GK_CAYMAN:
2372 Features["fp64"] = true;
2373 break;
2374 case GK_NONE:
2375 return false;
2376 default:
2377 llvm_unreachable("unhandled subtarget");
2378 }
2379 }
2380
2381 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeatureVec);
2382}
2383
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00002384const Builtin::Info BuiltinInfoX86[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00002385#define BUILTIN(ID, TYPE, ATTRS) \
2386 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002387#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
Craig Topper07d3b622015-08-07 05:14:44 +00002388 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Albert Gutowski727ab8a2016-09-14 21:19:43 +00002389#define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANGS, FEATURE) \
2390 { #ID, TYPE, ATTRS, HEADER, LANGS, FEATURE },
Chris Lattner5abdec72009-06-14 01:05:48 +00002391#include "clang/Basic/BuiltinsX86.def"
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00002392
2393#define BUILTIN(ID, TYPE, ATTRS) \
2394 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Albert Gutowski0fd6e962016-10-12 17:28:44 +00002395#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
2396 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00002397#define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANGS, FEATURE) \
2398 { #ID, TYPE, ATTRS, HEADER, LANGS, FEATURE },
2399#include "clang/Basic/BuiltinsX86_64.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00002400};
Eli Friedmanb5366062008-05-20 14:21:01 +00002401
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00002402
Nuno Lopescfca1f02009-12-23 17:49:57 +00002403static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002404 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
2405 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00002406 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002407 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
2408 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
2409 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00002410 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00002411 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
2412 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Marina Yatsina41c45fa2016-02-03 11:32:08 +00002413 "xmm16", "xmm17", "xmm18", "xmm19", "xmm20", "xmm21", "xmm22", "xmm23",
2414 "xmm24", "xmm25", "xmm26", "xmm27", "xmm28", "xmm29", "xmm30", "xmm31",
2415 "ymm16", "ymm17", "ymm18", "ymm19", "ymm20", "ymm21", "ymm22", "ymm23",
2416 "ymm24", "ymm25", "ymm26", "ymm27", "ymm28", "ymm29", "ymm30", "ymm31",
2417 "zmm0", "zmm1", "zmm2", "zmm3", "zmm4", "zmm5", "zmm6", "zmm7",
2418 "zmm8", "zmm9", "zmm10", "zmm11", "zmm12", "zmm13", "zmm14", "zmm15",
2419 "zmm16", "zmm17", "zmm18", "zmm19", "zmm20", "zmm21", "zmm22", "zmm23",
2420 "zmm24", "zmm25", "zmm26", "zmm27", "zmm28", "zmm29", "zmm30", "zmm31",
Michael Zuckerman15604b92016-10-31 14:16:57 +00002421 "k0", "k1", "k2", "k3", "k4", "k5", "k6", "k7",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002422};
2423
Eric Christophercdd36352011-06-21 00:05:20 +00002424const TargetInfo::AddlRegName AddlRegNames[] = {
2425 { { "al", "ah", "eax", "rax" }, 0 },
2426 { { "bl", "bh", "ebx", "rbx" }, 3 },
2427 { { "cl", "ch", "ecx", "rcx" }, 2 },
2428 { { "dl", "dh", "edx", "rdx" }, 1 },
2429 { { "esi", "rsi" }, 4 },
2430 { { "edi", "rdi" }, 5 },
2431 { { "esp", "rsp" }, 7 },
2432 { { "ebp", "rbp" }, 6 },
Alexey Bataeva7ab1b42015-09-04 03:42:23 +00002433 { { "r8d", "r8w", "r8b" }, 38 },
2434 { { "r9d", "r9w", "r9b" }, 39 },
2435 { { "r10d", "r10w", "r10b" }, 40 },
2436 { { "r11d", "r11w", "r11b" }, 41 },
2437 { { "r12d", "r12w", "r12b" }, 42 },
2438 { { "r13d", "r13w", "r13b" }, 43 },
2439 { { "r14d", "r14w", "r14b" }, 44 },
2440 { { "r15d", "r15w", "r15b" }, 45 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00002441};
2442
2443// X86 target abstract base class; x86-32 and x86-64 are very close, so
2444// most of the implementation can be shared.
2445class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00002446 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002447 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Craig Topper543f3bd2015-10-14 23:47:57 +00002448 } SSELevel = NoSSE;
Eli Friedman33465822011-07-08 23:31:17 +00002449 enum MMX3DNowEnum {
2450 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
Craig Topper543f3bd2015-10-14 23:47:57 +00002451 } MMX3DNowLevel = NoMMX3DNow;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002452 enum XOPEnum {
2453 NoXOP,
2454 SSE4A,
2455 FMA4,
2456 XOP
Craig Topper543f3bd2015-10-14 23:47:57 +00002457 } XOPLevel = NoXOP;
Anders Carlssone437c682010-01-27 03:47:49 +00002458
Craig Topper543f3bd2015-10-14 23:47:57 +00002459 bool HasAES = false;
2460 bool HasPCLMUL = false;
2461 bool HasLZCNT = false;
2462 bool HasRDRND = false;
2463 bool HasFSGSBASE = false;
2464 bool HasBMI = false;
2465 bool HasBMI2 = false;
2466 bool HasPOPCNT = false;
2467 bool HasRTM = false;
2468 bool HasPRFCHW = false;
2469 bool HasRDSEED = false;
2470 bool HasADX = false;
2471 bool HasTBM = false;
2472 bool HasFMA = false;
2473 bool HasF16C = false;
2474 bool HasAVX512CD = false;
2475 bool HasAVX512ER = false;
2476 bool HasAVX512PF = false;
2477 bool HasAVX512DQ = false;
2478 bool HasAVX512BW = false;
2479 bool HasAVX512VL = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002480 bool HasAVX512VBMI = false;
2481 bool HasAVX512IFMA = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002482 bool HasSHA = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002483 bool HasMPX = false;
2484 bool HasSGX = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002485 bool HasCX16 = false;
Craig Toppere33f51f2015-10-16 06:22:36 +00002486 bool HasFXSR = false;
Craig Topperda9fe562015-10-15 05:23:38 +00002487 bool HasXSAVE = false;
2488 bool HasXSAVEOPT = false;
2489 bool HasXSAVEC = false;
2490 bool HasXSAVES = false;
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00002491 bool HasMWAITX = false;
Craig Topper45742262017-02-09 06:10:14 +00002492 bool HasCLZERO = false;
Asaf Badouha9d1e182015-12-31 14:14:07 +00002493 bool HasPKU = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002494 bool HasCLFLUSHOPT = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002495 bool HasCLWB = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002496 bool HasMOVBE = false;
2497 bool HasPREFETCHWT1 = false;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00002498
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002499 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
2500 ///
2501 /// Each enumeration represents a particular CPU supported by Clang. These
2502 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
2503 enum CPUKind {
2504 CK_Generic,
2505
2506 /// \name i386
2507 /// i386-generation processors.
2508 //@{
2509 CK_i386,
2510 //@}
2511
2512 /// \name i486
2513 /// i486-generation processors.
2514 //@{
2515 CK_i486,
2516 CK_WinChipC6,
2517 CK_WinChip2,
2518 CK_C3,
2519 //@}
2520
2521 /// \name i586
2522 /// i586-generation processors, P5 microarchitecture based.
2523 //@{
2524 CK_i586,
2525 CK_Pentium,
2526 CK_PentiumMMX,
2527 //@}
2528
2529 /// \name i686
2530 /// i686-generation processors, P6 / Pentium M microarchitecture based.
2531 //@{
2532 CK_i686,
2533 CK_PentiumPro,
2534 CK_Pentium2,
2535 CK_Pentium3,
2536 CK_Pentium3M,
2537 CK_PentiumM,
2538 CK_C3_2,
2539
2540 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
2541 /// Clang however has some logic to suport this.
2542 // FIXME: Warn, deprecate, and potentially remove this.
2543 CK_Yonah,
2544 //@}
2545
2546 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00002547 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002548 //@{
2549 CK_Pentium4,
2550 CK_Pentium4M,
2551 CK_Prescott,
2552 CK_Nocona,
2553 //@}
2554
2555 /// \name Core
2556 /// Core microarchitecture based processors.
2557 //@{
2558 CK_Core2,
2559
2560 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
2561 /// codename which GCC no longer accepts as an option to -march, but Clang
2562 /// has some logic for recognizing it.
2563 // FIXME: Warn, deprecate, and potentially remove this.
2564 CK_Penryn,
2565 //@}
2566
2567 /// \name Atom
2568 /// Atom processors
2569 //@{
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002570 CK_Bonnell,
Preston Gurda3c58c02013-09-13 19:27:17 +00002571 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002572 //@}
2573
2574 /// \name Nehalem
2575 /// Nehalem microarchitecture based processors.
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002576 CK_Nehalem,
2577
2578 /// \name Westmere
2579 /// Westmere microarchitecture based processors.
2580 CK_Westmere,
2581
2582 /// \name Sandy Bridge
2583 /// Sandy Bridge microarchitecture based processors.
2584 CK_SandyBridge,
2585
2586 /// \name Ivy Bridge
2587 /// Ivy Bridge microarchitecture based processors.
2588 CK_IvyBridge,
2589
2590 /// \name Haswell
2591 /// Haswell microarchitecture based processors.
2592 CK_Haswell,
2593
2594 /// \name Broadwell
2595 /// Broadwell microarchitecture based processors.
Robert Khasanov50e6f582014-09-19 09:53:48 +00002596 CK_Broadwell,
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002597
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002598 /// \name Skylake Client
2599 /// Skylake client microarchitecture based processors.
2600 CK_SkylakeClient,
2601
2602 /// \name Skylake Server
2603 /// Skylake server microarchitecture based processors.
2604 CK_SkylakeServer,
2605
2606 /// \name Cannonlake Client
2607 /// Cannonlake client microarchitecture based processors.
2608 CK_Cannonlake,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002609
Craig Topper449314e2013-08-20 07:09:39 +00002610 /// \name Knights Landing
2611 /// Knights Landing processor.
2612 CK_KNL,
2613
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002614 /// \name Lakemont
2615 /// Lakemont microarchitecture based processors.
2616 CK_Lakemont,
2617
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002618 /// \name K6
2619 /// K6 architecture processors.
2620 //@{
2621 CK_K6,
2622 CK_K6_2,
2623 CK_K6_3,
2624 //@}
2625
2626 /// \name K7
2627 /// K7 architecture processors.
2628 //@{
2629 CK_Athlon,
2630 CK_AthlonThunderbird,
2631 CK_Athlon4,
2632 CK_AthlonXP,
2633 CK_AthlonMP,
2634 //@}
2635
2636 /// \name K8
2637 /// K8 architecture processors.
2638 //@{
2639 CK_Athlon64,
2640 CK_Athlon64SSE3,
2641 CK_AthlonFX,
2642 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00002643 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002644 CK_Opteron,
2645 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00002646 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002647 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002648
Benjamin Kramer569f2152012-01-10 11:50:18 +00002649 /// \name Bobcat
2650 /// Bobcat architecture processors.
2651 //@{
2652 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002653 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002654 //@}
2655
2656 /// \name Bulldozer
2657 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002658 //@{
2659 CK_BDVER1,
2660 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002661 CK_BDVER3,
Benjamin Kramer56c58222014-05-02 15:47:51 +00002662 CK_BDVER4,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002663 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002664
Craig Topperc45744a2017-01-10 06:02:12 +00002665 /// \name zen
2666 /// Zen architecture processors.
2667 //@{
2668 CK_ZNVER1,
2669 //@}
2670
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002671 /// This specification is deprecated and will be removed in the future.
2672 /// Users should prefer \see CK_K8.
2673 // FIXME: Warn on this when the CPU is set to it.
Saleem Abdulrasoolcb29c1a2014-11-17 18:40:15 +00002674 //@{
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002675 CK_x86_64,
2676 //@}
2677
2678 /// \name Geode
2679 /// Geode processors.
2680 //@{
2681 CK_Geode
2682 //@}
Craig Topper543f3bd2015-10-14 23:47:57 +00002683 } CPU = CK_Generic;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002684
Eric Christopherc50738f2015-08-27 00:05:50 +00002685 CPUKind getCPUKind(StringRef CPU) const {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002686 return llvm::StringSwitch<CPUKind>(CPU)
2687 .Case("i386", CK_i386)
2688 .Case("i486", CK_i486)
2689 .Case("winchip-c6", CK_WinChipC6)
2690 .Case("winchip2", CK_WinChip2)
2691 .Case("c3", CK_C3)
2692 .Case("i586", CK_i586)
2693 .Case("pentium", CK_Pentium)
2694 .Case("pentium-mmx", CK_PentiumMMX)
2695 .Case("i686", CK_i686)
2696 .Case("pentiumpro", CK_PentiumPro)
2697 .Case("pentium2", CK_Pentium2)
2698 .Case("pentium3", CK_Pentium3)
2699 .Case("pentium3m", CK_Pentium3M)
2700 .Case("pentium-m", CK_PentiumM)
2701 .Case("c3-2", CK_C3_2)
2702 .Case("yonah", CK_Yonah)
2703 .Case("pentium4", CK_Pentium4)
2704 .Case("pentium4m", CK_Pentium4M)
2705 .Case("prescott", CK_Prescott)
2706 .Case("nocona", CK_Nocona)
2707 .Case("core2", CK_Core2)
2708 .Case("penryn", CK_Penryn)
2709 .Case("bonnell", CK_Bonnell)
2710 .Case("atom", CK_Bonnell) // Legacy name.
2711 .Case("silvermont", CK_Silvermont)
2712 .Case("slm", CK_Silvermont) // Legacy name.
2713 .Case("nehalem", CK_Nehalem)
2714 .Case("corei7", CK_Nehalem) // Legacy name.
2715 .Case("westmere", CK_Westmere)
2716 .Case("sandybridge", CK_SandyBridge)
2717 .Case("corei7-avx", CK_SandyBridge) // Legacy name.
2718 .Case("ivybridge", CK_IvyBridge)
2719 .Case("core-avx-i", CK_IvyBridge) // Legacy name.
2720 .Case("haswell", CK_Haswell)
2721 .Case("core-avx2", CK_Haswell) // Legacy name.
2722 .Case("broadwell", CK_Broadwell)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002723 .Case("skylake", CK_SkylakeClient)
2724 .Case("skylake-avx512", CK_SkylakeServer)
2725 .Case("skx", CK_SkylakeServer) // Legacy name.
2726 .Case("cannonlake", CK_Cannonlake)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002727 .Case("knl", CK_KNL)
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002728 .Case("lakemont", CK_Lakemont)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002729 .Case("k6", CK_K6)
2730 .Case("k6-2", CK_K6_2)
2731 .Case("k6-3", CK_K6_3)
2732 .Case("athlon", CK_Athlon)
2733 .Case("athlon-tbird", CK_AthlonThunderbird)
2734 .Case("athlon-4", CK_Athlon4)
2735 .Case("athlon-xp", CK_AthlonXP)
2736 .Case("athlon-mp", CK_AthlonMP)
2737 .Case("athlon64", CK_Athlon64)
2738 .Case("athlon64-sse3", CK_Athlon64SSE3)
2739 .Case("athlon-fx", CK_AthlonFX)
2740 .Case("k8", CK_K8)
2741 .Case("k8-sse3", CK_K8SSE3)
2742 .Case("opteron", CK_Opteron)
2743 .Case("opteron-sse3", CK_OpteronSSE3)
2744 .Case("barcelona", CK_AMDFAM10)
2745 .Case("amdfam10", CK_AMDFAM10)
2746 .Case("btver1", CK_BTVER1)
2747 .Case("btver2", CK_BTVER2)
2748 .Case("bdver1", CK_BDVER1)
2749 .Case("bdver2", CK_BDVER2)
2750 .Case("bdver3", CK_BDVER3)
2751 .Case("bdver4", CK_BDVER4)
Craig Topperc45744a2017-01-10 06:02:12 +00002752 .Case("znver1", CK_ZNVER1)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002753 .Case("x86-64", CK_x86_64)
2754 .Case("geode", CK_Geode)
2755 .Default(CK_Generic);
2756 }
2757
Rafael Espindolaeb265472013-08-21 21:59:03 +00002758 enum FPMathKind {
2759 FP_Default,
2760 FP_SSE,
2761 FP_387
Craig Topper543f3bd2015-10-14 23:47:57 +00002762 } FPMath = FP_Default;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002763
Eli Friedman3fd920a2008-08-20 02:34:37 +00002764public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00002765 X86TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
2766 : TargetInfo(Triple) {
Stephan Bergmann17c7f702016-12-14 11:57:17 +00002767 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended();
Chris Lattner1f5ad112006-10-14 18:32:12 +00002768 }
Craig Topper3164f332014-03-11 03:39:26 +00002769 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00002770 // X87 evaluates with 80 bits "long double" precision.
2771 return SSELevel == NoSSE ? 2 : 0;
2772 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002773 ArrayRef<const char *> getGCCRegNames() const override {
2774 return llvm::makeArrayRef(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00002775 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002776 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
2777 return None;
Eric Christophercdd36352011-06-21 00:05:20 +00002778 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002779 ArrayRef<TargetInfo::AddlRegName> getGCCAddlRegNames() const override {
2780 return llvm::makeArrayRef(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00002781 }
Eric Christopherd9832702015-06-29 21:00:05 +00002782 bool validateCpuSupports(StringRef Name) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002783 bool validateAsmConstraint(const char *&Name,
Eric Christopher917e9522014-11-18 22:36:15 +00002784 TargetInfo::ConstraintInfo &info) const override;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002785
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00002786 bool validateGlobalRegisterVariable(StringRef RegName,
2787 unsigned RegSize,
2788 bool &HasSizeMismatch) const override {
2789 // esp and ebp are the only 32-bit registers the x86 backend can currently
2790 // handle.
2791 if (RegName.equals("esp") || RegName.equals("ebp")) {
2792 // Check that the register size is 32-bit.
2793 HasSizeMismatch = RegSize != 32;
2794 return true;
2795 }
2796
2797 return false;
2798 }
2799
Akira Hatanaka974131e2014-09-18 18:17:18 +00002800 bool validateOutputSize(StringRef Constraint, unsigned Size) const override;
2801
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002802 bool validateInputSize(StringRef Constraint, unsigned Size) const override;
2803
Akira Hatanaka974131e2014-09-18 18:17:18 +00002804 virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const;
2805
Craig Topper3164f332014-03-11 03:39:26 +00002806 std::string convertConstraint(const char *&Constraint) const override;
2807 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002808 return "~{dirflag},~{fpsr},~{flags}";
2809 }
Marina Yatsinac42fd032016-12-26 12:23:42 +00002810
2811 StringRef getConstraintRegister(const StringRef &Constraint,
2812 const StringRef &Expression) const override {
2813 StringRef::iterator I, E;
2814 for (I = Constraint.begin(), E = Constraint.end(); I != E; ++I) {
2815 if (isalpha(*I))
2816 break;
2817 }
2818 if (I == E)
2819 return "";
2820 switch (*I) {
2821 // For the register constraints, return the matching register name
2822 case 'a':
2823 return "ax";
2824 case 'b':
2825 return "bx";
2826 case 'c':
2827 return "cx";
2828 case 'd':
2829 return "dx";
2830 case 'S':
2831 return "si";
2832 case 'D':
2833 return "di";
2834 // In case the constraint is 'r' we need to return Expression
2835 case 'r':
2836 return Expression;
2837 default:
2838 // Default value if there is no constraint for the register
2839 return "";
2840 }
2841 return "";
2842 }
2843
Craig Topper3164f332014-03-11 03:39:26 +00002844 void getTargetDefines(const LangOptions &Opts,
2845 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00002846 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
2847 bool Enabled);
2848 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
2849 bool Enabled);
2850 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
2851 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002852 void setFeatureEnabled(llvm::StringMap<bool> &Features,
2853 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00002854 setFeatureEnabledImpl(Features, Name, Enabled);
2855 }
2856 // This exists purely to cut down on the number of virtual calls in
Eric Christopheref1e2952015-08-28 02:13:58 +00002857 // initFeatureMap which calls this repeatedly.
Craig Topper86d79ef2013-09-17 04:51:29 +00002858 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2859 StringRef Name, bool Enabled);
Eric Christopher8c47b422015-10-09 18:39:55 +00002860 bool
2861 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
2862 StringRef CPU,
2863 const std::vector<std::string> &FeaturesVec) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002864 bool hasFeature(StringRef Feature) const override;
2865 bool handleTargetFeatures(std::vector<std::string> &Features,
2866 DiagnosticsEngine &Diags) override;
Alp Toker4925ba72014-06-07 23:30:42 +00002867 StringRef getABI() const override {
Ahmed Bougacha0b938282015-06-22 21:31:43 +00002868 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX512F)
2869 return "avx512";
Craig Topperd945d502015-10-20 00:00:17 +00002870 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002871 return "avx";
Craig Topperd945d502015-10-20 00:00:17 +00002872 if (getTriple().getArch() == llvm::Triple::x86 &&
Derek Schuffc7dd7222012-10-11 15:52:22 +00002873 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002874 return "no-mmx";
2875 return "";
Eli Friedman33465822011-07-08 23:31:17 +00002876 }
Craig Topper3164f332014-03-11 03:39:26 +00002877 bool setCPU(const std::string &Name) override {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002878 CPU = getCPUKind(Name);
Chandler Carruth212334f2011-09-28 08:55:37 +00002879
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002880 // Perform any per-CPU checks necessary to determine if this CPU is
2881 // acceptable.
2882 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
2883 // invalid without explaining *why*.
2884 switch (CPU) {
2885 case CK_Generic:
2886 // No processor selected!
2887 return false;
2888
2889 case CK_i386:
2890 case CK_i486:
2891 case CK_WinChipC6:
2892 case CK_WinChip2:
2893 case CK_C3:
2894 case CK_i586:
2895 case CK_Pentium:
2896 case CK_PentiumMMX:
2897 case CK_i686:
2898 case CK_PentiumPro:
2899 case CK_Pentium2:
2900 case CK_Pentium3:
2901 case CK_Pentium3M:
2902 case CK_PentiumM:
2903 case CK_Yonah:
2904 case CK_C3_2:
2905 case CK_Pentium4:
2906 case CK_Pentium4M:
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002907 case CK_Lakemont:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002908 case CK_Prescott:
2909 case CK_K6:
2910 case CK_K6_2:
2911 case CK_K6_3:
2912 case CK_Athlon:
2913 case CK_AthlonThunderbird:
2914 case CK_Athlon4:
2915 case CK_AthlonXP:
2916 case CK_AthlonMP:
2917 case CK_Geode:
2918 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002919 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002920 return false;
2921
2922 // Fallthrough
2923 case CK_Nocona:
2924 case CK_Core2:
2925 case CK_Penryn:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002926 case CK_Bonnell:
Preston Gurda3c58c02013-09-13 19:27:17 +00002927 case CK_Silvermont:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002928 case CK_Nehalem:
2929 case CK_Westmere:
2930 case CK_SandyBridge:
2931 case CK_IvyBridge:
2932 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002933 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002934 case CK_SkylakeClient:
2935 case CK_SkylakeServer:
2936 case CK_Cannonlake:
Craig Topper449314e2013-08-20 07:09:39 +00002937 case CK_KNL:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002938 case CK_Athlon64:
2939 case CK_Athlon64SSE3:
2940 case CK_AthlonFX:
2941 case CK_K8:
2942 case CK_K8SSE3:
2943 case CK_Opteron:
2944 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00002945 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00002946 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002947 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002948 case CK_BDVER1:
2949 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002950 case CK_BDVER3:
Benjamin Kramer56c58222014-05-02 15:47:51 +00002951 case CK_BDVER4:
Craig Topperc45744a2017-01-10 06:02:12 +00002952 case CK_ZNVER1:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002953 case CK_x86_64:
2954 return true;
2955 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00002956 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002957 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002958
Craig Topper3164f332014-03-11 03:39:26 +00002959 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002960
Craig Topper3164f332014-03-11 03:39:26 +00002961 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00002962 // Most of the non-ARM calling conventions are i386 conventions.
2963 switch (CC) {
2964 case CC_X86ThisCall:
2965 case CC_X86FastCall:
2966 case CC_X86StdCall:
2967 case CC_X86VectorCall:
Erich Keane757d3172016-11-02 18:29:35 +00002968 case CC_X86RegCall:
John McCall477f2bb2016-03-03 06:39:32 +00002969 case CC_C:
2970 case CC_Swift:
2971 case CC_X86Pascal:
2972 case CC_IntelOclBicc:
2973 return CCCR_OK;
2974 default:
2975 return CCCR_Warning;
2976 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002977 }
2978
Craig Topper3164f332014-03-11 03:39:26 +00002979 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00002980 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002981 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00002982
2983 bool hasSjLjLowering() const override {
2984 return true;
2985 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002986
2987 void setSupportedOpenCLOpts() override {
Yaxun Liu5b746652016-12-18 05:18:55 +00002988 getSupportedOpenCLOpts().supportAll();
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002989 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00002990};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002991
Rafael Espindolaeb265472013-08-21 21:59:03 +00002992bool X86TargetInfo::setFPMath(StringRef Name) {
2993 if (Name == "387") {
2994 FPMath = FP_387;
2995 return true;
2996 }
2997 if (Name == "sse") {
2998 FPMath = FP_SSE;
2999 return true;
3000 }
3001 return false;
3002}
3003
Eric Christopher007b0a02015-08-28 22:32:01 +00003004bool X86TargetInfo::initFeatureMap(
3005 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
Eric Christopher8c47b422015-10-09 18:39:55 +00003006 const std::vector<std::string> &FeaturesVec) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003007 // FIXME: This *really* should not be here.
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003008 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00003009 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00003010 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003011
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003012 const CPUKind Kind = getCPUKind(CPU);
Andrey Turetskiy5f1cf5f2016-03-23 11:15:10 +00003013
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003014 // Enable X87 for all X86 processors but Lakemont.
3015 if (Kind != CK_Lakemont)
3016 setFeatureEnabledImpl(Features, "x87", true);
3017
3018 switch (Kind) {
Chandler Carruth212334f2011-09-28 08:55:37 +00003019 case CK_Generic:
3020 case CK_i386:
3021 case CK_i486:
3022 case CK_i586:
3023 case CK_Pentium:
3024 case CK_i686:
3025 case CK_PentiumPro:
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003026 case CK_Lakemont:
Chandler Carruth212334f2011-09-28 08:55:37 +00003027 break;
3028 case CK_PentiumMMX:
3029 case CK_Pentium2:
Craig Topperdb4dc082014-11-06 05:52:19 +00003030 case CK_K6:
3031 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00003032 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003033 break;
3034 case CK_Pentium3:
3035 case CK_Pentium3M:
Craig Topperdb4dc082014-11-06 05:52:19 +00003036 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00003037 setFeatureEnabledImpl(Features, "sse", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003038 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003039 break;
3040 case CK_PentiumM:
3041 case CK_Pentium4:
3042 case CK_Pentium4M:
3043 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00003044 setFeatureEnabledImpl(Features, "sse2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003045 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003046 break;
3047 case CK_Yonah:
3048 case CK_Prescott:
3049 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00003050 setFeatureEnabledImpl(Features, "sse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003051 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003052 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003053 break;
3054 case CK_Core2:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003055 case CK_Bonnell:
Craig Topper86d79ef2013-09-17 04:51:29 +00003056 setFeatureEnabledImpl(Features, "ssse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003057 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003058 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003059 break;
3060 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00003061 setFeatureEnabledImpl(Features, "sse4.1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003062 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003063 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003064 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003065 case CK_Cannonlake:
3066 setFeatureEnabledImpl(Features, "avx512ifma", true);
3067 setFeatureEnabledImpl(Features, "avx512vbmi", true);
3068 setFeatureEnabledImpl(Features, "sha", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003069 LLVM_FALLTHROUGH;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003070 case CK_SkylakeServer:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003071 setFeatureEnabledImpl(Features, "avx512f", true);
3072 setFeatureEnabledImpl(Features, "avx512cd", true);
3073 setFeatureEnabledImpl(Features, "avx512dq", true);
3074 setFeatureEnabledImpl(Features, "avx512bw", true);
3075 setFeatureEnabledImpl(Features, "avx512vl", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003076 setFeatureEnabledImpl(Features, "pku", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003077 setFeatureEnabledImpl(Features, "clwb", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003078 LLVM_FALLTHROUGH;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003079 case CK_SkylakeClient:
Craig Topperda9fe562015-10-15 05:23:38 +00003080 setFeatureEnabledImpl(Features, "xsavec", true);
3081 setFeatureEnabledImpl(Features, "xsaves", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003082 setFeatureEnabledImpl(Features, "mpx", true);
3083 setFeatureEnabledImpl(Features, "sgx", true);
3084 setFeatureEnabledImpl(Features, "clflushopt", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003085 LLVM_FALLTHROUGH;
Craig Topperdb4dc082014-11-06 05:52:19 +00003086 case CK_Broadwell:
3087 setFeatureEnabledImpl(Features, "rdseed", true);
3088 setFeatureEnabledImpl(Features, "adx", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003089 LLVM_FALLTHROUGH;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003090 case CK_Haswell:
Craig Topperdb4dc082014-11-06 05:52:19 +00003091 setFeatureEnabledImpl(Features, "avx2", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003092 setFeatureEnabledImpl(Features, "lzcnt", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003093 setFeatureEnabledImpl(Features, "bmi", true);
3094 setFeatureEnabledImpl(Features, "bmi2", true);
3095 setFeatureEnabledImpl(Features, "rtm", true);
3096 setFeatureEnabledImpl(Features, "fma", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003097 setFeatureEnabledImpl(Features, "movbe", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003098 LLVM_FALLTHROUGH;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003099 case CK_IvyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00003100 setFeatureEnabledImpl(Features, "rdrnd", true);
3101 setFeatureEnabledImpl(Features, "f16c", true);
3102 setFeatureEnabledImpl(Features, "fsgsbase", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003103 LLVM_FALLTHROUGH;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003104 case CK_SandyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00003105 setFeatureEnabledImpl(Features, "avx", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003106 setFeatureEnabledImpl(Features, "xsave", true);
3107 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003108 LLVM_FALLTHROUGH;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003109 case CK_Westmere:
Craig Topperdb4dc082014-11-06 05:52:19 +00003110 case CK_Silvermont:
3111 setFeatureEnabledImpl(Features, "aes", true);
3112 setFeatureEnabledImpl(Features, "pclmul", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003113 LLVM_FALLTHROUGH;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003114 case CK_Nehalem:
Craig Topperdb4dc082014-11-06 05:52:19 +00003115 setFeatureEnabledImpl(Features, "sse4.2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003116 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00003117 setFeatureEnabledImpl(Features, "cx16", true);
3118 break;
3119 case CK_KNL:
3120 setFeatureEnabledImpl(Features, "avx512f", true);
3121 setFeatureEnabledImpl(Features, "avx512cd", true);
3122 setFeatureEnabledImpl(Features, "avx512er", true);
3123 setFeatureEnabledImpl(Features, "avx512pf", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003124 setFeatureEnabledImpl(Features, "prefetchwt1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003125 setFeatureEnabledImpl(Features, "fxsr", true);
Robert Khasanov50e6f582014-09-19 09:53:48 +00003126 setFeatureEnabledImpl(Features, "rdseed", true);
3127 setFeatureEnabledImpl(Features, "adx", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00003128 setFeatureEnabledImpl(Features, "lzcnt", true);
3129 setFeatureEnabledImpl(Features, "bmi", true);
3130 setFeatureEnabledImpl(Features, "bmi2", true);
3131 setFeatureEnabledImpl(Features, "rtm", true);
3132 setFeatureEnabledImpl(Features, "fma", true);
3133 setFeatureEnabledImpl(Features, "rdrnd", true);
3134 setFeatureEnabledImpl(Features, "f16c", true);
3135 setFeatureEnabledImpl(Features, "fsgsbase", true);
3136 setFeatureEnabledImpl(Features, "aes", true);
3137 setFeatureEnabledImpl(Features, "pclmul", true);
3138 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003139 setFeatureEnabledImpl(Features, "xsaveopt", true);
3140 setFeatureEnabledImpl(Features, "xsave", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003141 setFeatureEnabledImpl(Features, "movbe", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003142 break;
3143 case CK_K6_2:
3144 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00003145 case CK_WinChip2:
3146 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00003147 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003148 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00003149 case CK_Athlon:
3150 case CK_AthlonThunderbird:
3151 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00003152 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00003153 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003154 case CK_Athlon4:
3155 case CK_AthlonXP:
3156 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00003157 setFeatureEnabledImpl(Features, "sse", true);
3158 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003159 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003160 break;
3161 case CK_K8:
3162 case CK_Opteron:
3163 case CK_Athlon64:
3164 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00003165 setFeatureEnabledImpl(Features, "sse2", true);
3166 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003167 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003168 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00003169 case CK_AMDFAM10:
3170 setFeatureEnabledImpl(Features, "sse4a", true);
3171 setFeatureEnabledImpl(Features, "lzcnt", true);
3172 setFeatureEnabledImpl(Features, "popcnt", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003173 LLVM_FALLTHROUGH;
Chandler Carruth212334f2011-09-28 08:55:37 +00003174 case CK_K8SSE3:
3175 case CK_OpteronSSE3:
3176 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00003177 setFeatureEnabledImpl(Features, "sse3", true);
3178 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003179 setFeatureEnabledImpl(Features, "fxsr", true);
Roman Divackyce253d82011-10-30 13:47:56 +00003180 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00003181 case CK_BTVER2:
3182 setFeatureEnabledImpl(Features, "avx", true);
3183 setFeatureEnabledImpl(Features, "aes", true);
3184 setFeatureEnabledImpl(Features, "pclmul", true);
3185 setFeatureEnabledImpl(Features, "bmi", true);
3186 setFeatureEnabledImpl(Features, "f16c", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003187 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003188 LLVM_FALLTHROUGH;
Benjamin Kramer569f2152012-01-10 11:50:18 +00003189 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00003190 setFeatureEnabledImpl(Features, "ssse3", true);
3191 setFeatureEnabledImpl(Features, "sse4a", true);
3192 setFeatureEnabledImpl(Features, "lzcnt", true);
3193 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00003194 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003195 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003196 setFeatureEnabledImpl(Features, "fxsr", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003197 break;
Craig Topperc45744a2017-01-10 06:02:12 +00003198 case CK_ZNVER1:
3199 setFeatureEnabledImpl(Features, "adx", true);
3200 setFeatureEnabledImpl(Features, "aes", true);
3201 setFeatureEnabledImpl(Features, "avx2", true);
3202 setFeatureEnabledImpl(Features, "bmi", true);
3203 setFeatureEnabledImpl(Features, "bmi2", true);
3204 setFeatureEnabledImpl(Features, "clflushopt", true);
Craig Topper45742262017-02-09 06:10:14 +00003205 setFeatureEnabledImpl(Features, "clzero", true);
Craig Topperc45744a2017-01-10 06:02:12 +00003206 setFeatureEnabledImpl(Features, "cx16", true);
3207 setFeatureEnabledImpl(Features, "f16c", true);
3208 setFeatureEnabledImpl(Features, "fma", true);
3209 setFeatureEnabledImpl(Features, "fsgsbase", true);
3210 setFeatureEnabledImpl(Features, "fxsr", true);
3211 setFeatureEnabledImpl(Features, "lzcnt", true);
3212 setFeatureEnabledImpl(Features, "mwaitx", true);
3213 setFeatureEnabledImpl(Features, "movbe", true);
3214 setFeatureEnabledImpl(Features, "pclmul", true);
3215 setFeatureEnabledImpl(Features, "popcnt", true);
3216 setFeatureEnabledImpl(Features, "prfchw", true);
3217 setFeatureEnabledImpl(Features, "rdrnd", true);
3218 setFeatureEnabledImpl(Features, "rdseed", true);
3219 setFeatureEnabledImpl(Features, "sha", true);
3220 setFeatureEnabledImpl(Features, "sse4a", true);
3221 setFeatureEnabledImpl(Features, "xsave", true);
3222 setFeatureEnabledImpl(Features, "xsavec", true);
3223 setFeatureEnabledImpl(Features, "xsaveopt", true);
3224 setFeatureEnabledImpl(Features, "xsaves", true);
3225 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003226 case CK_BDVER4:
3227 setFeatureEnabledImpl(Features, "avx2", true);
3228 setFeatureEnabledImpl(Features, "bmi2", true);
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003229 setFeatureEnabledImpl(Features, "mwaitx", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003230 LLVM_FALLTHROUGH;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003231 case CK_BDVER3:
Craig Topper8c7f2512014-11-03 06:51:41 +00003232 setFeatureEnabledImpl(Features, "fsgsbase", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003233 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003234 LLVM_FALLTHROUGH;
Craig Topper8c7f2512014-11-03 06:51:41 +00003235 case CK_BDVER2:
Andrea Di Biagio9760a442014-11-06 12:08:57 +00003236 setFeatureEnabledImpl(Features, "bmi", true);
3237 setFeatureEnabledImpl(Features, "fma", true);
3238 setFeatureEnabledImpl(Features, "f16c", true);
3239 setFeatureEnabledImpl(Features, "tbm", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003240 LLVM_FALLTHROUGH;
Andrea Di Biagio9760a442014-11-06 12:08:57 +00003241 case CK_BDVER1:
3242 // xop implies avx, sse4a and fma4.
Craig Topper86d79ef2013-09-17 04:51:29 +00003243 setFeatureEnabledImpl(Features, "xop", true);
3244 setFeatureEnabledImpl(Features, "lzcnt", true);
3245 setFeatureEnabledImpl(Features, "aes", true);
3246 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00003247 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003248 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003249 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003250 setFeatureEnabledImpl(Features, "xsave", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003251 break;
Eli Friedman33465822011-07-08 23:31:17 +00003252 }
Eric Christopherbbd746d2015-10-08 20:10:14 +00003253 if (!TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec))
3254 return false;
3255
3256 // Can't do this earlier because we need to be able to explicitly enable
3257 // or disable these features and the things that they depend upon.
3258
3259 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
3260 auto I = Features.find("sse4.2");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003261 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00003262 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-popcnt") ==
3263 FeaturesVec.end())
3264 Features["popcnt"] = true;
3265
3266 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
3267 I = Features.find("3dnow");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003268 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00003269 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-prfchw") ==
3270 FeaturesVec.end())
3271 Features["prfchw"] = true;
3272
Eric Christophera7260af2015-10-08 20:10:18 +00003273 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
3274 // then enable MMX.
3275 I = Features.find("sse");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003276 if (I != Features.end() && I->getValue() &&
Eric Christophera7260af2015-10-08 20:10:18 +00003277 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-mmx") ==
3278 FeaturesVec.end())
3279 Features["mmx"] = true;
3280
Eric Christopherbbd746d2015-10-08 20:10:14 +00003281 return true;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003282}
3283
Rafael Espindolae62e2792013-08-20 13:44:29 +00003284void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00003285 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003286 if (Enabled) {
3287 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003288 case AVX512F:
3289 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003290 case AVX2:
3291 Features["avx2"] = true;
3292 case AVX:
3293 Features["avx"] = true;
Craig Topperda9fe562015-10-15 05:23:38 +00003294 Features["xsave"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003295 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00003296 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003297 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00003298 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003299 case SSSE3:
3300 Features["ssse3"] = true;
3301 case SSE3:
3302 Features["sse3"] = true;
3303 case SSE2:
3304 Features["sse2"] = true;
3305 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00003306 Features["sse"] = true;
3307 case NoSSE:
3308 break;
3309 }
3310 return;
3311 }
3312
3313 switch (Level) {
3314 case NoSSE:
3315 case SSE1:
3316 Features["sse"] = false;
3317 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00003318 Features["sse2"] = Features["pclmul"] = Features["aes"] =
3319 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003320 case SSE3:
3321 Features["sse3"] = false;
3322 setXOPLevel(Features, NoXOP, false);
3323 case SSSE3:
3324 Features["ssse3"] = false;
3325 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00003326 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003327 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00003328 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003329 case AVX:
Craig Topperda9fe562015-10-15 05:23:38 +00003330 Features["fma"] = Features["avx"] = Features["f16c"] = Features["xsave"] =
3331 Features["xsaveopt"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00003332 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003333 case AVX2:
3334 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00003335 case AVX512F:
Eric Christopher917e9522014-11-18 22:36:15 +00003336 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
Craig Toppera31a5da2014-12-27 06:59:37 +00003337 Features["avx512pf"] = Features["avx512dq"] = Features["avx512bw"] =
Craig Topperb4f83a02016-02-29 06:51:38 +00003338 Features["avx512vl"] = Features["avx512vbmi"] =
3339 Features["avx512ifma"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003340 }
3341}
3342
3343void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00003344 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003345 if (Enabled) {
3346 switch (Level) {
3347 case AMD3DNowAthlon:
3348 Features["3dnowa"] = true;
3349 case AMD3DNow:
3350 Features["3dnow"] = true;
3351 case MMX:
3352 Features["mmx"] = true;
3353 case NoMMX3DNow:
3354 break;
3355 }
3356 return;
3357 }
3358
3359 switch (Level) {
3360 case NoMMX3DNow:
3361 case MMX:
3362 Features["mmx"] = false;
3363 case AMD3DNow:
3364 Features["3dnow"] = false;
3365 case AMD3DNowAthlon:
3366 Features["3dnowa"] = false;
3367 }
3368}
3369
3370void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00003371 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003372 if (Enabled) {
3373 switch (Level) {
3374 case XOP:
3375 Features["xop"] = true;
3376 case FMA4:
3377 Features["fma4"] = true;
3378 setSSELevel(Features, AVX, true);
3379 case SSE4A:
3380 Features["sse4a"] = true;
3381 setSSELevel(Features, SSE3, true);
3382 case NoXOP:
3383 break;
3384 }
3385 return;
3386 }
3387
3388 switch (Level) {
3389 case NoXOP:
3390 case SSE4A:
3391 Features["sse4a"] = false;
3392 case FMA4:
3393 Features["fma4"] = false;
3394 case XOP:
3395 Features["xop"] = false;
3396 }
3397}
3398
Craig Topper86d79ef2013-09-17 04:51:29 +00003399void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
3400 StringRef Name, bool Enabled) {
Eric Christopher298ac302015-07-01 00:08:32 +00003401 // This is a bit of a hack to deal with the sse4 target feature when used
3402 // as part of the target attribute. We handle sse4 correctly everywhere
3403 // else. See below for more information on how we handle the sse4 options.
3404 if (Name != "sse4")
3405 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00003406
Craig Topper29561122013-09-19 01:13:07 +00003407 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003408 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003409 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003410 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003411 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003412 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003413 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003414 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003415 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003416 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003417 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003418 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003419 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003420 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003421 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003422 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003423 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003424 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003425 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003426 if (Enabled)
3427 setSSELevel(Features, SSE2, Enabled);
3428 } else if (Name == "pclmul") {
3429 if (Enabled)
3430 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003431 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003432 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003433 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003434 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003435 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003436 setSSELevel(Features, AVX512F, Enabled);
Craig Topperb4f83a02016-02-29 06:51:38 +00003437 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf" ||
3438 Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl" ||
3439 Name == "avx512vbmi" || Name == "avx512ifma") {
Craig Topper679b53a2013-08-21 05:29:10 +00003440 if (Enabled)
3441 setSSELevel(Features, AVX512F, Enabled);
Craig Topper6c7ecc52016-11-09 04:51:03 +00003442 // Enable BWI instruction if VBMI is being enabled.
3443 if (Name == "avx512vbmi" && Enabled)
3444 Features["avx512bw"] = true;
3445 // Also disable VBMI if BWI is being disabled.
3446 if (Name == "avx512bw" && !Enabled)
3447 Features["avx512vbmi"] = false;
Craig Topper679b53a2013-08-21 05:29:10 +00003448 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003449 if (Enabled)
3450 setSSELevel(Features, AVX, Enabled);
3451 } else if (Name == "fma4") {
3452 setXOPLevel(Features, FMA4, Enabled);
3453 } else if (Name == "xop") {
3454 setXOPLevel(Features, XOP, Enabled);
3455 } else if (Name == "sse4a") {
3456 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00003457 } else if (Name == "f16c") {
3458 if (Enabled)
3459 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00003460 } else if (Name == "sha") {
3461 if (Enabled)
3462 setSSELevel(Features, SSE2, Enabled);
Eric Christopher298ac302015-07-01 00:08:32 +00003463 } else if (Name == "sse4") {
3464 // We can get here via the __target__ attribute since that's not controlled
3465 // via the -msse4/-mno-sse4 command line alias. Handle this the same way
3466 // here - turn on the sse4.2 if enabled, turn off the sse4.1 level if
3467 // disabled.
3468 if (Enabled)
3469 setSSELevel(Features, SSE42, Enabled);
3470 else
3471 setSSELevel(Features, SSE41, Enabled);
Craig Topperda9fe562015-10-15 05:23:38 +00003472 } else if (Name == "xsave") {
Craig Topper840927e2016-02-29 06:51:34 +00003473 if (!Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003474 Features["xsaveopt"] = false;
3475 } else if (Name == "xsaveopt" || Name == "xsavec" || Name == "xsaves") {
Craig Topper840927e2016-02-29 06:51:34 +00003476 if (Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003477 Features["xsave"] = true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003478 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003479}
3480
Eric Christopher3ff21b32013-10-16 21:26:26 +00003481/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003482/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00003483bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00003484 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00003485 for (const auto &Feature : Features) {
3486 if (Feature[0] != '+')
Daniel Dunbar979586e2009-11-11 09:38:56 +00003487 continue;
3488
Eric Christopher610fe112015-08-26 08:21:55 +00003489 if (Feature == "+aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00003490 HasAES = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003491 } else if (Feature == "+pclmul") {
Craig Topper3f122a72012-05-31 05:18:48 +00003492 HasPCLMUL = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003493 } else if (Feature == "+lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00003494 HasLZCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003495 } else if (Feature == "+rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00003496 HasRDRND = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003497 } else if (Feature == "+fsgsbase") {
Craig Topper8c7f2512014-11-03 06:51:41 +00003498 HasFSGSBASE = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003499 } else if (Feature == "+bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00003500 HasBMI = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003501 } else if (Feature == "+bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00003502 HasBMI2 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003503 } else if (Feature == "+popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00003504 HasPOPCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003505 } else if (Feature == "+rtm") {
Michael Liao625a8752012-11-10 05:17:46 +00003506 HasRTM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003507 } else if (Feature == "+prfchw") {
Michael Liao74f4eaf2013-03-26 17:52:08 +00003508 HasPRFCHW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003509 } else if (Feature == "+rdseed") {
Michael Liaoffaae352013-03-29 05:17:55 +00003510 HasRDSEED = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003511 } else if (Feature == "+adx") {
Robert Khasanov50e6f582014-09-19 09:53:48 +00003512 HasADX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003513 } else if (Feature == "+tbm") {
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003514 HasTBM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003515 } else if (Feature == "+fma") {
Craig Topperbba778b2012-06-03 21:46:30 +00003516 HasFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003517 } else if (Feature == "+f16c") {
Manman Rena45358c2012-10-11 00:59:55 +00003518 HasF16C = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003519 } else if (Feature == "+avx512cd") {
Craig Topper679b53a2013-08-21 05:29:10 +00003520 HasAVX512CD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003521 } else if (Feature == "+avx512er") {
Craig Topper679b53a2013-08-21 05:29:10 +00003522 HasAVX512ER = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003523 } else if (Feature == "+avx512pf") {
Craig Topper679b53a2013-08-21 05:29:10 +00003524 HasAVX512PF = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003525 } else if (Feature == "+avx512dq") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003526 HasAVX512DQ = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003527 } else if (Feature == "+avx512bw") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003528 HasAVX512BW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003529 } else if (Feature == "+avx512vl") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003530 HasAVX512VL = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003531 } else if (Feature == "+avx512vbmi") {
3532 HasAVX512VBMI = true;
3533 } else if (Feature == "+avx512ifma") {
3534 HasAVX512IFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003535 } else if (Feature == "+sha") {
Ben Langmuir58078d02013-09-19 13:22:04 +00003536 HasSHA = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003537 } else if (Feature == "+mpx") {
3538 HasMPX = true;
3539 } else if (Feature == "+movbe") {
3540 HasMOVBE = true;
3541 } else if (Feature == "+sgx") {
3542 HasSGX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003543 } else if (Feature == "+cx16") {
Nick Lewycky50e8f482013-10-05 20:14:27 +00003544 HasCX16 = true;
Craig Toppere33f51f2015-10-16 06:22:36 +00003545 } else if (Feature == "+fxsr") {
3546 HasFXSR = true;
Craig Topperda9fe562015-10-15 05:23:38 +00003547 } else if (Feature == "+xsave") {
3548 HasXSAVE = true;
3549 } else if (Feature == "+xsaveopt") {
3550 HasXSAVEOPT = true;
3551 } else if (Feature == "+xsavec") {
3552 HasXSAVEC = true;
3553 } else if (Feature == "+xsaves") {
3554 HasXSAVES = true;
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003555 } else if (Feature == "+mwaitx") {
3556 HasMWAITX = true;
Asaf Badouha9d1e182015-12-31 14:14:07 +00003557 } else if (Feature == "+pku") {
3558 HasPKU = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003559 } else if (Feature == "+clflushopt") {
3560 HasCLFLUSHOPT = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003561 } else if (Feature == "+clwb") {
3562 HasCLWB = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003563 } else if (Feature == "+prefetchwt1") {
3564 HasPREFETCHWT1 = true;
Craig Topper45742262017-02-09 06:10:14 +00003565 } else if (Feature == "+clzero") {
3566 HasCLZERO = true;
Nick Lewycky50e8f482013-10-05 20:14:27 +00003567 }
3568
Benjamin Kramer27402c62012-03-05 15:10:44 +00003569 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003570 .Case("+avx512f", AVX512F)
3571 .Case("+avx2", AVX2)
3572 .Case("+avx", AVX)
3573 .Case("+sse4.2", SSE42)
3574 .Case("+sse4.1", SSE41)
3575 .Case("+ssse3", SSSE3)
3576 .Case("+sse3", SSE3)
3577 .Case("+sse2", SSE2)
3578 .Case("+sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00003579 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003580 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003581
Eli Friedman33465822011-07-08 23:31:17 +00003582 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00003583 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003584 .Case("+3dnowa", AMD3DNowAthlon)
3585 .Case("+3dnow", AMD3DNow)
3586 .Case("+mmx", MMX)
Eli Friedman33465822011-07-08 23:31:17 +00003587 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00003588 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003589
3590 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003591 .Case("+xop", XOP)
3592 .Case("+fma4", FMA4)
3593 .Case("+sse4a", SSE4A)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003594 .Default(NoXOP);
3595 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003596 }
Eli Friedman33465822011-07-08 23:31:17 +00003597
Rafael Espindolaeb265472013-08-21 21:59:03 +00003598 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
3599 // matches the selected sse level.
Craig Topperd945d502015-10-20 00:00:17 +00003600 if ((FPMath == FP_SSE && SSELevel < SSE1) ||
3601 (FPMath == FP_387 && SSELevel >= SSE1)) {
3602 Diags.Report(diag::err_target_unsupported_fpmath) <<
3603 (FPMath == FP_SSE ? "sse" : "387");
Rafael Espindolaeb265472013-08-21 21:59:03 +00003604 return false;
3605 }
3606
Alexey Bataev00396512015-07-02 03:40:19 +00003607 SimdDefaultAlign =
Ahmed Bougacha68bf64e2015-08-27 22:24:56 +00003608 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Rafael Espindolaeb265472013-08-21 21:59:03 +00003609 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00003610}
Chris Lattnerecd49032009-03-02 22:27:17 +00003611
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003612/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
3613/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00003614void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003615 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00003616 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00003617 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003618 Builder.defineMacro("__amd64__");
3619 Builder.defineMacro("__amd64");
3620 Builder.defineMacro("__x86_64");
3621 Builder.defineMacro("__x86_64__");
Bob Wilsona2acb1e2014-08-08 23:46:28 +00003622 if (getTriple().getArchName() == "x86_64h") {
3623 Builder.defineMacro("__x86_64h");
3624 Builder.defineMacro("__x86_64h__");
3625 }
Chris Lattnerecd49032009-03-02 22:27:17 +00003626 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003627 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00003628 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003629
Chris Lattnerecd49032009-03-02 22:27:17 +00003630 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003631 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
3632 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00003633 switch (CPU) {
3634 case CK_Generic:
3635 break;
3636 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003637 // The rest are coming from the i386 define above.
3638 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003639 break;
3640 case CK_i486:
3641 case CK_WinChipC6:
3642 case CK_WinChip2:
3643 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003644 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00003645 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003646 case CK_PentiumMMX:
3647 Builder.defineMacro("__pentium_mmx__");
3648 Builder.defineMacro("__tune_pentium_mmx__");
3649 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003650 case CK_i586:
3651 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003652 defineCPUMacros(Builder, "i586");
3653 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00003654 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003655 case CK_Pentium3:
3656 case CK_Pentium3M:
3657 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003658 Builder.defineMacro("__tune_pentium3__");
3659 // Fallthrough
3660 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00003661 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003662 Builder.defineMacro("__tune_pentium2__");
3663 // Fallthrough
3664 case CK_PentiumPro:
3665 Builder.defineMacro("__tune_i686__");
3666 Builder.defineMacro("__tune_pentiumpro__");
3667 // Fallthrough
3668 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003669 Builder.defineMacro("__i686");
3670 Builder.defineMacro("__i686__");
3671 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
3672 Builder.defineMacro("__pentiumpro");
3673 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003674 break;
3675 case CK_Pentium4:
3676 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003677 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00003678 break;
3679 case CK_Yonah:
3680 case CK_Prescott:
3681 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003682 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00003683 break;
3684 case CK_Core2:
3685 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003686 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00003687 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003688 case CK_Bonnell:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003689 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00003690 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00003691 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00003692 defineCPUMacros(Builder, "slm");
3693 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003694 case CK_Nehalem:
3695 case CK_Westmere:
3696 case CK_SandyBridge:
3697 case CK_IvyBridge:
3698 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00003699 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003700 case CK_SkylakeClient:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003701 // FIXME: Historically, we defined this legacy name, it would be nice to
3702 // remove it at some point. We've never exposed fine-grained names for
3703 // recent primary x86 CPUs, and we should keep it that way.
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003704 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00003705 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003706 case CK_SkylakeServer:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003707 defineCPUMacros(Builder, "skx");
3708 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003709 case CK_Cannonlake:
3710 break;
Craig Topper449314e2013-08-20 07:09:39 +00003711 case CK_KNL:
3712 defineCPUMacros(Builder, "knl");
3713 break;
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003714 case CK_Lakemont:
3715 Builder.defineMacro("__tune_lakemont__");
3716 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003717 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003718 Builder.defineMacro("__k6_2__");
3719 Builder.defineMacro("__tune_k6_2__");
3720 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003721 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003722 if (CPU != CK_K6_2) { // In case of fallthrough
3723 // FIXME: GCC may be enabling these in cases where some other k6
3724 // architecture is specified but -m3dnow is explicitly provided. The
3725 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003726 Builder.defineMacro("__k6_3__");
3727 Builder.defineMacro("__tune_k6_3__");
3728 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003729 // Fallthrough
3730 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003731 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00003732 break;
3733 case CK_Athlon:
3734 case CK_AthlonThunderbird:
3735 case CK_Athlon4:
3736 case CK_AthlonXP:
3737 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003738 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003739 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003740 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003741 Builder.defineMacro("__tune_athlon_sse__");
3742 }
Chandler Carruth212334f2011-09-28 08:55:37 +00003743 break;
3744 case CK_K8:
3745 case CK_K8SSE3:
3746 case CK_x86_64:
3747 case CK_Opteron:
3748 case CK_OpteronSSE3:
3749 case CK_Athlon64:
3750 case CK_Athlon64SSE3:
3751 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003752 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00003753 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00003754 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003755 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00003756 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00003757 case CK_BTVER1:
3758 defineCPUMacros(Builder, "btver1");
3759 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003760 case CK_BTVER2:
3761 defineCPUMacros(Builder, "btver2");
3762 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003763 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003764 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003765 break;
3766 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003767 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003768 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003769 case CK_BDVER3:
3770 defineCPUMacros(Builder, "bdver3");
3771 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003772 case CK_BDVER4:
3773 defineCPUMacros(Builder, "bdver4");
3774 break;
Craig Topperc45744a2017-01-10 06:02:12 +00003775 case CK_ZNVER1:
3776 defineCPUMacros(Builder, "znver1");
3777 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003778 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003779 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00003780 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003781 }
Chris Lattner96e43572009-03-02 22:40:39 +00003782
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003783 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003784 Builder.defineMacro("__REGISTER_PREFIX__", "");
3785
Chris Lattner6df41af2009-04-19 17:32:33 +00003786 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
3787 // functions in glibc header files that use FP Stack inline asm which the
3788 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003789 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003790
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003791 if (HasAES)
3792 Builder.defineMacro("__AES__");
3793
Craig Topper3f122a72012-05-31 05:18:48 +00003794 if (HasPCLMUL)
3795 Builder.defineMacro("__PCLMUL__");
3796
Craig Topper22967d42011-12-25 05:06:45 +00003797 if (HasLZCNT)
3798 Builder.defineMacro("__LZCNT__");
3799
Benjamin Kramer1e250392012-07-07 09:39:18 +00003800 if (HasRDRND)
3801 Builder.defineMacro("__RDRND__");
3802
Craig Topper8c7f2512014-11-03 06:51:41 +00003803 if (HasFSGSBASE)
3804 Builder.defineMacro("__FSGSBASE__");
3805
Craig Topper22967d42011-12-25 05:06:45 +00003806 if (HasBMI)
3807 Builder.defineMacro("__BMI__");
3808
3809 if (HasBMI2)
3810 Builder.defineMacro("__BMI2__");
3811
Craig Topper1de83482011-12-29 16:10:46 +00003812 if (HasPOPCNT)
3813 Builder.defineMacro("__POPCNT__");
3814
Michael Liao625a8752012-11-10 05:17:46 +00003815 if (HasRTM)
3816 Builder.defineMacro("__RTM__");
3817
Michael Liao74f4eaf2013-03-26 17:52:08 +00003818 if (HasPRFCHW)
3819 Builder.defineMacro("__PRFCHW__");
3820
Michael Liaoffaae352013-03-29 05:17:55 +00003821 if (HasRDSEED)
3822 Builder.defineMacro("__RDSEED__");
3823
Robert Khasanov50e6f582014-09-19 09:53:48 +00003824 if (HasADX)
3825 Builder.defineMacro("__ADX__");
3826
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003827 if (HasTBM)
3828 Builder.defineMacro("__TBM__");
3829
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003830 if (HasMWAITX)
3831 Builder.defineMacro("__MWAITX__");
3832
Rafael Espindolae62e2792013-08-20 13:44:29 +00003833 switch (XOPLevel) {
3834 case XOP:
3835 Builder.defineMacro("__XOP__");
3836 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00003837 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00003838 case SSE4A:
3839 Builder.defineMacro("__SSE4A__");
3840 case NoXOP:
3841 break;
3842 }
Craig Topperffdb46c2011-12-30 07:33:42 +00003843
Craig Topperbba778b2012-06-03 21:46:30 +00003844 if (HasFMA)
3845 Builder.defineMacro("__FMA__");
3846
Manman Rena45358c2012-10-11 00:59:55 +00003847 if (HasF16C)
3848 Builder.defineMacro("__F16C__");
3849
Craig Topper679b53a2013-08-21 05:29:10 +00003850 if (HasAVX512CD)
3851 Builder.defineMacro("__AVX512CD__");
3852 if (HasAVX512ER)
3853 Builder.defineMacro("__AVX512ER__");
3854 if (HasAVX512PF)
3855 Builder.defineMacro("__AVX512PF__");
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003856 if (HasAVX512DQ)
3857 Builder.defineMacro("__AVX512DQ__");
3858 if (HasAVX512BW)
3859 Builder.defineMacro("__AVX512BW__");
3860 if (HasAVX512VL)
3861 Builder.defineMacro("__AVX512VL__");
Craig Topperb4f83a02016-02-29 06:51:38 +00003862 if (HasAVX512VBMI)
3863 Builder.defineMacro("__AVX512VBMI__");
3864 if (HasAVX512IFMA)
3865 Builder.defineMacro("__AVX512IFMA__");
Craig Topper679b53a2013-08-21 05:29:10 +00003866
Ben Langmuir58078d02013-09-19 13:22:04 +00003867 if (HasSHA)
3868 Builder.defineMacro("__SHA__");
3869
Craig Toppere33f51f2015-10-16 06:22:36 +00003870 if (HasFXSR)
3871 Builder.defineMacro("__FXSR__");
Craig Topperda9fe562015-10-15 05:23:38 +00003872 if (HasXSAVE)
3873 Builder.defineMacro("__XSAVE__");
3874 if (HasXSAVEOPT)
3875 Builder.defineMacro("__XSAVEOPT__");
3876 if (HasXSAVEC)
3877 Builder.defineMacro("__XSAVEC__");
3878 if (HasXSAVES)
3879 Builder.defineMacro("__XSAVES__");
Asaf Badouha9d1e182015-12-31 14:14:07 +00003880 if (HasPKU)
3881 Builder.defineMacro("__PKU__");
Nick Lewycky50e8f482013-10-05 20:14:27 +00003882 if (HasCX16)
3883 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
Craig Topper78b47872017-02-08 06:48:58 +00003884 if (HasCLFLUSHOPT)
3885 Builder.defineMacro("__CLFLUSHOPT__");
Craig Topper8c708cf2017-02-08 07:36:58 +00003886 if (HasCLWB)
3887 Builder.defineMacro("__CLWB__");
Craig Topperb16cb822017-02-08 07:56:42 +00003888 if (HasMPX)
3889 Builder.defineMacro("__MPX__");
Craig Topper204ecff2017-02-08 08:23:17 +00003890 if (HasSGX)
3891 Builder.defineMacro("__SGX__");
Craig Topperd2bf7b02017-02-08 08:23:40 +00003892 if (HasPREFETCHWT1)
3893 Builder.defineMacro("__PREFETCHWT1__");
Craig Topper45742262017-02-09 06:10:14 +00003894 if (HasCLZERO)
3895 Builder.defineMacro("__CLZERO__");
Nick Lewycky50e8f482013-10-05 20:14:27 +00003896
Chris Lattner96e43572009-03-02 22:40:39 +00003897 // Each case falls through to the previous one here.
3898 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003899 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00003900 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00003901 case AVX2:
3902 Builder.defineMacro("__AVX2__");
3903 case AVX:
3904 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00003905 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003906 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00003907 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003908 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00003909 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003910 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003911 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003912 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003913 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003914 Builder.defineMacro("__SSE2__");
3915 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00003916 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003917 Builder.defineMacro("__SSE__");
3918 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00003919 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00003920 break;
3921 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003922
Derek Schuffc7dd7222012-10-11 15:52:22 +00003923 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003924 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003925 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00003926 case AVX2:
3927 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003928 case SSE42:
3929 case SSE41:
3930 case SSSE3:
3931 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003932 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003933 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003934 break;
3935 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003936 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003937 break;
3938 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003939 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003940 }
3941 }
3942
Anders Carlssone437c682010-01-27 03:47:49 +00003943 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00003944 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00003945 case AMD3DNowAthlon:
3946 Builder.defineMacro("__3dNOW_A__");
3947 case AMD3DNow:
3948 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00003949 case MMX:
3950 Builder.defineMacro("__MMX__");
3951 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00003952 break;
3953 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00003954
3955 if (CPU >= CK_i486) {
3956 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
3957 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
3958 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
3959 }
3960 if (CPU >= CK_i586)
3961 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00003962}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003963
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003964bool X86TargetInfo::hasFeature(StringRef Feature) const {
3965 return llvm::StringSwitch<bool>(Feature)
3966 .Case("aes", HasAES)
3967 .Case("avx", SSELevel >= AVX)
3968 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00003969 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00003970 .Case("avx512cd", HasAVX512CD)
3971 .Case("avx512er", HasAVX512ER)
3972 .Case("avx512pf", HasAVX512PF)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003973 .Case("avx512dq", HasAVX512DQ)
3974 .Case("avx512bw", HasAVX512BW)
3975 .Case("avx512vl", HasAVX512VL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003976 .Case("avx512vbmi", HasAVX512VBMI)
3977 .Case("avx512ifma", HasAVX512IFMA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003978 .Case("bmi", HasBMI)
3979 .Case("bmi2", HasBMI2)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003980 .Case("clflushopt", HasCLFLUSHOPT)
3981 .Case("clwb", HasCLWB)
Craig Topper45742262017-02-09 06:10:14 +00003982 .Case("clzero", HasCLZERO)
Nick Lewycky50e8f482013-10-05 20:14:27 +00003983 .Case("cx16", HasCX16)
3984 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00003985 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003986 .Case("fma4", XOPLevel >= FMA4)
Craig Topper8c7f2512014-11-03 06:51:41 +00003987 .Case("fsgsbase", HasFSGSBASE)
Craig Toppere33f51f2015-10-16 06:22:36 +00003988 .Case("fxsr", HasFXSR)
Craig Topper8dbc5842014-11-03 07:05:26 +00003989 .Case("lzcnt", HasLZCNT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003990 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
3991 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
3992 .Case("mmx", MMX3DNowLevel >= MMX)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003993 .Case("movbe", HasMOVBE)
3994 .Case("mpx", HasMPX)
Craig Topper3f122a72012-05-31 05:18:48 +00003995 .Case("pclmul", HasPCLMUL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003996 .Case("pku", HasPKU)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003997 .Case("popcnt", HasPOPCNT)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003998 .Case("prefetchwt1", HasPREFETCHWT1)
Michael Liao74f4eaf2013-03-26 17:52:08 +00003999 .Case("prfchw", HasPRFCHW)
Craig Topper8dbc5842014-11-03 07:05:26 +00004000 .Case("rdrnd", HasRDRND)
Michael Liaoffaae352013-03-29 05:17:55 +00004001 .Case("rdseed", HasRDSEED)
Craig Topper8dbc5842014-11-03 07:05:26 +00004002 .Case("rtm", HasRTM)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00004003 .Case("sgx", HasSGX)
Ben Langmuir58078d02013-09-19 13:22:04 +00004004 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004005 .Case("sse", SSELevel >= SSE1)
4006 .Case("sse2", SSELevel >= SSE2)
4007 .Case("sse3", SSELevel >= SSE3)
4008 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00004009 .Case("sse4.1", SSELevel >= SSE41)
4010 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00004011 .Case("sse4a", XOPLevel >= SSE4A)
Craig Topper8dbc5842014-11-03 07:05:26 +00004012 .Case("tbm", HasTBM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004013 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00004014 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
4015 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00004016 .Case("xop", XOPLevel >= XOP)
Craig Topperda9fe562015-10-15 05:23:38 +00004017 .Case("xsave", HasXSAVE)
4018 .Case("xsavec", HasXSAVEC)
4019 .Case("xsaves", HasXSAVES)
4020 .Case("xsaveopt", HasXSAVEOPT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004021 .Default(false);
4022}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004023
Eric Christopherd9832702015-06-29 21:00:05 +00004024// We can't use a generic validation scheme for the features accepted here
4025// versus subtarget features accepted in the target attribute because the
4026// bitfield structure that's initialized in the runtime only supports the
4027// below currently rather than the full range of subtarget features. (See
4028// X86TargetInfo::hasFeature for a somewhat comprehensive list).
4029bool X86TargetInfo::validateCpuSupports(StringRef FeatureStr) const {
4030 return llvm::StringSwitch<bool>(FeatureStr)
4031 .Case("cmov", true)
4032 .Case("mmx", true)
4033 .Case("popcnt", true)
4034 .Case("sse", true)
4035 .Case("sse2", true)
4036 .Case("sse3", true)
Benjamin Kramerf4c520d2016-05-20 15:21:08 +00004037 .Case("ssse3", true)
Eric Christopherd9832702015-06-29 21:00:05 +00004038 .Case("sse4.1", true)
4039 .Case("sse4.2", true)
4040 .Case("avx", true)
4041 .Case("avx2", true)
4042 .Case("sse4a", true)
4043 .Case("fma4", true)
4044 .Case("xop", true)
4045 .Case("fma", true)
4046 .Case("avx512f", true)
4047 .Case("bmi", true)
4048 .Case("bmi2", true)
Benjamin Kramerf4c520d2016-05-20 15:21:08 +00004049 .Case("aes", true)
4050 .Case("pclmul", true)
4051 .Case("avx512vl", true)
4052 .Case("avx512bw", true)
4053 .Case("avx512dq", true)
4054 .Case("avx512cd", true)
4055 .Case("avx512er", true)
4056 .Case("avx512pf", true)
4057 .Case("avx512vbmi", true)
4058 .Case("avx512ifma", true)
Eric Christopherd9832702015-06-29 21:00:05 +00004059 .Default(false);
4060}
4061
Eli Friedman3fd920a2008-08-20 02:34:37 +00004062bool
Anders Carlsson58436352009-02-28 17:11:49 +00004063X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00004064 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00004065 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004066 default: return false;
Alexey Bataev91e58602015-07-20 12:08:00 +00004067 // Constant constraints.
4068 case 'e': // 32-bit signed integer constant for use with sign-extending x86_64
4069 // instructions.
4070 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
4071 // x86_64 instructions.
4072 case 's':
4073 Info.setRequiresImmediate();
4074 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00004075 case 'I':
4076 Info.setRequiresImmediate(0, 31);
4077 return true;
4078 case 'J':
4079 Info.setRequiresImmediate(0, 63);
4080 return true;
4081 case 'K':
4082 Info.setRequiresImmediate(-128, 127);
4083 return true;
4084 case 'L':
Alexey Bataev91e58602015-07-20 12:08:00 +00004085 Info.setRequiresImmediate({ int(0xff), int(0xffff), int(0xffffffff) });
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00004086 return true;
4087 case 'M':
4088 Info.setRequiresImmediate(0, 3);
4089 return true;
4090 case 'N':
4091 Info.setRequiresImmediate(0, 255);
4092 return true;
4093 case 'O':
4094 Info.setRequiresImmediate(0, 127);
4095 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00004096 // Register constraints.
4097 case 'Y': // 'Y' is the first character for several 2-character constraints.
4098 // Shift the pointer to the second character of the constraint.
4099 Name++;
4100 switch (*Name) {
4101 default:
4102 return false;
4103 case '0': // First SSE register.
4104 case 't': // Any SSE register, when SSE2 is enabled.
4105 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
4106 case 'm': // Any MMX register, when inter-unit moves enabled.
Michael Zuckerman849a6a52016-10-31 17:23:52 +00004107 case 'k': // AVX512 arch mask registers: k1-k7.
Alexey Bataev91e58602015-07-20 12:08:00 +00004108 Info.setAllowsRegister();
4109 return true;
4110 }
4111 case 'f': // Any x87 floating point stack register.
Akira Hatanaka88ef7282014-07-18 23:30:30 +00004112 // Constraint 'f' cannot be used for output operands.
4113 if (Info.ConstraintStr[0] == '=')
4114 return false;
Akira Hatanaka88ef7282014-07-18 23:30:30 +00004115 Info.setAllowsRegister();
4116 return true;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004117 case 'a': // eax.
4118 case 'b': // ebx.
4119 case 'c': // ecx.
4120 case 'd': // edx.
4121 case 'S': // esi.
4122 case 'D': // edi.
4123 case 'A': // edx:eax.
Alexey Bataev91e58602015-07-20 12:08:00 +00004124 case 't': // Top of floating point stack.
4125 case 'u': // Second from top of floating point stack.
Eli Friedman3fd920a2008-08-20 02:34:37 +00004126 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00004127 case 'y': // Any MMX register.
Michael Zuckerman62f516f2016-11-01 13:16:44 +00004128 case 'v': // Any {X,Y,Z}MM register (Arch & context dependent)
Anders Carlsson5f7ee682008-10-06 19:17:39 +00004129 case 'x': // Any SSE register.
Michael Zuckerman849a6a52016-10-31 17:23:52 +00004130 case 'k': // Any AVX512 mask register (same as Yk, additionaly allows k0
4131 // for intermideate k reg operations).
Eli Friedman3fd920a2008-08-20 02:34:37 +00004132 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00004133 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
4134 case 'l': // "Index" registers: any general register that can be used as an
4135 // index in a base+index memory access.
4136 Info.setAllowsRegister();
4137 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00004138 // Floating point constant constraints.
Dale Johannesen46742a42010-08-24 22:33:12 +00004139 case 'C': // SSE floating point constant.
4140 case 'G': // x87 floating point constant.
Eli Friedman3fd920a2008-08-20 02:34:37 +00004141 return true;
4142 }
4143}
4144
Akira Hatanaka974131e2014-09-18 18:17:18 +00004145bool X86TargetInfo::validateOutputSize(StringRef Constraint,
4146 unsigned Size) const {
4147 // Strip off constraint modifiers.
4148 while (Constraint[0] == '=' ||
4149 Constraint[0] == '+' ||
4150 Constraint[0] == '&')
4151 Constraint = Constraint.substr(1);
4152
4153 return validateOperandSize(Constraint, Size);
4154}
4155
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004156bool X86TargetInfo::validateInputSize(StringRef Constraint,
4157 unsigned Size) const {
Akira Hatanaka974131e2014-09-18 18:17:18 +00004158 return validateOperandSize(Constraint, Size);
4159}
4160
4161bool X86TargetInfo::validateOperandSize(StringRef Constraint,
4162 unsigned Size) const {
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004163 switch (Constraint[0]) {
4164 default: break;
Michael Zuckerman849a6a52016-10-31 17:23:52 +00004165 case 'k':
4166 // Registers k0-k7 (AVX512) size limit is 64 bit.
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004167 case 'y':
4168 return Size <= 64;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004169 case 'f':
4170 case 't':
4171 case 'u':
4172 return Size <= 128;
Michael Zuckerman62f516f2016-11-01 13:16:44 +00004173 case 'v':
Hans Wennborg3c619a42014-09-18 20:24:04 +00004174 case 'x':
Alexey Bataev91e58602015-07-20 12:08:00 +00004175 if (SSELevel >= AVX512F)
4176 // 512-bit zmm registers can be used if target supports AVX512F.
4177 return Size <= 512U;
4178 else if (SSELevel >= AVX)
4179 // 256-bit ymm registers can be used if target supports AVX.
4180 return Size <= 256U;
4181 return Size <= 128U;
4182 case 'Y':
4183 // 'Y' is the first character for several 2-character constraints.
4184 switch (Constraint[1]) {
4185 default: break;
4186 case 'm':
4187 // 'Ym' is synonymous with 'y'.
Michael Zuckerman849a6a52016-10-31 17:23:52 +00004188 case 'k':
Alexey Bataev91e58602015-07-20 12:08:00 +00004189 return Size <= 64;
4190 case 'i':
4191 case 't':
4192 // 'Yi' and 'Yt' are synonymous with 'x' when SSE2 is enabled.
4193 if (SSELevel >= AVX512F)
4194 return Size <= 512U;
4195 else if (SSELevel >= AVX)
4196 return Size <= 256U;
4197 return SSELevel >= SSE2 && Size <= 128U;
4198 }
4199
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004200 }
4201
4202 return true;
4203}
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00004204
Eli Friedman3fd920a2008-08-20 02:34:37 +00004205std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004206X86TargetInfo::convertConstraint(const char *&Constraint) const {
4207 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004208 case 'a': return std::string("{ax}");
4209 case 'b': return std::string("{bx}");
4210 case 'c': return std::string("{cx}");
4211 case 'd': return std::string("{dx}");
4212 case 'S': return std::string("{si}");
4213 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00004214 case 'p': // address
4215 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00004216 case 't': // top of floating point stack.
4217 return std::string("{st}");
4218 case 'u': // second from top of floating point stack.
4219 return std::string("{st(1)}"); // second from top of floating point stack.
Michael Zuckerman849a6a52016-10-31 17:23:52 +00004220 case 'Y':
4221 switch (Constraint[1]) {
4222 default:
4223 // Break from inner switch and fall through (copy single char),
4224 // continue parsing after copying the current constraint into
4225 // the return string.
4226 break;
4227 case 'k':
4228 // "^" hints llvm that this is a 2 letter constraint.
4229 // "Constraint++" is used to promote the string iterator
4230 // to the next constraint.
4231 return std::string("^") + std::string(Constraint++, 2);
4232 }
4233 LLVM_FALLTHROUGH;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004234 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004235 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00004236 }
4237}
Chris Lattner5ba61f02006-10-14 07:39:34 +00004238
Eli Friedman3fd920a2008-08-20 02:34:37 +00004239// X86-32 generic target
4240class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00004241public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004242 X86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4243 : X86TargetInfo(Triple, Opts) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004244 DoubleAlign = LongLongAlign = 32;
4245 LongDoubleWidth = 96;
4246 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00004247 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00004248 resetDataLayout("e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128");
Eli Friedman32ca82a2009-03-29 20:31:09 +00004249 SizeType = UnsignedInt;
4250 PtrDiffType = SignedInt;
4251 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00004252 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00004253
4254 // Use fpret for all types.
4255 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
4256 (1 << TargetInfo::Double) |
4257 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004258
4259 // x86-32 has atomics up to 8 bytes
4260 // FIXME: Check that we actually have cmpxchg8b before setting
4261 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
4262 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004263 }
Craig Topper3164f332014-03-11 03:39:26 +00004264 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004265 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004266 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004267
Craig Topper3164f332014-03-11 03:39:26 +00004268 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00004269 if (RegNo == 0) return 0;
4270 if (RegNo == 1) return 2;
4271 return -1;
4272 }
Akira Hatanaka974131e2014-09-18 18:17:18 +00004273 bool validateOperandSize(StringRef Constraint,
4274 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00004275 switch (Constraint[0]) {
4276 default: break;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004277 case 'R':
4278 case 'q':
4279 case 'Q':
Bill Wendling887b4852012-11-12 06:42:51 +00004280 case 'a':
4281 case 'b':
4282 case 'c':
4283 case 'd':
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004284 case 'S':
4285 case 'D':
Bill Wendling3c7fed82012-11-12 18:52:32 +00004286 return Size <= 32;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004287 case 'A':
4288 return Size <= 64;
Bill Wendling887b4852012-11-12 06:42:51 +00004289 }
4290
Akira Hatanaka974131e2014-09-18 18:17:18 +00004291 return X86TargetInfo::validateOperandSize(Constraint, Size);
Bill Wendling887b4852012-11-12 06:42:51 +00004292 }
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00004293 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
4294 return llvm::makeArrayRef(BuiltinInfoX86, clang::X86::LastX86CommonBuiltin -
4295 Builtin::FirstTSBuiltin + 1);
4296 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004297};
Eli Friedman3fd920a2008-08-20 02:34:37 +00004298
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004299class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
4300public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004301 NetBSDI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4302 : NetBSDTargetInfo<X86_32TargetInfo>(Triple, Opts) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004303
Craig Topper3164f332014-03-11 03:39:26 +00004304 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00004305 unsigned Major, Minor, Micro;
4306 getTriple().getOSVersion(Major, Minor, Micro);
4307 // New NetBSD uses the default rounding mode.
4308 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
4309 return X86_32TargetInfo::getFloatEvalMethod();
4310 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004311 return 1;
4312 }
4313};
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004314
Eli Friedmane3aa4542009-07-05 18:47:56 +00004315class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
4316public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004317 OpenBSDI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4318 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00004319 SizeType = UnsignedLong;
4320 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004321 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00004322 }
4323};
Eli Friedmane3aa4542009-07-05 18:47:56 +00004324
Eli Friedman9fa28852012-08-08 23:57:20 +00004325class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
4326public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004327 BitrigI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4328 : BitrigTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman9fa28852012-08-08 23:57:20 +00004329 SizeType = UnsignedLong;
4330 IntPtrType = SignedLong;
4331 PtrDiffType = SignedLong;
4332 }
4333};
Eli Friedman9fa28852012-08-08 23:57:20 +00004334
Torok Edwinb2b37c62009-06-30 17:10:35 +00004335class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004336public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004337 DarwinI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4338 : DarwinTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004339 LongDoubleWidth = 128;
4340 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004341 SuitableAlign = 128;
Tim Northover5627d392015-10-30 16:30:45 +00004342 MaxVectorAlign = 256;
4343 // The watchOS simulator uses the builtin bool type for Objective-C.
4344 llvm::Triple T = llvm::Triple(Triple);
4345 if (T.isWatchOS())
4346 UseSignedCharForObjCBool = false;
Eli Friedman32ca82a2009-03-29 20:31:09 +00004347 SizeType = UnsignedLong;
4348 IntPtrType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00004349 resetDataLayout("e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128");
Daniel Dunbarbd606522010-05-27 00:35:16 +00004350 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00004351 }
4352
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004353 bool handleTargetFeatures(std::vector<std::string> &Features,
4354 DiagnosticsEngine &Diags) override {
4355 if (!DarwinTargetInfo<X86_32TargetInfo>::handleTargetFeatures(Features,
4356 Diags))
4357 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004358 // We now know the features we have: we can decide how to align vectors.
4359 MaxVectorAlign =
4360 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004361 return true;
4362 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004363};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004364
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004365// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004366class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004367public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004368 WindowsX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4369 : WindowsTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Chris Lattner46be2e12009-06-24 17:12:15 +00004370 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00004371 DoubleAlign = LongLongAlign = 64;
Reid Kleckner7510c092015-04-01 16:45:06 +00004372 bool IsWinCOFF =
4373 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
James Y Knightb214cbc2016-03-04 19:00:41 +00004374 resetDataLayout(IsWinCOFF
4375 ? "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
4376 : "e-m:e-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32");
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004377 }
Craig Topper3164f332014-03-11 03:39:26 +00004378 void getTargetDefines(const LangOptions &Opts,
4379 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004380 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
4381 }
4382};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004383
4384// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004385class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004386public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004387 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple,
4388 const TargetOptions &Opts)
4389 : WindowsX86_32TargetInfo(Triple, Opts) {
Eli Friedman015d6282011-03-22 21:25:11 +00004390 LongDoubleWidth = LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00004391 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004392 }
Craig Topper3164f332014-03-11 03:39:26 +00004393 void getTargetDefines(const LangOptions &Opts,
4394 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004395 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
4396 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
4397 // The value of the following reflects processor type.
4398 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
4399 // We lost the original triple, so we use the default.
4400 Builder.defineMacro("_M_IX86", "600");
4401 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004402};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004403
David Majnemerae1ed0e2015-05-28 04:36:18 +00004404static void addCygMingDefines(const LangOptions &Opts, MacroBuilder &Builder) {
Eric Christopherb093d692015-10-09 18:39:59 +00004405 // Mingw and cygwin define __declspec(a) to __attribute__((a)). Clang
4406 // supports __declspec natively under -fms-extensions, but we define a no-op
4407 // __declspec macro anyway for pre-processor compatibility.
Reid Kleckner47606832014-04-21 20:58:00 +00004408 if (Opts.MicrosoftExt)
4409 Builder.defineMacro("__declspec", "__declspec");
4410 else
4411 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
4412
4413 if (!Opts.MicrosoftExt) {
4414 // Provide macros for all the calling convention keywords. Provide both
4415 // single and double underscore prefixed variants. These are available on
4416 // x64 as well as x86, even though they have no effect.
4417 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
4418 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00004419 std::string GCCSpelling = "__attribute__((__";
4420 GCCSpelling += CC;
4421 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00004422 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
4423 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
4424 }
4425 }
4426}
4427
David Majnemerae1ed0e2015-05-28 04:36:18 +00004428static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
4429 Builder.defineMacro("__MSVCRT__");
4430 Builder.defineMacro("__MINGW32__");
4431 addCygMingDefines(Opts, Builder);
4432}
4433
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004434// x86-32 MinGW target
4435class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
4436public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004437 MinGWX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4438 : WindowsX86_32TargetInfo(Triple, Opts) {}
Craig Topper3164f332014-03-11 03:39:26 +00004439 void getTargetDefines(const LangOptions &Opts,
4440 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004441 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004442 DefineStd(Builder, "WIN32", Opts);
4443 DefineStd(Builder, "WINNT", Opts);
4444 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00004445 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004446 }
4447};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004448
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004449// x86-32 Cygwin target
4450class CygwinX86_32TargetInfo : public X86_32TargetInfo {
4451public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004452 CygwinX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4453 : X86_32TargetInfo(Triple, Opts) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004454 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004455 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00004456 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 +00004457 }
Craig Topper3164f332014-03-11 03:39:26 +00004458 void getTargetDefines(const LangOptions &Opts,
4459 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004460 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00004461 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004462 Builder.defineMacro("__CYGWIN__");
4463 Builder.defineMacro("__CYGWIN32__");
David Majnemerae1ed0e2015-05-28 04:36:18 +00004464 addCygMingDefines(Opts, Builder);
Saleem Abdulrasool56027092017-02-07 19:00:06 +00004465 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00004466 if (Opts.CPlusPlus)
4467 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00004468 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004469};
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004470
Chris Lattnerb986aba2010-04-11 19:29:39 +00004471// x86-32 Haiku target
Reid Kleckner330fb172016-05-11 16:19:05 +00004472class HaikuX86_32TargetInfo : public HaikuTargetInfo<X86_32TargetInfo> {
Chris Lattnerb986aba2010-04-11 19:29:39 +00004473public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004474 HaikuX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Reid Kleckner330fb172016-05-11 16:19:05 +00004475 : HaikuTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman04831922010-08-22 01:00:03 +00004476 }
Craig Topper3164f332014-03-11 03:39:26 +00004477 void getTargetDefines(const LangOptions &Opts,
4478 MacroBuilder &Builder) const override {
Reid Kleckner330fb172016-05-11 16:19:05 +00004479 HaikuTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
Chris Lattnerb986aba2010-04-11 19:29:39 +00004480 Builder.defineMacro("__INTEL__");
Chris Lattnerb986aba2010-04-11 19:29:39 +00004481 }
4482};
Chris Lattnerb986aba2010-04-11 19:29:39 +00004483
Alexey Bataevc99b0492015-11-25 09:24:26 +00004484// X86-32 MCU target
4485class MCUX86_32TargetInfo : public X86_32TargetInfo {
4486public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004487 MCUX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4488 : X86_32TargetInfo(Triple, Opts) {
Alexey Bataevc99b0492015-11-25 09:24:26 +00004489 LongDoubleWidth = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00004490 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
James Y Knightb214cbc2016-03-04 19:00:41 +00004491 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 +00004492 WIntType = UnsignedInt;
Alexey Bataevc99b0492015-11-25 09:24:26 +00004493 }
4494
4495 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
4496 // On MCU we support only C calling convention.
4497 return CC == CC_C ? CCCR_OK : CCCR_Warning;
4498 }
4499
4500 void getTargetDefines(const LangOptions &Opts,
4501 MacroBuilder &Builder) const override {
4502 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4503 Builder.defineMacro("__iamcu");
4504 Builder.defineMacro("__iamcu__");
4505 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00004506
4507 bool allowsLargerPreferedTypeAlignment() const override {
4508 return false;
4509 }
Alexey Bataevc99b0492015-11-25 09:24:26 +00004510};
4511
Douglas Gregor9fabd852011-07-01 22:41:14 +00004512// RTEMS Target
4513template<typename Target>
4514class RTEMSTargetInfo : public OSTargetInfo<Target> {
4515protected:
Craig Topper3164f332014-03-11 03:39:26 +00004516 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4517 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004518 // RTEMS defines; list based off of gcc output
4519
Douglas Gregor9fabd852011-07-01 22:41:14 +00004520 Builder.defineMacro("__rtems__");
4521 Builder.defineMacro("__ELF__");
4522 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004523
Douglas Gregor9fabd852011-07-01 22:41:14 +00004524public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004525 RTEMSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4526 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004527 switch (Triple.getArch()) {
4528 default:
4529 case llvm::Triple::x86:
4530 // this->MCountName = ".mcount";
4531 break;
4532 case llvm::Triple::mips:
4533 case llvm::Triple::mipsel:
4534 case llvm::Triple::ppc:
4535 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00004536 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004537 // this->MCountName = "_mcount";
4538 break;
4539 case llvm::Triple::arm:
4540 // this->MCountName = "__mcount";
4541 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004542 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004543 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00004544};
4545
Douglas Gregor9fabd852011-07-01 22:41:14 +00004546// x86-32 RTEMS target
4547class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
4548public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004549 RTEMSX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4550 : X86_32TargetInfo(Triple, Opts) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004551 SizeType = UnsignedLong;
4552 IntPtrType = SignedLong;
4553 PtrDiffType = SignedLong;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004554 }
Craig Topper3164f332014-03-11 03:39:26 +00004555 void getTargetDefines(const LangOptions &Opts,
4556 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004557 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4558 Builder.defineMacro("__INTEL__");
4559 Builder.defineMacro("__rtems__");
4560 }
4561};
Douglas Gregor9fabd852011-07-01 22:41:14 +00004562
Eli Friedman3fd920a2008-08-20 02:34:37 +00004563// x86-64 generic target
4564class X86_64TargetInfo : public X86TargetInfo {
4565public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004566 X86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4567 : X86TargetInfo(Triple, Opts) {
David Blaikie40f842d2014-07-10 18:46:15 +00004568 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
David Majnemer8fa8c382015-03-17 23:55:00 +00004569 bool IsWinCOFF =
4570 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Zinovy Nis1db95732014-07-10 15:27:19 +00004571 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00004572 LongDoubleWidth = 128;
4573 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00004574 LargeArrayMinWidth = 128;
4575 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004576 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00004577 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
4578 PtrDiffType = IsX32 ? SignedInt : SignedLong;
4579 IntPtrType = IsX32 ? SignedInt : SignedLong;
4580 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00004581 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00004582 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00004583
Eric Christopher917e9522014-11-18 22:36:15 +00004584 // Pointers are 32-bit in x32.
Eric Christopherf6ee1f32017-02-10 04:35:21 +00004585 resetDataLayout(IsX32
4586 ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128"
4587 : IsWinCOFF ? "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
4588 : "e-m:e-i64:64-f80:128-n8:16:32:64-S128");
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00004589
4590 // Use fpret only for long double.
4591 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004592
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00004593 // Use fp2ret for _Complex long double.
4594 ComplexLongDoubleUsesFP2Ret = true;
4595
Charles Davisc7d5c942015-09-17 20:55:33 +00004596 // Make __builtin_ms_va_list available.
4597 HasBuiltinMSVaList = true;
4598
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004599 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004600 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00004601 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00004602 }
Craig Topper3164f332014-03-11 03:39:26 +00004603 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004604 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00004605 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004606
Craig Topper3164f332014-03-11 03:39:26 +00004607 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00004608 if (RegNo == 0) return 0;
4609 if (RegNo == 1) return 1;
4610 return -1;
4611 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004612
Craig Topper3164f332014-03-11 03:39:26 +00004613 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00004614 switch (CC) {
4615 case CC_C:
4616 case CC_Swift:
4617 case CC_X86VectorCall:
4618 case CC_IntelOclBicc:
4619 case CC_X86_64Win64:
Roman Levenstein35aa5ce2016-03-16 18:00:46 +00004620 case CC_PreserveMost:
4621 case CC_PreserveAll:
Erich Keane757d3172016-11-02 18:29:35 +00004622 case CC_X86RegCall:
John McCall477f2bb2016-03-03 06:39:32 +00004623 return CCCR_OK;
4624 default:
4625 return CCCR_Warning;
4626 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004627 }
4628
Craig Topper3164f332014-03-11 03:39:26 +00004629 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00004630 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004631 }
4632
Pavel Chupinfd223e12014-08-04 12:39:43 +00004633 // for x32 we need it here explicitly
4634 bool hasInt128Type() const override { return true; }
Reid Klecknerf27e7522016-02-01 18:58:24 +00004635 unsigned getUnwindWordWidth() const override { return 64; }
4636 unsigned getRegisterWidth() const override { return 64; }
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00004637
4638 bool validateGlobalRegisterVariable(StringRef RegName,
4639 unsigned RegSize,
4640 bool &HasSizeMismatch) const override {
4641 // rsp and rbp are the only 64-bit registers the x86 backend can currently
4642 // handle.
4643 if (RegName.equals("rsp") || RegName.equals("rbp")) {
4644 // Check that the register size is 64-bit.
4645 HasSizeMismatch = RegSize != 64;
4646 return true;
4647 }
4648
4649 // Check if the register is a 32-bit register the backend can handle.
4650 return X86TargetInfo::validateGlobalRegisterVariable(RegName, RegSize,
4651 HasSizeMismatch);
4652 }
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00004653 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
4654 return llvm::makeArrayRef(BuiltinInfoX86,
4655 X86::LastTSBuiltin - Builtin::FirstTSBuiltin);
4656 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004657};
Eli Friedman3fd920a2008-08-20 02:34:37 +00004658
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004659// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004660class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004661public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004662 WindowsX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4663 : WindowsTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004664 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00004665 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004666 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004667 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004668 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00004669 SizeType = UnsignedLongLong;
4670 PtrDiffType = SignedLongLong;
4671 IntPtrType = SignedLongLong;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004672 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004673
Craig Topper3164f332014-03-11 03:39:26 +00004674 void getTargetDefines(const LangOptions &Opts,
4675 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004676 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004677 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004678 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004679
Craig Topper3164f332014-03-11 03:39:26 +00004680 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004681 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00004682 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004683
Craig Topper3164f332014-03-11 03:39:26 +00004684 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004685 switch (CC) {
4686 case CC_X86StdCall:
4687 case CC_X86ThisCall:
4688 case CC_X86FastCall:
4689 return CCCR_Ignore;
4690 case CC_C:
4691 case CC_X86VectorCall:
4692 case CC_IntelOclBicc:
4693 case CC_X86_64SysV:
Arnold Schwaighofer4fc955e2016-10-12 18:59:24 +00004694 case CC_Swift:
Erich Keane757d3172016-11-02 18:29:35 +00004695 case CC_X86RegCall:
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004696 return CCCR_OK;
4697 default:
4698 return CCCR_Warning;
4699 }
Charles Davisb5a214e2013-08-30 04:39:01 +00004700 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004701};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004702
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004703// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004704class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004705public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004706 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple,
4707 const TargetOptions &Opts)
4708 : WindowsX86_64TargetInfo(Triple, Opts) {
Eli Friedman015d6282011-03-22 21:25:11 +00004709 LongDoubleWidth = LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00004710 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004711 }
Craig Topper3164f332014-03-11 03:39:26 +00004712 void getTargetDefines(const LangOptions &Opts,
4713 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004714 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
4715 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
David Majnemerb856e8f2015-07-26 23:17:29 +00004716 Builder.defineMacro("_M_X64", "100");
4717 Builder.defineMacro("_M_AMD64", "100");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004718 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004719};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004720
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004721// x86-64 MinGW target
4722class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
4723public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004724 MinGWX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4725 : WindowsX86_64TargetInfo(Triple, Opts) {
Reid Kleckner11a17192015-10-28 22:29:52 +00004726 // Mingw64 rounds long double size and alignment up to 16 bytes, but sticks
4727 // with x86 FP ops. Weird.
4728 LongDoubleWidth = LongDoubleAlign = 128;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00004729 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended();
Reid Kleckner11a17192015-10-28 22:29:52 +00004730 }
4731
Craig Topper3164f332014-03-11 03:39:26 +00004732 void getTargetDefines(const LangOptions &Opts,
4733 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004734 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004735 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004736 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00004737 addMinGWDefines(Opts, Builder);
Reid Klecknere070b992014-11-14 02:01:10 +00004738
4739 // GCC defines this macro when it is using __gxx_personality_seh0.
4740 if (!Opts.SjLjExceptions)
4741 Builder.defineMacro("__SEH__");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004742 }
4743};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004744
Yaron Kerend030d112015-07-22 17:38:19 +00004745// x86-64 Cygwin target
4746class CygwinX86_64TargetInfo : public X86_64TargetInfo {
4747public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004748 CygwinX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4749 : X86_64TargetInfo(Triple, Opts) {
Yaron Kerend030d112015-07-22 17:38:19 +00004750 TLSSupported = false;
4751 WCharType = UnsignedShort;
4752 }
4753 void getTargetDefines(const LangOptions &Opts,
4754 MacroBuilder &Builder) const override {
4755 X86_64TargetInfo::getTargetDefines(Opts, Builder);
4756 Builder.defineMacro("__x86_64__");
4757 Builder.defineMacro("__CYGWIN__");
4758 Builder.defineMacro("__CYGWIN64__");
4759 addCygMingDefines(Opts, Builder);
Saleem Abdulrasool56027092017-02-07 19:00:06 +00004760 DefineStd(Builder, "unix", Opts);
Yaron Kerend030d112015-07-22 17:38:19 +00004761 if (Opts.CPlusPlus)
4762 Builder.defineMacro("_GNU_SOURCE");
4763
4764 // GCC defines this macro when it is using __gxx_personality_seh0.
4765 if (!Opts.SjLjExceptions)
4766 Builder.defineMacro("__SEH__");
4767 }
4768};
4769
Eli Friedman2857ccb2009-07-01 03:36:11 +00004770class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
4771public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004772 DarwinX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4773 : DarwinTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00004774 Int64Type = SignedLongLong;
Tim Northovera2ee4332014-03-29 15:09:45 +00004775 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
4776 llvm::Triple T = llvm::Triple(Triple);
Bob Wilson946c04c2014-10-19 02:19:27 +00004777 if (T.isiOS())
Tim Northovera2ee4332014-03-29 15:09:45 +00004778 UseSignedCharForObjCBool = false;
James Y Knightb214cbc2016-03-04 19:00:41 +00004779 resetDataLayout("e-m:o-i64:64-f80:128-n8:16:32:64-S128");
Eli Friedman2857ccb2009-07-01 03:36:11 +00004780 }
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004781
4782 bool handleTargetFeatures(std::vector<std::string> &Features,
4783 DiagnosticsEngine &Diags) override {
4784 if (!DarwinTargetInfo<X86_64TargetInfo>::handleTargetFeatures(Features,
4785 Diags))
4786 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004787 // We now know the features we have: we can decide how to align vectors.
4788 MaxVectorAlign =
4789 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004790 return true;
4791 }
Eli Friedman2857ccb2009-07-01 03:36:11 +00004792};
Eli Friedman2857ccb2009-07-01 03:36:11 +00004793
Eli Friedman245f2292009-07-05 22:31:18 +00004794class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
4795public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004796 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4797 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Eli Friedman245f2292009-07-05 22:31:18 +00004798 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004799 Int64Type = SignedLongLong;
4800 }
4801};
Eli Friedman245f2292009-07-05 22:31:18 +00004802
Eli Friedman9fa28852012-08-08 23:57:20 +00004803class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
4804public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004805 BitrigX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4806 : BitrigTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004807 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004808 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00004809 }
4810};
Tim Northover9bb857a2013-01-31 12:13:10 +00004811
Eli Friedmanf05b7722008-08-20 07:44:10 +00004812class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004813 // Possible FPU choices.
4814 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004815 VFP2FPU = (1 << 0),
4816 VFP3FPU = (1 << 1),
4817 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00004818 NeonFPU = (1 << 3),
4819 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004820 };
4821
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004822 // Possible HWDiv features.
4823 enum HWDivMode {
4824 HWDivThumb = (1 << 0),
4825 HWDivARM = (1 << 1)
4826 };
4827
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004828 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004829 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004830 }
4831
4832 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4833 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004834
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004835 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004836
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004837 StringRef CPUProfile;
4838 StringRef CPUAttr;
4839
Rafael Espindolaeb265472013-08-21 21:59:03 +00004840 enum {
4841 FP_Default,
4842 FP_VFP,
4843 FP_Neon
4844 } FPMath;
4845
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004846 unsigned ArchISA;
Renato Goline84b0002015-10-08 16:43:26 +00004847 unsigned ArchKind = llvm::ARM::AK_ARMV4T;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004848 unsigned ArchProfile;
4849 unsigned ArchVersion;
4850
Bernard Ogdenda13af32013-10-24 18:32:51 +00004851 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004852
Logan Chien57086ce2012-10-10 06:56:20 +00004853 unsigned IsAAPCS : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004854 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004855
4856 // Initialized via features.
4857 unsigned SoftFloat : 1;
4858 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004859
Bernard Ogden18b57012013-10-29 09:47:51 +00004860 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00004861 unsigned Crypto : 1;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004862 unsigned DSP : 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004863 unsigned Unaligned : 1;
4864
4865 enum {
4866 LDREX_B = (1 << 0), /// byte (8-bit)
4867 LDREX_H = (1 << 1), /// half (16-bit)
4868 LDREX_W = (1 << 2), /// word (32-bit)
4869 LDREX_D = (1 << 3), /// double (64-bit)
4870 };
4871
4872 uint32_t LDREX;
Bernard Ogden18b57012013-10-29 09:47:51 +00004873
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004874 // ACLE 6.5.1 Hardware floating point
4875 enum {
4876 HW_FP_HP = (1 << 1), /// half (16-bit)
4877 HW_FP_SP = (1 << 2), /// single (32-bit)
4878 HW_FP_DP = (1 << 3), /// double (64-bit)
4879 };
4880 uint32_t HW_FP;
4881
Chris Lattner5cc15e02010-03-03 19:03:45 +00004882 static const Builtin::Info BuiltinInfo[];
4883
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004884 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004885 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004886
4887 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00004888 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004889
Renato Golin0201a9e2016-09-22 19:28:20 +00004890 // size_t is unsigned long on MachO-derived environments, NetBSD,
4891 // OpenBSD and Bitrig.
Renato Golin9ba39232015-02-27 16:35:48 +00004892 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD ||
Renato Golin0201a9e2016-09-22 19:28:20 +00004893 T.getOS() == llvm::Triple::OpenBSD ||
Renato Golin9ba39232015-02-27 16:35:48 +00004894 T.getOS() == llvm::Triple::Bitrig)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004895 SizeType = UnsignedLong;
4896 else
4897 SizeType = UnsignedInt;
4898
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004899 switch (T.getOS()) {
4900 case llvm::Triple::NetBSD:
Renato Golin0201a9e2016-09-22 19:28:20 +00004901 case llvm::Triple::OpenBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004902 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004903 break;
4904 case llvm::Triple::Win32:
4905 WCharType = UnsignedShort;
4906 break;
4907 case llvm::Triple::Linux:
4908 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004909 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
4910 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004911 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004912 }
4913
4914 UseBitFieldTypeAlignment = true;
4915
4916 ZeroLengthBitfieldBoundary = 0;
4917
Tim Northover147cd2f2014-10-14 22:12:21 +00004918 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
4919 // so set preferred for small types to 32.
4920 if (T.isOSBinFormatMachO()) {
James Y Knightb214cbc2016-03-04 19:00:41 +00004921 resetDataLayout(BigEndian
4922 ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4923 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Tim Northover147cd2f2014-10-14 22:12:21 +00004924 } else if (T.isOSWindows()) {
Tim Northover147cd2f2014-10-14 22:12:21 +00004925 assert(!BigEndian && "Windows on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004926 resetDataLayout("e"
4927 "-m:w"
4928 "-p:32:32"
4929 "-i64:64"
4930 "-v128:64:128"
4931 "-a:0:32"
4932 "-n32"
4933 "-S64");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00004934 } else if (T.isOSNaCl()) {
4935 assert(!BigEndian && "NaCl on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004936 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004937 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00004938 resetDataLayout(BigEndian
4939 ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4940 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004941 }
4942
4943 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004944 }
4945
Tim Northover5627d392015-10-30 16:30:45 +00004946 void setABIAPCS(bool IsAAPCS16) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00004947 const llvm::Triple &T = getTriple();
4948
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004949 IsAAPCS = false;
4950
Tim Northover5627d392015-10-30 16:30:45 +00004951 if (IsAAPCS16)
4952 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
4953 else
4954 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004955
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004956 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00004957 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004958 SizeType = UnsignedInt;
4959 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004960 SizeType = UnsignedLong;
4961
4962 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
4963 WCharType = SignedInt;
4964
4965 // Do not respect the alignment of bit-field types when laying out
4966 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
4967 UseBitFieldTypeAlignment = false;
4968
4969 /// gcc forces the alignment to 4 bytes, regardless of the type of the
4970 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
4971 /// gcc.
4972 ZeroLengthBitfieldBoundary = 32;
4973
Tim Northover5627d392015-10-30 16:30:45 +00004974 if (T.isOSBinFormatMachO() && IsAAPCS16) {
4975 assert(!BigEndian && "AAPCS16 does not support big-endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004976 resetDataLayout("e-m:o-p:32:32-i64:64-a:0:32-n32-S128");
Tim Northover5627d392015-10-30 16:30:45 +00004977 } else if (T.isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00004978 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00004979 BigEndian
4980 ? "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 +00004981 : "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 +00004982 else
James Y Knightb214cbc2016-03-04 19:00:41 +00004983 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00004984 BigEndian
4985 ? "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 +00004986 : "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 +00004987
4988 // FIXME: Override "preferred align" for double and long long.
4989 }
4990
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004991 void setArchInfo() {
4992 StringRef ArchName = getTriple().getArchName();
4993
Renato Goline84b0002015-10-08 16:43:26 +00004994 ArchISA = llvm::ARM::parseArchISA(ArchName);
4995 CPU = llvm::ARM::getDefaultCPU(ArchName);
4996 unsigned AK = llvm::ARM::parseArch(ArchName);
4997 if (AK != llvm::ARM::AK_INVALID)
4998 ArchKind = AK;
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004999 setArchInfo(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005000 }
5001
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005002 void setArchInfo(unsigned Kind) {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005003 StringRef SubArch;
5004
5005 // cache TargetParser info
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005006 ArchKind = Kind;
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00005007 SubArch = llvm::ARM::getSubArch(ArchKind);
5008 ArchProfile = llvm::ARM::parseArchProfile(SubArch);
5009 ArchVersion = llvm::ARM::parseArchVersion(SubArch);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005010
5011 // cache CPU related strings
5012 CPUAttr = getCPUAttr();
5013 CPUProfile = getCPUProfile();
5014 }
5015
5016 void setAtomic() {
Eric Christopherb093d692015-10-09 18:39:59 +00005017 // when triple does not specify a sub arch,
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005018 // then we are not using inline atomics
Renato Goline84b0002015-10-08 16:43:26 +00005019 bool ShouldUseInlineAtomic =
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005020 (ArchISA == llvm::ARM::IK_ARM && ArchVersion >= 6) ||
5021 (ArchISA == llvm::ARM::IK_THUMB && ArchVersion >= 7);
Eric Christopherb093d692015-10-09 18:39:59 +00005022 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005023 if (ArchProfile == llvm::ARM::PK_M) {
5024 MaxAtomicPromoteWidth = 32;
5025 if (ShouldUseInlineAtomic)
5026 MaxAtomicInlineWidth = 32;
5027 }
5028 else {
5029 MaxAtomicPromoteWidth = 64;
5030 if (ShouldUseInlineAtomic)
5031 MaxAtomicInlineWidth = 64;
Eric Christopherb093d692015-10-09 18:39:59 +00005032 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005033 }
5034
5035 bool isThumb() const {
5036 return (ArchISA == llvm::ARM::IK_THUMB);
5037 }
5038
5039 bool supportsThumb() const {
5040 return CPUAttr.count('T') || ArchVersion >= 6;
5041 }
5042
5043 bool supportsThumb2() const {
Bradley Smithf4affc12016-03-03 13:52:22 +00005044 return CPUAttr.equals("6T2") ||
5045 (ArchVersion >= 7 && !CPUAttr.equals("8M_BASE"));
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005046 }
5047
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005048 StringRef getCPUAttr() const {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005049 // For most sub-arches, the build attribute CPU name is enough.
5050 // For Cortex variants, it's slightly different.
5051 switch(ArchKind) {
5052 default:
Chandler Carruthd96f37a2015-08-30 07:51:18 +00005053 return llvm::ARM::getCPUAttr(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005054 case llvm::ARM::AK_ARMV6M:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005055 return "6M";
Tim Northover525c73c2015-07-21 21:47:33 +00005056 case llvm::ARM::AK_ARMV7S:
5057 return "7S";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005058 case llvm::ARM::AK_ARMV7A:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005059 return "7A";
5060 case llvm::ARM::AK_ARMV7R:
5061 return "7R";
5062 case llvm::ARM::AK_ARMV7M:
5063 return "7M";
5064 case llvm::ARM::AK_ARMV7EM:
5065 return "7EM";
George Burgess IVfc970562017-02-09 23:30:10 +00005066 case llvm::ARM::AK_ARMV7VE:
5067 return "7VE";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005068 case llvm::ARM::AK_ARMV8A:
5069 return "8A";
5070 case llvm::ARM::AK_ARMV8_1A:
5071 return "8_1A";
Oliver Stannard3086c042016-02-11 16:05:52 +00005072 case llvm::ARM::AK_ARMV8_2A:
5073 return "8_2A";
Bradley Smithf4affc12016-03-03 13:52:22 +00005074 case llvm::ARM::AK_ARMV8MBaseline:
5075 return "8M_BASE";
5076 case llvm::ARM::AK_ARMV8MMainline:
5077 return "8M_MAIN";
Javed Absar00b74442016-10-07 12:08:41 +00005078 case llvm::ARM::AK_ARMV8R:
5079 return "8R";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005080 }
5081 }
5082
5083 StringRef getCPUProfile() const {
5084 switch(ArchProfile) {
5085 case llvm::ARM::PK_A:
5086 return "A";
5087 case llvm::ARM::PK_R:
5088 return "R";
5089 case llvm::ARM::PK_M:
5090 return "M";
5091 default:
5092 return "";
5093 }
5094 }
5095
Chris Lattner17df24e2008-04-21 18:56:49 +00005096public:
Matt Arsenaultf333de32016-09-07 07:08:02 +00005097 ARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005098 : TargetInfo(Triple), FPMath(FP_Default), IsAAPCS(true), LDREX(0),
5099 HW_FP(0) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005100
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00005101 switch (getTriple().getOS()) {
5102 case llvm::Triple::NetBSD:
Renato Golin0201a9e2016-09-22 19:28:20 +00005103 case llvm::Triple::OpenBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00005104 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00005105 break;
5106 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00005107 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00005108 break;
5109 }
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00005110
Renato Goline84b0002015-10-08 16:43:26 +00005111 // Cache arch related info.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005112 setArchInfo();
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00005113
Chris Lattner1a8f3942010-04-23 16:29:58 +00005114 // {} in inline assembly are neon specifiers, not assembly variant
5115 // specifiers.
5116 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005117
Eric Christopher0e261882014-12-05 01:06:59 +00005118 // FIXME: This duplicates code from the driver that sets the -target-abi
5119 // option - this code is used if -target-abi isn't passed and should
5120 // be unified in some way.
5121 if (Triple.isOSBinFormatMachO()) {
5122 // The backend is hardwired to assume AAPCS for M-class processors, ensure
5123 // the frontend matches that.
5124 if (Triple.getEnvironment() == llvm::Triple::EABI ||
5125 Triple.getOS() == llvm::Triple::UnknownOS ||
Zijiao Ma56a83722016-08-17 02:13:33 +00005126 ArchProfile == llvm::ARM::PK_M) {
Eric Christopher0e261882014-12-05 01:06:59 +00005127 setABI("aapcs");
Tim Northoverd88ecb32016-01-27 19:32:40 +00005128 } else if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00005129 setABI("aapcs16");
Eric Christopher0e261882014-12-05 01:06:59 +00005130 } else {
5131 setABI("apcs-gnu");
5132 }
5133 } else if (Triple.isOSWindows()) {
5134 // FIXME: this is invalid for WindowsCE
5135 setABI("aapcs");
5136 } else {
5137 // Select the default based on the platform.
5138 switch (Triple.getEnvironment()) {
5139 case llvm::Triple::Android:
5140 case llvm::Triple::GNUEABI:
5141 case llvm::Triple::GNUEABIHF:
Rafael Espindola0fa66802016-06-24 21:35:06 +00005142 case llvm::Triple::MuslEABI:
5143 case llvm::Triple::MuslEABIHF:
Eric Christopher0e261882014-12-05 01:06:59 +00005144 setABI("aapcs-linux");
5145 break;
5146 case llvm::Triple::EABIHF:
5147 case llvm::Triple::EABI:
5148 setABI("aapcs");
5149 break;
Eric Christopher560cc4f2014-12-18 02:08:55 +00005150 case llvm::Triple::GNU:
Renato Goline84b0002015-10-08 16:43:26 +00005151 setABI("apcs-gnu");
5152 break;
Eric Christopher0e261882014-12-05 01:06:59 +00005153 default:
5154 if (Triple.getOS() == llvm::Triple::NetBSD)
5155 setABI("apcs-gnu");
5156 else
5157 setABI("aapcs");
5158 break;
5159 }
5160 }
John McCall86353412010-08-21 22:46:04 +00005161
5162 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00005163 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005164
Renato Golin15b86152015-07-03 16:41:13 +00005165 // ARM has atomics up to 8 bytes
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005166 setAtomic();
Rafael Espindola5ab8e2e2015-07-02 15:14:10 +00005167
James Molloya7139222012-03-12 09:14:10 +00005168 // Do force alignment of members that follow zero length bitfields. If
Eric Christopher917e9522014-11-18 22:36:15 +00005169 // the alignment of the zero-length bitfield is greater than the member
5170 // that follows it, `bar', `bar' will be aligned as the type of the
James Molloya7139222012-03-12 09:14:10 +00005171 // zero length bitfield.
5172 UseZeroLengthBitfieldAlignment = true;
Saleem Abdulrasool9b5ba542016-04-10 03:19:47 +00005173
5174 if (Triple.getOS() == llvm::Triple::Linux ||
5175 Triple.getOS() == llvm::Triple::UnknownOS)
5176 this->MCountName =
5177 Opts.EABIVersion == "gnu" ? "\01__gnu_mcount_nc" : "\01mcount";
Eli Friedmanb5366062008-05-20 14:21:01 +00005178 }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00005179
Alp Toker4925ba72014-06-07 23:30:42 +00005180 StringRef getABI() const override { return ABI; }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00005181
Craig Topper3164f332014-03-11 03:39:26 +00005182 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00005183 ABI = Name;
5184
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00005185 // The defaults (above) are for AAPCS, check if we need to change them.
5186 //
5187 // FIXME: We need support for -meabi... we could just mangle it into the
5188 // name.
Tim Northover756447a2015-10-30 16:30:36 +00005189 if (Name == "apcs-gnu" || Name == "aapcs16") {
Tim Northover5627d392015-10-30 16:30:45 +00005190 setABIAPCS(Name == "aapcs16");
Rafael Espindolad6c2b722013-12-18 19:47:32 +00005191 return true;
5192 }
5193 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
5194 setABIAAPCS();
5195 return true;
5196 }
5197 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00005198 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00005199
Renato Golinf5c4dec2015-05-27 13:33:00 +00005200 // FIXME: This should be based on Arch attributes, not CPU names.
Eric Christopher8c47b422015-10-09 18:39:55 +00005201 bool
5202 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
5203 StringRef CPU,
5204 const std::vector<std::string> &FeaturesVec) const override {
5205
Mehdi Aminia0016ec2016-10-07 08:37:29 +00005206 std::vector<StringRef> TargetFeatures;
Bradley Smithb3501962015-11-16 11:16:36 +00005207 unsigned Arch = llvm::ARM::parseArch(getTriple().getArchName());
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005208
5209 // get default FPU features
Bradley Smithb3501962015-11-16 11:16:36 +00005210 unsigned FPUKind = llvm::ARM::getDefaultFPU(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005211 llvm::ARM::getFPUFeatures(FPUKind, TargetFeatures);
5212
5213 // get default Extension features
Bradley Smithb3501962015-11-16 11:16:36 +00005214 unsigned Extensions = llvm::ARM::getDefaultExtensions(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005215 llvm::ARM::getExtensionFeatures(Extensions, TargetFeatures);
5216
Mehdi Aminia0016ec2016-10-07 08:37:29 +00005217 for (auto Feature : TargetFeatures)
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005218 if (Feature[0] == '+')
Mehdi Aminia0016ec2016-10-07 08:37:29 +00005219 Features[Feature.drop_front(1)] = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005220
Eric Christopher007b0a02015-08-28 22:32:01 +00005221 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005222 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005223
Craig Topper3164f332014-03-11 03:39:26 +00005224 bool handleTargetFeatures(std::vector<std::string> &Features,
5225 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005226 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00005227 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00005228 Crypto = 0;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005229 DSP = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005230 Unaligned = 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005231 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005232 HWDiv = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005233
Ranjeet Singhac08e532015-06-24 23:39:25 +00005234 // This does not diagnose illegal cases like having both
5235 // "+vfpv2" and "+vfpv3" or having "+neon" and "+fp-only-sp".
5236 uint32_t HW_FP_remove = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005237 for (const auto &Feature : Features) {
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005238 if (Feature == "+soft-float") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00005239 SoftFloat = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005240 } else if (Feature == "+soft-float-abi") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00005241 SoftFloatABI = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005242 } else if (Feature == "+vfp2") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005243 FPU |= VFP2FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005244 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005245 } else if (Feature == "+vfp3") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005246 FPU |= VFP3FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005247 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005248 } else if (Feature == "+vfp4") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005249 FPU |= VFP4FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005250 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005251 } else if (Feature == "+fp-armv8") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00005252 FPU |= FPARMV8;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005253 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005254 } else if (Feature == "+neon") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005255 FPU |= NeonFPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005256 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005257 } else if (Feature == "+hwdiv") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005258 HWDiv |= HWDivThumb;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005259 } else if (Feature == "+hwdiv-arm") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005260 HWDiv |= HWDivARM;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005261 } else if (Feature == "+crc") {
Bernard Ogden18b57012013-10-29 09:47:51 +00005262 CRC = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005263 } else if (Feature == "+crypto") {
Tim Northover02e38602014-02-03 17:28:04 +00005264 Crypto = 1;
Artyom Skrobov05d85ae2015-10-23 17:19:02 +00005265 } else if (Feature == "+dsp") {
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005266 DSP = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005267 } else if (Feature == "+fp-only-sp") {
Matt Arsenault250024f2016-06-08 01:56:42 +00005268 HW_FP_remove |= HW_FP_DP;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005269 } else if (Feature == "+strict-align") {
5270 Unaligned = 0;
5271 } else if (Feature == "+fp16") {
5272 HW_FP |= HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005273 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00005274 }
Ranjeet Singhac08e532015-06-24 23:39:25 +00005275 HW_FP &= ~HW_FP_remove;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005276
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005277 switch (ArchVersion) {
5278 case 6:
5279 if (ArchProfile == llvm::ARM::PK_M)
5280 LDREX = 0;
5281 else if (ArchKind == llvm::ARM::AK_ARMV6K)
5282 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5283 else
5284 LDREX = LDREX_W;
5285 break;
5286 case 7:
5287 if (ArchProfile == llvm::ARM::PK_M)
5288 LDREX = LDREX_W | LDREX_H | LDREX_B ;
5289 else
5290 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5291 break;
5292 case 8:
5293 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5294 }
5295
Rafael Espindolaeb265472013-08-21 21:59:03 +00005296 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
5297 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
5298 return false;
5299 }
5300
5301 if (FPMath == FP_Neon)
5302 Features.push_back("+neonfp");
5303 else if (FPMath == FP_VFP)
5304 Features.push_back("-neonfp");
5305
Daniel Dunbar893d4752009-12-19 04:15:38 +00005306 // Remove front-end specific options which the backend handles differently.
Eric Christopher9e172d22015-05-12 01:26:21 +00005307 auto Feature =
5308 std::find(Features.begin(), Features.end(), "+soft-float-abi");
5309 if (Feature != Features.end())
5310 Features.erase(Feature);
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005311
Rafael Espindolaeb265472013-08-21 21:59:03 +00005312 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005313 }
5314
Craig Topper3164f332014-03-11 03:39:26 +00005315 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005316 return llvm::StringSwitch<bool>(Feature)
5317 .Case("arm", true)
Ben Langmuir587aeaf2015-08-07 01:59:56 +00005318 .Case("aarch32", true)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005319 .Case("softfloat", SoftFloat)
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005320 .Case("thumb", isThumb())
Amara Emerson8c3de542013-09-16 18:07:35 +00005321 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005322 .Case("hwdiv", HWDiv & HWDivThumb)
5323 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005324 .Default(false);
5325 }
Renato Golin15b86152015-07-03 16:41:13 +00005326
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005327 bool setCPU(const std::string &Name) override {
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005328 if (Name != "generic")
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00005329 setArchInfo(llvm::ARM::parseCPUArch(Name));
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005330
Renato Golin15b86152015-07-03 16:41:13 +00005331 if (ArchKind == llvm::ARM::AK_INVALID)
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005332 return false;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005333 setAtomic();
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005334 CPU = Name;
5335 return true;
5336 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005337
Craig Topper3164f332014-03-11 03:39:26 +00005338 bool setFPMath(StringRef Name) override;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005339
Craig Topper3164f332014-03-11 03:39:26 +00005340 void getTargetDefines(const LangOptions &Opts,
5341 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00005342 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005343 Builder.defineMacro("__arm");
5344 Builder.defineMacro("__arm__");
Weiming Zhaob0613132016-04-18 16:25:46 +00005345 // For bare-metal none-eabi.
5346 if (getTriple().getOS() == llvm::Triple::UnknownOS &&
5347 getTriple().getEnvironment() == llvm::Triple::EABI)
5348 Builder.defineMacro("__ELF__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00005349
Chris Lattnerecd49032009-03-02 22:27:17 +00005350 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005351 Builder.defineMacro("__REGISTER_PREFIX__", "");
Tim Northover5627d392015-10-30 16:30:45 +00005352
5353 // Unfortunately, __ARM_ARCH_7K__ is now more of an ABI descriptor. The CPU
5354 // happens to be Cortex-A7 though, so it should still get __ARM_ARCH_7A__.
Tim Northoverd88ecb32016-01-27 19:32:40 +00005355 if (getTriple().isWatchABI())
Tim Northover5627d392015-10-30 16:30:45 +00005356 Builder.defineMacro("__ARM_ARCH_7K__", "2");
5357
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005358 if (!CPUAttr.empty())
5359 Builder.defineMacro("__ARM_ARCH_" + CPUAttr + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005360
5361 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005362 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
Benjamin Kramerb42d9a52015-12-24 10:07:37 +00005363 Builder.defineMacro("__ARM_ARCH", Twine(ArchVersion));
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005364
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005365 if (ArchVersion >= 8) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005366 // ACLE 6.5.7 Crypto Extension
5367 if (Crypto)
5368 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
5369 // ACLE 6.5.8 CRC32 Extension
5370 if (CRC)
5371 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
5372 // ACLE 6.5.10 Numeric Maximum and Minimum
5373 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
5374 // ACLE 6.5.9 Directed Rounding
5375 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
James Molloy0ffb0932014-09-15 11:25:38 +00005376 }
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005377
5378 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
5379 // is not defined for the M-profile.
Bradley Smithf4affc12016-03-03 13:52:22 +00005380 // NOTE that the default profile is assumed to be 'A'
5381 if (CPUProfile.empty() || ArchProfile != llvm::ARM::PK_M)
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005382 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
5383
Bradley Smithf4affc12016-03-03 13:52:22 +00005384 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supports the original
5385 // Thumb ISA (including v6-M and v8-M Baseline). It is set to 2 if the
5386 // core supports the Thumb-2 ISA as found in the v6T2 architecture and all
5387 // v7 and v8 architectures excluding v8-M Baseline.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005388 if (supportsThumb2())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005389 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005390 else if (supportsThumb())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005391 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
5392
5393 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
5394 // instruction set such as ARM or Thumb.
5395 Builder.defineMacro("__ARM_32BIT_STATE", "1");
5396
5397 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
5398
5399 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005400 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005401 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00005402
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005403 // ACLE 6.4.3 Unaligned access supported in hardware
Eric Christopherb093d692015-10-09 18:39:59 +00005404 if (Unaligned)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005405 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Eric Christopherb093d692015-10-09 18:39:59 +00005406
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005407 // ACLE 6.4.4 LDREX/STREX
5408 if (LDREX)
5409 Builder.defineMacro("__ARM_FEATURE_LDREX", "0x" + llvm::utohexstr(LDREX));
5410
5411 // ACLE 6.4.5 CLZ
Eric Christopherb093d692015-10-09 18:39:59 +00005412 if (ArchVersion == 5 ||
5413 (ArchVersion == 6 && CPUProfile != "M") ||
5414 ArchVersion > 6)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005415 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
5416
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005417 // ACLE 6.5.1 Hardware Floating Point
5418 if (HW_FP)
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +00005419 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005420
Yi Konga44c4d72014-06-27 21:25:42 +00005421 // ACLE predefines.
5422 Builder.defineMacro("__ARM_ACLE", "200");
5423
Oliver Stannarddc2854c2015-09-03 12:40:58 +00005424 // FP16 support (we currently only support IEEE format).
5425 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
5426 Builder.defineMacro("__ARM_FP16_ARGS", "1");
5427
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005428 // ACLE 6.5.3 Fused multiply-accumulate (FMA)
Silviu Baranga632fdc52016-04-28 11:29:08 +00005429 if (ArchVersion >= 7 && (FPU & VFP4FPU))
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005430 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
5431
Mike Stump9d54bd72009-04-08 02:07:04 +00005432 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005433
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005434 // FIXME: It's more complicated than this and we don't really support
5435 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005436 // Windows on ARM does not "support" interworking
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005437 if (5 <= ArchVersion && ArchVersion <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005438 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005439
David Tweed8f676532012-10-25 13:33:01 +00005440 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00005441 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005442 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
Tim Northover862eaf82016-05-13 21:26:45 +00005443 if (!getTriple().isOSBinFormatMachO() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00005444 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005445 Builder.defineMacro("__ARM_PCS", "1");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005446 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005447
Tim Northover28fc0e12016-04-28 13:59:55 +00005448 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp" ||
5449 ABI == "aapcs16")
5450 Builder.defineMacro("__ARM_PCS_VFP", "1");
5451
Daniel Dunbar893d4752009-12-19 04:15:38 +00005452 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005453 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005454
Zijiao Ma56a83722016-08-17 02:13:33 +00005455 if (ArchKind == llvm::ARM::AK_XSCALE)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005456 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005457
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005458 if (isThumb()) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005459 Builder.defineMacro("__THUMBEL__");
5460 Builder.defineMacro("__thumb__");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005461 if (supportsThumb2())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005462 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005463 }
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005464
5465 // ACLE 6.4.9 32-bit SIMD instructions
5466 if (ArchVersion >= 6 && (CPUProfile != "M" || CPUAttr == "7EM"))
5467 Builder.defineMacro("__ARM_FEATURE_SIMD32", "1");
5468
5469 // ACLE 6.4.10 Hardware Integer Divide
Eric Christopherb093d692015-10-09 18:39:59 +00005470 if (((HWDiv & HWDivThumb) && isThumb()) ||
5471 ((HWDiv & HWDivARM) && !isThumb())) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005472 Builder.defineMacro("__ARM_FEATURE_IDIV", "1");
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005473 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005474 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005475
5476 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005477 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005478
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005479 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005480 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005481 if (FPU & VFP2FPU)
5482 Builder.defineMacro("__ARM_VFPV2__");
5483 if (FPU & VFP3FPU)
5484 Builder.defineMacro("__ARM_VFPV3__");
5485 if (FPU & VFP4FPU)
5486 Builder.defineMacro("__ARM_VFPV4__");
Tim Northoverc67803f2016-12-21 20:49:43 +00005487 if (FPU & FPARMV8)
5488 Builder.defineMacro("__ARM_FPV5__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005489 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00005490
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005491 // This only gets set when Neon instructions are actually available, unlike
5492 // the VFP define, hence the soft float and arch check. This is subtly
5493 // different from gcc, we follow the intent which was that it should be set
5494 // when Neon instructions are actually available.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005495 if ((FPU & NeonFPU) && !SoftFloat && ArchVersion >= 7) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005496 Builder.defineMacro("__ARM_NEON", "1");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005497 Builder.defineMacro("__ARM_NEON__");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005498 // current AArch32 NEON implementations do not support double-precision
5499 // floating-point even when it is present in VFP.
Eric Christopherb093d692015-10-09 18:39:59 +00005500 Builder.defineMacro("__ARM_NEON_FP",
5501 "0x" + llvm::utohexstr(HW_FP & ~HW_FP_DP));
Tim Northover5bb34ca2013-11-21 12:36:34 +00005502 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00005503
Bradley Smith0f28f0c2014-01-20 10:52:00 +00005504 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
5505 Opts.ShortWChar ? "2" : "4");
5506
5507 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5508 Opts.ShortEnums ? "1" : "4");
5509
Bradley Smithf4affc12016-03-03 13:52:22 +00005510 if (ArchVersion >= 6 && CPUAttr != "6M" && CPUAttr != "8M_BASE") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00005511 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5512 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5513 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5514 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
5515 }
Sergey Dmitrouk745f5302014-11-25 08:57:36 +00005516
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005517 // ACLE 6.4.7 DSP instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005518 if (DSP) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005519 Builder.defineMacro("__ARM_FEATURE_DSP", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005520 }
5521
5522 // ACLE 6.4.8 Saturation instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005523 bool SAT = false;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005524 if ((ArchVersion == 6 && CPUProfile != "M") || ArchVersion > 6 ) {
5525 Builder.defineMacro("__ARM_FEATURE_SAT", "1");
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005526 SAT = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005527 }
5528
5529 // ACLE 6.4.6 Q (saturation) flag
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005530 if (DSP || SAT)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005531 Builder.defineMacro("__ARM_FEATURE_QBIT", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005532
5533 if (Opts.UnsafeFPMath)
5534 Builder.defineMacro("__ARM_FP_FAST", "1");
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005535
5536 if (ArchKind == llvm::ARM::AK_ARMV8_1A)
5537 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
Chris Lattner17df24e2008-04-21 18:56:49 +00005538 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005539
Craig Topper6c03a542015-10-19 04:51:35 +00005540 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5541 return llvm::makeArrayRef(BuiltinInfo,
5542 clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner17df24e2008-04-21 18:56:49 +00005543 }
Craig Topper3164f332014-03-11 03:39:26 +00005544 bool isCLZForZeroUndef() const override { return false; }
5545 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northover5627d392015-10-30 16:30:45 +00005546 return IsAAPCS
5547 ? AAPCSABIBuiltinVaList
Tim Northoverd88ecb32016-01-27 19:32:40 +00005548 : (getTriple().isWatchABI() ? TargetInfo::CharPtrBuiltinVaList
5549 : TargetInfo::VoidPtrBuiltinVaList);
Chris Lattner17df24e2008-04-21 18:56:49 +00005550 }
Craig Topperf054e3a2015-10-19 03:52:27 +00005551 ArrayRef<const char *> getGCCRegNames() const override;
5552 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00005553 bool validateAsmConstraint(const char *&Name,
5554 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00005555 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00005556 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00005557 case 'l': // r0-r7
5558 case 'h': // r8-r15
JF Bastien750caef2016-02-19 06:54:45 +00005559 case 't': // VFP Floating point register single precision
5560 case 'w': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00005561 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00005562 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005563 case 'I':
5564 case 'J':
5565 case 'K':
5566 case 'L':
5567 case 'M':
5568 // FIXME
5569 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00005570 case 'Q': // A memory address that is a single base register.
5571 Info.setAllowsMemory();
5572 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005573 case 'U': // a memory reference...
5574 switch (Name[1]) {
5575 case 'q': // ...ARMV4 ldrsb
5576 case 'v': // ...VFP load/store (reg+constant offset)
5577 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00005578 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00005579 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00005580 case 'n': // valid address for Neon doubleword vector load/store
5581 case 'm': // valid address for Neon element and structure load/store
5582 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00005583 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005584 Info.setAllowsMemory();
5585 Name++;
5586 return true;
5587 }
Nate Begeman2908fa02008-04-22 05:03:19 +00005588 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005589 return false;
5590 }
Craig Topper3164f332014-03-11 03:39:26 +00005591 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005592 std::string R;
5593 switch (*Constraint) {
5594 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00005595 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005596 Constraint++;
5597 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00005598 case 'p': // 'p' should be translated to 'r' by default.
5599 R = std::string("r");
5600 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005601 default:
5602 return std::string(1, *Constraint);
5603 }
5604 return R;
5605 }
Akira Hatanaka987f1862014-08-22 06:05:21 +00005606 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005607 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005608 std::string &SuggestedModifier) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00005609 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00005610 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00005611
Bill Wendling9d1ee112012-10-25 23:28:48 +00005612 // Strip off constraint modifiers.
5613 while (Constraint[0] == '=' ||
5614 Constraint[0] == '+' ||
5615 Constraint[0] == '&')
5616 Constraint = Constraint.substr(1);
5617
5618 switch (Constraint[0]) {
5619 default: break;
5620 case 'r': {
5621 switch (Modifier) {
5622 default:
Tim Northover8f24b172013-12-08 15:24:55 +00005623 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00005624 case 'q':
5625 // A register of size 32 cannot fit a vector type.
5626 return false;
5627 }
5628 }
5629 }
5630
5631 return true;
5632 }
Craig Topper3164f332014-03-11 03:39:26 +00005633 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00005634 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00005635 return "";
5636 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005637
Craig Topper3164f332014-03-11 03:39:26 +00005638 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00005639 switch (CC) {
5640 case CC_AAPCS:
5641 case CC_AAPCS_VFP:
5642 case CC_Swift:
5643 return CCCR_OK;
5644 default:
5645 return CCCR_Warning;
5646 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005647 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00005648
Craig Topper3164f332014-03-11 03:39:26 +00005649 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00005650 if (RegNo == 0) return 0;
5651 if (RegNo == 1) return 1;
5652 return -1;
5653 }
Matthias Braund1e2fad2015-07-17 00:15:22 +00005654
5655 bool hasSjLjLowering() const override {
5656 return true;
5657 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005658};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005659
Rafael Espindolaeb265472013-08-21 21:59:03 +00005660bool ARMTargetInfo::setFPMath(StringRef Name) {
5661 if (Name == "neon") {
5662 FPMath = FP_Neon;
5663 return true;
5664 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
5665 Name == "vfp4") {
5666 FPMath = FP_VFP;
5667 return true;
5668 }
5669 return false;
5670}
5671
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005672const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005673 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005674 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005675 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
5676
5677 // Float registers
5678 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
5679 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
5680 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005681 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005682
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005683 // Double registers
5684 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
5685 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005686 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
5687 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005688
5689 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005690 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
5691 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005692};
5693
Craig Topperf054e3a2015-10-19 03:52:27 +00005694ArrayRef<const char *> ARMTargetInfo::getGCCRegNames() const {
5695 return llvm::makeArrayRef(GCCRegNames);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005696}
5697
5698const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005699 { { "a1" }, "r0" },
5700 { { "a2" }, "r1" },
5701 { { "a3" }, "r2" },
5702 { { "a4" }, "r3" },
5703 { { "v1" }, "r4" },
5704 { { "v2" }, "r5" },
5705 { { "v3" }, "r6" },
5706 { { "v4" }, "r7" },
5707 { { "v5" }, "r8" },
5708 { { "v6", "rfp" }, "r9" },
5709 { { "sl" }, "r10" },
5710 { { "fp" }, "r11" },
5711 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00005712 { { "r13" }, "sp" },
5713 { { "r14" }, "lr" },
5714 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005715 // The S, D and Q registers overlap, but aren't really aliases; we
5716 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005717};
5718
Craig Topperf054e3a2015-10-19 03:52:27 +00005719ArrayRef<TargetInfo::GCCRegAlias> ARMTargetInfo::getGCCRegAliases() const {
5720 return llvm::makeArrayRef(GCCRegAliases);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005721}
Chris Lattner5cc15e02010-03-03 19:03:45 +00005722
5723const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00005724#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005725 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005726#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5727 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00005728#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00005729
Craig Topper07d3b622015-08-07 05:14:44 +00005730#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005731 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005732#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005733 { #ID, TYPE, ATTRS, nullptr, LANG, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005734#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5735 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Albert Gutowski2a0621e2016-10-12 22:01:05 +00005736#define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANGS, FEATURE) \
5737 { #ID, TYPE, ATTRS, HEADER, LANGS, FEATURE },
Chris Lattner5cc15e02010-03-03 19:03:45 +00005738#include "clang/Basic/BuiltinsARM.def"
5739};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005740
5741class ARMleTargetInfo : public ARMTargetInfo {
5742public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005743 ARMleTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Matt Arsenaultf333de32016-09-07 07:08:02 +00005744 : ARMTargetInfo(Triple, Opts) {}
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005745 void getTargetDefines(const LangOptions &Opts,
5746 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005747 Builder.defineMacro("__ARMEL__");
5748 ARMTargetInfo::getTargetDefines(Opts, Builder);
5749 }
5750};
5751
5752class ARMbeTargetInfo : public ARMTargetInfo {
5753public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005754 ARMbeTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Matt Arsenaultf333de32016-09-07 07:08:02 +00005755 : ARMTargetInfo(Triple, Opts) {}
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005756 void getTargetDefines(const LangOptions &Opts,
5757 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005758 Builder.defineMacro("__ARMEB__");
5759 Builder.defineMacro("__ARM_BIG_ENDIAN");
5760 ARMTargetInfo::getTargetDefines(Opts, Builder);
5761 }
5762};
Chris Lattner17df24e2008-04-21 18:56:49 +00005763
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005764class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
5765 const llvm::Triple Triple;
5766public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005767 WindowsARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5768 : WindowsTargetInfo<ARMleTargetInfo>(Triple, Opts), Triple(Triple) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005769 WCharType = UnsignedShort;
5770 SizeType = UnsignedInt;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005771 }
5772 void getVisualStudioDefines(const LangOptions &Opts,
5773 MacroBuilder &Builder) const {
5774 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
5775
5776 // FIXME: this is invalid for WindowsCE
5777 Builder.defineMacro("_M_ARM_NT", "1");
5778 Builder.defineMacro("_M_ARMT", "_M_ARM");
5779 Builder.defineMacro("_M_THUMB", "_M_ARM");
5780
5781 assert((Triple.getArch() == llvm::Triple::arm ||
5782 Triple.getArch() == llvm::Triple::thumb) &&
5783 "invalid architecture for Windows ARM target info");
5784 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
5785 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
5786
5787 // TODO map the complete set of values
5788 // 31: VFPv3 40: VFPv4
5789 Builder.defineMacro("_M_ARM_FP", "31");
5790 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00005791 BuiltinVaListKind getBuiltinVaListKind() const override {
5792 return TargetInfo::CharPtrBuiltinVaList;
5793 }
Martell Malone7ccda3c2015-08-14 18:00:09 +00005794 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5795 switch (CC) {
5796 case CC_X86StdCall:
5797 case CC_X86ThisCall:
5798 case CC_X86FastCall:
5799 case CC_X86VectorCall:
5800 return CCCR_Ignore;
5801 case CC_C:
5802 return CCCR_OK;
5803 default:
5804 return CCCR_Warning;
5805 }
5806 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005807};
5808
5809// Windows ARM + Itanium C++ ABI Target
5810class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
5811public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005812 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple,
5813 const TargetOptions &Opts)
5814 : WindowsARMTargetInfo(Triple, Opts) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005815 TheCXXABI.set(TargetCXXABI::GenericARM);
5816 }
5817
5818 void getTargetDefines(const LangOptions &Opts,
5819 MacroBuilder &Builder) const override {
5820 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5821
5822 if (Opts.MSVCCompat)
5823 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5824 }
5825};
5826
5827// Windows ARM, MS (C++) ABI
5828class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
5829public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005830 MicrosoftARMleTargetInfo(const llvm::Triple &Triple,
5831 const TargetOptions &Opts)
5832 : WindowsARMTargetInfo(Triple, Opts) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005833 TheCXXABI.set(TargetCXXABI::Microsoft);
5834 }
5835
5836 void getTargetDefines(const LangOptions &Opts,
5837 MacroBuilder &Builder) const override {
5838 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5839 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5840 }
5841};
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005842
Yaron Keren321249c2015-07-15 13:32:23 +00005843// ARM MinGW target
5844class MinGWARMTargetInfo : public WindowsARMTargetInfo {
5845public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005846 MinGWARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5847 : WindowsARMTargetInfo(Triple, Opts) {
Yaron Keren321249c2015-07-15 13:32:23 +00005848 TheCXXABI.set(TargetCXXABI::GenericARM);
5849 }
5850
5851 void getTargetDefines(const LangOptions &Opts,
5852 MacroBuilder &Builder) const override {
5853 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5854 DefineStd(Builder, "WIN32", Opts);
5855 DefineStd(Builder, "WINNT", Opts);
5856 Builder.defineMacro("_ARM_");
5857 addMinGWDefines(Opts, Builder);
5858 }
5859};
5860
5861// ARM Cygwin target
5862class CygwinARMTargetInfo : public ARMleTargetInfo {
5863public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005864 CygwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5865 : ARMleTargetInfo(Triple, Opts) {
Yaron Keren321249c2015-07-15 13:32:23 +00005866 TLSSupported = false;
5867 WCharType = UnsignedShort;
5868 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00005869 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Yaron Keren321249c2015-07-15 13:32:23 +00005870 }
5871 void getTargetDefines(const LangOptions &Opts,
5872 MacroBuilder &Builder) const override {
5873 ARMleTargetInfo::getTargetDefines(Opts, Builder);
5874 Builder.defineMacro("_ARM_");
5875 Builder.defineMacro("__CYGWIN__");
5876 Builder.defineMacro("__CYGWIN32__");
Saleem Abdulrasool56027092017-02-07 19:00:06 +00005877 DefineStd(Builder, "unix", Opts);
Yaron Keren321249c2015-07-15 13:32:23 +00005878 if (Opts.CPlusPlus)
5879 Builder.defineMacro("_GNU_SOURCE");
5880 }
5881};
5882
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005883class DarwinARMTargetInfo : public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00005884protected:
Craig Topper3164f332014-03-11 03:39:26 +00005885 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5886 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00005887 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00005888 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005889
Torok Edwinb2b37c62009-06-30 17:10:35 +00005890public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005891 DarwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5892 : DarwinTargetInfo<ARMleTargetInfo>(Triple, Opts) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005893 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005894 // iOS always has 64-bit atomic instructions.
Eric Christopher917e9522014-11-18 22:36:15 +00005895 // FIXME: This should be based off of the target features in
5896 // ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005897 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00005898
Tim Northoverd88ecb32016-01-27 19:32:40 +00005899 if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00005900 // Darwin on iOS uses a variant of the ARM C++ ABI.
5901 TheCXXABI.set(TargetCXXABI::WatchOS);
5902
5903 // The 32-bit ABI is silent on what ptrdiff_t should be, but given that
5904 // size_t is long, it's a bit weird for it to be int.
5905 PtrDiffType = SignedLong;
5906
5907 // BOOL should be a real boolean on the new ABI
5908 UseSignedCharForObjCBool = false;
5909 } else
5910 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005911 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005912};
Eli Friedmanf05b7722008-08-20 07:44:10 +00005913
Tim Northover573cbee2014-05-24 12:52:07 +00005914class AArch64TargetInfo : public TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00005915 virtual void setDataLayout() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00005916 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5917 static const char *const GCCRegNames[];
5918
James Molloy75f5f9e2014-04-16 15:33:48 +00005919 enum FPUModeEnum {
5920 FPUMode,
5921 NeonMode
5922 };
5923
5924 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00005925 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00005926 unsigned Crypto;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005927 unsigned Unaligned;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005928 unsigned V8_1A;
James Molloy75f5f9e2014-04-16 15:33:48 +00005929
Tim Northovera2ee4332014-03-29 15:09:45 +00005930 static const Builtin::Info BuiltinInfo[];
5931
5932 std::string ABI;
5933
5934public:
Saleem Abdulrasool9b5ba542016-04-10 03:19:47 +00005935 AArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Tim Northovera2ee4332014-03-29 15:09:45 +00005936 : TargetInfo(Triple), ABI("aapcs") {
Tim Northover25e8a672014-05-24 12:51:25 +00005937 if (getTriple().getOS() == llvm::Triple::NetBSD) {
5938 WCharType = SignedInt;
5939
5940 // NetBSD apparently prefers consistency across ARM targets to consistency
5941 // across 64-bit targets.
5942 Int64Type = SignedLongLong;
5943 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005944 } else {
5945 WCharType = UnsignedInt;
5946 Int64Type = SignedLong;
5947 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005948 }
5949
Tim Northovera2ee4332014-03-29 15:09:45 +00005950 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005951 MaxVectorAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005952 MaxAtomicInlineWidth = 128;
5953 MaxAtomicPromoteWidth = 128;
5954
Tim Northovera6a19f12015-02-06 01:25:07 +00005955 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 128;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00005956 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Tim Northovera2ee4332014-03-29 15:09:45 +00005957
Tim Northovera2ee4332014-03-29 15:09:45 +00005958 // {} in inline assembly are neon specifiers, not assembly variant
5959 // specifiers.
5960 NoAsmVariants = true;
5961
Tim Northover7ad87af2015-01-16 18:44:04 +00005962 // AAPCS gives rules for bitfields. 7.1.7 says: "The container type
5963 // contributes to the alignment of the containing aggregate in the same way
5964 // a plain (non bit-field) member of that type would, without exception for
5965 // zero-sized or anonymous bit-fields."
Tim Northover5627d392015-10-30 16:30:45 +00005966 assert(UseBitFieldTypeAlignment && "bitfields affect type alignment");
Tim Northover7ad87af2015-01-16 18:44:04 +00005967 UseZeroLengthBitfieldAlignment = true;
5968
Tim Northover573cbee2014-05-24 12:52:07 +00005969 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00005970 TheCXXABI.set(TargetCXXABI::GenericAArch64);
Saleem Abdulrasoolc066d9c2016-04-12 03:05:03 +00005971
5972 if (Triple.getOS() == llvm::Triple::Linux ||
5973 Triple.getOS() == llvm::Triple::UnknownOS)
5974 this->MCountName = Opts.EABIVersion == "gnu" ? "\01_mcount" : "mcount";
Tim Northovera2ee4332014-03-29 15:09:45 +00005975 }
5976
Alp Toker4925ba72014-06-07 23:30:42 +00005977 StringRef getABI() const override { return ABI; }
David Blaikie1cbb9712014-11-14 19:09:44 +00005978 bool setABI(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005979 if (Name != "aapcs" && Name != "darwinpcs")
5980 return false;
5981
5982 ABI = Name;
5983 return true;
5984 }
5985
David Blaikie1cbb9712014-11-14 19:09:44 +00005986 bool setCPU(const std::string &Name) override {
Zijiao Ma33e95212016-07-28 06:24:48 +00005987 return Name == "generic" ||
5988 llvm::AArch64::parseCPUArch(Name) !=
5989 static_cast<unsigned>(llvm::AArch64::ArchKind::AK_INVALID);
Tim Northovera2ee4332014-03-29 15:09:45 +00005990 }
5991
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005992 void getTargetDefines(const LangOptions &Opts,
5993 MacroBuilder &Builder) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005994 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00005995 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005996
5997 // Target properties.
5998 Builder.defineMacro("_LP64");
5999 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00006000
6001 // ACLE predefines. Many can only have one possible value on v8 AArch64.
6002 Builder.defineMacro("__ARM_ACLE", "200");
6003 Builder.defineMacro("__ARM_ARCH", "8");
6004 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
6005
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006006 Builder.defineMacro("__ARM_64BIT_STATE", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00006007 Builder.defineMacro("__ARM_PCS_AAPCS64", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006008 Builder.defineMacro("__ARM_ARCH_ISA_A64", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00006009
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006010 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
6011 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
6012 Builder.defineMacro("__ARM_FEATURE_LDREX", "0xF");
6013 Builder.defineMacro("__ARM_FEATURE_IDIV", "1"); // As specified in ACLE
James Molloy0ffb0932014-09-15 11:25:38 +00006014 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006015 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
6016 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00006017
6018 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
6019
6020 // 0xe implies support for half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006021 Builder.defineMacro("__ARM_FP", "0xE");
Tim Northovera2ee4332014-03-29 15:09:45 +00006022
6023 // PCS specifies this for SysV variants, which is all we support. Other ABIs
6024 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006025 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
6026 Builder.defineMacro("__ARM_FP16_ARGS", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00006027
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00006028 if (Opts.UnsafeFPMath)
6029 Builder.defineMacro("__ARM_FP_FAST", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00006030
6031 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
6032
6033 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
6034 Opts.ShortEnums ? "1" : "4");
6035
James Molloy75f5f9e2014-04-16 15:33:48 +00006036 if (FPU == NeonMode) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006037 Builder.defineMacro("__ARM_NEON", "1");
James Molloy75f5f9e2014-04-16 15:33:48 +00006038 // 64-bit NEON supports half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006039 Builder.defineMacro("__ARM_NEON_FP", "0xE");
James Molloy75f5f9e2014-04-16 15:33:48 +00006040 }
Tim Northovera2ee4332014-03-29 15:09:45 +00006041
Bradley Smith418c5932014-05-02 15:17:51 +00006042 if (CRC)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006043 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
Bradley Smith418c5932014-05-02 15:17:51 +00006044
James Molloy75f5f9e2014-04-16 15:33:48 +00006045 if (Crypto)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006046 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
6047
6048 if (Unaligned)
6049 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Reid Klecknerd167d422015-05-06 15:31:46 +00006050
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00006051 if (V8_1A)
6052 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
6053
Reid Klecknerd167d422015-05-06 15:31:46 +00006054 // All of the __sync_(bool|val)_compare_and_swap_(1|2|4|8) builtins work.
6055 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
6056 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
6057 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
6058 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Tim Northovera2ee4332014-03-29 15:09:45 +00006059 }
6060
Craig Topper6c03a542015-10-19 04:51:35 +00006061 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6062 return llvm::makeArrayRef(BuiltinInfo,
6063 clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin);
Tim Northovera2ee4332014-03-29 15:09:45 +00006064 }
6065
David Blaikie1cbb9712014-11-14 19:09:44 +00006066 bool hasFeature(StringRef Feature) const override {
James Molloy75f5f9e2014-04-16 15:33:48 +00006067 return Feature == "aarch64" ||
6068 Feature == "arm64" ||
Ben Langmuir587aeaf2015-08-07 01:59:56 +00006069 Feature == "arm" ||
James Molloy75f5f9e2014-04-16 15:33:48 +00006070 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00006071 }
6072
James Molloy5e73df52014-04-16 15:06:20 +00006073 bool handleTargetFeatures(std::vector<std::string> &Features,
6074 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00006075 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00006076 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00006077 Crypto = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006078 Unaligned = 1;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00006079 V8_1A = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006080
Eric Christopher610fe112015-08-26 08:21:55 +00006081 for (const auto &Feature : Features) {
6082 if (Feature == "+neon")
James Molloy75f5f9e2014-04-16 15:33:48 +00006083 FPU = NeonMode;
Eric Christopher610fe112015-08-26 08:21:55 +00006084 if (Feature == "+crc")
Bradley Smith418c5932014-05-02 15:17:51 +00006085 CRC = 1;
Eric Christopher610fe112015-08-26 08:21:55 +00006086 if (Feature == "+crypto")
James Molloy75f5f9e2014-04-16 15:33:48 +00006087 Crypto = 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006088 if (Feature == "+strict-align")
6089 Unaligned = 0;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00006090 if (Feature == "+v8.1a")
6091 V8_1A = 1;
James Molloy75f5f9e2014-04-16 15:33:48 +00006092 }
6093
James Y Knightb214cbc2016-03-04 19:00:41 +00006094 setDataLayout();
James Molloy5e73df52014-04-16 15:06:20 +00006095
6096 return true;
6097 }
6098
John McCall477f2bb2016-03-03 06:39:32 +00006099 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
6100 switch (CC) {
6101 case CC_C:
6102 case CC_Swift:
Roman Levenstein35aa5ce2016-03-16 18:00:46 +00006103 case CC_PreserveMost:
6104 case CC_PreserveAll:
John McCall477f2bb2016-03-03 06:39:32 +00006105 return CCCR_OK;
6106 default:
6107 return CCCR_Warning;
6108 }
6109 }
6110
David Blaikie1cbb9712014-11-14 19:09:44 +00006111 bool isCLZForZeroUndef() const override { return false; }
Tim Northovera2ee4332014-03-29 15:09:45 +00006112
David Blaikie1cbb9712014-11-14 19:09:44 +00006113 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006114 return TargetInfo::AArch64ABIBuiltinVaList;
6115 }
6116
Craig Topperf054e3a2015-10-19 03:52:27 +00006117 ArrayRef<const char *> getGCCRegNames() const override;
6118 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00006119
Alexander Kornienko34eb2072015-04-11 02:00:23 +00006120 bool validateAsmConstraint(const char *&Name,
6121 TargetInfo::ConstraintInfo &Info) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006122 switch (*Name) {
6123 default:
6124 return false;
6125 case 'w': // Floating point and SIMD registers (V0-V31)
6126 Info.setAllowsRegister();
6127 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00006128 case 'I': // Constant that can be used with an ADD instruction
6129 case 'J': // Constant that can be used with a SUB instruction
6130 case 'K': // Constant that can be used with a 32-bit logical instruction
6131 case 'L': // Constant that can be used with a 64-bit logical instruction
6132 case 'M': // Constant that can be used as a 32-bit MOV immediate
6133 case 'N': // Constant that can be used as a 64-bit MOV immediate
6134 case 'Y': // Floating point constant zero
6135 case 'Z': // Integer constant zero
6136 return true;
6137 case 'Q': // A memory reference with base register and no offset
6138 Info.setAllowsMemory();
6139 return true;
6140 case 'S': // A symbolic address
6141 Info.setAllowsRegister();
6142 return true;
6143 case 'U':
Eric Christopher917e9522014-11-18 22:36:15 +00006144 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
6145 // Utf: A memory address suitable for ldp/stp in TF mode.
6146 // Usa: An absolute symbolic address.
6147 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
6148 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
Tim Northovera2ee4332014-03-29 15:09:45 +00006149 case 'z': // Zero register, wzr or xzr
6150 Info.setAllowsRegister();
6151 return true;
6152 case 'x': // Floating point and SIMD registers (V0-V15)
6153 Info.setAllowsRegister();
6154 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00006155 }
6156 return false;
6157 }
6158
Akira Hatanaka987f1862014-08-22 06:05:21 +00006159 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00006160 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00006161 std::string &SuggestedModifier) const override {
James Molloy8a157bf2014-07-25 10:19:47 +00006162 // Strip off constraint modifiers.
6163 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
6164 Constraint = Constraint.substr(1);
6165
6166 switch (Constraint[0]) {
6167 default:
6168 return true;
6169 case 'z':
6170 case 'r': {
6171 switch (Modifier) {
6172 case 'x':
6173 case 'w':
6174 // For now assume that the person knows what they're
6175 // doing with the modifier.
6176 return true;
6177 default:
6178 // By default an 'r' constraint will be in the 'x'
6179 // registers.
Akira Hatanaka987f1862014-08-22 06:05:21 +00006180 if (Size == 64)
6181 return true;
6182
6183 SuggestedModifier = "w";
6184 return false;
James Molloy8a157bf2014-07-25 10:19:47 +00006185 }
6186 }
6187 }
6188 }
6189
David Blaikie1cbb9712014-11-14 19:09:44 +00006190 const char *getClobbers() const override { return ""; }
Tim Northovera2ee4332014-03-29 15:09:45 +00006191
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00006192 int getEHDataRegisterNumber(unsigned RegNo) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006193 if (RegNo == 0)
6194 return 0;
6195 if (RegNo == 1)
6196 return 1;
6197 return -1;
6198 }
6199};
6200
Tim Northover573cbee2014-05-24 12:52:07 +00006201const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00006202 // 32-bit Integer registers
6203 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
6204 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
6205 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
6206
6207 // 64-bit Integer registers
6208 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
6209 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
6210 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
6211
6212 // 32-bit floating point regsisters
6213 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
6214 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
6215 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
6216
6217 // 64-bit floating point regsisters
6218 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
6219 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
6220 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
6221
6222 // Vector registers
6223 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
6224 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
6225 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
6226};
6227
Craig Topperf054e3a2015-10-19 03:52:27 +00006228ArrayRef<const char *> AArch64TargetInfo::getGCCRegNames() const {
6229 return llvm::makeArrayRef(GCCRegNames);
Tim Northovera2ee4332014-03-29 15:09:45 +00006230}
6231
Tim Northover573cbee2014-05-24 12:52:07 +00006232const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00006233 { { "w31" }, "wsp" },
6234 { { "x29" }, "fp" },
6235 { { "x30" }, "lr" },
6236 { { "x31" }, "sp" },
6237 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
6238 // don't want to substitute one of these for a different-sized one.
6239};
6240
Craig Topperf054e3a2015-10-19 03:52:27 +00006241ArrayRef<TargetInfo::GCCRegAlias> AArch64TargetInfo::getGCCRegAliases() const {
6242 return llvm::makeArrayRef(GCCRegAliases);
Tim Northovera2ee4332014-03-29 15:09:45 +00006243}
6244
Tim Northover573cbee2014-05-24 12:52:07 +00006245const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00006246#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006247 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00006248#include "clang/Basic/BuiltinsNEON.def"
6249
6250#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006251 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northover573cbee2014-05-24 12:52:07 +00006252#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00006253};
James Molloy5e73df52014-04-16 15:06:20 +00006254
Tim Northover573cbee2014-05-24 12:52:07 +00006255class AArch64leTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00006256 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00006257 if (getTriple().isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00006258 resetDataLayout("e-m:o-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006259 else
Chad Rosier4c077aa2016-07-07 20:02:25 +00006260 resetDataLayout("e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006261 }
6262
6263public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006264 AArch64leTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6265 : AArch64TargetInfo(Triple, Opts) {
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006266 }
James Molloy5e73df52014-04-16 15:06:20 +00006267 void getTargetDefines(const LangOptions &Opts,
6268 MacroBuilder &Builder) const override {
6269 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00006270 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00006271 }
6272};
6273
Tim Northover573cbee2014-05-24 12:52:07 +00006274class AArch64beTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00006275 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00006276 assert(!getTriple().isOSBinFormatMachO());
Chad Rosier4c077aa2016-07-07 20:02:25 +00006277 resetDataLayout("E-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006278 }
6279
6280public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006281 AArch64beTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6282 : AArch64TargetInfo(Triple, Opts) {}
James Molloy5e73df52014-04-16 15:06:20 +00006283 void getTargetDefines(const LangOptions &Opts,
6284 MacroBuilder &Builder) const override {
6285 Builder.defineMacro("__AARCH64EB__");
6286 Builder.defineMacro("__AARCH_BIG_ENDIAN");
6287 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00006288 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00006289 }
6290};
Tim Northovera2ee4332014-03-29 15:09:45 +00006291
Tim Northover573cbee2014-05-24 12:52:07 +00006292class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00006293protected:
6294 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
6295 MacroBuilder &Builder) const override {
6296 Builder.defineMacro("__AARCH64_SIMD__");
6297 Builder.defineMacro("__ARM64_ARCH_8__");
6298 Builder.defineMacro("__ARM_NEON__");
6299 Builder.defineMacro("__LITTLE_ENDIAN__");
6300 Builder.defineMacro("__REGISTER_PREFIX__", "");
6301 Builder.defineMacro("__arm64", "1");
6302 Builder.defineMacro("__arm64__", "1");
6303
6304 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
6305 }
6306
Tim Northovera2ee4332014-03-29 15:09:45 +00006307public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006308 DarwinAArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6309 : DarwinTargetInfo<AArch64leTargetInfo>(Triple, Opts) {
Tim Northovera2ee4332014-03-29 15:09:45 +00006310 Int64Type = SignedLongLong;
6311 WCharType = SignedInt;
6312 UseSignedCharForObjCBool = false;
6313
Tim Northovera6a19f12015-02-06 01:25:07 +00006314 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00006315 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Tim Northovera2ee4332014-03-29 15:09:45 +00006316
6317 TheCXXABI.set(TargetCXXABI::iOS64);
6318 }
6319
David Blaikie1cbb9712014-11-14 19:09:44 +00006320 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006321 return TargetInfo::CharPtrBuiltinVaList;
6322 }
6323};
Tim Northovera2ee4332014-03-29 15:09:45 +00006324
Tony Linthicum76329bf2011-12-12 21:14:55 +00006325// Hexagon abstract base class
6326class HexagonTargetInfo : public TargetInfo {
6327 static const Builtin::Info BuiltinInfo[];
6328 static const char * const GCCRegNames[];
6329 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6330 std::string CPU;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006331 bool HasHVX, HasHVXDouble;
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006332 bool UseLongCalls;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006333
Tony Linthicum76329bf2011-12-12 21:14:55 +00006334public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006335 HexagonTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6336 : TargetInfo(Triple) {
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00006337 // Specify the vector alignment explicitly. For v512x1, the calculated
6338 // alignment would be 512*alignment(i1), which is 512 bytes, instead of
6339 // the required minimum of 64 bytes.
James Y Knightb214cbc2016-03-04 19:00:41 +00006340 resetDataLayout("e-m:e-p:32:32:32-a:0-n16:32-"
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00006341 "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 +00006342 "v32:32:32-v64:64:64-v512:512:512-v1024:1024:1024-v2048:2048:2048");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006343 SizeType = UnsignedInt;
6344 PtrDiffType = SignedInt;
6345 IntPtrType = SignedInt;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006346
6347 // {} in inline assembly are packet specifiers, not assembly variant
6348 // specifiers.
6349 NoAsmVariants = true;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006350
6351 LargeArrayMinWidth = 64;
6352 LargeArrayAlign = 64;
6353 UseBitFieldTypeAlignment = true;
6354 ZeroLengthBitfieldBoundary = 32;
6355 HasHVX = HasHVXDouble = false;
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006356 UseLongCalls = false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006357 }
6358
Craig Topper6c03a542015-10-19 04:51:35 +00006359 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6360 return llvm::makeArrayRef(BuiltinInfo,
6361 clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006362 }
6363
Craig Topper3164f332014-03-11 03:39:26 +00006364 bool validateAsmConstraint(const char *&Name,
6365 TargetInfo::ConstraintInfo &Info) const override {
Krzysztof Parzyszeke0026e42016-05-18 14:56:14 +00006366 switch (*Name) {
6367 case 'v':
6368 case 'q':
6369 if (HasHVX) {
6370 Info.setAllowsRegister();
6371 return true;
6372 }
6373 break;
Krzysztof Parzyszek89fb4412016-05-20 13:50:32 +00006374 case 's':
6375 // Relocatable constant.
6376 return true;
Krzysztof Parzyszeke0026e42016-05-18 14:56:14 +00006377 }
6378 return false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006379 }
6380
Craig Topper3164f332014-03-11 03:39:26 +00006381 void getTargetDefines(const LangOptions &Opts,
6382 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006383
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006384 bool isCLZForZeroUndef() const override { return false; }
6385
Craig Topper3164f332014-03-11 03:39:26 +00006386 bool hasFeature(StringRef Feature) const override {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006387 return llvm::StringSwitch<bool>(Feature)
6388 .Case("hexagon", true)
6389 .Case("hvx", HasHVX)
6390 .Case("hvx-double", HasHVXDouble)
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006391 .Case("long-calls", UseLongCalls)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006392 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006393 }
Craig Topper3164f332014-03-11 03:39:26 +00006394
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006395 bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6396 StringRef CPU, const std::vector<std::string> &FeaturesVec)
6397 const override;
6398
6399 bool handleTargetFeatures(std::vector<std::string> &Features,
6400 DiagnosticsEngine &Diags) override;
6401
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006402 void setFeatureEnabled(llvm::StringMap<bool> &Features, StringRef Name,
6403 bool Enabled) const override;
6404
Craig Topper3164f332014-03-11 03:39:26 +00006405 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006406 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006407 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006408 ArrayRef<const char *> getGCCRegNames() const override;
6409 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00006410 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006411 return "";
6412 }
Sebastian Pop86500282012-01-13 20:37:10 +00006413
6414 static const char *getHexagonCPUSuffix(StringRef Name) {
6415 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00006416 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006417 .Case("hexagonv5", "5")
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006418 .Case("hexagonv55", "55")
6419 .Case("hexagonv60", "60")
Craig Topperf1186c52014-05-08 06:41:40 +00006420 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00006421 }
6422
Craig Topper3164f332014-03-11 03:39:26 +00006423 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00006424 if (!getHexagonCPUSuffix(Name))
6425 return false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006426 CPU = Name;
6427 return true;
6428 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006429
6430 int getEHDataRegisterNumber(unsigned RegNo) const override {
6431 return RegNo < 2 ? RegNo : -1;
6432 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006433};
6434
6435void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006436 MacroBuilder &Builder) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006437 Builder.defineMacro("__qdsp6__", "1");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006438 Builder.defineMacro("__hexagon__", "1");
6439
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006440 if (CPU == "hexagonv4") {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006441 Builder.defineMacro("__HEXAGON_V4__");
6442 Builder.defineMacro("__HEXAGON_ARCH__", "4");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006443 if (Opts.HexagonQdsp6Compat) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006444 Builder.defineMacro("__QDSP6_V4__");
6445 Builder.defineMacro("__QDSP6_ARCH__", "4");
6446 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006447 } else if (CPU == "hexagonv5") {
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006448 Builder.defineMacro("__HEXAGON_V5__");
6449 Builder.defineMacro("__HEXAGON_ARCH__", "5");
6450 if(Opts.HexagonQdsp6Compat) {
6451 Builder.defineMacro("__QDSP6_V5__");
6452 Builder.defineMacro("__QDSP6_ARCH__", "5");
6453 }
Krzysztof Parzyszeka58ff512016-04-21 14:30:04 +00006454 } else if (CPU == "hexagonv55") {
6455 Builder.defineMacro("__HEXAGON_V55__");
6456 Builder.defineMacro("__HEXAGON_ARCH__", "55");
6457 Builder.defineMacro("__QDSP6_V55__");
6458 Builder.defineMacro("__QDSP6_ARCH__", "55");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006459 } else if (CPU == "hexagonv60") {
6460 Builder.defineMacro("__HEXAGON_V60__");
6461 Builder.defineMacro("__HEXAGON_ARCH__", "60");
6462 Builder.defineMacro("__QDSP6_V60__");
6463 Builder.defineMacro("__QDSP6_ARCH__", "60");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006464 }
Krzysztof Parzyszek7f0756c2016-04-18 18:38:11 +00006465
6466 if (hasFeature("hvx")) {
6467 Builder.defineMacro("__HVX__");
6468 if (hasFeature("hvx-double"))
6469 Builder.defineMacro("__HVXDBL__");
6470 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006471}
6472
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006473bool HexagonTargetInfo::initFeatureMap(llvm::StringMap<bool> &Features,
6474 DiagnosticsEngine &Diags, StringRef CPU,
6475 const std::vector<std::string> &FeaturesVec) const {
6476 // Default for v60: -hvx, -hvx-double.
6477 Features["hvx"] = false;
6478 Features["hvx-double"] = false;
6479 Features["long-calls"] = false;
6480
6481 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
6482}
6483
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006484bool HexagonTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
6485 DiagnosticsEngine &Diags) {
6486 for (auto &F : Features) {
6487 if (F == "+hvx")
6488 HasHVX = true;
6489 else if (F == "-hvx")
6490 HasHVX = HasHVXDouble = false;
6491 else if (F == "+hvx-double")
6492 HasHVX = HasHVXDouble = true;
6493 else if (F == "-hvx-double")
6494 HasHVXDouble = false;
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006495
6496 if (F == "+long-calls")
6497 UseLongCalls = true;
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006498 else if (F == "-long-calls")
6499 UseLongCalls = false;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006500 }
6501 return true;
6502}
6503
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006504void HexagonTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
6505 StringRef Name, bool Enabled) const {
6506 if (Enabled) {
6507 if (Name == "hvx-double")
6508 Features["hvx"] = true;
6509 } else {
6510 if (Name == "hvx")
6511 Features["hvx-double"] = false;
6512 }
6513 Features[Name] = Enabled;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006514}
6515
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006516const char *const HexagonTargetInfo::GCCRegNames[] = {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006517 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6518 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6519 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6520 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
6521 "p0", "p1", "p2", "p3",
6522 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
6523};
6524
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006525ArrayRef<const char*> HexagonTargetInfo::getGCCRegNames() const {
Craig Topperf054e3a2015-10-19 03:52:27 +00006526 return llvm::makeArrayRef(GCCRegNames);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006527}
6528
Tony Linthicum76329bf2011-12-12 21:14:55 +00006529const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
6530 { { "sp" }, "r29" },
6531 { { "fp" }, "r30" },
6532 { { "lr" }, "r31" },
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006533};
Tony Linthicum76329bf2011-12-12 21:14:55 +00006534
Craig Topperf054e3a2015-10-19 03:52:27 +00006535ArrayRef<TargetInfo::GCCRegAlias> HexagonTargetInfo::getGCCRegAliases() const {
6536 return llvm::makeArrayRef(GCCRegAliases);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006537}
6538
6539
6540const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00006541#define BUILTIN(ID, TYPE, ATTRS) \
6542 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
6543#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
6544 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tony Linthicum76329bf2011-12-12 21:14:55 +00006545#include "clang/Basic/BuiltinsHexagon.def"
6546};
Tony Linthicum76329bf2011-12-12 21:14:55 +00006547
Jacques Pienaard964cc22016-03-28 21:02:54 +00006548class LanaiTargetInfo : public TargetInfo {
6549 // Class for Lanai (32-bit).
6550 // The CPU profiles supported by the Lanai backend
6551 enum CPUKind {
6552 CK_NONE,
6553 CK_V11,
6554 } CPU;
6555
6556 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6557 static const char *const GCCRegNames[];
6558
6559public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006560 LanaiTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6561 : TargetInfo(Triple) {
Jacques Pienaard964cc22016-03-28 21:02:54 +00006562 // Description string has to be kept in sync with backend.
6563 resetDataLayout("E" // Big endian
6564 "-m:e" // ELF name manging
6565 "-p:32:32" // 32 bit pointers, 32 bit aligned
6566 "-i64:64" // 64 bit integers, 64 bit aligned
6567 "-a:0:32" // 32 bit alignment of objects of aggregate type
6568 "-n32" // 32 bit native integer width
6569 "-S64" // 64 bit natural stack alignment
6570 );
6571
6572 // Setting RegParmMax equal to what mregparm was set to in the old
6573 // toolchain
6574 RegParmMax = 4;
6575
6576 // Set the default CPU to V11
6577 CPU = CK_V11;
6578
6579 // Temporary approach to make everything at least word-aligned and allow for
6580 // safely casting between pointers with different alignment requirements.
6581 // TODO: Remove this when there are no more cast align warnings on the
6582 // firmware.
6583 MinGlobalAlign = 32;
6584 }
6585
6586 void getTargetDefines(const LangOptions &Opts,
6587 MacroBuilder &Builder) const override {
6588 // Define __lanai__ when building for target lanai.
6589 Builder.defineMacro("__lanai__");
6590
6591 // Set define for the CPU specified.
6592 switch (CPU) {
6593 case CK_V11:
6594 Builder.defineMacro("__LANAI_V11__");
6595 break;
6596 case CK_NONE:
6597 llvm_unreachable("Unhandled target CPU");
6598 }
6599 }
6600
6601 bool setCPU(const std::string &Name) override {
6602 CPU = llvm::StringSwitch<CPUKind>(Name)
6603 .Case("v11", CK_V11)
6604 .Default(CK_NONE);
6605
6606 return CPU != CK_NONE;
6607 }
6608
6609 bool hasFeature(StringRef Feature) const override {
6610 return llvm::StringSwitch<bool>(Feature).Case("lanai", true).Default(false);
6611 }
6612
6613 ArrayRef<const char *> getGCCRegNames() const override;
6614
6615 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
6616
6617 BuiltinVaListKind getBuiltinVaListKind() const override {
6618 return TargetInfo::VoidPtrBuiltinVaList;
6619 }
6620
6621 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
6622
6623 bool validateAsmConstraint(const char *&Name,
6624 TargetInfo::ConstraintInfo &info) const override {
6625 return false;
6626 }
6627
6628 const char *getClobbers() const override { return ""; }
6629};
6630
6631const char *const LanaiTargetInfo::GCCRegNames[] = {
6632 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10",
6633 "r11", "r12", "r13", "r14", "r15", "r16", "r17", "r18", "r19", "r20", "r21",
6634 "r22", "r23", "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"};
6635
6636ArrayRef<const char *> LanaiTargetInfo::getGCCRegNames() const {
6637 return llvm::makeArrayRef(GCCRegNames);
6638}
6639
6640const TargetInfo::GCCRegAlias LanaiTargetInfo::GCCRegAliases[] = {
6641 {{"pc"}, "r2"},
6642 {{"sp"}, "r4"},
6643 {{"fp"}, "r5"},
6644 {{"rv"}, "r8"},
6645 {{"rr1"}, "r10"},
6646 {{"rr2"}, "r11"},
6647 {{"rca"}, "r15"},
6648};
6649
6650ArrayRef<TargetInfo::GCCRegAlias> LanaiTargetInfo::getGCCRegAliases() const {
6651 return llvm::makeArrayRef(GCCRegAliases);
6652}
6653
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006654// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
6655class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00006656 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6657 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006658 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00006659public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006660 SparcTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
James Y Knighta3518ad2016-01-27 01:04:51 +00006661 : TargetInfo(Triple), SoftFloat(false) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006662
Joerg Sonnenbergerd0be8dc2016-03-07 17:19:15 +00006663 int getEHDataRegisterNumber(unsigned RegNo) const override {
6664 if (RegNo == 0) return 24;
6665 if (RegNo == 1) return 25;
6666 return -1;
6667 }
6668
Craig Topper3164f332014-03-11 03:39:26 +00006669 bool handleTargetFeatures(std::vector<std::string> &Features,
6670 DiagnosticsEngine &Diags) override {
Jacob Baungard Hansen13a49372016-05-24 08:30:08 +00006671 // Check if software floating point is enabled
Eric Christopherfb481a42015-04-29 23:32:17 +00006672 auto Feature = std::find(Features.begin(), Features.end(), "+soft-float");
6673 if (Feature != Features.end()) {
6674 SoftFloat = true;
Eric Christopherfb481a42015-04-29 23:32:17 +00006675 }
Rafael Espindolaeb265472013-08-21 21:59:03 +00006676 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006677 }
Craig Topper3164f332014-03-11 03:39:26 +00006678 void getTargetDefines(const LangOptions &Opts,
6679 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006680 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006681 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006682
6683 if (SoftFloat)
6684 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00006685 }
Craig Topper3164f332014-03-11 03:39:26 +00006686
6687 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006688 return llvm::StringSwitch<bool>(Feature)
6689 .Case("softfloat", SoftFloat)
6690 .Case("sparc", true)
6691 .Default(false);
6692 }
Craig Topper3164f332014-03-11 03:39:26 +00006693
Chris Dewhurst0381cd72016-06-15 12:44:47 +00006694 bool hasSjLjLowering() const override {
6695 return true;
6696 }
6697
Craig Topper6c03a542015-10-19 04:51:35 +00006698 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006699 // FIXME: Implement!
Craig Topper6c03a542015-10-19 04:51:35 +00006700 return None;
Gabor Greif49991682008-02-21 16:29:08 +00006701 }
Craig Topper3164f332014-03-11 03:39:26 +00006702 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006703 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00006704 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006705 ArrayRef<const char *> getGCCRegNames() const override;
6706 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00006707 bool validateAsmConstraint(const char *&Name,
6708 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006709 // FIXME: Implement!
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00006710 switch (*Name) {
6711 case 'I': // Signed 13-bit constant
6712 case 'J': // Zero
6713 case 'K': // 32-bit constant with the low 12 bits clear
6714 case 'L': // A constant in the range supported by movcc (11-bit signed imm)
6715 case 'M': // A constant in the range supported by movrcc (19-bit signed imm)
6716 case 'N': // Same as 'K' but zext (required for SIMode)
6717 case 'O': // The constant 4096
6718 return true;
6719 }
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006720 return false;
Gabor Greif49991682008-02-21 16:29:08 +00006721 }
Craig Topper3164f332014-03-11 03:39:26 +00006722 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006723 // FIXME: Implement!
6724 return "";
Gabor Greif49991682008-02-21 16:29:08 +00006725 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006726
6727 // No Sparc V7 for now, the backend doesn't support it anyway.
6728 enum CPUKind {
6729 CK_GENERIC,
6730 CK_V8,
6731 CK_SUPERSPARC,
6732 CK_SPARCLITE,
6733 CK_F934,
6734 CK_HYPERSPARC,
6735 CK_SPARCLITE86X,
6736 CK_SPARCLET,
6737 CK_TSC701,
6738 CK_V9,
6739 CK_ULTRASPARC,
6740 CK_ULTRASPARC3,
6741 CK_NIAGARA,
6742 CK_NIAGARA2,
6743 CK_NIAGARA3,
Douglas Katzman6871afc2016-03-15 22:34:02 +00006744 CK_NIAGARA4,
Douglas Katzman87da5f42016-07-25 16:36:02 +00006745 CK_MYRIAD2100,
6746 CK_MYRIAD2150,
6747 CK_MYRIAD2450,
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006748 CK_LEON2,
6749 CK_LEON2_AT697E,
6750 CK_LEON2_AT697F,
6751 CK_LEON3,
6752 CK_LEON3_UT699,
6753 CK_LEON3_GR712RC,
6754 CK_LEON4,
6755 CK_LEON4_GR740
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006756 } CPU = CK_GENERIC;
6757
6758 enum CPUGeneration {
6759 CG_V8,
6760 CG_V9,
6761 };
6762
6763 CPUGeneration getCPUGeneration(CPUKind Kind) const {
6764 switch (Kind) {
6765 case CK_GENERIC:
6766 case CK_V8:
6767 case CK_SUPERSPARC:
6768 case CK_SPARCLITE:
6769 case CK_F934:
6770 case CK_HYPERSPARC:
6771 case CK_SPARCLITE86X:
6772 case CK_SPARCLET:
6773 case CK_TSC701:
Douglas Katzman87da5f42016-07-25 16:36:02 +00006774 case CK_MYRIAD2100:
6775 case CK_MYRIAD2150:
6776 case CK_MYRIAD2450:
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006777 case CK_LEON2:
6778 case CK_LEON2_AT697E:
6779 case CK_LEON2_AT697F:
6780 case CK_LEON3:
6781 case CK_LEON3_UT699:
6782 case CK_LEON3_GR712RC:
6783 case CK_LEON4:
6784 case CK_LEON4_GR740:
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006785 return CG_V8;
6786 case CK_V9:
6787 case CK_ULTRASPARC:
6788 case CK_ULTRASPARC3:
6789 case CK_NIAGARA:
6790 case CK_NIAGARA2:
6791 case CK_NIAGARA3:
6792 case CK_NIAGARA4:
6793 return CG_V9;
6794 }
Aaron Ballmana9a72852015-11-11 13:42:02 +00006795 llvm_unreachable("Unexpected CPU kind");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006796 }
6797
6798 CPUKind getCPUKind(StringRef Name) const {
6799 return llvm::StringSwitch<CPUKind>(Name)
6800 .Case("v8", CK_V8)
6801 .Case("supersparc", CK_SUPERSPARC)
6802 .Case("sparclite", CK_SPARCLITE)
6803 .Case("f934", CK_F934)
6804 .Case("hypersparc", CK_HYPERSPARC)
6805 .Case("sparclite86x", CK_SPARCLITE86X)
6806 .Case("sparclet", CK_SPARCLET)
6807 .Case("tsc701", CK_TSC701)
6808 .Case("v9", CK_V9)
6809 .Case("ultrasparc", CK_ULTRASPARC)
6810 .Case("ultrasparc3", CK_ULTRASPARC3)
6811 .Case("niagara", CK_NIAGARA)
6812 .Case("niagara2", CK_NIAGARA2)
6813 .Case("niagara3", CK_NIAGARA3)
6814 .Case("niagara4", CK_NIAGARA4)
Douglas Katzman87da5f42016-07-25 16:36:02 +00006815 .Case("ma2100", CK_MYRIAD2100)
6816 .Case("ma2150", CK_MYRIAD2150)
6817 .Case("ma2450", CK_MYRIAD2450)
6818 // FIXME: the myriad2[.n] spellings are obsolete,
6819 // but a grace period is needed to allow updating dependent builds.
6820 .Case("myriad2", CK_MYRIAD2100)
6821 .Case("myriad2.1", CK_MYRIAD2100)
6822 .Case("myriad2.2", CK_MYRIAD2150)
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006823 .Case("leon2", CK_LEON2)
6824 .Case("at697e", CK_LEON2_AT697E)
6825 .Case("at697f", CK_LEON2_AT697F)
6826 .Case("leon3", CK_LEON3)
6827 .Case("ut699", CK_LEON3_UT699)
6828 .Case("gr712rc", CK_LEON3_GR712RC)
6829 .Case("leon4", CK_LEON4)
6830 .Case("gr740", CK_LEON4_GR740)
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006831 .Default(CK_GENERIC);
6832 }
6833
6834 bool setCPU(const std::string &Name) override {
6835 CPU = getCPUKind(Name);
6836 return CPU != CK_GENERIC;
6837 }
Gabor Greif49991682008-02-21 16:29:08 +00006838};
6839
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006840const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00006841 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6842 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6843 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6844 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
6845};
6846
Craig Topperf054e3a2015-10-19 03:52:27 +00006847ArrayRef<const char *> SparcTargetInfo::getGCCRegNames() const {
6848 return llvm::makeArrayRef(GCCRegNames);
Chris Lattner9b415d62009-01-27 01:58:38 +00006849}
6850
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006851const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00006852 { { "g0" }, "r0" },
6853 { { "g1" }, "r1" },
6854 { { "g2" }, "r2" },
6855 { { "g3" }, "r3" },
6856 { { "g4" }, "r4" },
6857 { { "g5" }, "r5" },
6858 { { "g6" }, "r6" },
6859 { { "g7" }, "r7" },
6860 { { "o0" }, "r8" },
6861 { { "o1" }, "r9" },
6862 { { "o2" }, "r10" },
6863 { { "o3" }, "r11" },
6864 { { "o4" }, "r12" },
6865 { { "o5" }, "r13" },
6866 { { "o6", "sp" }, "r14" },
6867 { { "o7" }, "r15" },
6868 { { "l0" }, "r16" },
6869 { { "l1" }, "r17" },
6870 { { "l2" }, "r18" },
6871 { { "l3" }, "r19" },
6872 { { "l4" }, "r20" },
6873 { { "l5" }, "r21" },
6874 { { "l6" }, "r22" },
6875 { { "l7" }, "r23" },
6876 { { "i0" }, "r24" },
6877 { { "i1" }, "r25" },
6878 { { "i2" }, "r26" },
6879 { { "i3" }, "r27" },
6880 { { "i4" }, "r28" },
6881 { { "i5" }, "r29" },
6882 { { "i6", "fp" }, "r30" },
6883 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00006884};
6885
Craig Topperf054e3a2015-10-19 03:52:27 +00006886ArrayRef<TargetInfo::GCCRegAlias> SparcTargetInfo::getGCCRegAliases() const {
6887 return llvm::makeArrayRef(GCCRegAliases);
Chris Lattner9b415d62009-01-27 01:58:38 +00006888}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006889
6890// SPARC v8 is the 32-bit mode selected by Triple::sparc.
6891class SparcV8TargetInfo : public SparcTargetInfo {
6892public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006893 SparcV8TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6894 : SparcTargetInfo(Triple, Opts) {
James Y Knightb214cbc2016-03-04 19:00:41 +00006895 resetDataLayout("E-m:e-p:32:32-i64:64-f128:64-n32-S64");
Brad Smith73859112015-08-13 21:45:57 +00006896 // NetBSD / OpenBSD use long (same as llvm default); everyone else uses int.
6897 switch (getTriple().getOS()) {
6898 default:
James Y Knight4b4d19e2015-06-04 15:36:29 +00006899 SizeType = UnsignedInt;
6900 IntPtrType = SignedInt;
6901 PtrDiffType = SignedInt;
Brad Smith73859112015-08-13 21:45:57 +00006902 break;
6903 case llvm::Triple::NetBSD:
6904 case llvm::Triple::OpenBSD:
6905 SizeType = UnsignedLong;
6906 IntPtrType = SignedLong;
6907 PtrDiffType = SignedLong;
6908 break;
Brad Smith56495d52015-08-13 22:00:53 +00006909 }
Douglas Katzman13f4a912016-11-09 15:43:51 +00006910 // Up to 32 bits are lock-free atomic, but we're willing to do atomic ops
6911 // on up to 64 bits.
6912 MaxAtomicPromoteWidth = 64;
6913 MaxAtomicInlineWidth = 32;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006914 }
6915
Craig Topper3164f332014-03-11 03:39:26 +00006916 void getTargetDefines(const LangOptions &Opts,
6917 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006918 SparcTargetInfo::getTargetDefines(Opts, Builder);
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006919 switch (getCPUGeneration(CPU)) {
6920 case CG_V8:
6921 Builder.defineMacro("__sparcv8");
6922 if (getTriple().getOS() != llvm::Triple::Solaris)
6923 Builder.defineMacro("__sparcv8__");
6924 break;
6925 case CG_V9:
6926 Builder.defineMacro("__sparcv9");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00006927 if (getTriple().getOS() != llvm::Triple::Solaris) {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006928 Builder.defineMacro("__sparcv9__");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00006929 Builder.defineMacro("__sparc_v9__");
6930 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006931 break;
6932 }
Douglas Katzman6871afc2016-03-15 22:34:02 +00006933 if (getTriple().getVendor() == llvm::Triple::Myriad) {
Douglas Katzman87da5f42016-07-25 16:36:02 +00006934 std::string MyriadArchValue, Myriad2Value;
6935 Builder.defineMacro("__sparc_v8__");
6936 Builder.defineMacro("__leon__");
Douglas Katzman6871afc2016-03-15 22:34:02 +00006937 switch (CPU) {
Douglas Katzman87da5f42016-07-25 16:36:02 +00006938 case CK_MYRIAD2150:
6939 MyriadArchValue = "__ma2150";
6940 Myriad2Value = "2";
Douglas Katzman6871afc2016-03-15 22:34:02 +00006941 break;
Douglas Katzman87da5f42016-07-25 16:36:02 +00006942 case CK_MYRIAD2450:
6943 MyriadArchValue = "__ma2450";
6944 Myriad2Value = "2";
Douglas Katzman6871afc2016-03-15 22:34:02 +00006945 break;
6946 default:
Douglas Katzman87da5f42016-07-25 16:36:02 +00006947 MyriadArchValue = "__ma2100";
6948 Myriad2Value = "1";
Douglas Katzman6871afc2016-03-15 22:34:02 +00006949 break;
6950 }
Douglas Katzman87da5f42016-07-25 16:36:02 +00006951 Builder.defineMacro(MyriadArchValue, "1");
6952 Builder.defineMacro(MyriadArchValue+"__", "1");
6953 Builder.defineMacro("__myriad2__", Myriad2Value);
6954 Builder.defineMacro("__myriad2", Myriad2Value);
Douglas Katzman6871afc2016-03-15 22:34:02 +00006955 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006956 }
Chris Dewhurst69fa1922016-05-04 09:33:30 +00006957
6958 bool hasSjLjLowering() const override {
6959 return true;
6960 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006961};
6962
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006963// SPARCV8el is the 32-bit little-endian mode selected by Triple::sparcel.
6964class SparcV8elTargetInfo : public SparcV8TargetInfo {
6965 public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006966 SparcV8elTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6967 : SparcV8TargetInfo(Triple, Opts) {
6968 resetDataLayout("e-m:e-p:32:32-i64:64-f128:64-n32-S64");
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006969 }
6970};
6971
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006972// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
6973class SparcV9TargetInfo : public SparcTargetInfo {
6974public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006975 SparcV9TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6976 : SparcTargetInfo(Triple, Opts) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006977 // FIXME: Support Sparc quad-precision long double?
James Y Knightb214cbc2016-03-04 19:00:41 +00006978 resetDataLayout("E-m:e-i64:64-n32:64-S128");
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00006979 // This is an LP64 platform.
6980 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006981
6982 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00006983 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006984 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00006985 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006986 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006987 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00006988
6989 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
6990 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
6991 LongDoubleWidth = 128;
6992 LongDoubleAlign = 128;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00006993 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00006994 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006995 }
6996
Craig Topper3164f332014-03-11 03:39:26 +00006997 void getTargetDefines(const LangOptions &Opts,
6998 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006999 SparcTargetInfo::getTargetDefines(Opts, Builder);
7000 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00007001 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00007002 // Solaris doesn't need these variants, but the BSDs do.
7003 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00007004 Builder.defineMacro("__sparc64__");
7005 Builder.defineMacro("__sparc_v9__");
7006 Builder.defineMacro("__sparcv9__");
7007 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007008 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00007009
Craig Topper3164f332014-03-11 03:39:26 +00007010 bool setCPU(const std::string &Name) override {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00007011 if (!SparcTargetInfo::setCPU(Name))
7012 return false;
7013 return getCPUGeneration(CPU) == CG_V9;
Roman Divackyb1ae3d42014-02-25 18:35:30 +00007014 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007015};
7016
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007017class SystemZTargetInfo : public TargetInfo {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007018 static const Builtin::Info BuiltinInfo[];
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007019 static const char *const GCCRegNames[];
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007020 std::string CPU;
7021 bool HasTransactionalExecution;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007022 bool HasVector;
Ulrich Weigand47445072013-05-06 16:26:41 +00007023
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007024public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007025 SystemZTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Eric Christopherb093d692015-10-09 18:39:59 +00007026 : TargetInfo(Triple), CPU("z10"), HasTransactionalExecution(false),
7027 HasVector(false) {
Ulrich Weigand881497a2015-03-30 13:50:21 +00007028 IntMaxType = SignedLong;
7029 Int64Type = SignedLong;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007030 TLSSupported = true;
7031 IntWidth = IntAlign = 32;
7032 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
7033 PointerWidth = PointerAlign = 64;
7034 LongDoubleWidth = 128;
7035 LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007036 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Ulrich Weigandca3cb7f2015-04-21 17:29:35 +00007037 DefaultAlignForAttributeAligned = 64;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007038 MinGlobalAlign = 16;
James Y Knightb214cbc2016-03-04 19:00:41 +00007039 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 +00007040 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
7041 }
7042 void getTargetDefines(const LangOptions &Opts,
7043 MacroBuilder &Builder) const override {
7044 Builder.defineMacro("__s390__");
7045 Builder.defineMacro("__s390x__");
7046 Builder.defineMacro("__zarch__");
7047 Builder.defineMacro("__LONG_DOUBLE_128__");
Ulrich Weigandb038a522016-02-05 21:34:28 +00007048
Ulrich Weigand82a86cb2017-02-06 17:04:22 +00007049 const std::string ISARev = llvm::StringSwitch<std::string>(CPU)
7050 .Cases("arch8", "z10", "8")
7051 .Cases("arch9", "z196", "9")
7052 .Cases("arch10", "zEC12", "10")
7053 .Cases("arch11", "z13", "11")
7054 .Default("");
7055 if (!ISARev.empty())
7056 Builder.defineMacro("__ARCH__", ISARev);
7057
Ulrich Weigandb038a522016-02-05 21:34:28 +00007058 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
7059 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
7060 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
7061 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
7062
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007063 if (HasTransactionalExecution)
7064 Builder.defineMacro("__HTM__");
Ulrich Weigand82a86cb2017-02-06 17:04:22 +00007065 if (HasVector)
7066 Builder.defineMacro("__VX__");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00007067 if (Opts.ZVector)
7068 Builder.defineMacro("__VEC__", "10301");
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007069 }
Craig Topper6c03a542015-10-19 04:51:35 +00007070 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7071 return llvm::makeArrayRef(BuiltinInfo,
7072 clang::SystemZ::LastTSBuiltin-Builtin::FirstTSBuiltin);
Ulrich Weigand47445072013-05-06 16:26:41 +00007073 }
7074
Craig Topperf054e3a2015-10-19 03:52:27 +00007075 ArrayRef<const char *> getGCCRegNames() const override;
7076 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007077 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00007078 return None;
Ulrich Weigand47445072013-05-06 16:26:41 +00007079 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007080 bool validateAsmConstraint(const char *&Name,
7081 TargetInfo::ConstraintInfo &info) const override;
7082 const char *getClobbers() const override {
7083 // FIXME: Is this really right?
7084 return "";
7085 }
7086 BuiltinVaListKind getBuiltinVaListKind() const override {
7087 return TargetInfo::SystemZBuiltinVaList;
7088 }
7089 bool setCPU(const std::string &Name) override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007090 CPU = Name;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007091 bool CPUKnown = llvm::StringSwitch<bool>(Name)
7092 .Case("z10", true)
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007093 .Case("arch8", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007094 .Case("z196", true)
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007095 .Case("arch9", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007096 .Case("zEC12", true)
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007097 .Case("arch10", true)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007098 .Case("z13", true)
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007099 .Case("arch11", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007100 .Default(false);
7101
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007102 return CPUKnown;
7103 }
Eric Christopher8c47b422015-10-09 18:39:55 +00007104 bool
7105 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7106 StringRef CPU,
7107 const std::vector<std::string> &FeaturesVec) const override {
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007108 if (CPU == "zEC12" || CPU == "arch10")
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007109 Features["transactional-execution"] = true;
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007110 if (CPU == "z13" || CPU == "arch11") {
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007111 Features["transactional-execution"] = true;
7112 Features["vector"] = true;
7113 }
Eric Christopher007b0a02015-08-28 22:32:01 +00007114 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007115 }
7116
7117 bool handleTargetFeatures(std::vector<std::string> &Features,
7118 DiagnosticsEngine &Diags) override {
7119 HasTransactionalExecution = false;
Eric Christopher610fe112015-08-26 08:21:55 +00007120 for (const auto &Feature : Features) {
7121 if (Feature == "+transactional-execution")
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007122 HasTransactionalExecution = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007123 else if (Feature == "+vector")
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007124 HasVector = true;
7125 }
7126 // If we use the vector ABI, vector types are 64-bit aligned.
7127 if (HasVector) {
7128 MaxVectorAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00007129 resetDataLayout("E-m:e-i1:8:16-i8:8:16-i64:64-f128:64"
7130 "-v128:64-a:8:16-n32:64");
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007131 }
7132 return true;
7133 }
7134
7135 bool hasFeature(StringRef Feature) const override {
7136 return llvm::StringSwitch<bool>(Feature)
Ulrich Weigandcc673442015-04-01 14:15:35 +00007137 .Case("systemz", true)
7138 .Case("htm", HasTransactionalExecution)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007139 .Case("vx", HasVector)
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007140 .Default(false);
7141 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007142
Bryan Chane3f1ed52016-04-28 13:56:43 +00007143 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
7144 switch (CC) {
7145 case CC_C:
7146 case CC_Swift:
7147 return CCCR_OK;
7148 default:
7149 return CCCR_Warning;
7150 }
7151 }
7152
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007153 StringRef getABI() const override {
7154 if (HasVector)
7155 return "vector";
7156 return "";
7157 }
Ulrich Weigand47fd2532015-06-16 15:21:47 +00007158
7159 bool useFloat128ManglingForLongDouble() const override {
7160 return true;
7161 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007162};
7163
7164const Builtin::Info SystemZTargetInfo::BuiltinInfo[] = {
7165#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00007166 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Jonas Paulsson3ace74a2016-03-30 15:51:24 +00007167#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
7168 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007169#include "clang/Basic/BuiltinsSystemZ.def"
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007170};
7171
7172const char *const SystemZTargetInfo::GCCRegNames[] = {
7173 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
7174 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
7175 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
7176 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
7177};
7178
Craig Topperf054e3a2015-10-19 03:52:27 +00007179ArrayRef<const char *> SystemZTargetInfo::getGCCRegNames() const {
7180 return llvm::makeArrayRef(GCCRegNames);
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007181}
7182
7183bool SystemZTargetInfo::
7184validateAsmConstraint(const char *&Name,
7185 TargetInfo::ConstraintInfo &Info) const {
7186 switch (*Name) {
7187 default:
7188 return false;
7189
7190 case 'a': // Address register
7191 case 'd': // Data register (equivalent to 'r')
7192 case 'f': // Floating-point register
7193 Info.setAllowsRegister();
7194 return true;
7195
7196 case 'I': // Unsigned 8-bit constant
7197 case 'J': // Unsigned 12-bit constant
7198 case 'K': // Signed 16-bit constant
7199 case 'L': // Signed 20-bit displacement (on all targets we support)
7200 case 'M': // 0x7fffffff
7201 return true;
7202
7203 case 'Q': // Memory with base and unsigned 12-bit displacement
7204 case 'R': // Likewise, plus an index
7205 case 'S': // Memory with base and signed 20-bit displacement
7206 case 'T': // Likewise, plus an index
7207 Info.setAllowsMemory();
7208 return true;
7209 }
7210}
Ulrich Weigand47445072013-05-06 16:26:41 +00007211
Eric Christopherc48497a2015-09-18 21:26:24 +00007212class MSP430TargetInfo : public TargetInfo {
7213 static const char *const GCCRegNames[];
Anton Korobeynikova0f54372009-05-03 13:43:08 +00007214
Eric Christopherc48497a2015-09-18 21:26:24 +00007215public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007216 MSP430TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7217 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007218 TLSSupported = false;
7219 IntWidth = 16;
7220 IntAlign = 16;
7221 LongWidth = 32;
7222 LongLongWidth = 64;
7223 LongAlign = LongLongAlign = 16;
7224 PointerWidth = 16;
7225 PointerAlign = 16;
7226 SuitableAlign = 16;
7227 SizeType = UnsignedInt;
7228 IntMaxType = SignedLongLong;
7229 IntPtrType = SignedInt;
7230 PtrDiffType = SignedInt;
7231 SigAtomicType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00007232 resetDataLayout("e-m:e-p:16:16-i32:16:32-a:16-n8:16");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00007233 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007234 void getTargetDefines(const LangOptions &Opts,
7235 MacroBuilder &Builder) const override {
7236 Builder.defineMacro("MSP430");
7237 Builder.defineMacro("__MSP430__");
7238 // FIXME: defines for different 'flavours' of MCU
7239 }
Craig Topper6c03a542015-10-19 04:51:35 +00007240 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00007241 // FIXME: Implement.
Craig Topper6c03a542015-10-19 04:51:35 +00007242 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00007243 }
7244 bool hasFeature(StringRef Feature) const override {
7245 return Feature == "msp430";
7246 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007247 ArrayRef<const char *> getGCCRegNames() const override;
7248 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00007249 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00007250 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00007251 }
7252 bool validateAsmConstraint(const char *&Name,
7253 TargetInfo::ConstraintInfo &info) const override {
7254 // FIXME: implement
7255 switch (*Name) {
7256 case 'K': // the constant 1
7257 case 'L': // constant -1^20 .. 1^19
7258 case 'M': // constant 1-4:
Eli Friedmana9c3d712009-08-19 20:47:07 +00007259 return true;
7260 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007261 // No target constraints for now.
7262 return false;
7263 }
7264 const char *getClobbers() const override {
7265 // FIXME: Is this really right?
7266 return "";
7267 }
7268 BuiltinVaListKind getBuiltinVaListKind() const override {
7269 // FIXME: implement
7270 return TargetInfo::CharPtrBuiltinVaList;
7271 }
7272};
7273
7274const char *const MSP430TargetInfo::GCCRegNames[] = {
7275 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
7276 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"};
7277
Craig Topperf054e3a2015-10-19 03:52:27 +00007278ArrayRef<const char *> MSP430TargetInfo::getGCCRegNames() const {
7279 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00007280}
7281
7282// LLVM and Clang cannot be used directly to output native binaries for
7283// target, but is used to compile C code to llvm bitcode with correct
7284// type and alignment information.
7285//
7286// TCE uses the llvm bitcode as input and uses it for generating customized
7287// target processor and program binary. TCE co-design environment is
7288// publicly available in http://tce.cs.tut.fi
7289
7290static const unsigned TCEOpenCLAddrSpaceMap[] = {
7291 3, // opencl_global
7292 4, // opencl_local
7293 5, // opencl_constant
7294 // FIXME: generic has to be added to the target
7295 0, // opencl_generic
7296 0, // cuda_device
7297 0, // cuda_constant
7298 0 // cuda_shared
7299};
7300
7301class TCETargetInfo : public TargetInfo {
7302public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007303 TCETargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7304 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007305 TLSSupported = false;
7306 IntWidth = 32;
7307 LongWidth = LongLongWidth = 32;
7308 PointerWidth = 32;
7309 IntAlign = 32;
7310 LongAlign = LongLongAlign = 32;
7311 PointerAlign = 32;
7312 SuitableAlign = 32;
7313 SizeType = UnsignedInt;
7314 IntMaxType = SignedLong;
7315 IntPtrType = SignedInt;
7316 PtrDiffType = SignedInt;
7317 FloatWidth = 32;
7318 FloatAlign = 32;
7319 DoubleWidth = 32;
7320 DoubleAlign = 32;
7321 LongDoubleWidth = 32;
7322 LongDoubleAlign = 32;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007323 FloatFormat = &llvm::APFloat::IEEEsingle();
7324 DoubleFormat = &llvm::APFloat::IEEEsingle();
7325 LongDoubleFormat = &llvm::APFloat::IEEEsingle();
Pekka Jaaskelainen67354482016-11-16 15:22:31 +00007326 resetDataLayout("E-p:32:32:32-i1:8:8-i8:8:32-"
7327 "i16:16:32-i32:32:32-i64:32:32-"
7328 "f32:32:32-f64:32:32-v64:32:32-"
7329 "v128:32:32-v256:32:32-v512:32:32-"
7330 "v1024:32:32-a0:0:32-n32");
Eric Christopherc48497a2015-09-18 21:26:24 +00007331 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
7332 UseAddrSpaceMapMangling = true;
7333 }
7334
7335 void getTargetDefines(const LangOptions &Opts,
7336 MacroBuilder &Builder) const override {
7337 DefineStd(Builder, "tce", Opts);
7338 Builder.defineMacro("__TCE__");
7339 Builder.defineMacro("__TCE_V1__");
7340 }
7341 bool hasFeature(StringRef Feature) const override { return Feature == "tce"; }
7342
Craig Topper6c03a542015-10-19 04:51:35 +00007343 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007344 const char *getClobbers() const override { return ""; }
7345 BuiltinVaListKind getBuiltinVaListKind() const override {
7346 return TargetInfo::VoidPtrBuiltinVaList;
7347 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007348 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007349 bool validateAsmConstraint(const char *&Name,
7350 TargetInfo::ConstraintInfo &info) const override {
7351 return true;
7352 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007353 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7354 return None;
7355 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007356};
Eli Friedmana9c3d712009-08-19 20:47:07 +00007357
Pekka Jaaskelainen67354482016-11-16 15:22:31 +00007358class TCELETargetInfo : public TCETargetInfo {
7359public:
7360 TCELETargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7361 : TCETargetInfo(Triple, Opts) {
7362 BigEndian = false;
7363
7364 resetDataLayout("e-p:32:32:32-i1:8:8-i8:8:32-"
7365 "i16:16:32-i32:32:32-i64:32:32-"
7366 "f32:32:32-f64:32:32-v64:32:32-"
7367 "v128:32:32-v256:32:32-v512:32:32-"
7368 "v1024:32:32-a0:0:32-n32");
7369
7370 }
7371
7372 virtual void getTargetDefines(const LangOptions &Opts,
7373 MacroBuilder &Builder) const {
7374 DefineStd(Builder, "tcele", Opts);
7375 Builder.defineMacro("__TCE__");
7376 Builder.defineMacro("__TCE_V1__");
7377 Builder.defineMacro("__TCELE__");
7378 Builder.defineMacro("__TCELE_V1__");
7379 }
7380
7381};
7382
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007383class BPFTargetInfo : public TargetInfo {
7384public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007385 BPFTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7386 : TargetInfo(Triple) {
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007387 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
7388 SizeType = UnsignedLong;
7389 PtrDiffType = SignedLong;
7390 IntPtrType = SignedLong;
7391 IntMaxType = SignedLong;
7392 Int64Type = SignedLong;
7393 RegParmMax = 5;
7394 if (Triple.getArch() == llvm::Triple::bpfeb) {
James Y Knightb214cbc2016-03-04 19:00:41 +00007395 resetDataLayout("E-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007396 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00007397 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007398 }
7399 MaxAtomicPromoteWidth = 64;
7400 MaxAtomicInlineWidth = 64;
7401 TLSSupported = false;
7402 }
7403 void getTargetDefines(const LangOptions &Opts,
7404 MacroBuilder &Builder) const override {
7405 DefineStd(Builder, "bpf", Opts);
7406 Builder.defineMacro("__BPF__");
7407 }
7408 bool hasFeature(StringRef Feature) const override {
7409 return Feature == "bpf";
7410 }
7411
Craig Topper6c03a542015-10-19 04:51:35 +00007412 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007413 const char *getClobbers() const override {
7414 return "";
7415 }
7416 BuiltinVaListKind getBuiltinVaListKind() const override {
7417 return TargetInfo::VoidPtrBuiltinVaList;
7418 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007419 ArrayRef<const char *> getGCCRegNames() const override {
7420 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007421 }
7422 bool validateAsmConstraint(const char *&Name,
7423 TargetInfo::ConstraintInfo &info) const override {
7424 return true;
7425 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007426 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7427 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007428 }
7429};
7430
Daniel Sanders4672af62016-05-27 11:51:02 +00007431class MipsTargetInfo : public TargetInfo {
7432 void setDataLayout() {
Daniel Sanders55e40692016-06-03 10:11:01 +00007433 StringRef Layout;
7434
7435 if (ABI == "o32")
7436 Layout = "m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
7437 else if (ABI == "n32")
Daniel Sanders6a738832016-07-19 10:49:03 +00007438 Layout = "m:e-p:32:32-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Daniel Sanders55e40692016-06-03 10:11:01 +00007439 else if (ABI == "n64")
Daniel Sanders6a738832016-07-19 10:49:03 +00007440 Layout = "m:e-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Daniel Sanders55e40692016-06-03 10:11:01 +00007441 else
7442 llvm_unreachable("Invalid ABI");
7443
7444 if (BigEndian)
7445 resetDataLayout(("E-" + Layout).str());
7446 else
7447 resetDataLayout(("e-" + Layout).str());
Daniel Sanders4672af62016-05-27 11:51:02 +00007448 }
7449
Akira Hatanaka9064e362013-10-29 18:30:33 +00007450
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00007451 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007452 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00007453 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00007454 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007455 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00007456 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007457 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00007458 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007459 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007460 enum DspRevEnum {
7461 NoDSP, DSP1, DSP2
7462 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00007463 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007464
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007465protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00007466 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007467 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007468
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007469public:
Daniel Sanders4672af62016-05-27 11:51:02 +00007470 MipsTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007471 : TargetInfo(Triple), IsMips16(false), IsMicromips(false),
7472 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
7473 DspRev(NoDSP), HasMSA(false), HasFP64(false) {
Zoran Jovanovic26a12162015-02-18 15:21:35 +00007474 TheCXXABI.set(TargetCXXABI::GenericMIPS);
Daniel Sanders4672af62016-05-27 11:51:02 +00007475
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007476 setABI((getTriple().getArch() == llvm::Triple::mips ||
7477 getTriple().getArch() == llvm::Triple::mipsel)
7478 ? "o32"
7479 : "n64");
7480
7481 CPU = ABI == "o32" ? "mips32r2" : "mips64r2";
Zoran Jovanovic26a12162015-02-18 15:21:35 +00007482 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007483
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007484 bool isNaN2008Default() const {
7485 return CPU == "mips32r6" || CPU == "mips64r6";
7486 }
7487
7488 bool isFP64Default() const {
7489 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
7490 }
7491
Petar Jovanovicd55ae6b2015-02-26 18:19:22 +00007492 bool isNan2008() const override {
7493 return IsNan2008;
7494 }
7495
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007496 bool processorSupportsGPR64() const {
7497 return llvm::StringSwitch<bool>(CPU)
7498 .Case("mips3", true)
7499 .Case("mips4", true)
7500 .Case("mips5", true)
7501 .Case("mips64", true)
7502 .Case("mips64r2", true)
7503 .Case("mips64r3", true)
7504 .Case("mips64r5", true)
7505 .Case("mips64r6", true)
7506 .Case("octeon", true)
7507 .Default(false);
7508 return false;
7509 }
7510
Alp Toker4925ba72014-06-07 23:30:42 +00007511 StringRef getABI() const override { return ABI; }
Daniel Sanders4672af62016-05-27 11:51:02 +00007512 bool setABI(const std::string &Name) override {
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007513 if (Name == "o32") {
7514 setO32ABITypes();
7515 ABI = Name;
7516 return true;
Daniel Sanders4672af62016-05-27 11:51:02 +00007517 }
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007518
7519 if (Name == "n32") {
7520 setN32ABITypes();
7521 ABI = Name;
7522 return true;
7523 }
7524 if (Name == "n64") {
7525 setN64ABITypes();
7526 ABI = Name;
7527 return true;
Daniel Sanders4672af62016-05-27 11:51:02 +00007528 }
7529 return false;
7530 }
7531
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007532 void setO32ABITypes() {
7533 Int64Type = SignedLongLong;
7534 IntMaxType = Int64Type;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007535 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007536 LongDoubleWidth = LongDoubleAlign = 64;
7537 LongWidth = LongAlign = 32;
7538 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
7539 PointerWidth = PointerAlign = 32;
7540 PtrDiffType = SignedInt;
7541 SizeType = UnsignedInt;
7542 SuitableAlign = 64;
7543 }
7544
7545 void setN32N64ABITypes() {
7546 LongDoubleWidth = LongDoubleAlign = 128;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007547 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007548 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
7549 LongDoubleWidth = LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007550 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007551 }
7552 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
7553 SuitableAlign = 128;
7554 }
7555
Daniel Sanders4672af62016-05-27 11:51:02 +00007556 void setN64ABITypes() {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007557 setN32N64ABITypes();
Daniel Sanders4672af62016-05-27 11:51:02 +00007558 Int64Type = SignedLong;
7559 IntMaxType = Int64Type;
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007560 LongWidth = LongAlign = 64;
7561 PointerWidth = PointerAlign = 64;
7562 PtrDiffType = SignedLong;
7563 SizeType = UnsignedLong;
Daniel Sanders4672af62016-05-27 11:51:02 +00007564 }
7565
7566 void setN32ABITypes() {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007567 setN32N64ABITypes();
Daniel Sanders4672af62016-05-27 11:51:02 +00007568 Int64Type = SignedLongLong;
7569 IntMaxType = Int64Type;
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007570 LongWidth = LongAlign = 32;
7571 PointerWidth = PointerAlign = 32;
7572 PtrDiffType = SignedInt;
7573 SizeType = UnsignedInt;
Daniel Sanders4672af62016-05-27 11:51:02 +00007574 }
7575
Craig Topper3164f332014-03-11 03:39:26 +00007576 bool setCPU(const std::string &Name) override {
Eric Christopher0b26a612010-03-02 02:41:08 +00007577 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007578 return llvm::StringSwitch<bool>(Name)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007579 .Case("mips1", true)
7580 .Case("mips2", true)
Simon Atanasyan26610c52014-07-04 12:36:56 +00007581 .Case("mips3", true)
7582 .Case("mips4", true)
7583 .Case("mips5", true)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007584 .Case("mips32", true)
7585 .Case("mips32r2", true)
7586 .Case("mips32r3", true)
7587 .Case("mips32r5", true)
7588 .Case("mips32r6", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007589 .Case("mips64", true)
7590 .Case("mips64r2", true)
Simon Atanasyan162feb52015-02-20 23:37:40 +00007591 .Case("mips64r3", true)
7592 .Case("mips64r5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007593 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00007594 .Case("octeon", true)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007595 .Case("p5600", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007596 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00007597 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00007598 const std::string& getCPU() const { return CPU; }
Eric Christopher8c47b422015-10-09 18:39:55 +00007599 bool
7600 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7601 StringRef CPU,
7602 const std::vector<std::string> &FeaturesVec) const override {
Bhushan D. Attardebacb988732016-03-04 06:56:29 +00007603 if (CPU.empty())
7604 CPU = getCPU();
Simon Atanasyan4e16a422014-07-04 12:37:04 +00007605 if (CPU == "octeon")
7606 Features["mips64r2"] = Features["cnmips"] = true;
7607 else
7608 Features[CPU] = true;
Eric Christopher007b0a02015-08-28 22:32:01 +00007609 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Eric Christopher0b26a612010-03-02 02:41:08 +00007610 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007611
Craig Topper3164f332014-03-11 03:39:26 +00007612 void getTargetDefines(const LangOptions &Opts,
7613 MacroBuilder &Builder) const override {
Daniel Sanders4672af62016-05-27 11:51:02 +00007614 if (BigEndian) {
7615 DefineStd(Builder, "MIPSEB", Opts);
7616 Builder.defineMacro("_MIPSEB");
7617 } else {
7618 DefineStd(Builder, "MIPSEL", Opts);
7619 Builder.defineMacro("_MIPSEL");
7620 }
7621
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007622 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00007623 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007624 if (Opts.GNUMode)
7625 Builder.defineMacro("mips");
7626
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007627 if (ABI == "o32") {
Daniel Sanders4672af62016-05-27 11:51:02 +00007628 Builder.defineMacro("__mips", "32");
7629 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
7630 } else {
7631 Builder.defineMacro("__mips", "64");
7632 Builder.defineMacro("__mips64");
7633 Builder.defineMacro("__mips64__");
7634 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
7635 }
7636
7637 const std::string ISARev = llvm::StringSwitch<std::string>(getCPU())
7638 .Cases("mips32", "mips64", "1")
7639 .Cases("mips32r2", "mips64r2", "2")
7640 .Cases("mips32r3", "mips64r3", "3")
7641 .Cases("mips32r5", "mips64r5", "5")
7642 .Cases("mips32r6", "mips64r6", "6")
7643 .Default("");
7644 if (!ISARev.empty())
7645 Builder.defineMacro("__mips_isa_rev", ISARev);
7646
7647 if (ABI == "o32") {
7648 Builder.defineMacro("__mips_o32");
7649 Builder.defineMacro("_ABIO32", "1");
7650 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
Daniel Sanders07c86542016-05-27 14:30:23 +00007651 } else if (ABI == "n32") {
Daniel Sanders4672af62016-05-27 11:51:02 +00007652 Builder.defineMacro("__mips_n32");
7653 Builder.defineMacro("_ABIN32", "2");
7654 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
7655 } else if (ABI == "n64") {
7656 Builder.defineMacro("__mips_n64");
7657 Builder.defineMacro("_ABI64", "3");
7658 Builder.defineMacro("_MIPS_SIM", "_ABI64");
7659 } else
7660 llvm_unreachable("Invalid ABI.");
7661
Simon Atanasyan683535b2012-08-29 19:14:58 +00007662 Builder.defineMacro("__REGISTER_PREFIX__", "");
7663
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007664 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007665 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00007666 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007667 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007668 case SoftFloat:
7669 Builder.defineMacro("__mips_soft_float", Twine(1));
7670 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00007671 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00007672
Simon Atanasyan16071912013-04-14 14:07:30 +00007673 if (IsSingleFloat)
7674 Builder.defineMacro("__mips_single_float", Twine(1));
7675
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007676 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
7677 Builder.defineMacro("_MIPS_FPSET",
7678 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
7679
Simon Atanasyan72244b62012-07-05 16:06:06 +00007680 if (IsMips16)
7681 Builder.defineMacro("__mips16", Twine(1));
7682
Simon Atanasyan60777612013-04-14 14:07:51 +00007683 if (IsMicromips)
7684 Builder.defineMacro("__mips_micromips", Twine(1));
7685
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007686 if (IsNan2008)
7687 Builder.defineMacro("__mips_nan2008", Twine(1));
7688
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007689 switch (DspRev) {
7690 default:
7691 break;
7692 case DSP1:
7693 Builder.defineMacro("__mips_dsp_rev", Twine(1));
7694 Builder.defineMacro("__mips_dsp", Twine(1));
7695 break;
7696 case DSP2:
7697 Builder.defineMacro("__mips_dsp_rev", Twine(2));
7698 Builder.defineMacro("__mips_dspr2", Twine(1));
7699 Builder.defineMacro("__mips_dsp", Twine(1));
7700 break;
7701 }
7702
Jack Carter44ff1e52013-08-12 17:20:29 +00007703 if (HasMSA)
7704 Builder.defineMacro("__mips_msa", Twine(1));
7705
Simon Atanasyan26f19672012-04-05 19:28:31 +00007706 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
7707 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
7708 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00007709
7710 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
7711 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Daniel Sanders5176f7e2015-12-22 12:59:30 +00007712
7713 // These shouldn't be defined for MIPS-I but there's no need to check
7714 // for that since MIPS-I isn't supported.
7715 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
7716 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
7717 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007718
7719 // 32-bit MIPS processors don't have the necessary lld/scd instructions
7720 // found in 64-bit processors. In the case of O32 on a 64-bit processor,
7721 // the instructions exist but using them violates the ABI since they
7722 // require 64-bit GPRs and O32 only supports 32-bit GPRs.
7723 if (ABI == "n32" || ABI == "n64")
Daniel Sanders4672af62016-05-27 11:51:02 +00007724 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007725 }
7726
Craig Topper6c03a542015-10-19 04:51:35 +00007727 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7728 return llvm::makeArrayRef(BuiltinInfo,
7729 clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin);
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007730 }
Craig Topper3164f332014-03-11 03:39:26 +00007731 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00007732 return llvm::StringSwitch<bool>(Feature)
7733 .Case("mips", true)
7734 .Case("fp64", HasFP64)
7735 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00007736 }
Craig Topper3164f332014-03-11 03:39:26 +00007737 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00007738 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007739 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007740 ArrayRef<const char *> getGCCRegNames() const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00007741 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00007742 // CPU register names
7743 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007744 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
7745 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
7746 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00007747 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
7748 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007749 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
7750 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
7751 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
7752 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00007753 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007754 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Hrvoje Varga14c42ee2016-03-29 12:46:16 +00007755 "$fcc5","$fcc6","$fcc7","$ac1hi","$ac1lo","$ac2hi","$ac2lo",
7756 "$ac3hi","$ac3lo",
Daniel Sanders8b59af12013-11-12 12:56:01 +00007757 // MSA register names
7758 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
7759 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
7760 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
7761 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
7762 // MSA control register names
7763 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
7764 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007765 };
Craig Topperf054e3a2015-10-19 03:52:27 +00007766 return llvm::makeArrayRef(GCCRegNames);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007767 }
Craig Topper3164f332014-03-11 03:39:26 +00007768 bool validateAsmConstraint(const char *&Name,
7769 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007770 switch (*Name) {
7771 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00007772 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007773 case 'r': // CPU registers.
7774 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00007775 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007776 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00007777 case 'c': // $25 for indirect jumps
7778 case 'l': // lo register
7779 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007780 Info.setAllowsRegister();
7781 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00007782 case 'I': // Signed 16-bit constant
7783 case 'J': // Integer 0
7784 case 'K': // Unsigned 16-bit constant
7785 case 'L': // Signed 32-bit constant, lower 16-bit zeros (for lui)
7786 case 'M': // Constants not loadable via lui, addiu, or ori
7787 case 'N': // Constant -1 to -65535
7788 case 'O': // A signed 15-bit constant
7789 case 'P': // A constant between 1 go 65535
7790 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00007791 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00007792 Info.setAllowsMemory();
7793 return true;
Daniel Sanders48fa39e2015-03-30 13:47:23 +00007794 case 'Z':
7795 if (Name[1] == 'C') { // An address usable by ll, and sc.
7796 Info.setAllowsMemory();
7797 Name++; // Skip over 'Z'.
7798 return true;
7799 }
7800 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007801 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007802 }
7803
Daniel Sanders48fa39e2015-03-30 13:47:23 +00007804 std::string convertConstraint(const char *&Constraint) const override {
7805 std::string R;
7806 switch (*Constraint) {
7807 case 'Z': // Two-character constraint; add "^" hint for later parsing.
7808 if (Constraint[1] == 'C') {
7809 R = std::string("^") + std::string(Constraint, 2);
7810 Constraint++;
7811 return R;
7812 }
7813 break;
7814 }
7815 return TargetInfo::convertConstraint(Constraint);
7816 }
7817
Craig Topper3164f332014-03-11 03:39:26 +00007818 const char *getClobbers() const override {
Toma Tabacucfab40f2015-01-12 14:41:30 +00007819 // In GCC, $1 is not widely used in generated code (it's used only in a few
7820 // specific situations), so there is no real need for users to add it to
7821 // the clobbers list if they want to use it in their inline assembly code.
7822 //
7823 // In LLVM, $1 is treated as a normal GPR and is always allocatable during
7824 // code generation, so using it in inline assembly without adding it to the
7825 // clobbers list can cause conflicts between the inline assembly code and
7826 // the surrounding generated code.
7827 //
7828 // Another problem is that LLVM is allowed to choose $1 for inline assembly
7829 // operands, which will conflict with the ".set at" assembler option (which
7830 // we use only for inline assembly, in order to maintain compatibility with
7831 // GCC) and will also conflict with the user's usage of $1.
7832 //
7833 // The easiest way to avoid these conflicts and keep $1 as an allocatable
7834 // register for generated code is to automatically clobber $1 for all inline
7835 // assembly code.
7836 //
7837 // FIXME: We should automatically clobber $1 only for inline assembly code
7838 // which actually uses it. This would allow LLVM to use $1 for inline
7839 // assembly operands if the user's assembly code doesn't use it.
Toma Tabacu99411952014-12-17 12:02:58 +00007840 return "~{$1}";
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007841 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007842
Craig Topper3164f332014-03-11 03:39:26 +00007843 bool handleTargetFeatures(std::vector<std::string> &Features,
7844 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00007845 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00007846 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007847 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00007848 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007849 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007850 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007851 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007852
Eric Christopher610fe112015-08-26 08:21:55 +00007853 for (const auto &Feature : Features) {
7854 if (Feature == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00007855 IsSingleFloat = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007856 else if (Feature == "+soft-float")
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007857 FloatABI = SoftFloat;
Eric Christopher610fe112015-08-26 08:21:55 +00007858 else if (Feature == "+mips16")
Simon Atanasyan72244b62012-07-05 16:06:06 +00007859 IsMips16 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007860 else if (Feature == "+micromips")
Simon Atanasyan60777612013-04-14 14:07:51 +00007861 IsMicromips = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007862 else if (Feature == "+dsp")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007863 DspRev = std::max(DspRev, DSP1);
Eric Christopher610fe112015-08-26 08:21:55 +00007864 else if (Feature == "+dspr2")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007865 DspRev = std::max(DspRev, DSP2);
Eric Christopher610fe112015-08-26 08:21:55 +00007866 else if (Feature == "+msa")
Jack Carter44ff1e52013-08-12 17:20:29 +00007867 HasMSA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007868 else if (Feature == "+fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007869 HasFP64 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007870 else if (Feature == "-fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007871 HasFP64 = false;
Eric Christopher610fe112015-08-26 08:21:55 +00007872 else if (Feature == "+nan2008")
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007873 IsNan2008 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007874 else if (Feature == "-nan2008")
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007875 IsNan2008 = false;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007876 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007877
James Y Knightb214cbc2016-03-04 19:00:41 +00007878 setDataLayout();
Akira Hatanaka9064e362013-10-29 18:30:33 +00007879
Rafael Espindolaeb265472013-08-21 21:59:03 +00007880 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007881 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00007882
Craig Topper3164f332014-03-11 03:39:26 +00007883 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00007884 if (RegNo == 0) return 4;
7885 if (RegNo == 1) return 5;
7886 return -1;
7887 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00007888
7889 bool isCLZForZeroUndef() const override { return false; }
Daniel Sanders4672af62016-05-27 11:51:02 +00007890
7891 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7892 static const TargetInfo::GCCRegAlias O32RegAliases[] = {
7893 {{"at"}, "$1"}, {{"v0"}, "$2"}, {{"v1"}, "$3"},
7894 {{"a0"}, "$4"}, {{"a1"}, "$5"}, {{"a2"}, "$6"},
7895 {{"a3"}, "$7"}, {{"t0"}, "$8"}, {{"t1"}, "$9"},
7896 {{"t2"}, "$10"}, {{"t3"}, "$11"}, {{"t4"}, "$12"},
7897 {{"t5"}, "$13"}, {{"t6"}, "$14"}, {{"t7"}, "$15"},
7898 {{"s0"}, "$16"}, {{"s1"}, "$17"}, {{"s2"}, "$18"},
7899 {{"s3"}, "$19"}, {{"s4"}, "$20"}, {{"s5"}, "$21"},
7900 {{"s6"}, "$22"}, {{"s7"}, "$23"}, {{"t8"}, "$24"},
7901 {{"t9"}, "$25"}, {{"k0"}, "$26"}, {{"k1"}, "$27"},
7902 {{"gp"}, "$28"}, {{"sp", "$sp"}, "$29"}, {{"fp", "$fp"}, "$30"},
7903 {{"ra"}, "$31"}};
7904 static const TargetInfo::GCCRegAlias NewABIRegAliases[] = {
7905 {{"at"}, "$1"}, {{"v0"}, "$2"}, {{"v1"}, "$3"},
7906 {{"a0"}, "$4"}, {{"a1"}, "$5"}, {{"a2"}, "$6"},
7907 {{"a3"}, "$7"}, {{"a4"}, "$8"}, {{"a5"}, "$9"},
7908 {{"a6"}, "$10"}, {{"a7"}, "$11"}, {{"t0"}, "$12"},
7909 {{"t1"}, "$13"}, {{"t2"}, "$14"}, {{"t3"}, "$15"},
7910 {{"s0"}, "$16"}, {{"s1"}, "$17"}, {{"s2"}, "$18"},
7911 {{"s3"}, "$19"}, {{"s4"}, "$20"}, {{"s5"}, "$21"},
7912 {{"s6"}, "$22"}, {{"s7"}, "$23"}, {{"t8"}, "$24"},
7913 {{"t9"}, "$25"}, {{"k0"}, "$26"}, {{"k1"}, "$27"},
7914 {{"gp"}, "$28"}, {{"sp", "$sp"}, "$29"}, {{"fp", "$fp"}, "$30"},
7915 {{"ra"}, "$31"}};
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007916 if (ABI == "o32")
Daniel Sanders4672af62016-05-27 11:51:02 +00007917 return llvm::makeArrayRef(O32RegAliases);
7918 return llvm::makeArrayRef(NewABIRegAliases);
7919 }
7920
7921 bool hasInt128Type() const override {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007922 return ABI == "n32" || ABI == "n64";
Daniel Sanders4672af62016-05-27 11:51:02 +00007923 }
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007924
7925 bool validateTarget(DiagnosticsEngine &Diags) const override {
7926 // FIXME: It's valid to use O32 on a 64-bit CPU but the backend can't handle
7927 // this yet. It's better to fail here than on the backend assertion.
7928 if (processorSupportsGPR64() && ABI == "o32") {
7929 Diags.Report(diag::err_target_unsupported_abi) << ABI << CPU;
7930 return false;
7931 }
7932
7933 // 64-bit ABI's require 64-bit CPU's.
7934 if (!processorSupportsGPR64() && (ABI == "n32" || ABI == "n64")) {
7935 Diags.Report(diag::err_target_unsupported_abi) << ABI << CPU;
7936 return false;
7937 }
7938
7939 // FIXME: It's valid to use O32 on a mips64/mips64el triple but the backend
7940 // can't handle this yet. It's better to fail here than on the
7941 // backend assertion.
7942 if ((getTriple().getArch() == llvm::Triple::mips64 ||
7943 getTriple().getArch() == llvm::Triple::mips64el) &&
7944 ABI == "o32") {
7945 Diags.Report(diag::err_target_unsupported_abi_for_triple)
7946 << ABI << getTriple().str();
7947 return false;
7948 }
7949
7950 // FIXME: It's valid to use N32/N64 on a mips/mipsel triple but the backend
7951 // can't handle this yet. It's better to fail here than on the
7952 // backend assertion.
7953 if ((getTriple().getArch() == llvm::Triple::mips ||
7954 getTriple().getArch() == llvm::Triple::mipsel) &&
7955 (ABI == "n32" || ABI == "n64")) {
7956 Diags.Report(diag::err_target_unsupported_abi_for_triple)
7957 << ABI << getTriple().str();
7958 return false;
7959 }
7960
7961 return true;
7962 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007963};
7964
Daniel Sanders4672af62016-05-27 11:51:02 +00007965const Builtin::Info MipsTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00007966#define BUILTIN(ID, TYPE, ATTRS) \
7967 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7968#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7969 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00007970#include "clang/Basic/BuiltinsMips.def"
7971};
7972
Ivan Krasindd7403e2011-08-24 20:22:22 +00007973class PNaClTargetInfo : public TargetInfo {
7974public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007975 PNaClTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7976 : TargetInfo(Triple) {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007977 this->LongAlign = 32;
7978 this->LongWidth = 32;
7979 this->PointerAlign = 32;
7980 this->PointerWidth = 32;
7981 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007982 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00007983 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00007984 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00007985 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00007986 this->SizeType = TargetInfo::UnsignedInt;
7987 this->PtrDiffType = TargetInfo::SignedInt;
7988 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00007989 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00007990 }
7991
Craig Toppere6f17d02014-03-11 04:07:52 +00007992 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007993 Builder.defineMacro("__le32__");
7994 Builder.defineMacro("__pnacl__");
7995 }
Craig Topper3164f332014-03-11 03:39:26 +00007996 void getTargetDefines(const LangOptions &Opts,
7997 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007998 getArchDefines(Opts, Builder);
7999 }
Craig Topper3164f332014-03-11 03:39:26 +00008000 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00008001 return Feature == "pnacl";
8002 }
Craig Topper6c03a542015-10-19 04:51:35 +00008003 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Craig Topper3164f332014-03-11 03:39:26 +00008004 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00008005 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00008006 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008007 ArrayRef<const char *> getGCCRegNames() const override;
8008 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00008009 bool validateAsmConstraint(const char *&Name,
8010 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00008011 return false;
8012 }
8013
Craig Topper3164f332014-03-11 03:39:26 +00008014 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00008015 return "";
8016 }
8017};
8018
Craig Topperf054e3a2015-10-19 03:52:27 +00008019ArrayRef<const char *> PNaClTargetInfo::getGCCRegNames() const {
8020 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00008021}
8022
Craig Topperf054e3a2015-10-19 03:52:27 +00008023ArrayRef<TargetInfo::GCCRegAlias> PNaClTargetInfo::getGCCRegAliases() const {
8024 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00008025}
Ivan Krasindd7403e2011-08-24 20:22:22 +00008026
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008027// We attempt to use PNaCl (le32) frontend and Mips32EL backend.
Daniel Sanders4672af62016-05-27 11:51:02 +00008028class NaClMips32TargetInfo : public MipsTargetInfo {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008029public:
Daniel Sanders4672af62016-05-27 11:51:02 +00008030 NaClMips32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8031 : MipsTargetInfo(Triple, Opts) {}
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008032
8033 BuiltinVaListKind getBuiltinVaListKind() const override {
8034 return TargetInfo::PNaClABIBuiltinVaList;
8035 }
8036};
8037
JF Bastien643817d2014-09-12 17:52:47 +00008038class Le64TargetInfo : public TargetInfo {
8039 static const Builtin::Info BuiltinInfo[];
8040
8041public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008042 Le64TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
8043 : TargetInfo(Triple) {
JF Bastien643817d2014-09-12 17:52:47 +00008044 NoAsmVariants = true;
8045 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
8046 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00008047 resetDataLayout("e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128");
JF Bastien643817d2014-09-12 17:52:47 +00008048 }
8049
8050 void getTargetDefines(const LangOptions &Opts,
8051 MacroBuilder &Builder) const override {
Saleem Abdulrasool56027092017-02-07 19:00:06 +00008052 DefineStd(Builder, "unix", Opts);
JF Bastien643817d2014-09-12 17:52:47 +00008053 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
8054 Builder.defineMacro("__ELF__");
8055 }
Craig Topper6c03a542015-10-19 04:51:35 +00008056 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
8057 return llvm::makeArrayRef(BuiltinInfo,
8058 clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin);
JF Bastien643817d2014-09-12 17:52:47 +00008059 }
8060 BuiltinVaListKind getBuiltinVaListKind() const override {
8061 return TargetInfo::PNaClABIBuiltinVaList;
8062 }
8063 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00008064 ArrayRef<const char *> getGCCRegNames() const override {
8065 return None;
JF Bastien643817d2014-09-12 17:52:47 +00008066 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008067 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8068 return None;
JF Bastien643817d2014-09-12 17:52:47 +00008069 }
8070 bool validateAsmConstraint(const char *&Name,
8071 TargetInfo::ConstraintInfo &Info) const override {
8072 return false;
8073 }
8074
8075 bool hasProtectedVisibility() const override { return false; }
JF Bastien643817d2014-09-12 17:52:47 +00008076};
Dan Gohmanc2853072015-09-03 22:51:53 +00008077
8078class WebAssemblyTargetInfo : public TargetInfo {
8079 static const Builtin::Info BuiltinInfo[];
8080
8081 enum SIMDEnum {
8082 NoSIMD,
8083 SIMD128,
8084 } SIMDLevel;
8085
8086public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008087 explicit WebAssemblyTargetInfo(const llvm::Triple &T, const TargetOptions &)
Dan Gohmanc2853072015-09-03 22:51:53 +00008088 : TargetInfo(T), SIMDLevel(NoSIMD) {
Dan Gohmanc2853072015-09-03 22:51:53 +00008089 NoAsmVariants = true;
8090 SuitableAlign = 128;
8091 LargeArrayMinWidth = 128;
8092 LargeArrayAlign = 128;
8093 SimdDefaultAlign = 128;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00008094 SigAtomicType = SignedLong;
Dan Gohman6db46402015-11-10 21:01:46 +00008095 LongDoubleWidth = LongDoubleAlign = 128;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00008096 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Derek Schuffacdc8e62016-09-01 22:38:37 +00008097 SizeType = UnsignedInt;
8098 PtrDiffType = SignedInt;
8099 IntPtrType = SignedInt;
Dan Gohmanc2853072015-09-03 22:51:53 +00008100 }
8101
8102protected:
8103 void getTargetDefines(const LangOptions &Opts,
8104 MacroBuilder &Builder) const override {
8105 defineCPUMacros(Builder, "wasm", /*Tuning=*/false);
8106 if (SIMDLevel >= SIMD128)
8107 Builder.defineMacro("__wasm_simd128__");
8108 }
8109
8110private:
Eric Christopher8c47b422015-10-09 18:39:55 +00008111 bool
8112 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
8113 StringRef CPU,
8114 const std::vector<std::string> &FeaturesVec) const override {
Dan Gohmanc2853072015-09-03 22:51:53 +00008115 if (CPU == "bleeding-edge")
8116 Features["simd128"] = true;
8117 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
8118 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00008119 bool hasFeature(StringRef Feature) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00008120 return llvm::StringSwitch<bool>(Feature)
8121 .Case("simd128", SIMDLevel >= SIMD128)
8122 .Default(false);
8123 }
8124 bool handleTargetFeatures(std::vector<std::string> &Features,
Hans Wennborg7eb54642015-09-10 17:07:54 +00008125 DiagnosticsEngine &Diags) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00008126 for (const auto &Feature : Features) {
8127 if (Feature == "+simd128") {
8128 SIMDLevel = std::max(SIMDLevel, SIMD128);
8129 continue;
8130 }
8131 if (Feature == "-simd128") {
8132 SIMDLevel = std::min(SIMDLevel, SIMDEnum(SIMD128 - 1));
8133 continue;
8134 }
8135
8136 Diags.Report(diag::err_opt_not_valid_with_opt) << Feature
8137 << "-target-feature";
8138 return false;
8139 }
8140 return true;
8141 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00008142 bool setCPU(const std::string &Name) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00008143 return llvm::StringSwitch<bool>(Name)
8144 .Case("mvp", true)
8145 .Case("bleeding-edge", true)
8146 .Case("generic", true)
8147 .Default(false);
8148 }
Craig Topper6c03a542015-10-19 04:51:35 +00008149 ArrayRef<Builtin::Info> getTargetBuiltins() const final {
8150 return llvm::makeArrayRef(BuiltinInfo,
8151 clang::WebAssembly::LastTSBuiltin - Builtin::FirstTSBuiltin);
Dan Gohmanc2853072015-09-03 22:51:53 +00008152 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00008153 BuiltinVaListKind getBuiltinVaListKind() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00008154 return VoidPtrBuiltinVaList;
8155 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008156 ArrayRef<const char *> getGCCRegNames() const final {
8157 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00008158 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008159 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const final {
8160 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00008161 }
8162 bool
8163 validateAsmConstraint(const char *&Name,
Hans Wennborg7eb54642015-09-10 17:07:54 +00008164 TargetInfo::ConstraintInfo &Info) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00008165 return false;
8166 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00008167 const char *getClobbers() const final { return ""; }
8168 bool isCLZForZeroUndef() const final { return false; }
8169 bool hasInt128Type() const final { return true; }
Dan Gohmanab0e31f2015-09-14 21:49:41 +00008170 IntType getIntTypeByWidth(unsigned BitWidth,
8171 bool IsSigned) const final {
8172 // WebAssembly prefers long long for explicitly 64-bit integers.
8173 return BitWidth == 64 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
8174 : TargetInfo::getIntTypeByWidth(BitWidth, IsSigned);
8175 }
8176 IntType getLeastIntTypeByWidth(unsigned BitWidth,
8177 bool IsSigned) const final {
8178 // WebAssembly uses long long for int_least64_t and int_fast64_t.
8179 return BitWidth == 64
8180 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
8181 : TargetInfo::getLeastIntTypeByWidth(BitWidth, IsSigned);
8182 }
Dan Gohmanc2853072015-09-03 22:51:53 +00008183};
8184
8185const Builtin::Info WebAssemblyTargetInfo::BuiltinInfo[] = {
8186#define BUILTIN(ID, TYPE, ATTRS) \
8187 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
8188#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
8189 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
8190#include "clang/Basic/BuiltinsWebAssembly.def"
8191};
8192
8193class WebAssembly32TargetInfo : public WebAssemblyTargetInfo {
8194public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008195 explicit WebAssembly32TargetInfo(const llvm::Triple &T,
8196 const TargetOptions &Opts)
8197 : WebAssemblyTargetInfo(T, Opts) {
Dan Gohmanf1c34e62015-09-14 21:56:37 +00008198 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
James Y Knightb214cbc2016-03-04 19:00:41 +00008199 resetDataLayout("e-m:e-p:32:32-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00008200 }
8201
8202protected:
8203 void getTargetDefines(const LangOptions &Opts,
8204 MacroBuilder &Builder) const override {
8205 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
8206 defineCPUMacros(Builder, "wasm32", /*Tuning=*/false);
8207 }
8208};
8209
8210class WebAssembly64TargetInfo : public WebAssemblyTargetInfo {
8211public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008212 explicit WebAssembly64TargetInfo(const llvm::Triple &T,
8213 const TargetOptions &Opts)
8214 : WebAssemblyTargetInfo(T, Opts) {
Dan Gohmanc2853072015-09-03 22:51:53 +00008215 LongAlign = LongWidth = 64;
8216 PointerAlign = PointerWidth = 64;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00008217 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Derek Schuffacdc8e62016-09-01 22:38:37 +00008218 SizeType = UnsignedLong;
8219 PtrDiffType = SignedLong;
8220 IntPtrType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00008221 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00008222 }
8223
8224protected:
8225 void getTargetDefines(const LangOptions &Opts,
8226 MacroBuilder &Builder) const override {
8227 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
8228 defineCPUMacros(Builder, "wasm64", /*Tuning=*/false);
8229 }
8230};
8231
JF Bastien643817d2014-09-12 17:52:47 +00008232const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
8233#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00008234 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
JF Bastien643817d2014-09-12 17:52:47 +00008235#include "clang/Basic/BuiltinsLe64.def"
8236};
8237
Eric Christopherc48497a2015-09-18 21:26:24 +00008238static const unsigned SPIRAddrSpaceMap[] = {
8239 1, // opencl_global
8240 3, // opencl_local
8241 2, // opencl_constant
8242 4, // opencl_generic
8243 0, // cuda_device
8244 0, // cuda_constant
8245 0 // cuda_shared
8246};
8247class SPIRTargetInfo : public TargetInfo {
8248public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008249 SPIRTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
8250 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00008251 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
8252 "SPIR target must use unknown OS");
8253 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
8254 "SPIR target must use unknown environment type");
Eric Christopherc48497a2015-09-18 21:26:24 +00008255 TLSSupported = false;
8256 LongWidth = LongAlign = 64;
8257 AddrSpaceMap = &SPIRAddrSpaceMap;
8258 UseAddrSpaceMapMangling = true;
8259 // Define available target features
8260 // These must be defined in sorted order!
8261 NoAsmVariants = true;
8262 }
8263 void getTargetDefines(const LangOptions &Opts,
8264 MacroBuilder &Builder) const override {
8265 DefineStd(Builder, "SPIR", Opts);
8266 }
8267 bool hasFeature(StringRef Feature) const override {
8268 return Feature == "spir";
8269 }
Craig Topper3164f332014-03-11 03:39:26 +00008270
Craig Topper6c03a542015-10-19 04:51:35 +00008271 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00008272 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00008273 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00008274 bool validateAsmConstraint(const char *&Name,
8275 TargetInfo::ConstraintInfo &info) const override {
8276 return true;
8277 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008278 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8279 return None;
8280 }
Eric Christopherc48497a2015-09-18 21:26:24 +00008281 BuiltinVaListKind getBuiltinVaListKind() const override {
8282 return TargetInfo::VoidPtrBuiltinVaList;
8283 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00008284
Eric Christopherc48497a2015-09-18 21:26:24 +00008285 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Nikolay Haustov8c6538b2016-06-30 09:06:33 +00008286 return (CC == CC_SpirFunction || CC == CC_OpenCLKernel) ? CCCR_OK
8287 : CCCR_Warning;
Eric Christopherc48497a2015-09-18 21:26:24 +00008288 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00008289
Eric Christopherc48497a2015-09-18 21:26:24 +00008290 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
8291 return CC_SpirFunction;
8292 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00008293
8294 void setSupportedOpenCLOpts() override {
8295 // Assume all OpenCL extensions and optional core features are supported
8296 // for SPIR since it is a generic target.
Yaxun Liu5b746652016-12-18 05:18:55 +00008297 getSupportedOpenCLOpts().supportAll();
Yaxun Liu39cf40f2016-05-16 17:06:34 +00008298 }
Eric Christopherc48497a2015-09-18 21:26:24 +00008299};
Guy Benyeib798fc92012-12-11 21:38:14 +00008300
Eric Christopherc48497a2015-09-18 21:26:24 +00008301class SPIR32TargetInfo : public SPIRTargetInfo {
8302public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008303 SPIR32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8304 : SPIRTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00008305 PointerWidth = PointerAlign = 32;
8306 SizeType = TargetInfo::UnsignedInt;
8307 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +00008308 resetDataLayout("e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
8309 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00008310 }
8311 void getTargetDefines(const LangOptions &Opts,
8312 MacroBuilder &Builder) const override {
8313 DefineStd(Builder, "SPIR32", Opts);
8314 }
8315};
Guy Benyeib798fc92012-12-11 21:38:14 +00008316
Eric Christopherc48497a2015-09-18 21:26:24 +00008317class SPIR64TargetInfo : public SPIRTargetInfo {
8318public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008319 SPIR64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8320 : SPIRTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00008321 PointerWidth = PointerAlign = 64;
8322 SizeType = TargetInfo::UnsignedLong;
8323 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00008324 resetDataLayout("e-i64:64-v16:16-v24:32-v32:32-v48:64-"
8325 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00008326 }
8327 void getTargetDefines(const LangOptions &Opts,
8328 MacroBuilder &Builder) const override {
8329 DefineStd(Builder, "SPIR64", Opts);
8330 }
8331};
Guy Benyeib798fc92012-12-11 21:38:14 +00008332
Robert Lytton0e076492013-08-13 09:43:10 +00008333class XCoreTargetInfo : public TargetInfo {
8334 static const Builtin::Info BuiltinInfo[];
8335public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008336 XCoreTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
8337 : TargetInfo(Triple) {
Robert Lytton0e076492013-08-13 09:43:10 +00008338 NoAsmVariants = true;
8339 LongLongAlign = 32;
8340 SuitableAlign = 32;
8341 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00008342 SizeType = UnsignedInt;
8343 PtrDiffType = SignedInt;
8344 IntPtrType = SignedInt;
8345 WCharType = UnsignedChar;
8346 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00008347 UseZeroLengthBitfieldAlignment = true;
James Y Knightb214cbc2016-03-04 19:00:41 +00008348 resetDataLayout("e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32"
8349 "-f64:32-a:0:32-n32");
Robert Lytton0e076492013-08-13 09:43:10 +00008350 }
Craig Topper3164f332014-03-11 03:39:26 +00008351 void getTargetDefines(const LangOptions &Opts,
8352 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008353 Builder.defineMacro("__XS1B__");
8354 }
Craig Topper6c03a542015-10-19 04:51:35 +00008355 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
8356 return llvm::makeArrayRef(BuiltinInfo,
8357 clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin);
Robert Lytton0e076492013-08-13 09:43:10 +00008358 }
Craig Topper3164f332014-03-11 03:39:26 +00008359 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008360 return TargetInfo::VoidPtrBuiltinVaList;
8361 }
Craig Topper3164f332014-03-11 03:39:26 +00008362 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008363 return "";
8364 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008365 ArrayRef<const char *> getGCCRegNames() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008366 static const char * const GCCRegNames[] = {
8367 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
8368 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
8369 };
Craig Topperf054e3a2015-10-19 03:52:27 +00008370 return llvm::makeArrayRef(GCCRegNames);
Robert Lytton0e076492013-08-13 09:43:10 +00008371 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008372 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8373 return None;
Robert Lytton0e076492013-08-13 09:43:10 +00008374 }
Craig Topper3164f332014-03-11 03:39:26 +00008375 bool validateAsmConstraint(const char *&Name,
8376 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008377 return false;
8378 }
Craig Topper3164f332014-03-11 03:39:26 +00008379 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00008380 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
8381 return (RegNo < 2)? RegNo : -1;
8382 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00008383 bool allowsLargerPreferedTypeAlignment() const override {
8384 return false;
8385 }
Robert Lytton0e076492013-08-13 09:43:10 +00008386};
8387
8388const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00008389#define BUILTIN(ID, TYPE, ATTRS) \
8390 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
8391#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
8392 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Robert Lytton0e076492013-08-13 09:43:10 +00008393#include "clang/Basic/BuiltinsXCore.def"
8394};
Robert Lytton0e076492013-08-13 09:43:10 +00008395
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008396// x86_32 Android target
8397class AndroidX86_32TargetInfo : public LinuxTargetInfo<X86_32TargetInfo> {
8398public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008399 AndroidX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8400 : LinuxTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008401 SuitableAlign = 32;
8402 LongDoubleWidth = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00008403 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008404 }
8405};
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008406
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008407// x86_64 Android target
8408class AndroidX86_64TargetInfo : public LinuxTargetInfo<X86_64TargetInfo> {
8409public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008410 AndroidX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8411 : LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Stephan Bergmann17c7f702016-12-14 11:57:17 +00008412 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008413 }
Chih-Hung Hsieh0b0eeaa2015-07-24 18:12:54 +00008414
8415 bool useFloat128ManglingForLongDouble() const override {
8416 return true;
8417 }
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008418};
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008419
8420// 32-bit RenderScript is armv7 with width and align of 'long' set to 8-bytes
8421class RenderScript32TargetInfo : public ARMleTargetInfo {
8422public:
8423 RenderScript32TargetInfo(const llvm::Triple &Triple,
8424 const TargetOptions &Opts)
8425 : ARMleTargetInfo(llvm::Triple("armv7", Triple.getVendorName(),
8426 Triple.getOSName(),
8427 Triple.getEnvironmentName()),
8428 Opts) {
Pirama Arumuga Nainarbb846a32016-07-27 19:01:51 +00008429 IsRenderScriptTarget = true;
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008430 LongWidth = LongAlign = 64;
8431 }
8432 void getTargetDefines(const LangOptions &Opts,
8433 MacroBuilder &Builder) const override {
8434 Builder.defineMacro("__RENDERSCRIPT__");
8435 ARMleTargetInfo::getTargetDefines(Opts, Builder);
8436 }
8437};
8438
8439// 64-bit RenderScript is aarch64
8440class RenderScript64TargetInfo : public AArch64leTargetInfo {
8441public:
8442 RenderScript64TargetInfo(const llvm::Triple &Triple,
8443 const TargetOptions &Opts)
8444 : AArch64leTargetInfo(llvm::Triple("aarch64", Triple.getVendorName(),
8445 Triple.getOSName(),
8446 Triple.getEnvironmentName()),
Pirama Arumuga Nainarbb846a32016-07-27 19:01:51 +00008447 Opts) {
8448 IsRenderScriptTarget = true;
8449 }
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008450
8451 void getTargetDefines(const LangOptions &Opts,
8452 MacroBuilder &Builder) const override {
8453 Builder.defineMacro("__RENDERSCRIPT__");
8454 AArch64leTargetInfo::getTargetDefines(Opts, Builder);
8455 }
8456};
8457
Dylan McKayecb6e7b2017-02-07 06:04:18 +00008458/// Information about a specific microcontroller.
8459struct MCUInfo {
8460 const char *Name;
8461 const char *DefineName;
8462};
8463
8464// This list should be kept up-to-date with AVRDevices.td in LLVM.
8465static ArrayRef<MCUInfo> AVRMcus = {
8466 { "at90s1200", "__AVR_AT90S1200__" },
8467 { "attiny11", "__AVR_ATtiny11" },
8468 { "attiny12", "__AVR_ATtiny12" },
8469 { "attiny15", "__AVR_ATtiny15" },
8470 { "attiny28", "__AVR_ATtiny28" },
8471 { "at90s2313", "__AVR_AT90S2313" },
8472 { "at90s2323", "__AVR_AT90S2323" },
8473 { "at90s2333", "__AVR_AT90S2333" },
8474 { "at90s2343", "__AVR_AT90S2343" },
8475 { "attiny22", "__AVR_ATtiny22" },
8476 { "attiny26", "__AVR_ATtiny26" },
8477 { "at86rf401", "__AVR_AT86RF401" },
8478 { "at90s4414", "__AVR_AT90S4414" },
8479 { "at90s4433", "__AVR_AT90S4433" },
8480 { "at90s4434", "__AVR_AT90S4434" },
8481 { "at90s8515", "__AVR_AT90S8515" },
8482 { "at90c8534", "__AVR_AT90c8534" },
8483 { "at90s8535", "__AVR_AT90S8535" },
8484 { "ata5272", "__AVR_ATA5272" },
8485 { "attiny13", "__AVR_ATtiny13" },
8486 { "attiny13a", "__AVR_ATtiny13A" },
8487 { "attiny2313", "__AVR_ATtiny2313" },
8488 { "attiny2313a", "__AVR_ATtiny2313A" },
8489 { "attiny24", "__AVR_ATtiny24" },
8490 { "attiny24a", "__AVR_ATtiny24A" },
8491 { "attiny4313", "__AVR_ATtiny4313" },
8492 { "attiny44", "__AVR_ATtiny44" },
8493 { "attiny44a", "__AVR_ATtiny44A" },
8494 { "attiny84", "__AVR_ATtiny84" },
8495 { "attiny84a", "__AVR_ATtiny84A" },
8496 { "attiny25", "__AVR_ATtiny25" },
8497 { "attiny45", "__AVR_ATtiny45" },
8498 { "attiny85", "__AVR_ATtiny85" },
8499 { "attiny261", "__AVR_ATtiny261" },
8500 { "attiny261a", "__AVR_ATtiny261A" },
8501 { "attiny461", "__AVR_ATtiny461" },
8502 { "attiny461a", "__AVR_ATtiny461A" },
8503 { "attiny861", "__AVR_ATtiny861" },
8504 { "attiny861a", "__AVR_ATtiny861A" },
8505 { "attiny87", "__AVR_ATtiny87" },
8506 { "attiny43u", "__AVR_ATtiny43U" },
8507 { "attiny48", "__AVR_ATtiny48" },
8508 { "attiny88", "__AVR_ATtiny88" },
8509 { "attiny828", "__AVR_ATtiny828" },
8510 { "at43usb355", "__AVR_AT43USB355" },
8511 { "at76c711", "__AVR_AT76C711" },
8512 { "atmega103", "__AVR_ATmega103" },
8513 { "at43usb320", "__AVR_AT43USB320" },
8514 { "attiny167", "__AVR_ATtiny167" },
8515 { "at90usb82", "__AVR_AT90USB82" },
8516 { "at90usb162", "__AVR_AT90USB162" },
8517 { "ata5505", "__AVR_ATA5505" },
8518 { "atmega8u2", "__AVR_ATmega8U2" },
8519 { "atmega16u2", "__AVR_ATmega16U2" },
8520 { "atmega32u2", "__AVR_ATmega32U2" },
8521 { "attiny1634", "__AVR_ATtiny1634" },
8522 { "atmega8", "__AVR_ATmega8" },
8523 { "ata6289", "__AVR_ATA6289" },
8524 { "atmega8a", "__AVR_ATmega8A" },
8525 { "ata6285", "__AVR_ATA6285" },
8526 { "ata6286", "__AVR_ATA6286" },
8527 { "atmega48", "__AVR_ATmega48" },
8528 { "atmega48a", "__AVR_ATmega48A" },
8529 { "atmega48pa", "__AVR_ATmega48PA" },
8530 { "atmega48p", "__AVR_ATmega48P" },
8531 { "atmega88", "__AVR_ATmega88" },
8532 { "atmega88a", "__AVR_ATmega88A" },
8533 { "atmega88p", "__AVR_ATmega88P" },
8534 { "atmega88pa", "__AVR_ATmega88PA" },
8535 { "atmega8515", "__AVR_ATmega8515" },
8536 { "atmega8535", "__AVR_ATmega8535" },
8537 { "atmega8hva", "__AVR_ATmega8HVA" },
8538 { "at90pwm1", "__AVR_AT90PWM1" },
8539 { "at90pwm2", "__AVR_AT90PWM2" },
8540 { "at90pwm2b", "__AVR_AT90PWM2B" },
8541 { "at90pwm3", "__AVR_AT90PWM3" },
8542 { "at90pwm3b", "__AVR_AT90PWM3B" },
8543 { "at90pwm81", "__AVR_AT90PWM81" },
8544 { "ata5790", "__AVR_ATA5790" },
8545 { "ata5795", "__AVR_ATA5795" },
8546 { "atmega16", "__AVR_ATmega16" },
8547 { "atmega16a", "__AVR_ATmega16A" },
8548 { "atmega161", "__AVR_ATmega161" },
8549 { "atmega162", "__AVR_ATmega162" },
8550 { "atmega163", "__AVR_ATmega163" },
8551 { "atmega164a", "__AVR_ATmega164A" },
8552 { "atmega164p", "__AVR_ATmega164P" },
8553 { "atmega164pa", "__AVR_ATmega164PA" },
8554 { "atmega165", "__AVR_ATmega165" },
8555 { "atmega165a", "__AVR_ATmega165A" },
8556 { "atmega165p", "__AVR_ATmega165P" },
8557 { "atmega165pa", "__AVR_ATmega165PA" },
8558 { "atmega168", "__AVR_ATmega168" },
8559 { "atmega168a", "__AVR_ATmega168A" },
8560 { "atmega168p", "__AVR_ATmega168P" },
8561 { "atmega168pa", "__AVR_ATmega168PA" },
8562 { "atmega169", "__AVR_ATmega169" },
8563 { "atmega169a", "__AVR_ATmega169A" },
8564 { "atmega169p", "__AVR_ATmega169P" },
8565 { "atmega169pa", "__AVR_ATmega169PA" },
8566 { "atmega32", "__AVR_ATmega32" },
8567 { "atmega32a", "__AVR_ATmega32A" },
8568 { "atmega323", "__AVR_ATmega323" },
8569 { "atmega324a", "__AVR_ATmega324A" },
8570 { "atmega324p", "__AVR_ATmega324P" },
8571 { "atmega324pa", "__AVR_ATmega324PA" },
8572 { "atmega325", "__AVR_ATmega325" },
8573 { "atmega325a", "__AVR_ATmega325A" },
8574 { "atmega325p", "__AVR_ATmega325P" },
8575 { "atmega325pa", "__AVR_ATmega325PA" },
8576 { "atmega3250", "__AVR_ATmega3250" },
8577 { "atmega3250a", "__AVR_ATmega3250A" },
8578 { "atmega3250p", "__AVR_ATmega3250P" },
8579 { "atmega3250pa", "__AVR_ATmega3250PA" },
8580 { "atmega328", "__AVR_ATmega328" },
8581 { "atmega328p", "__AVR_ATmega328P" },
8582 { "atmega329", "__AVR_ATmega329" },
8583 { "atmega329a", "__AVR_ATmega329A" },
8584 { "atmega329p", "__AVR_ATmega329P" },
8585 { "atmega329pa", "__AVR_ATmega329PA" },
8586 { "atmega3290", "__AVR_ATmega3290" },
8587 { "atmega3290a", "__AVR_ATmega3290A" },
8588 { "atmega3290p", "__AVR_ATmega3290P" },
8589 { "atmega3290pa", "__AVR_ATmega3290PA" },
8590 { "atmega406", "__AVR_ATmega406" },
8591 { "atmega64", "__AVR_ATmega64" },
8592 { "atmega64a", "__AVR_ATmega64A" },
8593 { "atmega640", "__AVR_ATmega640" },
8594 { "atmega644", "__AVR_ATmega644" },
8595 { "atmega644a", "__AVR_ATmega644A" },
8596 { "atmega644p", "__AVR_ATmega644P" },
8597 { "atmega644pa", "__AVR_ATmega644PA" },
8598 { "atmega645", "__AVR_ATmega645" },
8599 { "atmega645a", "__AVR_ATmega645A" },
8600 { "atmega645p", "__AVR_ATmega645P" },
8601 { "atmega649", "__AVR_ATmega649" },
8602 { "atmega649a", "__AVR_ATmega649A" },
8603 { "atmega649p", "__AVR_ATmega649P" },
8604 { "atmega6450", "__AVR_ATmega6450" },
8605 { "atmega6450a", "__AVR_ATmega6450A" },
8606 { "atmega6450p", "__AVR_ATmega6450P" },
8607 { "atmega6490", "__AVR_ATmega6490" },
8608 { "atmega6490a", "__AVR_ATmega6490A" },
8609 { "atmega6490p", "__AVR_ATmega6490P" },
8610 { "atmega64rfr2", "__AVR_ATmega64RFR2" },
8611 { "atmega644rfr2", "__AVR_ATmega644RFR2" },
8612 { "atmega16hva", "__AVR_ATmega16HVA" },
8613 { "atmega16hva2", "__AVR_ATmega16HVA2" },
8614 { "atmega16hvb", "__AVR_ATmega16HVB" },
8615 { "atmega16hvbrevb", "__AVR_ATmega16HVBREVB" },
8616 { "atmega32hvb", "__AVR_ATmega32HVB" },
8617 { "atmega32hvbrevb", "__AVR_ATmega32HVBREVB" },
8618 { "atmega64hve", "__AVR_ATmega64HVE" },
8619 { "at90can32", "__AVR_AT90CAN32" },
8620 { "at90can64", "__AVR_AT90CAN64" },
8621 { "at90pwm161", "__AVR_AT90PWM161" },
8622 { "at90pwm216", "__AVR_AT90PWM216" },
8623 { "at90pwm316", "__AVR_AT90PWM316" },
8624 { "atmega32c1", "__AVR_ATmega32C1" },
8625 { "atmega64c1", "__AVR_ATmega64C1" },
8626 { "atmega16m1", "__AVR_ATmega16M1" },
8627 { "atmega32m1", "__AVR_ATmega32M1" },
8628 { "atmega64m1", "__AVR_ATmega64M1" },
8629 { "atmega16u4", "__AVR_ATmega16U4" },
8630 { "atmega32u4", "__AVR_ATmega32U4" },
8631 { "atmega32u6", "__AVR_ATmega32U6" },
8632 { "at90usb646", "__AVR_AT90USB646" },
8633 { "at90usb647", "__AVR_AT90USB647" },
8634 { "at90scr100", "__AVR_AT90SCR100" },
8635 { "at94k", "__AVR_AT94K" },
8636 { "m3000", "__AVR_AT000" },
8637 { "atmega128", "__AVR_ATmega128" },
8638 { "atmega128a", "__AVR_ATmega128A" },
8639 { "atmega1280", "__AVR_ATmega1280" },
8640 { "atmega1281", "__AVR_ATmega1281" },
8641 { "atmega1284", "__AVR_ATmega1284" },
8642 { "atmega1284p", "__AVR_ATmega1284P" },
8643 { "atmega128rfa1", "__AVR_ATmega128RFA1" },
8644 { "atmega128rfr2", "__AVR_ATmega128RFR2" },
8645 { "atmega1284rfr2", "__AVR_ATmega1284RFR2" },
8646 { "at90can128", "__AVR_AT90CAN128" },
8647 { "at90usb1286", "__AVR_AT90USB1286" },
8648 { "at90usb1287", "__AVR_AT90USB1287" },
8649 { "atmega2560", "__AVR_ATmega2560" },
8650 { "atmega2561", "__AVR_ATmega2561" },
8651 { "atmega256rfr2", "__AVR_ATmega256RFR2" },
8652 { "atmega2564rfr2", "__AVR_ATmega2564RFR2" },
8653 { "atxmega16a4", "__AVR_ATxmega16A4" },
8654 { "atxmega16a4u", "__AVR_ATxmega16a4U" },
8655 { "atxmega16c4", "__AVR_ATxmega16C4" },
8656 { "atxmega16d4", "__AVR_ATxmega16D4" },
8657 { "atxmega32a4", "__AVR_ATxmega32A4" },
8658 { "atxmega32a4u", "__AVR_ATxmega32A4U" },
8659 { "atxmega32c4", "__AVR_ATxmega32C4" },
8660 { "atxmega32d4", "__AVR_ATxmega32D4" },
8661 { "atxmega32e5", "__AVR_ATxmega32E5" },
8662 { "atxmega16e5", "__AVR_ATxmega16E5" },
8663 { "atxmega8e5", "__AVR_ATxmega8E5" },
8664 { "atxmega32x1", "__AVR_ATxmega32X1" },
8665 { "atxmega64a3", "__AVR_ATxmega64A3" },
8666 { "atxmega64a3u", "__AVR_ATxmega64A3U" },
8667 { "atxmega64a4u", "__AVR_ATxmega64A4U" },
8668 { "atxmega64b1", "__AVR_ATxmega64B1" },
8669 { "atxmega64b3", "__AVR_ATxmega64B3" },
8670 { "atxmega64c3", "__AVR_ATxmega64C3" },
8671 { "atxmega64d3", "__AVR_ATxmega64D3" },
8672 { "atxmega64d4", "__AVR_ATxmega64D4" },
8673 { "atxmega64a1", "__AVR_ATxmega64A1" },
8674 { "atxmega64a1u", "__AVR_ATxmega64A1U" },
8675 { "atxmega128a3", "__AVR_ATxmega128A3" },
8676 { "atxmega128a3u", "__AVR_ATxmega128A3U" },
8677 { "atxmega128b1", "__AVR_ATxmega128B1" },
8678 { "atxmega128b3", "__AVR_ATxmega128B3" },
8679 { "atxmega128c3", "__AVR_ATxmega128C3" },
8680 { "atxmega128d3", "__AVR_ATxmega128D3" },
8681 { "atxmega128d4", "__AVR_ATxmega128D4" },
8682 { "atxmega192a3", "__AVR_ATxmega192A3" },
8683 { "atxmega192a3u", "__AVR_ATxmega192A3U" },
8684 { "atxmega192c3", "__AVR_ATxmega192C3" },
8685 { "atxmega192d3", "__AVR_ATxmega192D3" },
8686 { "atxmega256a3", "__AVR_ATxmega256A3" },
8687 { "atxmega256a3u", "__AVR_ATxmega256A3U" },
8688 { "atxmega256a3b", "__AVR_ATxmega256A3B" },
8689 { "atxmega256a3bu", "__AVR_ATxmega256A3BU" },
8690 { "atxmega256c3", "__AVR_ATxmega256C3" },
8691 { "atxmega256d3", "__AVR_ATxmega256D3" },
8692 { "atxmega384c3", "__AVR_ATxmega384C3" },
8693 { "atxmega384d3", "__AVR_ATxmega384D3" },
8694 { "atxmega128a1", "__AVR_ATxmega128A1" },
8695 { "atxmega128a1u", "__AVR_ATxmega128A1U" },
8696 { "atxmega128a4u", "__AVR_ATxmega128a4U" },
8697 { "attiny4", "__AVR_ATtiny4" },
8698 { "attiny5", "__AVR_ATtiny5" },
8699 { "attiny9", "__AVR_ATtiny9" },
8700 { "attiny10", "__AVR_ATtiny10" },
8701 { "attiny20", "__AVR_ATtiny20" },
8702 { "attiny40", "__AVR_ATtiny40" },
8703 { "attiny102", "__AVR_ATtiny102" },
8704 { "attiny104", "__AVR_ATtiny104" },
8705};
Dylan McKay924fa3a2017-01-05 05:20:27 +00008706
8707// AVR Target
8708class AVRTargetInfo : public TargetInfo {
8709public:
8710 AVRTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
8711 : TargetInfo(Triple) {
8712 TLSSupported = false;
8713 PointerWidth = 16;
8714 PointerAlign = 8;
8715 IntWidth = 16;
8716 IntAlign = 8;
8717 LongWidth = 32;
8718 LongAlign = 8;
8719 LongLongWidth = 64;
8720 LongLongAlign = 8;
8721 SuitableAlign = 8;
8722 DefaultAlignForAttributeAligned = 8;
8723 HalfWidth = 16;
8724 HalfAlign = 8;
8725 FloatWidth = 32;
8726 FloatAlign = 8;
8727 DoubleWidth = 32;
8728 DoubleAlign = 8;
8729 DoubleFormat = &llvm::APFloat::IEEEsingle();
8730 LongDoubleWidth = 32;
8731 LongDoubleAlign = 8;
8732 LongDoubleFormat = &llvm::APFloat::IEEEsingle();
8733 SizeType = UnsignedInt;
8734 PtrDiffType = SignedInt;
8735 IntPtrType = SignedInt;
8736 Char16Type = UnsignedInt;
8737 WCharType = SignedInt;
8738 WIntType = SignedInt;
8739 Char32Type = UnsignedLong;
8740 SigAtomicType = SignedChar;
8741 resetDataLayout("e-p:16:16:16-i8:8:8-i16:16:16-i32:32:32-i64:64:64"
8742 "-f32:32:32-f64:64:64-n8");
8743 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008744
Dylan McKay924fa3a2017-01-05 05:20:27 +00008745 void getTargetDefines(const LangOptions &Opts,
8746 MacroBuilder &Builder) const override {
Dylan McKayecb6e7b2017-02-07 06:04:18 +00008747 Builder.defineMacro("AVR");
8748 Builder.defineMacro("__AVR");
Dylan McKay924fa3a2017-01-05 05:20:27 +00008749 Builder.defineMacro("__AVR__");
Dylan McKayecb6e7b2017-02-07 06:04:18 +00008750
8751 if (!this->CPU.empty()) {
8752 auto It = std::find_if(AVRMcus.begin(), AVRMcus.end(),
8753 [&](const MCUInfo &Info) { return Info.Name == this->CPU; });
8754
8755 if (It != AVRMcus.end())
8756 Builder.defineMacro(It->DefineName);
8757 }
Dylan McKay924fa3a2017-01-05 05:20:27 +00008758 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008759
Dylan McKay924fa3a2017-01-05 05:20:27 +00008760 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
8761 return None;
8762 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008763
Dylan McKay924fa3a2017-01-05 05:20:27 +00008764 BuiltinVaListKind getBuiltinVaListKind() const override {
8765 return TargetInfo::VoidPtrBuiltinVaList;
8766 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008767
Dylan McKay924fa3a2017-01-05 05:20:27 +00008768 const char *getClobbers() const override {
8769 return "";
8770 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008771
Dylan McKay924fa3a2017-01-05 05:20:27 +00008772 ArrayRef<const char *> getGCCRegNames() const override {
8773 static const char * const GCCRegNames[] = {
8774 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
8775 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
8776 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
Dylan McKay95aa2652017-01-05 07:17:46 +00008777 "r24", "r25", "X", "Y", "Z", "SP"
Dylan McKay924fa3a2017-01-05 05:20:27 +00008778 };
8779 return llvm::makeArrayRef(GCCRegNames);
8780 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008781
Dylan McKay924fa3a2017-01-05 05:20:27 +00008782 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8783 return None;
8784 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008785
Dylan McKay924fa3a2017-01-05 05:20:27 +00008786 ArrayRef<TargetInfo::AddlRegName> getGCCAddlRegNames() const override {
8787 static const TargetInfo::AddlRegName AddlRegNames[] = {
8788 { { "r26", "r27"}, 26 },
8789 { { "r28", "r29"}, 27 },
8790 { { "r30", "r31"}, 28 },
8791 { { "SPL", "SPH"}, 29 },
8792 };
8793 return llvm::makeArrayRef(AddlRegNames);
8794 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008795
Dylan McKay924fa3a2017-01-05 05:20:27 +00008796 bool validateAsmConstraint(const char *&Name,
8797 TargetInfo::ConstraintInfo &Info) const override {
Dylan McKayd31534c2017-02-06 09:01:59 +00008798 // There aren't any multi-character AVR specific constraints.
8799 if (StringRef(Name).size() > 1) return false;
8800
8801 switch (*Name) {
8802 default: return false;
8803 case 'a': // Simple upper registers
8804 case 'b': // Base pointer registers pairs
8805 case 'd': // Upper register
8806 case 'l': // Lower registers
8807 case 'e': // Pointer register pairs
8808 case 'q': // Stack pointer register
8809 case 'r': // Any register
8810 case 'w': // Special upper register pairs
8811 case 't': // Temporary register
8812 case 'x': case 'X': // Pointer register pair X
8813 case 'y': case 'Y': // Pointer register pair Y
8814 case 'z': case 'Z': // Pointer register pair Z
8815 Info.setAllowsRegister();
8816 return true;
8817 case 'I': // 6-bit positive integer constant
8818 Info.setRequiresImmediate(0, 63);
8819 return true;
8820 case 'J': // 6-bit negative integer constant
8821 Info.setRequiresImmediate(-63, 0);
8822 return true;
8823 case 'K': // Integer constant (Range: 2)
8824 Info.setRequiresImmediate(2);
8825 return true;
8826 case 'L': // Integer constant (Range: 0)
8827 Info.setRequiresImmediate(0);
8828 return true;
8829 case 'M': // 8-bit integer constant
8830 Info.setRequiresImmediate(0, 0xff);
8831 return true;
8832 case 'N': // Integer constant (Range: -1)
8833 Info.setRequiresImmediate(-1);
8834 return true;
8835 case 'O': // Integer constant (Range: 8, 16, 24)
8836 Info.setRequiresImmediate({8, 16, 24});
8837 return true;
8838 case 'P': // Integer constant (Range: 1)
8839 Info.setRequiresImmediate(1);
8840 return true;
8841 case 'R': // Integer constant (Range: -6 to 5)
8842 Info.setRequiresImmediate(-6, 5);
8843 return true;
8844 case 'G': // Floating point constant
8845 case 'Q': // A memory address based on Y or Z pointer with displacement.
8846 return true;
8847 }
8848
Dylan McKay924fa3a2017-01-05 05:20:27 +00008849 return false;
8850 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008851
Dylan McKay924fa3a2017-01-05 05:20:27 +00008852 IntType getIntTypeByWidth(unsigned BitWidth,
8853 bool IsSigned) const final {
8854 // AVR prefers int for 16-bit integers.
8855 return BitWidth == 16 ? (IsSigned ? SignedInt : UnsignedInt)
8856 : TargetInfo::getIntTypeByWidth(BitWidth, IsSigned);
8857 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008858
Dylan McKay924fa3a2017-01-05 05:20:27 +00008859 IntType getLeastIntTypeByWidth(unsigned BitWidth,
8860 bool IsSigned) const final {
8861 // AVR uses int for int_least16_t and int_fast16_t.
8862 return BitWidth == 16
8863 ? (IsSigned ? SignedInt : UnsignedInt)
8864 : TargetInfo::getLeastIntTypeByWidth(BitWidth, IsSigned);
8865 }
Dylan McKayecb6e7b2017-02-07 06:04:18 +00008866
8867 bool setCPU(const std::string &Name) override {
8868 bool IsFamily = llvm::StringSwitch<bool>(Name)
8869 .Case("avr1", true)
8870 .Case("avr2", true)
8871 .Case("avr25", true)
8872 .Case("avr3", true)
8873 .Case("avr31", true)
8874 .Case("avr35", true)
8875 .Case("avr4", true)
8876 .Case("avr5", true)
8877 .Case("avr51", true)
8878 .Case("avr6", true)
8879 .Case("avrxmega1", true)
8880 .Case("avrxmega2", true)
8881 .Case("avrxmega3", true)
8882 .Case("avrxmega4", true)
8883 .Case("avrxmega5", true)
8884 .Case("avrxmega6", true)
8885 .Case("avrxmega7", true)
8886 .Case("avrtiny", true)
8887 .Default(false);
8888
8889 if (IsFamily) this->CPU = Name;
8890
8891 bool IsMCU = std::find_if(AVRMcus.begin(), AVRMcus.end(),
8892 [&](const MCUInfo &Info) { return Info.Name == Name; }) != AVRMcus.end();
8893
8894 if (IsMCU) this->CPU = Name;
8895
8896 return IsFamily || IsMCU;
8897 }
8898
8899protected:
8900 std::string CPU;
Dylan McKay924fa3a2017-01-05 05:20:27 +00008901};
8902
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008903} // end anonymous namespace
8904
Chris Lattner5ba61f02006-10-14 07:39:34 +00008905//===----------------------------------------------------------------------===//
8906// Driver code
8907//===----------------------------------------------------------------------===//
8908
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008909static TargetInfo *AllocateTarget(const llvm::Triple &Triple,
8910 const TargetOptions &Opts) {
Daniel Dunbar52322032009-08-18 05:47:58 +00008911 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00008912
Daniel Dunbar52322032009-08-18 05:47:58 +00008913 switch (Triple.getArch()) {
8914 default:
Craig Topperf1186c52014-05-08 06:41:40 +00008915 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00008916
Tim Northover2a0783d2014-05-30 14:14:07 +00008917 case llvm::Triple::xcore:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008918 return new XCoreTargetInfo(Triple, Opts);
Tim Northover2a0783d2014-05-30 14:14:07 +00008919
8920 case llvm::Triple::hexagon:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008921 return new HexagonTargetInfo(Triple, Opts);
Tim Northover2a0783d2014-05-30 14:14:07 +00008922
Jacques Pienaard964cc22016-03-28 21:02:54 +00008923 case llvm::Triple::lanai:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008924 return new LanaiTargetInfo(Triple, Opts);
Jacques Pienaard964cc22016-03-28 21:02:54 +00008925
Tim Northover2a0783d2014-05-30 14:14:07 +00008926 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00008927 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008928 return new DarwinAArch64TargetInfo(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00008929
8930 switch (os) {
Ed Schoutenea9448e2015-10-15 15:07:07 +00008931 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008932 return new CloudABITargetInfo<AArch64leTargetInfo>(Triple, Opts);
Ed Maste6a9eda52014-11-13 16:55:42 +00008933 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008934 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Petr Hosek9834fcd2016-10-24 22:55:57 +00008935 case llvm::Triple::Fuchsia:
8936 return new FuchsiaTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00008937 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008938 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple, Opts);
James Molloy5e73df52014-04-16 15:06:20 +00008939 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008940 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00008941 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008942 return new AArch64leTargetInfo(Triple, Opts);
James Molloy5e73df52014-04-16 15:06:20 +00008943 }
8944
Christian Pirker9b019ae2014-02-25 13:51:00 +00008945 case llvm::Triple::aarch64_be:
8946 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00008947 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008948 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Petr Hosek9834fcd2016-10-24 22:55:57 +00008949 case llvm::Triple::Fuchsia:
8950 return new FuchsiaTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00008951 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008952 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00008953 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008954 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00008955 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008956 return new AArch64beTargetInfo(Triple, Opts);
Tim Northover9bb857a2013-01-31 12:13:10 +00008957 }
8958
Daniel Dunbar52322032009-08-18 05:47:58 +00008959 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00008960 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00008961 if (Triple.isOSBinFormatMachO())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008962 return new DarwinARMTargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008963
Daniel Dunbar52322032009-08-18 05:47:58 +00008964 switch (os) {
Ed Schoutenc6d1a732016-09-05 18:38:34 +00008965 case llvm::Triple::CloudABI:
8966 return new CloudABITargetInfo<ARMleTargetInfo>(Triple, Opts);
Rafael Espindolaad8fed52010-06-10 00:46:51 +00008967 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008968 return new LinuxTargetInfo<ARMleTargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008969 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008970 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008971 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008972 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008973 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008974 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00008975 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008976 return new BitrigTargetInfo<ARMleTargetInfo>(Triple, Opts);
Douglas Gregor9fabd852011-07-01 22:41:14 +00008977 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008978 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00008979 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008980 return new NaClTargetInfo<ARMleTargetInfo>(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008981 case llvm::Triple::Win32:
8982 switch (Triple.getEnvironment()) {
Yaron Keren321249c2015-07-15 13:32:23 +00008983 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008984 return new CygwinARMTargetInfo(Triple, Opts);
Yaron Keren321249c2015-07-15 13:32:23 +00008985 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008986 return new MinGWARMTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008987 case llvm::Triple::Itanium:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008988 return new ItaniumWindowsARMleTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008989 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008990 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008991 return new MicrosoftARMleTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008992 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008993 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008994 return new ARMleTargetInfo(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008995 }
8996
8997 case llvm::Triple::armeb:
8998 case llvm::Triple::thumbeb:
8999 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009000 return new DarwinARMTargetInfo(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009001
9002 switch (os) {
9003 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009004 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009005 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009006 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009007 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009008 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009009 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009010 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009011 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009012 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009013 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009014 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009015 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009016 return new NaClTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009017 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009018 return new ARMbeTargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009019 }
Eli Friedmanb5366062008-05-20 14:21:01 +00009020
Dylan McKay924fa3a2017-01-05 05:20:27 +00009021 case llvm::Triple::avr:
9022 return new AVRTargetInfo(Triple, Opts);
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00009023 case llvm::Triple::bpfeb:
9024 case llvm::Triple::bpfel:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009025 return new BPFTargetInfo(Triple, Opts);
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00009026
Daniel Dunbar52322032009-08-18 05:47:58 +00009027 case llvm::Triple::msp430:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009028 return new MSP430TargetInfo(Triple, Opts);
Eli Friedmanb5366062008-05-20 14:21:01 +00009029
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00009030 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009031 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009032 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00009033 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009034 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00009035 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009036 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009037 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009038 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009039 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009040 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00009041 return new MipsTargetInfo(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009042 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00009043
9044 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009045 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009046 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00009047 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009048 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00009049 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009050 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009051 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009052 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009053 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00009054 case llvm::Triple::NaCl:
Daniel Sanders4672af62016-05-27 11:51:02 +00009055 return new NaClTargetInfo<NaClMips32TargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009056 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00009057 return new MipsTargetInfo(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009058 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00009059
Akira Hatanakabef17452011-09-20 19:21:49 +00009060 case llvm::Triple::mips64:
9061 switch (os) {
9062 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00009063 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009064 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00009065 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009066 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009067 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009068 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009069 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00009070 case llvm::Triple::OpenBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009071 return new OpenBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009072 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00009073 return new MipsTargetInfo(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009074 }
9075
9076 case llvm::Triple::mips64el:
9077 switch (os) {
9078 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00009079 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009080 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00009081 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009082 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009083 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009084 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009085 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00009086 case llvm::Triple::OpenBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009087 return new OpenBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009088 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00009089 return new MipsTargetInfo(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009090 }
9091
Ivan Krasindd7403e2011-08-24 20:22:22 +00009092 case llvm::Triple::le32:
9093 switch (os) {
Douglas Katzman78d7c542015-05-12 21:18:10 +00009094 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009095 return new NaClTargetInfo<PNaClTargetInfo>(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00009096 default:
9097 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00009098 }
9099
JF Bastien643817d2014-09-12 17:52:47 +00009100 case llvm::Triple::le64:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009101 return new Le64TargetInfo(Triple, Opts);
JF Bastien643817d2014-09-12 17:52:47 +00009102
Daniel Dunbar52322032009-08-18 05:47:58 +00009103 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00009104 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009105 return new DarwinPPC32TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009106 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00009107 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009108 return new LinuxTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009109 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009110 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009111 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009112 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00009113 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009114 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009115 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009116 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009117 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009118 return new PPC32TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009119 }
Daniel Dunbar52322032009-08-18 05:47:58 +00009120
9121 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00009122 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009123 return new DarwinPPC64TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009124 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00009125 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009126 return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009127 case llvm::Triple::Lv2:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009128 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009129 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009130 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009131 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009132 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009133 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009134 return new PPC64TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009135 }
Daniel Dunbar52322032009-08-18 05:47:58 +00009136
Bill Schmidt778d3872013-07-26 01:36:11 +00009137 case llvm::Triple::ppc64le:
9138 switch (os) {
9139 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009140 return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger22a2d992015-04-10 20:53:48 +00009141 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009142 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Bill Schmidt778d3872013-07-26 01:36:11 +00009143 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009144 return new PPC64TargetInfo(Triple, Opts);
Bill Schmidt778d3872013-07-26 01:36:11 +00009145 }
9146
Peter Collingbournec947aae2012-05-20 23:28:41 +00009147 case llvm::Triple::nvptx:
Justin Lebarb6626592017-01-05 16:53:21 +00009148 return new NVPTXTargetInfo(Triple, Opts, /*TargetPointerWidth=*/32);
Peter Collingbournec947aae2012-05-20 23:28:41 +00009149 case llvm::Triple::nvptx64:
Justin Lebarb6626592017-01-05 16:53:21 +00009150 return new NVPTXTargetInfo(Triple, Opts, /*TargetPointerWidth=*/64);
Peter Collingbournec947aae2012-05-20 23:28:41 +00009151
Tom Stellardd8e38a32015-01-06 20:34:47 +00009152 case llvm::Triple::amdgcn:
Eli Friedmand13b41e2012-10-12 23:32:00 +00009153 case llvm::Triple::r600:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009154 return new AMDGPUTargetInfo(Triple, Opts);
Eli Friedmand13b41e2012-10-12 23:32:00 +00009155
Daniel Dunbar52322032009-08-18 05:47:58 +00009156 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009157 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00009158 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009159 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009160 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009161 return new SolarisTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009162 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009163 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00009164 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009165 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009166 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009167 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009168 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009169 return new SparcV8TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009170 }
Daniel Dunbar52322032009-08-18 05:47:58 +00009171
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009172 // The 'sparcel' architecture copies all the above cases except for Solaris.
9173 case llvm::Triple::sparcel:
9174 switch (os) {
9175 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009176 return new LinuxTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009177 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009178 return new NetBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009179 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009180 return new OpenBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009181 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009182 return new RTEMSTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009183 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009184 return new SparcV8elTargetInfo(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009185 }
9186
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009187 case llvm::Triple::sparcv9:
9188 switch (os) {
9189 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009190 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009191 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009192 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009193 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009194 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009195 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009196 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009197 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009198 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009199 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009200 return new SparcV9TargetInfo(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009201 }
9202
Ulrich Weigand47445072013-05-06 16:26:41 +00009203 case llvm::Triple::systemz:
9204 switch (os) {
9205 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009206 return new LinuxTargetInfo<SystemZTargetInfo>(Triple, Opts);
Ulrich Weigand47445072013-05-06 16:26:41 +00009207 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009208 return new SystemZTargetInfo(Triple, Opts);
Ulrich Weigand47445072013-05-06 16:26:41 +00009209 }
9210
Eli Friedmana9c3d712009-08-19 20:47:07 +00009211 case llvm::Triple::tce:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009212 return new TCETargetInfo(Triple, Opts);
Eli Friedmana9c3d712009-08-19 20:47:07 +00009213
Pekka Jaaskelainen67354482016-11-16 15:22:31 +00009214 case llvm::Triple::tcele:
9215 return new TCELETargetInfo(Triple, Opts);
9216
Daniel Dunbar52322032009-08-18 05:47:58 +00009217 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00009218 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009219 return new DarwinI386TargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00009220
Daniel Dunbar52322032009-08-18 05:47:58 +00009221 switch (os) {
Ed Schouten7893e682015-06-13 21:33:49 +00009222 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009223 return new CloudABITargetInfo<X86_32TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009224 case llvm::Triple::Linux: {
9225 switch (Triple.getEnvironment()) {
9226 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009227 return new LinuxTargetInfo<X86_32TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009228 case llvm::Triple::Android:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009229 return new AndroidX86_32TargetInfo(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009230 }
9231 }
Daniel Dunbar52322032009-08-18 05:47:58 +00009232 case llvm::Triple::DragonFly:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009233 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009234 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009235 return new NetBSDI386TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009236 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009237 return new OpenBSDI386TargetInfo(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00009238 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009239 return new BitrigI386TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009240 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009241 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00009242 case llvm::Triple::KFreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009243 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009244 case llvm::Triple::Minix:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009245 return new MinixTargetInfo<X86_32TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009246 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009247 return new SolarisTargetInfo<X86_32TargetInfo>(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009248 case llvm::Triple::Win32: {
9249 switch (Triple.getEnvironment()) {
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009250 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009251 return new CygwinX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009252 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009253 return new MinGWX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00009254 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009255 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00009256 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009257 return new MicrosoftX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009258 }
9259 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00009260 case llvm::Triple::Haiku:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009261 return new HaikuX86_32TargetInfo(Triple, Opts);
Douglas Gregor9fabd852011-07-01 22:41:14 +00009262 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009263 return new RTEMSX86_32TargetInfo(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00009264 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009265 return new NaClTargetInfo<X86_32TargetInfo>(Triple, Opts);
Alexey Bataevc99b0492015-11-25 09:24:26 +00009266 case llvm::Triple::ELFIAMCU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009267 return new MCUX86_32TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009268 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009269 return new X86_32TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009270 }
9271
9272 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009273 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009274 return new DarwinX86_64TargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00009275
Daniel Dunbar52322032009-08-18 05:47:58 +00009276 switch (os) {
Ed Schoutenf33c6072015-03-11 08:42:46 +00009277 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009278 return new CloudABITargetInfo<X86_64TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009279 case llvm::Triple::Linux: {
9280 switch (Triple.getEnvironment()) {
9281 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009282 return new LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009283 case llvm::Triple::Android:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009284 return new AndroidX86_64TargetInfo(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009285 }
9286 }
Chris Lattner002ba6b2010-01-09 05:41:14 +00009287 case llvm::Triple::DragonFly:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009288 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009289 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009290 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009291 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009292 return new OpenBSDX86_64TargetInfo(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00009293 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009294 return new BitrigX86_64TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009295 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009296 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Petr Hosek9834fcd2016-10-24 22:55:57 +00009297 case llvm::Triple::Fuchsia:
9298 return new FuchsiaTargetInfo<X86_64TargetInfo>(Triple, Opts);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00009299 case llvm::Triple::KFreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009300 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009301 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009302 return new SolarisTargetInfo<X86_64TargetInfo>(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009303 case llvm::Triple::Win32: {
9304 switch (Triple.getEnvironment()) {
Yaron Kerend030d112015-07-22 17:38:19 +00009305 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009306 return new CygwinX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009307 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009308 return new MinGWX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009309 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00009310 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009311 return new MicrosoftX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009312 }
9313 }
Reid Kleckner330fb172016-05-11 16:19:05 +00009314 case llvm::Triple::Haiku:
9315 return new HaikuTargetInfo<X86_64TargetInfo>(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00009316 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009317 return new NaClTargetInfo<X86_64TargetInfo>(Triple, Opts);
Alex Rosenberg12207fa2015-01-27 14:47:44 +00009318 case llvm::Triple::PS4:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009319 return new PS4OSTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009320 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009321 return new X86_64TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009322 }
Guy Benyeib798fc92012-12-11 21:38:14 +00009323
Douglas Katzman78d7c542015-05-12 21:18:10 +00009324 case llvm::Triple::spir: {
9325 if (Triple.getOS() != llvm::Triple::UnknownOS ||
9326 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
9327 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009328 return new SPIR32TargetInfo(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00009329 }
9330 case llvm::Triple::spir64: {
9331 if (Triple.getOS() != llvm::Triple::UnknownOS ||
9332 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
9333 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009334 return new SPIR64TargetInfo(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00009335 }
Dan Gohmanc2853072015-09-03 22:51:53 +00009336 case llvm::Triple::wasm32:
Dan Gohman839f2152017-01-17 21:46:38 +00009337 if (Triple.getSubArch() != llvm::Triple::NoSubArch ||
9338 Triple.getVendor() != llvm::Triple::UnknownVendor ||
9339 Triple.getOS() != llvm::Triple::UnknownOS ||
9340 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment ||
9341 !(Triple.isOSBinFormatELF() || Triple.isOSBinFormatWasm()))
Dan Gohmanc2853072015-09-03 22:51:53 +00009342 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009343 return new WebAssemblyOSTargetInfo<WebAssembly32TargetInfo>(Triple, Opts);
Dan Gohmanc2853072015-09-03 22:51:53 +00009344 case llvm::Triple::wasm64:
Dan Gohman839f2152017-01-17 21:46:38 +00009345 if (Triple.getSubArch() != llvm::Triple::NoSubArch ||
9346 Triple.getVendor() != llvm::Triple::UnknownVendor ||
9347 Triple.getOS() != llvm::Triple::UnknownOS ||
9348 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment ||
9349 !(Triple.isOSBinFormatELF() || Triple.isOSBinFormatWasm()))
Dan Gohmanc2853072015-09-03 22:51:53 +00009350 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009351 return new WebAssemblyOSTargetInfo<WebAssembly64TargetInfo>(Triple, Opts);
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00009352
9353 case llvm::Triple::renderscript32:
9354 return new LinuxTargetInfo<RenderScript32TargetInfo>(Triple, Opts);
9355 case llvm::Triple::renderscript64:
9356 return new LinuxTargetInfo<RenderScript64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009357 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00009358}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009359
9360/// CreateTargetInfo - Return the target info object for the specified target
Eric Christophere4f73b32015-08-07 19:07:08 +00009361/// options.
Alp Toker80758082014-07-06 05:26:44 +00009362TargetInfo *
9363TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
Saleem Abdulrasool10a49722016-04-08 16:52:00 +00009364 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00009365 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009366
9367 // Construct the target
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009368 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple, *Opts));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009369 if (!Target) {
9370 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00009371 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009372 }
Alp Toker80758082014-07-06 05:26:44 +00009373 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009374
Daniel Dunbaracde99e2009-12-18 18:42:37 +00009375 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00009376 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
9377 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00009378 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00009379 }
9380
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009381 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00009382 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
9383 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00009384 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009385 }
9386
Rafael Espindolaeb265472013-08-21 21:59:03 +00009387 // Set the fp math unit.
9388 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
9389 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00009390 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00009391 }
9392
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009393 // Compute the default target features, we need the target to handle this
9394 // because features may have dependencies on one another.
9395 llvm::StringMap<bool> Features;
Eric Christopher007b0a02015-08-28 22:32:01 +00009396 if (!Target->initFeatureMap(Features, Diags, Opts->CPU,
9397 Opts->FeaturesAsWritten))
Eric Christopher6b454372015-08-25 13:45:24 +00009398 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009399
9400 // Add the features to the compile options.
Douglas Gregorf8715de2012-11-16 04:24:59 +00009401 Opts->Features.clear();
Aaron Ballmanb226d3d2015-08-12 13:38:59 +00009402 for (const auto &F : Features)
9403 Opts->Features.push_back((F.getValue() ? "+" : "-") + F.getKey().str());
9404
Eric Christopher3ff21b32013-10-16 21:26:26 +00009405 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00009406 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009407
Yaxun Liu39cf40f2016-05-16 17:06:34 +00009408 Target->setSupportedOpenCLOpts();
Alexey Bader0ea07532016-11-01 15:50:52 +00009409 Target->setOpenCLExtensionOpts();
Yaxun Liu39cf40f2016-05-16 17:06:34 +00009410
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00009411 if (!Target->validateTarget(Diags))
9412 return nullptr;
9413
Ahmed Charles9a16beb2014-03-07 19:33:25 +00009414 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009415}