blob: a359ec2088cf420e639d4882797d38452d49482a [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 Christopher4855ba82017-02-10 03:32:34 +00001676 std::string Layout;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001677
Eric Christopher4855ba82017-02-10 03:32:34 +00001678 // PPC64LE is little endian.
1679 if (Triple.getArch() == llvm::Triple::ppc64le)
1680 Layout = "e";
1681 else
1682 Layout = "E";
1683
1684 Layout += llvm::DataLayout::getManglingComponent(Triple);
1685
1686 Layout += "-i64:64";
1687
1688 // 128 bit integers are always aligned to 128 bits, but only 64-bit matters,
1689 // because __int128 is only supoprted on 64-bit targets.
1690 // FIXME: See if this is valid on other 64-bit ppc oses.
1691 if (Triple.isOSLinux())
1692 Layout += "-i128:128";
1693
1694 Layout += "-n32:64";
1695
1696 resetDataLayout(Layout);
1697
1698 // PPC64LE started a new ABI.
1699 if (Triple.getArch() == llvm::Triple::ppc64le)
1700 ABI = "elfv2";
1701 else
1702 ABI = "elfv1";
1703
1704 switch (Triple.getOS()) {
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001705 case llvm::Triple::FreeBSD:
Roman Divacky3ffe7462012-03-13 19:20:17 +00001706 LongDoubleWidth = LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00001707 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001708 break;
Joerg Sonnenbergeraac82c42014-10-15 19:52:03 +00001709 case llvm::Triple::NetBSD:
1710 IntMaxType = SignedLongLong;
1711 Int64Type = SignedLongLong;
1712 break;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001713 default:
1714 break;
Ulrich Weigand8afad612014-07-28 13:17:52 +00001715 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001716
1717 // PPC64 supports atomics up to 8 bytes.
1718 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001719 }
Craig Topper3164f332014-03-11 03:39:26 +00001720 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001721 return TargetInfo::CharPtrBuiltinVaList;
Roman Divacky965b0b72011-01-06 08:27:10 +00001722 }
Eric Christophere6b7cf42015-07-10 18:25:52 +00001723 // PPC64 Linux-specific ABI options.
Ulrich Weigand8afad612014-07-28 13:17:52 +00001724 bool setABI(const std::string &Name) override {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001725 if (Name == "elfv1" || Name == "elfv1-qpx" || Name == "elfv2") {
Ulrich Weigand8afad612014-07-28 13:17:52 +00001726 ABI = Name;
1727 return true;
1728 }
1729 return false;
1730 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001731};
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001732
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001733class DarwinPPC32TargetInfo : public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001734public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001735 DarwinPPC32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1736 : DarwinTargetInfo<PPC32TargetInfo>(Triple, Opts) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001737 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +00001738 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Eric Christopher917e9522014-11-18 22:36:15 +00001739 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev68d773c2012-01-17 22:40:00 +00001740 LongLongAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001741 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00001742 resetDataLayout("E-m:o-p:32:32-f64:32:64-n32");
Roman Divacky965b0b72011-01-06 08:27:10 +00001743 }
Craig Topper3164f332014-03-11 03:39:26 +00001744 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001745 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001746 }
1747};
1748
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001749class DarwinPPC64TargetInfo : public DarwinTargetInfo<PPC64TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001750public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001751 DarwinPPC64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1752 : DarwinTargetInfo<PPC64TargetInfo>(Triple, Opts) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001753 HasAlignMac68kSupport = true;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001754 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00001755 resetDataLayout("E-m:o-i64:64-n32:64");
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001756 }
1757};
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001758
Eric Christopherc48497a2015-09-18 21:26:24 +00001759static const unsigned NVPTXAddrSpaceMap[] = {
1760 1, // opencl_global
1761 3, // opencl_local
1762 4, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00001763 // FIXME: generic has to be added to the target
Eric Christopherc48497a2015-09-18 21:26:24 +00001764 0, // opencl_generic
1765 1, // cuda_device
1766 4, // cuda_constant
1767 3, // cuda_shared
1768};
1769
1770class NVPTXTargetInfo : public TargetInfo {
1771 static const char *const GCCRegNames[];
1772 static const Builtin::Info BuiltinInfo[];
Justin Lebar62907612016-07-06 21:21:39 +00001773 CudaArch GPU;
Justin Lebarb6626592017-01-05 16:53:21 +00001774 std::unique_ptr<TargetInfo> HostTarget;
Reid Klecknerbbc01782014-12-03 21:53:36 +00001775
Eric Christopherc48497a2015-09-18 21:26:24 +00001776public:
Justin Lebarb6626592017-01-05 16:53:21 +00001777 NVPTXTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts,
1778 unsigned TargetPointerWidth)
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001779 : TargetInfo(Triple) {
Justin Lebarb6626592017-01-05 16:53:21 +00001780 assert((TargetPointerWidth == 32 || TargetPointerWidth == 64) &&
1781 "NVPTX only supports 32- and 64-bit modes.");
1782
Eric Christopherc48497a2015-09-18 21:26:24 +00001783 TLSSupported = false;
Eric Christopherc48497a2015-09-18 21:26:24 +00001784 AddrSpaceMap = &NVPTXAddrSpaceMap;
1785 UseAddrSpaceMapMangling = true;
Justin Lebarb6626592017-01-05 16:53:21 +00001786
Eric Christopherc48497a2015-09-18 21:26:24 +00001787 // Define available target features
1788 // These must be defined in sorted order!
1789 NoAsmVariants = true;
Justin Lebar62907612016-07-06 21:21:39 +00001790 GPU = CudaArch::SM_20;
Justin Lebar76945b22016-04-29 23:05:19 +00001791
Justin Lebarb6626592017-01-05 16:53:21 +00001792 if (TargetPointerWidth == 32)
1793 resetDataLayout("e-p:32:32-i64:64-v16:16-v32:32-n16:32:64");
1794 else
1795 resetDataLayout("e-i64:64-v16:16-v32:32-n16:32:64");
1796
Justin Lebar76945b22016-04-29 23:05:19 +00001797 // If possible, get a TargetInfo for our host triple, so we can match its
1798 // types.
1799 llvm::Triple HostTriple(Opts.HostTriple);
Justin Lebarb6626592017-01-05 16:53:21 +00001800 if (!HostTriple.isNVPTX())
1801 HostTarget.reset(AllocateTarget(llvm::Triple(Opts.HostTriple), Opts));
1802
1803 // If no host target, make some guesses about the data layout and return.
Justin Lebar76945b22016-04-29 23:05:19 +00001804 if (!HostTarget) {
Justin Lebarb6626592017-01-05 16:53:21 +00001805 LongWidth = LongAlign = TargetPointerWidth;
1806 PointerWidth = PointerAlign = TargetPointerWidth;
1807 switch (TargetPointerWidth) {
1808 case 32:
1809 SizeType = TargetInfo::UnsignedInt;
1810 PtrDiffType = TargetInfo::SignedInt;
1811 IntPtrType = TargetInfo::SignedInt;
1812 break;
1813 case 64:
1814 SizeType = TargetInfo::UnsignedLong;
1815 PtrDiffType = TargetInfo::SignedLong;
1816 IntPtrType = TargetInfo::SignedLong;
1817 break;
1818 default:
1819 llvm_unreachable("TargetPointerWidth must be 32 or 64");
1820 }
Justin Lebar76945b22016-04-29 23:05:19 +00001821 return;
1822 }
1823
Justin Lebarb6626592017-01-05 16:53:21 +00001824 // Copy properties from host target.
Justin Lebar76945b22016-04-29 23:05:19 +00001825 PointerWidth = HostTarget->getPointerWidth(/* AddrSpace = */ 0);
1826 PointerAlign = HostTarget->getPointerAlign(/* AddrSpace = */ 0);
1827 BoolWidth = HostTarget->getBoolWidth();
1828 BoolAlign = HostTarget->getBoolAlign();
1829 IntWidth = HostTarget->getIntWidth();
1830 IntAlign = HostTarget->getIntAlign();
1831 HalfWidth = HostTarget->getHalfWidth();
1832 HalfAlign = HostTarget->getHalfAlign();
1833 FloatWidth = HostTarget->getFloatWidth();
1834 FloatAlign = HostTarget->getFloatAlign();
1835 DoubleWidth = HostTarget->getDoubleWidth();
1836 DoubleAlign = HostTarget->getDoubleAlign();
1837 LongWidth = HostTarget->getLongWidth();
1838 LongAlign = HostTarget->getLongAlign();
1839 LongLongWidth = HostTarget->getLongLongWidth();
1840 LongLongAlign = HostTarget->getLongLongAlign();
1841 MinGlobalAlign = HostTarget->getMinGlobalAlign();
Richard Smith59139022016-09-30 22:41:36 +00001842 NewAlign = HostTarget->getNewAlign();
Justin Lebar76945b22016-04-29 23:05:19 +00001843 DefaultAlignForAttributeAligned =
1844 HostTarget->getDefaultAlignForAttributeAligned();
1845 SizeType = HostTarget->getSizeType();
1846 IntMaxType = HostTarget->getIntMaxType();
1847 PtrDiffType = HostTarget->getPtrDiffType(/* AddrSpace = */ 0);
1848 IntPtrType = HostTarget->getIntPtrType();
1849 WCharType = HostTarget->getWCharType();
1850 WIntType = HostTarget->getWIntType();
1851 Char16Type = HostTarget->getChar16Type();
1852 Char32Type = HostTarget->getChar32Type();
1853 Int64Type = HostTarget->getInt64Type();
1854 SigAtomicType = HostTarget->getSigAtomicType();
1855 ProcessIDType = HostTarget->getProcessIDType();
1856
1857 UseBitFieldTypeAlignment = HostTarget->useBitFieldTypeAlignment();
1858 UseZeroLengthBitfieldAlignment =
1859 HostTarget->useZeroLengthBitfieldAlignment();
1860 UseExplicitBitFieldAlignment = HostTarget->useExplicitBitFieldAlignment();
1861 ZeroLengthBitfieldBoundary = HostTarget->getZeroLengthBitfieldBoundary();
1862
Justin Lebar5057f172016-09-09 20:35:43 +00001863 // This is a bit of a lie, but it controls __GCC_ATOMIC_XXX_LOCK_FREE, and
1864 // we need those macros to be identical on host and device, because (among
1865 // other things) they affect which standard library classes are defined, and
1866 // we need all classes to be defined on both the host and device.
1867 MaxAtomicInlineWidth = HostTarget->getMaxAtomicInlineWidth();
1868
Justin Lebar76945b22016-04-29 23:05:19 +00001869 // Properties intentionally not copied from host:
1870 // - LargeArrayMinWidth, LargeArrayAlign: Not visible across the
1871 // host/device boundary.
1872 // - SuitableAlign: Not visible across the host/device boundary, and may
1873 // correctly be different on host/device, e.g. if host has wider vector
1874 // types than device.
1875 // - LongDoubleWidth, LongDoubleAlign: nvptx's long double type is the same
1876 // as its double type, but that's not necessarily true on the host.
1877 // TODO: nvcc emits a warning when using long double on device; we should
1878 // do the same.
Eric Christopherc48497a2015-09-18 21:26:24 +00001879 }
1880 void getTargetDefines(const LangOptions &Opts,
1881 MacroBuilder &Builder) const override {
1882 Builder.defineMacro("__PTX__");
1883 Builder.defineMacro("__NVPTX__");
1884 if (Opts.CUDAIsDevice) {
1885 // Set __CUDA_ARCH__ for the GPU specified.
Justin Lebaref1aaac2016-07-06 21:21:14 +00001886 std::string CUDAArchCode = [this] {
1887 switch (GPU) {
Simon Pilgrim13dff572016-07-07 22:32:26 +00001888 case CudaArch::UNKNOWN:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001889 assert(false && "No GPU arch when compiling CUDA device code.");
1890 return "";
Justin Lebar62907612016-07-06 21:21:39 +00001891 case CudaArch::SM_20:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001892 return "200";
Justin Lebar62907612016-07-06 21:21:39 +00001893 case CudaArch::SM_21:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001894 return "210";
Justin Lebar62907612016-07-06 21:21:39 +00001895 case CudaArch::SM_30:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001896 return "300";
Justin Lebar62907612016-07-06 21:21:39 +00001897 case CudaArch::SM_32:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001898 return "320";
Justin Lebar62907612016-07-06 21:21:39 +00001899 case CudaArch::SM_35:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001900 return "350";
Justin Lebar62907612016-07-06 21:21:39 +00001901 case CudaArch::SM_37:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001902 return "370";
Justin Lebar62907612016-07-06 21:21:39 +00001903 case CudaArch::SM_50:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001904 return "500";
Justin Lebar62907612016-07-06 21:21:39 +00001905 case CudaArch::SM_52:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001906 return "520";
Justin Lebar62907612016-07-06 21:21:39 +00001907 case CudaArch::SM_53:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001908 return "530";
Justin Lebar62907612016-07-06 21:21:39 +00001909 case CudaArch::SM_60:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001910 return "600";
Justin Lebar62907612016-07-06 21:21:39 +00001911 case CudaArch::SM_61:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001912 return "610";
Justin Lebar62907612016-07-06 21:21:39 +00001913 case CudaArch::SM_62:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001914 return "620";
1915 }
Simon Pilgrim13dff572016-07-07 22:32:26 +00001916 llvm_unreachable("unhandled CudaArch");
Justin Lebaref1aaac2016-07-06 21:21:14 +00001917 }();
Eric Christopherc48497a2015-09-18 21:26:24 +00001918 Builder.defineMacro("__CUDA_ARCH__", CUDAArchCode);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001919 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001920 }
Craig Topper6c03a542015-10-19 04:51:35 +00001921 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
1922 return llvm::makeArrayRef(BuiltinInfo,
1923 clang::NVPTX::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eric Christopherc48497a2015-09-18 21:26:24 +00001924 }
Artem Belevichfda99052016-09-28 17:47:35 +00001925 bool
1926 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
1927 StringRef CPU,
1928 const std::vector<std::string> &FeaturesVec) const override {
1929 Features["satom"] = GPU >= CudaArch::SM_60;
1930 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
1931 }
1932
Eric Christopherc48497a2015-09-18 21:26:24 +00001933 bool hasFeature(StringRef Feature) const override {
Artem Belevichfda99052016-09-28 17:47:35 +00001934 return llvm::StringSwitch<bool>(Feature)
1935 .Cases("ptx", "nvptx", true)
1936 .Case("satom", GPU >= CudaArch::SM_60) // Atomics w/ scope.
1937 .Default(false);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001938 }
1939
Craig Topperf054e3a2015-10-19 03:52:27 +00001940 ArrayRef<const char *> getGCCRegNames() const override;
1941 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00001942 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00001943 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00001944 }
1945 bool validateAsmConstraint(const char *&Name,
1946 TargetInfo::ConstraintInfo &Info) const override {
1947 switch (*Name) {
1948 default:
1949 return false;
1950 case 'c':
1951 case 'h':
1952 case 'r':
1953 case 'l':
1954 case 'f':
1955 case 'd':
1956 Info.setAllowsRegister();
1957 return true;
Eli Bendersky13467172015-04-01 20:29:18 +00001958 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001959 }
1960 const char *getClobbers() const override {
1961 // FIXME: Is this really right?
1962 return "";
1963 }
1964 BuiltinVaListKind getBuiltinVaListKind() const override {
1965 // FIXME: implement
1966 return TargetInfo::CharPtrBuiltinVaList;
1967 }
1968 bool setCPU(const std::string &Name) override {
Justin Lebar62907612016-07-06 21:21:39 +00001969 GPU = StringToCudaArch(Name);
1970 return GPU != CudaArch::UNKNOWN;
Eric Christopherc48497a2015-09-18 21:26:24 +00001971 }
Jan Vesely9674bd42016-06-17 19:02:14 +00001972 void setSupportedOpenCLOpts() override {
1973 auto &Opts = getSupportedOpenCLOpts();
Yaxun Liu5b746652016-12-18 05:18:55 +00001974 Opts.support("cl_clang_storage_class_specifiers");
1975 Opts.support("cl_khr_gl_sharing");
1976 Opts.support("cl_khr_icd");
Jan Vesely9674bd42016-06-17 19:02:14 +00001977
Yaxun Liu5b746652016-12-18 05:18:55 +00001978 Opts.support("cl_khr_fp64");
1979 Opts.support("cl_khr_byte_addressable_store");
1980 Opts.support("cl_khr_global_int32_base_atomics");
1981 Opts.support("cl_khr_global_int32_extended_atomics");
1982 Opts.support("cl_khr_local_int32_base_atomics");
1983 Opts.support("cl_khr_local_int32_extended_atomics");
Jan Vesely9674bd42016-06-17 19:02:14 +00001984 }
Justin Lebar86c4e632017-01-05 16:53:38 +00001985
1986 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
1987 // CUDA compilations support all of the host's calling conventions.
1988 //
1989 // TODO: We should warn if you apply a non-default CC to anything other than
1990 // a host function.
1991 if (HostTarget)
1992 return HostTarget->checkCallingConvention(CC);
1993 return CCCR_Warning;
1994 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001995};
1996
1997const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1998#define BUILTIN(ID, TYPE, ATTRS) \
1999 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
2000#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
2001 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Artem Belevichfda99052016-09-28 17:47:35 +00002002#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
2003 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Eric Christopherc48497a2015-09-18 21:26:24 +00002004#include "clang/Basic/BuiltinsNVPTX.def"
2005};
2006
2007const char *const NVPTXTargetInfo::GCCRegNames[] = {"r0"};
2008
Craig Topperf054e3a2015-10-19 03:52:27 +00002009ArrayRef<const char *> NVPTXTargetInfo::getGCCRegNames() const {
2010 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00002011}
2012
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002013static const unsigned AMDGPUAddrSpaceMap[] = {
Eli Friedmand13b41e2012-10-12 23:32:00 +00002014 1, // opencl_global
2015 3, // opencl_local
2016 2, // opencl_constant
Matt Arsenaultbfe25b22014-12-01 16:46:03 +00002017 4, // opencl_generic
Eli Friedmand13b41e2012-10-12 23:32:00 +00002018 1, // cuda_device
2019 2, // cuda_constant
2020 3 // cuda_shared
2021};
2022
Tom Stellarda96344b2014-08-21 13:58:40 +00002023// If you edit the description strings, make sure you update
2024// getPointerWidthV().
2025
Craig Topper273dbc62015-10-18 05:29:26 +00002026static const char *const DataLayoutStringR600 =
Rafael Espindola29db13a2014-01-03 18:13:17 +00002027 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
2028 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00002029
Craig Topper273dbc62015-10-18 05:29:26 +00002030static const char *const DataLayoutStringSI =
Matt Arsenault6dc455f2016-05-31 16:58:18 +00002031 "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 +00002032 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
2033 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00002034
Matt Arsenault250024f2016-06-08 01:56:42 +00002035class AMDGPUTargetInfo final : public TargetInfo {
Matt Arsenault56f008d2014-06-24 20:45:01 +00002036 static const Builtin::Info BuiltinInfo[];
Tom Stellard7b1059b2015-04-14 14:36:56 +00002037 static const char * const GCCRegNames[];
Matt Arsenault56f008d2014-06-24 20:45:01 +00002038
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002039 /// \brief The GPU profiles supported by the AMDGPU target.
Tom Stellardc74b1e02013-03-04 17:40:53 +00002040 enum GPUKind {
2041 GK_NONE,
2042 GK_R600,
2043 GK_R600_DOUBLE_OPS,
2044 GK_R700,
2045 GK_R700_DOUBLE_OPS,
2046 GK_EVERGREEN,
2047 GK_EVERGREEN_DOUBLE_OPS,
2048 GK_NORTHERN_ISLANDS,
2049 GK_CAYMAN,
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002050 GK_GFX6,
2051 GK_GFX7,
2052 GK_GFX8
Tom Stellardc74b1e02013-03-04 17:40:53 +00002053 } GPU;
2054
Jan Veselyeebeaea2015-05-04 19:53:36 +00002055 bool hasFP64:1;
2056 bool hasFMAF:1;
2057 bool hasLDEXPF:1;
Yaxun Liud3e85b92016-09-13 17:37:09 +00002058 bool hasFullSpeedFP32Denorms:1;
Jan Veselya3abd6d2015-05-01 17:38:13 +00002059
Matt Arsenault250024f2016-06-08 01:56:42 +00002060 static bool isAMDGCN(const llvm::Triple &TT) {
2061 return TT.getArch() == llvm::Triple::amdgcn;
2062 }
2063
Eli Friedmand13b41e2012-10-12 23:32:00 +00002064public:
Yaxun Liu2c17e822016-08-09 19:43:38 +00002065 AMDGPUTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Matt Arsenault250024f2016-06-08 01:56:42 +00002066 : TargetInfo(Triple) ,
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002067 GPU(isAMDGCN(Triple) ? GK_GFX6 : GK_R600),
Matt Arsenault250024f2016-06-08 01:56:42 +00002068 hasFP64(false),
2069 hasFMAF(false),
Yaxun Liu2c17e822016-08-09 19:43:38 +00002070 hasLDEXPF(false),
Yaxun Liud3e85b92016-09-13 17:37:09 +00002071 hasFullSpeedFP32Denorms(false){
Matt Arsenault250024f2016-06-08 01:56:42 +00002072 if (getTriple().getArch() == llvm::Triple::amdgcn) {
Jan Veselya3abd6d2015-05-01 17:38:13 +00002073 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00002074 hasFMAF = true;
2075 hasLDEXPF = true;
Tom Stellardd99fb952015-01-28 15:38:44 +00002076 }
Matt Arsenault250024f2016-06-08 01:56:42 +00002077
2078 resetDataLayout(getTriple().getArch() == llvm::Triple::amdgcn ?
2079 DataLayoutStringSI : DataLayoutStringR600);
2080
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002081 AddrSpaceMap = &AMDGPUAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00002082 UseAddrSpaceMapMangling = true;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002083 }
2084
Tom Stellarda96344b2014-08-21 13:58:40 +00002085 uint64_t getPointerWidthV(unsigned AddrSpace) const override {
2086 if (GPU <= GK_CAYMAN)
2087 return 32;
2088
2089 switch(AddrSpace) {
2090 default:
2091 return 64;
2092 case 0:
2093 case 3:
2094 case 5:
2095 return 32;
2096 }
2097 }
2098
Yaxun Liu26f75662016-08-19 05:17:25 +00002099 uint64_t getMaxPointerWidth() const override {
2100 return getTriple().getArch() == llvm::Triple::amdgcn ? 64 : 32;
2101 }
2102
Craig Topper3164f332014-03-11 03:39:26 +00002103 const char * getClobbers() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00002104 return "";
2105 }
2106
Craig Topperf054e3a2015-10-19 03:52:27 +00002107 ArrayRef<const char *> getGCCRegNames() const override;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002108
Craig Topperf054e3a2015-10-19 03:52:27 +00002109 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
2110 return None;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002111 }
2112
Craig Topper3164f332014-03-11 03:39:26 +00002113 bool validateAsmConstraint(const char *&Name,
Tom Stellardd097e942015-11-19 22:11:58 +00002114 TargetInfo::ConstraintInfo &Info) const override {
2115 switch (*Name) {
2116 default: break;
2117 case 'v': // vgpr
2118 case 's': // sgpr
2119 Info.setAllowsRegister();
2120 return true;
2121 }
2122 return false;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002123 }
2124
Matt Arsenault250024f2016-06-08 01:56:42 +00002125 bool initFeatureMap(llvm::StringMap<bool> &Features,
2126 DiagnosticsEngine &Diags, StringRef CPU,
2127 const std::vector<std::string> &FeatureVec) const override;
2128
Yaxun Liu2c17e822016-08-09 19:43:38 +00002129 void adjustTargetOptions(const CodeGenOptions &CGOpts,
2130 TargetOptions &TargetOpts) const override {
Yaxun Liu2c17e822016-08-09 19:43:38 +00002131 bool hasFP32Denormals = false;
2132 bool hasFP64Denormals = false;
2133 for (auto &I : TargetOpts.FeaturesAsWritten) {
2134 if (I == "+fp32-denormals" || I == "-fp32-denormals")
2135 hasFP32Denormals = true;
Matt Arsenault09cca092017-01-23 22:31:14 +00002136 if (I == "+fp64-fp16-denormals" || I == "-fp64-fp16-denormals")
Yaxun Liu2c17e822016-08-09 19:43:38 +00002137 hasFP64Denormals = true;
2138 }
2139 if (!hasFP32Denormals)
Yaxun Liud3e85b92016-09-13 17:37:09 +00002140 TargetOpts.Features.push_back((Twine(hasFullSpeedFP32Denorms &&
2141 !CGOpts.FlushDenorm ? '+' : '-') + Twine("fp32-denormals")).str());
Matt Arsenault09cca092017-01-23 22:31:14 +00002142 // Always do not flush fp64 or fp16 denorms.
Yaxun Liu2c17e822016-08-09 19:43:38 +00002143 if (!hasFP64Denormals && hasFP64)
Matt Arsenault09cca092017-01-23 22:31:14 +00002144 TargetOpts.Features.push_back("+fp64-fp16-denormals");
Yaxun Liu2c17e822016-08-09 19:43:38 +00002145 }
2146
Craig Topper6c03a542015-10-19 04:51:35 +00002147 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
2148 return llvm::makeArrayRef(BuiltinInfo,
2149 clang::AMDGPU::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eli Friedmand13b41e2012-10-12 23:32:00 +00002150 }
2151
Craig Topper3164f332014-03-11 03:39:26 +00002152 void getTargetDefines(const LangOptions &Opts,
2153 MacroBuilder &Builder) const override {
Matt Arsenault5e020b22016-02-27 09:06:26 +00002154 if (getTriple().getArch() == llvm::Triple::amdgcn)
2155 Builder.defineMacro("__AMDGCN__");
2156 else
2157 Builder.defineMacro("__R600__");
2158
Jan Veselyeebeaea2015-05-04 19:53:36 +00002159 if (hasFMAF)
2160 Builder.defineMacro("__HAS_FMAF__");
2161 if (hasLDEXPF)
2162 Builder.defineMacro("__HAS_LDEXPF__");
Jan Vesely211ba782016-06-17 02:25:03 +00002163 if (hasFP64)
2164 Builder.defineMacro("__HAS_FP64__");
Eli Friedmand13b41e2012-10-12 23:32:00 +00002165 }
2166
Craig Topper3164f332014-03-11 03:39:26 +00002167 BuiltinVaListKind getBuiltinVaListKind() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00002168 return TargetInfo::CharPtrBuiltinVaList;
2169 }
2170
Matt Arsenault250024f2016-06-08 01:56:42 +00002171 static GPUKind parseR600Name(StringRef Name) {
2172 return llvm::StringSwitch<GPUKind>(Name)
Tom Stellardc74b1e02013-03-04 17:40:53 +00002173 .Case("r600" , GK_R600)
2174 .Case("rv610", GK_R600)
2175 .Case("rv620", GK_R600)
2176 .Case("rv630", GK_R600)
2177 .Case("rv635", GK_R600)
2178 .Case("rs780", GK_R600)
2179 .Case("rs880", GK_R600)
2180 .Case("rv670", GK_R600_DOUBLE_OPS)
2181 .Case("rv710", GK_R700)
2182 .Case("rv730", GK_R700)
2183 .Case("rv740", GK_R700_DOUBLE_OPS)
2184 .Case("rv770", GK_R700_DOUBLE_OPS)
2185 .Case("palm", GK_EVERGREEN)
2186 .Case("cedar", GK_EVERGREEN)
2187 .Case("sumo", GK_EVERGREEN)
2188 .Case("sumo2", GK_EVERGREEN)
2189 .Case("redwood", GK_EVERGREEN)
2190 .Case("juniper", GK_EVERGREEN)
2191 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
2192 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
2193 .Case("barts", GK_NORTHERN_ISLANDS)
2194 .Case("turks", GK_NORTHERN_ISLANDS)
2195 .Case("caicos", GK_NORTHERN_ISLANDS)
2196 .Case("cayman", GK_CAYMAN)
2197 .Case("aruba", GK_CAYMAN)
Matt Arsenault250024f2016-06-08 01:56:42 +00002198 .Default(GK_NONE);
2199 }
2200
2201 static GPUKind parseAMDGCNName(StringRef Name) {
2202 return llvm::StringSwitch<GPUKind>(Name)
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002203 .Case("tahiti", GK_GFX6)
2204 .Case("pitcairn", GK_GFX6)
2205 .Case("verde", GK_GFX6)
2206 .Case("oland", GK_GFX6)
2207 .Case("hainan", GK_GFX6)
2208 .Case("bonaire", GK_GFX7)
2209 .Case("kabini", GK_GFX7)
2210 .Case("kaveri", GK_GFX7)
2211 .Case("hawaii", GK_GFX7)
2212 .Case("mullins", GK_GFX7)
Yaxun Liue59a0bc2016-10-26 16:40:21 +00002213 .Case("gfx700", GK_GFX7)
2214 .Case("gfx701", GK_GFX7)
2215 .Case("gfx702", GK_GFX7)
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002216 .Case("tonga", GK_GFX8)
2217 .Case("iceland", GK_GFX8)
2218 .Case("carrizo", GK_GFX8)
2219 .Case("fiji", GK_GFX8)
2220 .Case("stoney", GK_GFX8)
2221 .Case("polaris10", GK_GFX8)
2222 .Case("polaris11", GK_GFX8)
Yaxun Liue59a0bc2016-10-26 16:40:21 +00002223 .Case("gfx800", GK_GFX8)
2224 .Case("gfx801", GK_GFX8)
2225 .Case("gfx802", GK_GFX8)
2226 .Case("gfx803", GK_GFX8)
2227 .Case("gfx804", GK_GFX8)
2228 .Case("gfx810", GK_GFX8)
Tom Stellardc74b1e02013-03-04 17:40:53 +00002229 .Default(GK_NONE);
Matt Arsenault250024f2016-06-08 01:56:42 +00002230 }
Tom Stellardc74b1e02013-03-04 17:40:53 +00002231
Matt Arsenault250024f2016-06-08 01:56:42 +00002232 bool setCPU(const std::string &Name) override {
2233 if (getTriple().getArch() == llvm::Triple::amdgcn)
2234 GPU = parseAMDGCNName(Name);
2235 else
2236 GPU = parseR600Name(Name);
Tom Stellardc74b1e02013-03-04 17:40:53 +00002237
Matt Arsenault250024f2016-06-08 01:56:42 +00002238 return GPU != GK_NONE;
Tom Stellardc74b1e02013-03-04 17:40:53 +00002239 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002240
Jan Vesely211ba782016-06-17 02:25:03 +00002241 void setSupportedOpenCLOpts() override {
2242 auto &Opts = getSupportedOpenCLOpts();
Yaxun Liu5b746652016-12-18 05:18:55 +00002243 Opts.support("cl_clang_storage_class_specifiers");
2244 Opts.support("cl_khr_icd");
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002245
Jan Vesely211ba782016-06-17 02:25:03 +00002246 if (hasFP64)
Yaxun Liu5b746652016-12-18 05:18:55 +00002247 Opts.support("cl_khr_fp64");
Jan Vesely211ba782016-06-17 02:25:03 +00002248 if (GPU >= GK_EVERGREEN) {
Yaxun Liu5b746652016-12-18 05:18:55 +00002249 Opts.support("cl_khr_byte_addressable_store");
2250 Opts.support("cl_khr_global_int32_base_atomics");
2251 Opts.support("cl_khr_global_int32_extended_atomics");
2252 Opts.support("cl_khr_local_int32_base_atomics");
2253 Opts.support("cl_khr_local_int32_extended_atomics");
Jan Vesely211ba782016-06-17 02:25:03 +00002254 }
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002255 if (GPU >= GK_GFX6) {
Yaxun Liu5b746652016-12-18 05:18:55 +00002256 Opts.support("cl_khr_fp16");
2257 Opts.support("cl_khr_int64_base_atomics");
2258 Opts.support("cl_khr_int64_extended_atomics");
2259 Opts.support("cl_khr_mipmap_image");
2260 Opts.support("cl_khr_subgroups");
2261 Opts.support("cl_khr_3d_image_writes");
2262 Opts.support("cl_amd_media_ops");
2263 Opts.support("cl_amd_media_ops2");
Jan Vesely211ba782016-06-17 02:25:03 +00002264 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002265 }
Nikolay Haustov8c6538b2016-06-30 09:06:33 +00002266
Yaxun Liu99444cb2016-08-03 20:38:06 +00002267 LangAS::ID getOpenCLImageAddrSpace() const override {
2268 return LangAS::opencl_constant;
2269 }
2270
Nikolay Haustov8c6538b2016-06-30 09:06:33 +00002271 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
2272 switch (CC) {
2273 default:
2274 return CCCR_Warning;
2275 case CC_C:
2276 case CC_OpenCLKernel:
2277 return CCCR_OK;
2278 }
2279 }
Yaxun Liu402804b2016-12-15 08:09:08 +00002280
2281 // In amdgcn target the null pointer in global, constant, and generic
2282 // address space has value 0 but in private and local address space has
2283 // value ~0.
2284 uint64_t getNullPointerValue(unsigned AS) const override {
2285 return AS != LangAS::opencl_local && AS != 0 ? 0 : ~0;
2286 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00002287};
2288
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002289const Builtin::Info AMDGPUTargetInfo::BuiltinInfo[] = {
Matt Arsenault56f008d2014-06-24 20:45:01 +00002290#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00002291 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Matt Arsenault250024f2016-06-08 01:56:42 +00002292#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
2293 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002294#include "clang/Basic/BuiltinsAMDGPU.def"
Matt Arsenault56f008d2014-06-24 20:45:01 +00002295};
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002296const char * const AMDGPUTargetInfo::GCCRegNames[] = {
Tom Stellard7b1059b2015-04-14 14:36:56 +00002297 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
2298 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
2299 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
2300 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
2301 "v32", "v33", "v34", "v35", "v36", "v37", "v38", "v39",
2302 "v40", "v41", "v42", "v43", "v44", "v45", "v46", "v47",
2303 "v48", "v49", "v50", "v51", "v52", "v53", "v54", "v55",
2304 "v56", "v57", "v58", "v59", "v60", "v61", "v62", "v63",
2305 "v64", "v65", "v66", "v67", "v68", "v69", "v70", "v71",
2306 "v72", "v73", "v74", "v75", "v76", "v77", "v78", "v79",
2307 "v80", "v81", "v82", "v83", "v84", "v85", "v86", "v87",
2308 "v88", "v89", "v90", "v91", "v92", "v93", "v94", "v95",
2309 "v96", "v97", "v98", "v99", "v100", "v101", "v102", "v103",
2310 "v104", "v105", "v106", "v107", "v108", "v109", "v110", "v111",
2311 "v112", "v113", "v114", "v115", "v116", "v117", "v118", "v119",
2312 "v120", "v121", "v122", "v123", "v124", "v125", "v126", "v127",
2313 "v128", "v129", "v130", "v131", "v132", "v133", "v134", "v135",
2314 "v136", "v137", "v138", "v139", "v140", "v141", "v142", "v143",
2315 "v144", "v145", "v146", "v147", "v148", "v149", "v150", "v151",
2316 "v152", "v153", "v154", "v155", "v156", "v157", "v158", "v159",
2317 "v160", "v161", "v162", "v163", "v164", "v165", "v166", "v167",
2318 "v168", "v169", "v170", "v171", "v172", "v173", "v174", "v175",
2319 "v176", "v177", "v178", "v179", "v180", "v181", "v182", "v183",
2320 "v184", "v185", "v186", "v187", "v188", "v189", "v190", "v191",
2321 "v192", "v193", "v194", "v195", "v196", "v197", "v198", "v199",
2322 "v200", "v201", "v202", "v203", "v204", "v205", "v206", "v207",
2323 "v208", "v209", "v210", "v211", "v212", "v213", "v214", "v215",
2324 "v216", "v217", "v218", "v219", "v220", "v221", "v222", "v223",
2325 "v224", "v225", "v226", "v227", "v228", "v229", "v230", "v231",
2326 "v232", "v233", "v234", "v235", "v236", "v237", "v238", "v239",
2327 "v240", "v241", "v242", "v243", "v244", "v245", "v246", "v247",
2328 "v248", "v249", "v250", "v251", "v252", "v253", "v254", "v255",
2329 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
2330 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
2331 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
2332 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
2333 "s32", "s33", "s34", "s35", "s36", "s37", "s38", "s39",
2334 "s40", "s41", "s42", "s43", "s44", "s45", "s46", "s47",
2335 "s48", "s49", "s50", "s51", "s52", "s53", "s54", "s55",
2336 "s56", "s57", "s58", "s59", "s60", "s61", "s62", "s63",
2337 "s64", "s65", "s66", "s67", "s68", "s69", "s70", "s71",
2338 "s72", "s73", "s74", "s75", "s76", "s77", "s78", "s79",
2339 "s80", "s81", "s82", "s83", "s84", "s85", "s86", "s87",
2340 "s88", "s89", "s90", "s91", "s92", "s93", "s94", "s95",
2341 "s96", "s97", "s98", "s99", "s100", "s101", "s102", "s103",
2342 "s104", "s105", "s106", "s107", "s108", "s109", "s110", "s111",
2343 "s112", "s113", "s114", "s115", "s116", "s117", "s118", "s119",
Etienne Bergerone8ae26f2016-03-24 18:29:24 +00002344 "s120", "s121", "s122", "s123", "s124", "s125", "s126", "s127",
Matt Arsenaultb015d622016-02-27 09:06:22 +00002345 "exec", "vcc", "scc", "m0", "flat_scratch", "exec_lo", "exec_hi",
2346 "vcc_lo", "vcc_hi", "flat_scratch_lo", "flat_scratch_hi"
Tom Stellard7b1059b2015-04-14 14:36:56 +00002347};
2348
Craig Topperf054e3a2015-10-19 03:52:27 +00002349ArrayRef<const char *> AMDGPUTargetInfo::getGCCRegNames() const {
2350 return llvm::makeArrayRef(GCCRegNames);
Tom Stellard7b1059b2015-04-14 14:36:56 +00002351}
Matt Arsenault56f008d2014-06-24 20:45:01 +00002352
Matt Arsenault250024f2016-06-08 01:56:42 +00002353bool AMDGPUTargetInfo::initFeatureMap(
2354 llvm::StringMap<bool> &Features,
2355 DiagnosticsEngine &Diags, StringRef CPU,
2356 const std::vector<std::string> &FeatureVec) const {
2357
2358 // XXX - What does the member GPU mean if device name string passed here?
2359 if (getTriple().getArch() == llvm::Triple::amdgcn) {
2360 if (CPU.empty())
2361 CPU = "tahiti";
2362
2363 switch (parseAMDGCNName(CPU)) {
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002364 case GK_GFX6:
2365 case GK_GFX7:
Matt Arsenault250024f2016-06-08 01:56:42 +00002366 break;
2367
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002368 case GK_GFX8:
Matt Arsenault250024f2016-06-08 01:56:42 +00002369 Features["s-memrealtime"] = true;
2370 Features["16-bit-insts"] = true;
2371 break;
2372
2373 case GK_NONE:
2374 return false;
2375 default:
2376 llvm_unreachable("unhandled subtarget");
2377 }
2378 } else {
2379 if (CPU.empty())
2380 CPU = "r600";
2381
2382 switch (parseR600Name(CPU)) {
2383 case GK_R600:
2384 case GK_R700:
2385 case GK_EVERGREEN:
2386 case GK_NORTHERN_ISLANDS:
2387 break;
2388 case GK_R600_DOUBLE_OPS:
2389 case GK_R700_DOUBLE_OPS:
2390 case GK_EVERGREEN_DOUBLE_OPS:
2391 case GK_CAYMAN:
2392 Features["fp64"] = true;
2393 break;
2394 case GK_NONE:
2395 return false;
2396 default:
2397 llvm_unreachable("unhandled subtarget");
2398 }
2399 }
2400
2401 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeatureVec);
2402}
2403
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00002404const Builtin::Info BuiltinInfoX86[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00002405#define BUILTIN(ID, TYPE, ATTRS) \
2406 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002407#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
Craig Topper07d3b622015-08-07 05:14:44 +00002408 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Albert Gutowski727ab8a2016-09-14 21:19:43 +00002409#define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANGS, FEATURE) \
2410 { #ID, TYPE, ATTRS, HEADER, LANGS, FEATURE },
Chris Lattner5abdec72009-06-14 01:05:48 +00002411#include "clang/Basic/BuiltinsX86.def"
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00002412
2413#define BUILTIN(ID, TYPE, ATTRS) \
2414 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Albert Gutowski0fd6e962016-10-12 17:28:44 +00002415#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
2416 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00002417#define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANGS, FEATURE) \
2418 { #ID, TYPE, ATTRS, HEADER, LANGS, FEATURE },
2419#include "clang/Basic/BuiltinsX86_64.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00002420};
Eli Friedmanb5366062008-05-20 14:21:01 +00002421
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00002422
Nuno Lopescfca1f02009-12-23 17:49:57 +00002423static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002424 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
2425 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00002426 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002427 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
2428 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
2429 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00002430 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00002431 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
2432 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Marina Yatsina41c45fa2016-02-03 11:32:08 +00002433 "xmm16", "xmm17", "xmm18", "xmm19", "xmm20", "xmm21", "xmm22", "xmm23",
2434 "xmm24", "xmm25", "xmm26", "xmm27", "xmm28", "xmm29", "xmm30", "xmm31",
2435 "ymm16", "ymm17", "ymm18", "ymm19", "ymm20", "ymm21", "ymm22", "ymm23",
2436 "ymm24", "ymm25", "ymm26", "ymm27", "ymm28", "ymm29", "ymm30", "ymm31",
2437 "zmm0", "zmm1", "zmm2", "zmm3", "zmm4", "zmm5", "zmm6", "zmm7",
2438 "zmm8", "zmm9", "zmm10", "zmm11", "zmm12", "zmm13", "zmm14", "zmm15",
2439 "zmm16", "zmm17", "zmm18", "zmm19", "zmm20", "zmm21", "zmm22", "zmm23",
2440 "zmm24", "zmm25", "zmm26", "zmm27", "zmm28", "zmm29", "zmm30", "zmm31",
Michael Zuckerman15604b92016-10-31 14:16:57 +00002441 "k0", "k1", "k2", "k3", "k4", "k5", "k6", "k7",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002442};
2443
Eric Christophercdd36352011-06-21 00:05:20 +00002444const TargetInfo::AddlRegName AddlRegNames[] = {
2445 { { "al", "ah", "eax", "rax" }, 0 },
2446 { { "bl", "bh", "ebx", "rbx" }, 3 },
2447 { { "cl", "ch", "ecx", "rcx" }, 2 },
2448 { { "dl", "dh", "edx", "rdx" }, 1 },
2449 { { "esi", "rsi" }, 4 },
2450 { { "edi", "rdi" }, 5 },
2451 { { "esp", "rsp" }, 7 },
2452 { { "ebp", "rbp" }, 6 },
Alexey Bataeva7ab1b42015-09-04 03:42:23 +00002453 { { "r8d", "r8w", "r8b" }, 38 },
2454 { { "r9d", "r9w", "r9b" }, 39 },
2455 { { "r10d", "r10w", "r10b" }, 40 },
2456 { { "r11d", "r11w", "r11b" }, 41 },
2457 { { "r12d", "r12w", "r12b" }, 42 },
2458 { { "r13d", "r13w", "r13b" }, 43 },
2459 { { "r14d", "r14w", "r14b" }, 44 },
2460 { { "r15d", "r15w", "r15b" }, 45 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00002461};
2462
2463// X86 target abstract base class; x86-32 and x86-64 are very close, so
2464// most of the implementation can be shared.
2465class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00002466 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002467 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Craig Topper543f3bd2015-10-14 23:47:57 +00002468 } SSELevel = NoSSE;
Eli Friedman33465822011-07-08 23:31:17 +00002469 enum MMX3DNowEnum {
2470 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
Craig Topper543f3bd2015-10-14 23:47:57 +00002471 } MMX3DNowLevel = NoMMX3DNow;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002472 enum XOPEnum {
2473 NoXOP,
2474 SSE4A,
2475 FMA4,
2476 XOP
Craig Topper543f3bd2015-10-14 23:47:57 +00002477 } XOPLevel = NoXOP;
Anders Carlssone437c682010-01-27 03:47:49 +00002478
Craig Topper543f3bd2015-10-14 23:47:57 +00002479 bool HasAES = false;
2480 bool HasPCLMUL = false;
2481 bool HasLZCNT = false;
2482 bool HasRDRND = false;
2483 bool HasFSGSBASE = false;
2484 bool HasBMI = false;
2485 bool HasBMI2 = false;
2486 bool HasPOPCNT = false;
2487 bool HasRTM = false;
2488 bool HasPRFCHW = false;
2489 bool HasRDSEED = false;
2490 bool HasADX = false;
2491 bool HasTBM = false;
2492 bool HasFMA = false;
2493 bool HasF16C = false;
2494 bool HasAVX512CD = false;
2495 bool HasAVX512ER = false;
2496 bool HasAVX512PF = false;
2497 bool HasAVX512DQ = false;
2498 bool HasAVX512BW = false;
2499 bool HasAVX512VL = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002500 bool HasAVX512VBMI = false;
2501 bool HasAVX512IFMA = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002502 bool HasSHA = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002503 bool HasMPX = false;
2504 bool HasSGX = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002505 bool HasCX16 = false;
Craig Toppere33f51f2015-10-16 06:22:36 +00002506 bool HasFXSR = false;
Craig Topperda9fe562015-10-15 05:23:38 +00002507 bool HasXSAVE = false;
2508 bool HasXSAVEOPT = false;
2509 bool HasXSAVEC = false;
2510 bool HasXSAVES = false;
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00002511 bool HasMWAITX = false;
Craig Topper45742262017-02-09 06:10:14 +00002512 bool HasCLZERO = false;
Asaf Badouha9d1e182015-12-31 14:14:07 +00002513 bool HasPKU = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002514 bool HasCLFLUSHOPT = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002515 bool HasCLWB = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002516 bool HasMOVBE = false;
2517 bool HasPREFETCHWT1 = false;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00002518
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002519 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
2520 ///
2521 /// Each enumeration represents a particular CPU supported by Clang. These
2522 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
2523 enum CPUKind {
2524 CK_Generic,
2525
2526 /// \name i386
2527 /// i386-generation processors.
2528 //@{
2529 CK_i386,
2530 //@}
2531
2532 /// \name i486
2533 /// i486-generation processors.
2534 //@{
2535 CK_i486,
2536 CK_WinChipC6,
2537 CK_WinChip2,
2538 CK_C3,
2539 //@}
2540
2541 /// \name i586
2542 /// i586-generation processors, P5 microarchitecture based.
2543 //@{
2544 CK_i586,
2545 CK_Pentium,
2546 CK_PentiumMMX,
2547 //@}
2548
2549 /// \name i686
2550 /// i686-generation processors, P6 / Pentium M microarchitecture based.
2551 //@{
2552 CK_i686,
2553 CK_PentiumPro,
2554 CK_Pentium2,
2555 CK_Pentium3,
2556 CK_Pentium3M,
2557 CK_PentiumM,
2558 CK_C3_2,
2559
2560 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
2561 /// Clang however has some logic to suport this.
2562 // FIXME: Warn, deprecate, and potentially remove this.
2563 CK_Yonah,
2564 //@}
2565
2566 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00002567 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002568 //@{
2569 CK_Pentium4,
2570 CK_Pentium4M,
2571 CK_Prescott,
2572 CK_Nocona,
2573 //@}
2574
2575 /// \name Core
2576 /// Core microarchitecture based processors.
2577 //@{
2578 CK_Core2,
2579
2580 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
2581 /// codename which GCC no longer accepts as an option to -march, but Clang
2582 /// has some logic for recognizing it.
2583 // FIXME: Warn, deprecate, and potentially remove this.
2584 CK_Penryn,
2585 //@}
2586
2587 /// \name Atom
2588 /// Atom processors
2589 //@{
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002590 CK_Bonnell,
Preston Gurda3c58c02013-09-13 19:27:17 +00002591 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002592 //@}
2593
2594 /// \name Nehalem
2595 /// Nehalem microarchitecture based processors.
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002596 CK_Nehalem,
2597
2598 /// \name Westmere
2599 /// Westmere microarchitecture based processors.
2600 CK_Westmere,
2601
2602 /// \name Sandy Bridge
2603 /// Sandy Bridge microarchitecture based processors.
2604 CK_SandyBridge,
2605
2606 /// \name Ivy Bridge
2607 /// Ivy Bridge microarchitecture based processors.
2608 CK_IvyBridge,
2609
2610 /// \name Haswell
2611 /// Haswell microarchitecture based processors.
2612 CK_Haswell,
2613
2614 /// \name Broadwell
2615 /// Broadwell microarchitecture based processors.
Robert Khasanov50e6f582014-09-19 09:53:48 +00002616 CK_Broadwell,
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002617
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002618 /// \name Skylake Client
2619 /// Skylake client microarchitecture based processors.
2620 CK_SkylakeClient,
2621
2622 /// \name Skylake Server
2623 /// Skylake server microarchitecture based processors.
2624 CK_SkylakeServer,
2625
2626 /// \name Cannonlake Client
2627 /// Cannonlake client microarchitecture based processors.
2628 CK_Cannonlake,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002629
Craig Topper449314e2013-08-20 07:09:39 +00002630 /// \name Knights Landing
2631 /// Knights Landing processor.
2632 CK_KNL,
2633
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002634 /// \name Lakemont
2635 /// Lakemont microarchitecture based processors.
2636 CK_Lakemont,
2637
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002638 /// \name K6
2639 /// K6 architecture processors.
2640 //@{
2641 CK_K6,
2642 CK_K6_2,
2643 CK_K6_3,
2644 //@}
2645
2646 /// \name K7
2647 /// K7 architecture processors.
2648 //@{
2649 CK_Athlon,
2650 CK_AthlonThunderbird,
2651 CK_Athlon4,
2652 CK_AthlonXP,
2653 CK_AthlonMP,
2654 //@}
2655
2656 /// \name K8
2657 /// K8 architecture processors.
2658 //@{
2659 CK_Athlon64,
2660 CK_Athlon64SSE3,
2661 CK_AthlonFX,
2662 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00002663 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002664 CK_Opteron,
2665 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00002666 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002667 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002668
Benjamin Kramer569f2152012-01-10 11:50:18 +00002669 /// \name Bobcat
2670 /// Bobcat architecture processors.
2671 //@{
2672 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002673 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002674 //@}
2675
2676 /// \name Bulldozer
2677 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002678 //@{
2679 CK_BDVER1,
2680 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002681 CK_BDVER3,
Benjamin Kramer56c58222014-05-02 15:47:51 +00002682 CK_BDVER4,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002683 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002684
Craig Topperc45744a2017-01-10 06:02:12 +00002685 /// \name zen
2686 /// Zen architecture processors.
2687 //@{
2688 CK_ZNVER1,
2689 //@}
2690
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002691 /// This specification is deprecated and will be removed in the future.
2692 /// Users should prefer \see CK_K8.
2693 // FIXME: Warn on this when the CPU is set to it.
Saleem Abdulrasoolcb29c1a2014-11-17 18:40:15 +00002694 //@{
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002695 CK_x86_64,
2696 //@}
2697
2698 /// \name Geode
2699 /// Geode processors.
2700 //@{
2701 CK_Geode
2702 //@}
Craig Topper543f3bd2015-10-14 23:47:57 +00002703 } CPU = CK_Generic;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002704
Eric Christopherc50738f2015-08-27 00:05:50 +00002705 CPUKind getCPUKind(StringRef CPU) const {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002706 return llvm::StringSwitch<CPUKind>(CPU)
2707 .Case("i386", CK_i386)
2708 .Case("i486", CK_i486)
2709 .Case("winchip-c6", CK_WinChipC6)
2710 .Case("winchip2", CK_WinChip2)
2711 .Case("c3", CK_C3)
2712 .Case("i586", CK_i586)
2713 .Case("pentium", CK_Pentium)
2714 .Case("pentium-mmx", CK_PentiumMMX)
2715 .Case("i686", CK_i686)
2716 .Case("pentiumpro", CK_PentiumPro)
2717 .Case("pentium2", CK_Pentium2)
2718 .Case("pentium3", CK_Pentium3)
2719 .Case("pentium3m", CK_Pentium3M)
2720 .Case("pentium-m", CK_PentiumM)
2721 .Case("c3-2", CK_C3_2)
2722 .Case("yonah", CK_Yonah)
2723 .Case("pentium4", CK_Pentium4)
2724 .Case("pentium4m", CK_Pentium4M)
2725 .Case("prescott", CK_Prescott)
2726 .Case("nocona", CK_Nocona)
2727 .Case("core2", CK_Core2)
2728 .Case("penryn", CK_Penryn)
2729 .Case("bonnell", CK_Bonnell)
2730 .Case("atom", CK_Bonnell) // Legacy name.
2731 .Case("silvermont", CK_Silvermont)
2732 .Case("slm", CK_Silvermont) // Legacy name.
2733 .Case("nehalem", CK_Nehalem)
2734 .Case("corei7", CK_Nehalem) // Legacy name.
2735 .Case("westmere", CK_Westmere)
2736 .Case("sandybridge", CK_SandyBridge)
2737 .Case("corei7-avx", CK_SandyBridge) // Legacy name.
2738 .Case("ivybridge", CK_IvyBridge)
2739 .Case("core-avx-i", CK_IvyBridge) // Legacy name.
2740 .Case("haswell", CK_Haswell)
2741 .Case("core-avx2", CK_Haswell) // Legacy name.
2742 .Case("broadwell", CK_Broadwell)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002743 .Case("skylake", CK_SkylakeClient)
2744 .Case("skylake-avx512", CK_SkylakeServer)
2745 .Case("skx", CK_SkylakeServer) // Legacy name.
2746 .Case("cannonlake", CK_Cannonlake)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002747 .Case("knl", CK_KNL)
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002748 .Case("lakemont", CK_Lakemont)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002749 .Case("k6", CK_K6)
2750 .Case("k6-2", CK_K6_2)
2751 .Case("k6-3", CK_K6_3)
2752 .Case("athlon", CK_Athlon)
2753 .Case("athlon-tbird", CK_AthlonThunderbird)
2754 .Case("athlon-4", CK_Athlon4)
2755 .Case("athlon-xp", CK_AthlonXP)
2756 .Case("athlon-mp", CK_AthlonMP)
2757 .Case("athlon64", CK_Athlon64)
2758 .Case("athlon64-sse3", CK_Athlon64SSE3)
2759 .Case("athlon-fx", CK_AthlonFX)
2760 .Case("k8", CK_K8)
2761 .Case("k8-sse3", CK_K8SSE3)
2762 .Case("opteron", CK_Opteron)
2763 .Case("opteron-sse3", CK_OpteronSSE3)
2764 .Case("barcelona", CK_AMDFAM10)
2765 .Case("amdfam10", CK_AMDFAM10)
2766 .Case("btver1", CK_BTVER1)
2767 .Case("btver2", CK_BTVER2)
2768 .Case("bdver1", CK_BDVER1)
2769 .Case("bdver2", CK_BDVER2)
2770 .Case("bdver3", CK_BDVER3)
2771 .Case("bdver4", CK_BDVER4)
Craig Topperc45744a2017-01-10 06:02:12 +00002772 .Case("znver1", CK_ZNVER1)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002773 .Case("x86-64", CK_x86_64)
2774 .Case("geode", CK_Geode)
2775 .Default(CK_Generic);
2776 }
2777
Rafael Espindolaeb265472013-08-21 21:59:03 +00002778 enum FPMathKind {
2779 FP_Default,
2780 FP_SSE,
2781 FP_387
Craig Topper543f3bd2015-10-14 23:47:57 +00002782 } FPMath = FP_Default;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002783
Eli Friedman3fd920a2008-08-20 02:34:37 +00002784public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00002785 X86TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
2786 : TargetInfo(Triple) {
Stephan Bergmann17c7f702016-12-14 11:57:17 +00002787 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended();
Chris Lattner1f5ad112006-10-14 18:32:12 +00002788 }
Craig Topper3164f332014-03-11 03:39:26 +00002789 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00002790 // X87 evaluates with 80 bits "long double" precision.
2791 return SSELevel == NoSSE ? 2 : 0;
2792 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002793 ArrayRef<const char *> getGCCRegNames() const override {
2794 return llvm::makeArrayRef(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00002795 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002796 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
2797 return None;
Eric Christophercdd36352011-06-21 00:05:20 +00002798 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002799 ArrayRef<TargetInfo::AddlRegName> getGCCAddlRegNames() const override {
2800 return llvm::makeArrayRef(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00002801 }
Eric Christopherd9832702015-06-29 21:00:05 +00002802 bool validateCpuSupports(StringRef Name) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002803 bool validateAsmConstraint(const char *&Name,
Eric Christopher917e9522014-11-18 22:36:15 +00002804 TargetInfo::ConstraintInfo &info) const override;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002805
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00002806 bool validateGlobalRegisterVariable(StringRef RegName,
2807 unsigned RegSize,
2808 bool &HasSizeMismatch) const override {
2809 // esp and ebp are the only 32-bit registers the x86 backend can currently
2810 // handle.
2811 if (RegName.equals("esp") || RegName.equals("ebp")) {
2812 // Check that the register size is 32-bit.
2813 HasSizeMismatch = RegSize != 32;
2814 return true;
2815 }
2816
2817 return false;
2818 }
2819
Akira Hatanaka974131e2014-09-18 18:17:18 +00002820 bool validateOutputSize(StringRef Constraint, unsigned Size) const override;
2821
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002822 bool validateInputSize(StringRef Constraint, unsigned Size) const override;
2823
Akira Hatanaka974131e2014-09-18 18:17:18 +00002824 virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const;
2825
Craig Topper3164f332014-03-11 03:39:26 +00002826 std::string convertConstraint(const char *&Constraint) const override;
2827 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002828 return "~{dirflag},~{fpsr},~{flags}";
2829 }
Marina Yatsinac42fd032016-12-26 12:23:42 +00002830
2831 StringRef getConstraintRegister(const StringRef &Constraint,
2832 const StringRef &Expression) const override {
2833 StringRef::iterator I, E;
2834 for (I = Constraint.begin(), E = Constraint.end(); I != E; ++I) {
2835 if (isalpha(*I))
2836 break;
2837 }
2838 if (I == E)
2839 return "";
2840 switch (*I) {
2841 // For the register constraints, return the matching register name
2842 case 'a':
2843 return "ax";
2844 case 'b':
2845 return "bx";
2846 case 'c':
2847 return "cx";
2848 case 'd':
2849 return "dx";
2850 case 'S':
2851 return "si";
2852 case 'D':
2853 return "di";
2854 // In case the constraint is 'r' we need to return Expression
2855 case 'r':
2856 return Expression;
2857 default:
2858 // Default value if there is no constraint for the register
2859 return "";
2860 }
2861 return "";
2862 }
2863
Craig Topper3164f332014-03-11 03:39:26 +00002864 void getTargetDefines(const LangOptions &Opts,
2865 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00002866 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
2867 bool Enabled);
2868 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
2869 bool Enabled);
2870 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
2871 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002872 void setFeatureEnabled(llvm::StringMap<bool> &Features,
2873 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00002874 setFeatureEnabledImpl(Features, Name, Enabled);
2875 }
2876 // This exists purely to cut down on the number of virtual calls in
Eric Christopheref1e2952015-08-28 02:13:58 +00002877 // initFeatureMap which calls this repeatedly.
Craig Topper86d79ef2013-09-17 04:51:29 +00002878 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2879 StringRef Name, bool Enabled);
Eric Christopher8c47b422015-10-09 18:39:55 +00002880 bool
2881 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
2882 StringRef CPU,
2883 const std::vector<std::string> &FeaturesVec) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002884 bool hasFeature(StringRef Feature) const override;
2885 bool handleTargetFeatures(std::vector<std::string> &Features,
2886 DiagnosticsEngine &Diags) override;
Alp Toker4925ba72014-06-07 23:30:42 +00002887 StringRef getABI() const override {
Ahmed Bougacha0b938282015-06-22 21:31:43 +00002888 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX512F)
2889 return "avx512";
Craig Topperd945d502015-10-20 00:00:17 +00002890 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002891 return "avx";
Craig Topperd945d502015-10-20 00:00:17 +00002892 if (getTriple().getArch() == llvm::Triple::x86 &&
Derek Schuffc7dd7222012-10-11 15:52:22 +00002893 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002894 return "no-mmx";
2895 return "";
Eli Friedman33465822011-07-08 23:31:17 +00002896 }
Craig Topper3164f332014-03-11 03:39:26 +00002897 bool setCPU(const std::string &Name) override {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002898 CPU = getCPUKind(Name);
Chandler Carruth212334f2011-09-28 08:55:37 +00002899
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002900 // Perform any per-CPU checks necessary to determine if this CPU is
2901 // acceptable.
2902 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
2903 // invalid without explaining *why*.
2904 switch (CPU) {
2905 case CK_Generic:
2906 // No processor selected!
2907 return false;
2908
2909 case CK_i386:
2910 case CK_i486:
2911 case CK_WinChipC6:
2912 case CK_WinChip2:
2913 case CK_C3:
2914 case CK_i586:
2915 case CK_Pentium:
2916 case CK_PentiumMMX:
2917 case CK_i686:
2918 case CK_PentiumPro:
2919 case CK_Pentium2:
2920 case CK_Pentium3:
2921 case CK_Pentium3M:
2922 case CK_PentiumM:
2923 case CK_Yonah:
2924 case CK_C3_2:
2925 case CK_Pentium4:
2926 case CK_Pentium4M:
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002927 case CK_Lakemont:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002928 case CK_Prescott:
2929 case CK_K6:
2930 case CK_K6_2:
2931 case CK_K6_3:
2932 case CK_Athlon:
2933 case CK_AthlonThunderbird:
2934 case CK_Athlon4:
2935 case CK_AthlonXP:
2936 case CK_AthlonMP:
2937 case CK_Geode:
2938 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002939 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002940 return false;
2941
2942 // Fallthrough
2943 case CK_Nocona:
2944 case CK_Core2:
2945 case CK_Penryn:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002946 case CK_Bonnell:
Preston Gurda3c58c02013-09-13 19:27:17 +00002947 case CK_Silvermont:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002948 case CK_Nehalem:
2949 case CK_Westmere:
2950 case CK_SandyBridge:
2951 case CK_IvyBridge:
2952 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002953 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002954 case CK_SkylakeClient:
2955 case CK_SkylakeServer:
2956 case CK_Cannonlake:
Craig Topper449314e2013-08-20 07:09:39 +00002957 case CK_KNL:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002958 case CK_Athlon64:
2959 case CK_Athlon64SSE3:
2960 case CK_AthlonFX:
2961 case CK_K8:
2962 case CK_K8SSE3:
2963 case CK_Opteron:
2964 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00002965 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00002966 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002967 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002968 case CK_BDVER1:
2969 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002970 case CK_BDVER3:
Benjamin Kramer56c58222014-05-02 15:47:51 +00002971 case CK_BDVER4:
Craig Topperc45744a2017-01-10 06:02:12 +00002972 case CK_ZNVER1:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002973 case CK_x86_64:
2974 return true;
2975 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00002976 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002977 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002978
Craig Topper3164f332014-03-11 03:39:26 +00002979 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002980
Craig Topper3164f332014-03-11 03:39:26 +00002981 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00002982 // Most of the non-ARM calling conventions are i386 conventions.
2983 switch (CC) {
2984 case CC_X86ThisCall:
2985 case CC_X86FastCall:
2986 case CC_X86StdCall:
2987 case CC_X86VectorCall:
Erich Keane757d3172016-11-02 18:29:35 +00002988 case CC_X86RegCall:
John McCall477f2bb2016-03-03 06:39:32 +00002989 case CC_C:
2990 case CC_Swift:
2991 case CC_X86Pascal:
2992 case CC_IntelOclBicc:
2993 return CCCR_OK;
2994 default:
2995 return CCCR_Warning;
2996 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002997 }
2998
Craig Topper3164f332014-03-11 03:39:26 +00002999 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00003000 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003001 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00003002
3003 bool hasSjLjLowering() const override {
3004 return true;
3005 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00003006
3007 void setSupportedOpenCLOpts() override {
Yaxun Liu5b746652016-12-18 05:18:55 +00003008 getSupportedOpenCLOpts().supportAll();
Yaxun Liu39cf40f2016-05-16 17:06:34 +00003009 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00003010};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00003011
Rafael Espindolaeb265472013-08-21 21:59:03 +00003012bool X86TargetInfo::setFPMath(StringRef Name) {
3013 if (Name == "387") {
3014 FPMath = FP_387;
3015 return true;
3016 }
3017 if (Name == "sse") {
3018 FPMath = FP_SSE;
3019 return true;
3020 }
3021 return false;
3022}
3023
Eric Christopher007b0a02015-08-28 22:32:01 +00003024bool X86TargetInfo::initFeatureMap(
3025 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
Eric Christopher8c47b422015-10-09 18:39:55 +00003026 const std::vector<std::string> &FeaturesVec) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003027 // FIXME: This *really* should not be here.
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003028 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00003029 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00003030 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003031
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003032 const CPUKind Kind = getCPUKind(CPU);
Andrey Turetskiy5f1cf5f2016-03-23 11:15:10 +00003033
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003034 // Enable X87 for all X86 processors but Lakemont.
3035 if (Kind != CK_Lakemont)
3036 setFeatureEnabledImpl(Features, "x87", true);
3037
3038 switch (Kind) {
Chandler Carruth212334f2011-09-28 08:55:37 +00003039 case CK_Generic:
3040 case CK_i386:
3041 case CK_i486:
3042 case CK_i586:
3043 case CK_Pentium:
3044 case CK_i686:
3045 case CK_PentiumPro:
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003046 case CK_Lakemont:
Chandler Carruth212334f2011-09-28 08:55:37 +00003047 break;
3048 case CK_PentiumMMX:
3049 case CK_Pentium2:
Craig Topperdb4dc082014-11-06 05:52:19 +00003050 case CK_K6:
3051 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00003052 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003053 break;
3054 case CK_Pentium3:
3055 case CK_Pentium3M:
Craig Topperdb4dc082014-11-06 05:52:19 +00003056 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00003057 setFeatureEnabledImpl(Features, "sse", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003058 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003059 break;
3060 case CK_PentiumM:
3061 case CK_Pentium4:
3062 case CK_Pentium4M:
3063 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00003064 setFeatureEnabledImpl(Features, "sse2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003065 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003066 break;
3067 case CK_Yonah:
3068 case CK_Prescott:
3069 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00003070 setFeatureEnabledImpl(Features, "sse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003071 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003072 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003073 break;
3074 case CK_Core2:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003075 case CK_Bonnell:
Craig Topper86d79ef2013-09-17 04:51:29 +00003076 setFeatureEnabledImpl(Features, "ssse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003077 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003078 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003079 break;
3080 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00003081 setFeatureEnabledImpl(Features, "sse4.1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003082 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003083 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003084 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003085 case CK_Cannonlake:
3086 setFeatureEnabledImpl(Features, "avx512ifma", true);
3087 setFeatureEnabledImpl(Features, "avx512vbmi", true);
3088 setFeatureEnabledImpl(Features, "sha", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003089 LLVM_FALLTHROUGH;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003090 case CK_SkylakeServer:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003091 setFeatureEnabledImpl(Features, "avx512f", true);
3092 setFeatureEnabledImpl(Features, "avx512cd", true);
3093 setFeatureEnabledImpl(Features, "avx512dq", true);
3094 setFeatureEnabledImpl(Features, "avx512bw", true);
3095 setFeatureEnabledImpl(Features, "avx512vl", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003096 setFeatureEnabledImpl(Features, "pku", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003097 setFeatureEnabledImpl(Features, "clwb", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003098 LLVM_FALLTHROUGH;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003099 case CK_SkylakeClient:
Craig Topperda9fe562015-10-15 05:23:38 +00003100 setFeatureEnabledImpl(Features, "xsavec", true);
3101 setFeatureEnabledImpl(Features, "xsaves", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003102 setFeatureEnabledImpl(Features, "mpx", true);
3103 setFeatureEnabledImpl(Features, "sgx", true);
3104 setFeatureEnabledImpl(Features, "clflushopt", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003105 LLVM_FALLTHROUGH;
Craig Topperdb4dc082014-11-06 05:52:19 +00003106 case CK_Broadwell:
3107 setFeatureEnabledImpl(Features, "rdseed", true);
3108 setFeatureEnabledImpl(Features, "adx", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003109 LLVM_FALLTHROUGH;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003110 case CK_Haswell:
Craig Topperdb4dc082014-11-06 05:52:19 +00003111 setFeatureEnabledImpl(Features, "avx2", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003112 setFeatureEnabledImpl(Features, "lzcnt", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003113 setFeatureEnabledImpl(Features, "bmi", true);
3114 setFeatureEnabledImpl(Features, "bmi2", true);
3115 setFeatureEnabledImpl(Features, "rtm", true);
3116 setFeatureEnabledImpl(Features, "fma", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003117 setFeatureEnabledImpl(Features, "movbe", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003118 LLVM_FALLTHROUGH;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003119 case CK_IvyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00003120 setFeatureEnabledImpl(Features, "rdrnd", true);
3121 setFeatureEnabledImpl(Features, "f16c", true);
3122 setFeatureEnabledImpl(Features, "fsgsbase", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003123 LLVM_FALLTHROUGH;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003124 case CK_SandyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00003125 setFeatureEnabledImpl(Features, "avx", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003126 setFeatureEnabledImpl(Features, "xsave", true);
3127 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003128 LLVM_FALLTHROUGH;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003129 case CK_Westmere:
Craig Topperdb4dc082014-11-06 05:52:19 +00003130 case CK_Silvermont:
3131 setFeatureEnabledImpl(Features, "aes", true);
3132 setFeatureEnabledImpl(Features, "pclmul", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003133 LLVM_FALLTHROUGH;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003134 case CK_Nehalem:
Craig Topperdb4dc082014-11-06 05:52:19 +00003135 setFeatureEnabledImpl(Features, "sse4.2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003136 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00003137 setFeatureEnabledImpl(Features, "cx16", true);
3138 break;
3139 case CK_KNL:
3140 setFeatureEnabledImpl(Features, "avx512f", true);
3141 setFeatureEnabledImpl(Features, "avx512cd", true);
3142 setFeatureEnabledImpl(Features, "avx512er", true);
3143 setFeatureEnabledImpl(Features, "avx512pf", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003144 setFeatureEnabledImpl(Features, "prefetchwt1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003145 setFeatureEnabledImpl(Features, "fxsr", true);
Robert Khasanov50e6f582014-09-19 09:53:48 +00003146 setFeatureEnabledImpl(Features, "rdseed", true);
3147 setFeatureEnabledImpl(Features, "adx", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00003148 setFeatureEnabledImpl(Features, "lzcnt", true);
3149 setFeatureEnabledImpl(Features, "bmi", true);
3150 setFeatureEnabledImpl(Features, "bmi2", true);
3151 setFeatureEnabledImpl(Features, "rtm", true);
3152 setFeatureEnabledImpl(Features, "fma", true);
3153 setFeatureEnabledImpl(Features, "rdrnd", true);
3154 setFeatureEnabledImpl(Features, "f16c", true);
3155 setFeatureEnabledImpl(Features, "fsgsbase", true);
3156 setFeatureEnabledImpl(Features, "aes", true);
3157 setFeatureEnabledImpl(Features, "pclmul", true);
3158 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003159 setFeatureEnabledImpl(Features, "xsaveopt", true);
3160 setFeatureEnabledImpl(Features, "xsave", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003161 setFeatureEnabledImpl(Features, "movbe", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003162 break;
3163 case CK_K6_2:
3164 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00003165 case CK_WinChip2:
3166 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00003167 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003168 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00003169 case CK_Athlon:
3170 case CK_AthlonThunderbird:
3171 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00003172 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00003173 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003174 case CK_Athlon4:
3175 case CK_AthlonXP:
3176 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00003177 setFeatureEnabledImpl(Features, "sse", true);
3178 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003179 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003180 break;
3181 case CK_K8:
3182 case CK_Opteron:
3183 case CK_Athlon64:
3184 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00003185 setFeatureEnabledImpl(Features, "sse2", true);
3186 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003187 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003188 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00003189 case CK_AMDFAM10:
3190 setFeatureEnabledImpl(Features, "sse4a", true);
3191 setFeatureEnabledImpl(Features, "lzcnt", true);
3192 setFeatureEnabledImpl(Features, "popcnt", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003193 LLVM_FALLTHROUGH;
Chandler Carruth212334f2011-09-28 08:55:37 +00003194 case CK_K8SSE3:
3195 case CK_OpteronSSE3:
3196 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00003197 setFeatureEnabledImpl(Features, "sse3", true);
3198 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003199 setFeatureEnabledImpl(Features, "fxsr", true);
Roman Divackyce253d82011-10-30 13:47:56 +00003200 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00003201 case CK_BTVER2:
3202 setFeatureEnabledImpl(Features, "avx", true);
3203 setFeatureEnabledImpl(Features, "aes", true);
3204 setFeatureEnabledImpl(Features, "pclmul", true);
3205 setFeatureEnabledImpl(Features, "bmi", true);
3206 setFeatureEnabledImpl(Features, "f16c", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003207 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003208 LLVM_FALLTHROUGH;
Benjamin Kramer569f2152012-01-10 11:50:18 +00003209 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00003210 setFeatureEnabledImpl(Features, "ssse3", true);
3211 setFeatureEnabledImpl(Features, "sse4a", true);
3212 setFeatureEnabledImpl(Features, "lzcnt", true);
3213 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00003214 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003215 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003216 setFeatureEnabledImpl(Features, "fxsr", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003217 break;
Craig Topperc45744a2017-01-10 06:02:12 +00003218 case CK_ZNVER1:
3219 setFeatureEnabledImpl(Features, "adx", true);
3220 setFeatureEnabledImpl(Features, "aes", true);
3221 setFeatureEnabledImpl(Features, "avx2", true);
3222 setFeatureEnabledImpl(Features, "bmi", true);
3223 setFeatureEnabledImpl(Features, "bmi2", true);
3224 setFeatureEnabledImpl(Features, "clflushopt", true);
Craig Topper45742262017-02-09 06:10:14 +00003225 setFeatureEnabledImpl(Features, "clzero", true);
Craig Topperc45744a2017-01-10 06:02:12 +00003226 setFeatureEnabledImpl(Features, "cx16", true);
3227 setFeatureEnabledImpl(Features, "f16c", true);
3228 setFeatureEnabledImpl(Features, "fma", true);
3229 setFeatureEnabledImpl(Features, "fsgsbase", true);
3230 setFeatureEnabledImpl(Features, "fxsr", true);
3231 setFeatureEnabledImpl(Features, "lzcnt", true);
3232 setFeatureEnabledImpl(Features, "mwaitx", true);
3233 setFeatureEnabledImpl(Features, "movbe", true);
3234 setFeatureEnabledImpl(Features, "pclmul", true);
3235 setFeatureEnabledImpl(Features, "popcnt", true);
3236 setFeatureEnabledImpl(Features, "prfchw", true);
3237 setFeatureEnabledImpl(Features, "rdrnd", true);
3238 setFeatureEnabledImpl(Features, "rdseed", true);
3239 setFeatureEnabledImpl(Features, "sha", true);
3240 setFeatureEnabledImpl(Features, "sse4a", true);
3241 setFeatureEnabledImpl(Features, "xsave", true);
3242 setFeatureEnabledImpl(Features, "xsavec", true);
3243 setFeatureEnabledImpl(Features, "xsaveopt", true);
3244 setFeatureEnabledImpl(Features, "xsaves", true);
3245 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003246 case CK_BDVER4:
3247 setFeatureEnabledImpl(Features, "avx2", true);
3248 setFeatureEnabledImpl(Features, "bmi2", true);
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003249 setFeatureEnabledImpl(Features, "mwaitx", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003250 LLVM_FALLTHROUGH;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003251 case CK_BDVER3:
Craig Topper8c7f2512014-11-03 06:51:41 +00003252 setFeatureEnabledImpl(Features, "fsgsbase", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003253 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003254 LLVM_FALLTHROUGH;
Craig Topper8c7f2512014-11-03 06:51:41 +00003255 case CK_BDVER2:
Andrea Di Biagio9760a442014-11-06 12:08:57 +00003256 setFeatureEnabledImpl(Features, "bmi", true);
3257 setFeatureEnabledImpl(Features, "fma", true);
3258 setFeatureEnabledImpl(Features, "f16c", true);
3259 setFeatureEnabledImpl(Features, "tbm", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003260 LLVM_FALLTHROUGH;
Andrea Di Biagio9760a442014-11-06 12:08:57 +00003261 case CK_BDVER1:
3262 // xop implies avx, sse4a and fma4.
Craig Topper86d79ef2013-09-17 04:51:29 +00003263 setFeatureEnabledImpl(Features, "xop", true);
3264 setFeatureEnabledImpl(Features, "lzcnt", true);
3265 setFeatureEnabledImpl(Features, "aes", true);
3266 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00003267 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003268 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003269 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003270 setFeatureEnabledImpl(Features, "xsave", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003271 break;
Eli Friedman33465822011-07-08 23:31:17 +00003272 }
Eric Christopherbbd746d2015-10-08 20:10:14 +00003273 if (!TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec))
3274 return false;
3275
3276 // Can't do this earlier because we need to be able to explicitly enable
3277 // or disable these features and the things that they depend upon.
3278
3279 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
3280 auto I = Features.find("sse4.2");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003281 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00003282 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-popcnt") ==
3283 FeaturesVec.end())
3284 Features["popcnt"] = true;
3285
3286 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
3287 I = Features.find("3dnow");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003288 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00003289 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-prfchw") ==
3290 FeaturesVec.end())
3291 Features["prfchw"] = true;
3292
Eric Christophera7260af2015-10-08 20:10:18 +00003293 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
3294 // then enable MMX.
3295 I = Features.find("sse");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003296 if (I != Features.end() && I->getValue() &&
Eric Christophera7260af2015-10-08 20:10:18 +00003297 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-mmx") ==
3298 FeaturesVec.end())
3299 Features["mmx"] = true;
3300
Eric Christopherbbd746d2015-10-08 20:10:14 +00003301 return true;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003302}
3303
Rafael Espindolae62e2792013-08-20 13:44:29 +00003304void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00003305 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003306 if (Enabled) {
3307 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003308 case AVX512F:
3309 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003310 case AVX2:
3311 Features["avx2"] = true;
3312 case AVX:
3313 Features["avx"] = true;
Craig Topperda9fe562015-10-15 05:23:38 +00003314 Features["xsave"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003315 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00003316 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003317 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00003318 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003319 case SSSE3:
3320 Features["ssse3"] = true;
3321 case SSE3:
3322 Features["sse3"] = true;
3323 case SSE2:
3324 Features["sse2"] = true;
3325 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00003326 Features["sse"] = true;
3327 case NoSSE:
3328 break;
3329 }
3330 return;
3331 }
3332
3333 switch (Level) {
3334 case NoSSE:
3335 case SSE1:
3336 Features["sse"] = false;
3337 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00003338 Features["sse2"] = Features["pclmul"] = Features["aes"] =
3339 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003340 case SSE3:
3341 Features["sse3"] = false;
3342 setXOPLevel(Features, NoXOP, false);
3343 case SSSE3:
3344 Features["ssse3"] = false;
3345 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00003346 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003347 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00003348 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003349 case AVX:
Craig Topperda9fe562015-10-15 05:23:38 +00003350 Features["fma"] = Features["avx"] = Features["f16c"] = Features["xsave"] =
3351 Features["xsaveopt"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00003352 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003353 case AVX2:
3354 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00003355 case AVX512F:
Eric Christopher917e9522014-11-18 22:36:15 +00003356 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
Craig Toppera31a5da2014-12-27 06:59:37 +00003357 Features["avx512pf"] = Features["avx512dq"] = Features["avx512bw"] =
Craig Topperb4f83a02016-02-29 06:51:38 +00003358 Features["avx512vl"] = Features["avx512vbmi"] =
3359 Features["avx512ifma"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003360 }
3361}
3362
3363void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00003364 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003365 if (Enabled) {
3366 switch (Level) {
3367 case AMD3DNowAthlon:
3368 Features["3dnowa"] = true;
3369 case AMD3DNow:
3370 Features["3dnow"] = true;
3371 case MMX:
3372 Features["mmx"] = true;
3373 case NoMMX3DNow:
3374 break;
3375 }
3376 return;
3377 }
3378
3379 switch (Level) {
3380 case NoMMX3DNow:
3381 case MMX:
3382 Features["mmx"] = false;
3383 case AMD3DNow:
3384 Features["3dnow"] = false;
3385 case AMD3DNowAthlon:
3386 Features["3dnowa"] = false;
3387 }
3388}
3389
3390void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00003391 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003392 if (Enabled) {
3393 switch (Level) {
3394 case XOP:
3395 Features["xop"] = true;
3396 case FMA4:
3397 Features["fma4"] = true;
3398 setSSELevel(Features, AVX, true);
3399 case SSE4A:
3400 Features["sse4a"] = true;
3401 setSSELevel(Features, SSE3, true);
3402 case NoXOP:
3403 break;
3404 }
3405 return;
3406 }
3407
3408 switch (Level) {
3409 case NoXOP:
3410 case SSE4A:
3411 Features["sse4a"] = false;
3412 case FMA4:
3413 Features["fma4"] = false;
3414 case XOP:
3415 Features["xop"] = false;
3416 }
3417}
3418
Craig Topper86d79ef2013-09-17 04:51:29 +00003419void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
3420 StringRef Name, bool Enabled) {
Eric Christopher298ac302015-07-01 00:08:32 +00003421 // This is a bit of a hack to deal with the sse4 target feature when used
3422 // as part of the target attribute. We handle sse4 correctly everywhere
3423 // else. See below for more information on how we handle the sse4 options.
3424 if (Name != "sse4")
3425 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00003426
Craig Topper29561122013-09-19 01:13:07 +00003427 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003428 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003429 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003430 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003431 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003432 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003433 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003434 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003435 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003436 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003437 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003438 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003439 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003440 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003441 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003442 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003443 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003444 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003445 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003446 if (Enabled)
3447 setSSELevel(Features, SSE2, Enabled);
3448 } else if (Name == "pclmul") {
3449 if (Enabled)
3450 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003451 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003452 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003453 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003454 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003455 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003456 setSSELevel(Features, AVX512F, Enabled);
Craig Topperb4f83a02016-02-29 06:51:38 +00003457 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf" ||
3458 Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl" ||
3459 Name == "avx512vbmi" || Name == "avx512ifma") {
Craig Topper679b53a2013-08-21 05:29:10 +00003460 if (Enabled)
3461 setSSELevel(Features, AVX512F, Enabled);
Craig Topper6c7ecc52016-11-09 04:51:03 +00003462 // Enable BWI instruction if VBMI is being enabled.
3463 if (Name == "avx512vbmi" && Enabled)
3464 Features["avx512bw"] = true;
3465 // Also disable VBMI if BWI is being disabled.
3466 if (Name == "avx512bw" && !Enabled)
3467 Features["avx512vbmi"] = false;
Craig Topper679b53a2013-08-21 05:29:10 +00003468 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003469 if (Enabled)
3470 setSSELevel(Features, AVX, Enabled);
3471 } else if (Name == "fma4") {
3472 setXOPLevel(Features, FMA4, Enabled);
3473 } else if (Name == "xop") {
3474 setXOPLevel(Features, XOP, Enabled);
3475 } else if (Name == "sse4a") {
3476 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00003477 } else if (Name == "f16c") {
3478 if (Enabled)
3479 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00003480 } else if (Name == "sha") {
3481 if (Enabled)
3482 setSSELevel(Features, SSE2, Enabled);
Eric Christopher298ac302015-07-01 00:08:32 +00003483 } else if (Name == "sse4") {
3484 // We can get here via the __target__ attribute since that's not controlled
3485 // via the -msse4/-mno-sse4 command line alias. Handle this the same way
3486 // here - turn on the sse4.2 if enabled, turn off the sse4.1 level if
3487 // disabled.
3488 if (Enabled)
3489 setSSELevel(Features, SSE42, Enabled);
3490 else
3491 setSSELevel(Features, SSE41, Enabled);
Craig Topperda9fe562015-10-15 05:23:38 +00003492 } else if (Name == "xsave") {
Craig Topper840927e2016-02-29 06:51:34 +00003493 if (!Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003494 Features["xsaveopt"] = false;
3495 } else if (Name == "xsaveopt" || Name == "xsavec" || Name == "xsaves") {
Craig Topper840927e2016-02-29 06:51:34 +00003496 if (Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003497 Features["xsave"] = true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003498 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003499}
3500
Eric Christopher3ff21b32013-10-16 21:26:26 +00003501/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003502/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00003503bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00003504 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00003505 for (const auto &Feature : Features) {
3506 if (Feature[0] != '+')
Daniel Dunbar979586e2009-11-11 09:38:56 +00003507 continue;
3508
Eric Christopher610fe112015-08-26 08:21:55 +00003509 if (Feature == "+aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00003510 HasAES = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003511 } else if (Feature == "+pclmul") {
Craig Topper3f122a72012-05-31 05:18:48 +00003512 HasPCLMUL = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003513 } else if (Feature == "+lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00003514 HasLZCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003515 } else if (Feature == "+rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00003516 HasRDRND = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003517 } else if (Feature == "+fsgsbase") {
Craig Topper8c7f2512014-11-03 06:51:41 +00003518 HasFSGSBASE = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003519 } else if (Feature == "+bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00003520 HasBMI = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003521 } else if (Feature == "+bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00003522 HasBMI2 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003523 } else if (Feature == "+popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00003524 HasPOPCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003525 } else if (Feature == "+rtm") {
Michael Liao625a8752012-11-10 05:17:46 +00003526 HasRTM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003527 } else if (Feature == "+prfchw") {
Michael Liao74f4eaf2013-03-26 17:52:08 +00003528 HasPRFCHW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003529 } else if (Feature == "+rdseed") {
Michael Liaoffaae352013-03-29 05:17:55 +00003530 HasRDSEED = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003531 } else if (Feature == "+adx") {
Robert Khasanov50e6f582014-09-19 09:53:48 +00003532 HasADX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003533 } else if (Feature == "+tbm") {
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003534 HasTBM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003535 } else if (Feature == "+fma") {
Craig Topperbba778b2012-06-03 21:46:30 +00003536 HasFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003537 } else if (Feature == "+f16c") {
Manman Rena45358c2012-10-11 00:59:55 +00003538 HasF16C = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003539 } else if (Feature == "+avx512cd") {
Craig Topper679b53a2013-08-21 05:29:10 +00003540 HasAVX512CD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003541 } else if (Feature == "+avx512er") {
Craig Topper679b53a2013-08-21 05:29:10 +00003542 HasAVX512ER = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003543 } else if (Feature == "+avx512pf") {
Craig Topper679b53a2013-08-21 05:29:10 +00003544 HasAVX512PF = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003545 } else if (Feature == "+avx512dq") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003546 HasAVX512DQ = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003547 } else if (Feature == "+avx512bw") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003548 HasAVX512BW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003549 } else if (Feature == "+avx512vl") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003550 HasAVX512VL = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003551 } else if (Feature == "+avx512vbmi") {
3552 HasAVX512VBMI = true;
3553 } else if (Feature == "+avx512ifma") {
3554 HasAVX512IFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003555 } else if (Feature == "+sha") {
Ben Langmuir58078d02013-09-19 13:22:04 +00003556 HasSHA = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003557 } else if (Feature == "+mpx") {
3558 HasMPX = true;
3559 } else if (Feature == "+movbe") {
3560 HasMOVBE = true;
3561 } else if (Feature == "+sgx") {
3562 HasSGX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003563 } else if (Feature == "+cx16") {
Nick Lewycky50e8f482013-10-05 20:14:27 +00003564 HasCX16 = true;
Craig Toppere33f51f2015-10-16 06:22:36 +00003565 } else if (Feature == "+fxsr") {
3566 HasFXSR = true;
Craig Topperda9fe562015-10-15 05:23:38 +00003567 } else if (Feature == "+xsave") {
3568 HasXSAVE = true;
3569 } else if (Feature == "+xsaveopt") {
3570 HasXSAVEOPT = true;
3571 } else if (Feature == "+xsavec") {
3572 HasXSAVEC = true;
3573 } else if (Feature == "+xsaves") {
3574 HasXSAVES = true;
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003575 } else if (Feature == "+mwaitx") {
3576 HasMWAITX = true;
Asaf Badouha9d1e182015-12-31 14:14:07 +00003577 } else if (Feature == "+pku") {
3578 HasPKU = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003579 } else if (Feature == "+clflushopt") {
3580 HasCLFLUSHOPT = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003581 } else if (Feature == "+clwb") {
3582 HasCLWB = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003583 } else if (Feature == "+prefetchwt1") {
3584 HasPREFETCHWT1 = true;
Craig Topper45742262017-02-09 06:10:14 +00003585 } else if (Feature == "+clzero") {
3586 HasCLZERO = true;
Nick Lewycky50e8f482013-10-05 20:14:27 +00003587 }
3588
Benjamin Kramer27402c62012-03-05 15:10:44 +00003589 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003590 .Case("+avx512f", AVX512F)
3591 .Case("+avx2", AVX2)
3592 .Case("+avx", AVX)
3593 .Case("+sse4.2", SSE42)
3594 .Case("+sse4.1", SSE41)
3595 .Case("+ssse3", SSSE3)
3596 .Case("+sse3", SSE3)
3597 .Case("+sse2", SSE2)
3598 .Case("+sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00003599 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003600 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003601
Eli Friedman33465822011-07-08 23:31:17 +00003602 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00003603 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003604 .Case("+3dnowa", AMD3DNowAthlon)
3605 .Case("+3dnow", AMD3DNow)
3606 .Case("+mmx", MMX)
Eli Friedman33465822011-07-08 23:31:17 +00003607 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00003608 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003609
3610 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003611 .Case("+xop", XOP)
3612 .Case("+fma4", FMA4)
3613 .Case("+sse4a", SSE4A)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003614 .Default(NoXOP);
3615 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003616 }
Eli Friedman33465822011-07-08 23:31:17 +00003617
Rafael Espindolaeb265472013-08-21 21:59:03 +00003618 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
3619 // matches the selected sse level.
Craig Topperd945d502015-10-20 00:00:17 +00003620 if ((FPMath == FP_SSE && SSELevel < SSE1) ||
3621 (FPMath == FP_387 && SSELevel >= SSE1)) {
3622 Diags.Report(diag::err_target_unsupported_fpmath) <<
3623 (FPMath == FP_SSE ? "sse" : "387");
Rafael Espindolaeb265472013-08-21 21:59:03 +00003624 return false;
3625 }
3626
Alexey Bataev00396512015-07-02 03:40:19 +00003627 SimdDefaultAlign =
Ahmed Bougacha68bf64e2015-08-27 22:24:56 +00003628 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Rafael Espindolaeb265472013-08-21 21:59:03 +00003629 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00003630}
Chris Lattnerecd49032009-03-02 22:27:17 +00003631
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003632/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
3633/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00003634void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003635 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00003636 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00003637 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003638 Builder.defineMacro("__amd64__");
3639 Builder.defineMacro("__amd64");
3640 Builder.defineMacro("__x86_64");
3641 Builder.defineMacro("__x86_64__");
Bob Wilsona2acb1e2014-08-08 23:46:28 +00003642 if (getTriple().getArchName() == "x86_64h") {
3643 Builder.defineMacro("__x86_64h");
3644 Builder.defineMacro("__x86_64h__");
3645 }
Chris Lattnerecd49032009-03-02 22:27:17 +00003646 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003647 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00003648 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003649
Chris Lattnerecd49032009-03-02 22:27:17 +00003650 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003651 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
3652 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00003653 switch (CPU) {
3654 case CK_Generic:
3655 break;
3656 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003657 // The rest are coming from the i386 define above.
3658 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003659 break;
3660 case CK_i486:
3661 case CK_WinChipC6:
3662 case CK_WinChip2:
3663 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003664 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00003665 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003666 case CK_PentiumMMX:
3667 Builder.defineMacro("__pentium_mmx__");
3668 Builder.defineMacro("__tune_pentium_mmx__");
3669 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003670 case CK_i586:
3671 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003672 defineCPUMacros(Builder, "i586");
3673 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00003674 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003675 case CK_Pentium3:
3676 case CK_Pentium3M:
3677 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003678 Builder.defineMacro("__tune_pentium3__");
3679 // Fallthrough
3680 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00003681 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003682 Builder.defineMacro("__tune_pentium2__");
3683 // Fallthrough
3684 case CK_PentiumPro:
3685 Builder.defineMacro("__tune_i686__");
3686 Builder.defineMacro("__tune_pentiumpro__");
3687 // Fallthrough
3688 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003689 Builder.defineMacro("__i686");
3690 Builder.defineMacro("__i686__");
3691 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
3692 Builder.defineMacro("__pentiumpro");
3693 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003694 break;
3695 case CK_Pentium4:
3696 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003697 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00003698 break;
3699 case CK_Yonah:
3700 case CK_Prescott:
3701 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003702 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00003703 break;
3704 case CK_Core2:
3705 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003706 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00003707 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003708 case CK_Bonnell:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003709 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00003710 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00003711 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00003712 defineCPUMacros(Builder, "slm");
3713 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003714 case CK_Nehalem:
3715 case CK_Westmere:
3716 case CK_SandyBridge:
3717 case CK_IvyBridge:
3718 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00003719 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003720 case CK_SkylakeClient:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003721 // FIXME: Historically, we defined this legacy name, it would be nice to
3722 // remove it at some point. We've never exposed fine-grained names for
3723 // recent primary x86 CPUs, and we should keep it that way.
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003724 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00003725 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003726 case CK_SkylakeServer:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003727 defineCPUMacros(Builder, "skx");
3728 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003729 case CK_Cannonlake:
3730 break;
Craig Topper449314e2013-08-20 07:09:39 +00003731 case CK_KNL:
3732 defineCPUMacros(Builder, "knl");
3733 break;
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003734 case CK_Lakemont:
3735 Builder.defineMacro("__tune_lakemont__");
3736 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003737 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003738 Builder.defineMacro("__k6_2__");
3739 Builder.defineMacro("__tune_k6_2__");
3740 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003741 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003742 if (CPU != CK_K6_2) { // In case of fallthrough
3743 // FIXME: GCC may be enabling these in cases where some other k6
3744 // architecture is specified but -m3dnow is explicitly provided. The
3745 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003746 Builder.defineMacro("__k6_3__");
3747 Builder.defineMacro("__tune_k6_3__");
3748 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003749 // Fallthrough
3750 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003751 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00003752 break;
3753 case CK_Athlon:
3754 case CK_AthlonThunderbird:
3755 case CK_Athlon4:
3756 case CK_AthlonXP:
3757 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003758 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003759 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003760 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003761 Builder.defineMacro("__tune_athlon_sse__");
3762 }
Chandler Carruth212334f2011-09-28 08:55:37 +00003763 break;
3764 case CK_K8:
3765 case CK_K8SSE3:
3766 case CK_x86_64:
3767 case CK_Opteron:
3768 case CK_OpteronSSE3:
3769 case CK_Athlon64:
3770 case CK_Athlon64SSE3:
3771 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003772 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00003773 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00003774 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003775 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00003776 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00003777 case CK_BTVER1:
3778 defineCPUMacros(Builder, "btver1");
3779 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003780 case CK_BTVER2:
3781 defineCPUMacros(Builder, "btver2");
3782 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003783 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003784 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003785 break;
3786 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003787 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003788 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003789 case CK_BDVER3:
3790 defineCPUMacros(Builder, "bdver3");
3791 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003792 case CK_BDVER4:
3793 defineCPUMacros(Builder, "bdver4");
3794 break;
Craig Topperc45744a2017-01-10 06:02:12 +00003795 case CK_ZNVER1:
3796 defineCPUMacros(Builder, "znver1");
3797 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003798 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003799 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00003800 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003801 }
Chris Lattner96e43572009-03-02 22:40:39 +00003802
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003803 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003804 Builder.defineMacro("__REGISTER_PREFIX__", "");
3805
Chris Lattner6df41af2009-04-19 17:32:33 +00003806 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
3807 // functions in glibc header files that use FP Stack inline asm which the
3808 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003809 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003810
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003811 if (HasAES)
3812 Builder.defineMacro("__AES__");
3813
Craig Topper3f122a72012-05-31 05:18:48 +00003814 if (HasPCLMUL)
3815 Builder.defineMacro("__PCLMUL__");
3816
Craig Topper22967d42011-12-25 05:06:45 +00003817 if (HasLZCNT)
3818 Builder.defineMacro("__LZCNT__");
3819
Benjamin Kramer1e250392012-07-07 09:39:18 +00003820 if (HasRDRND)
3821 Builder.defineMacro("__RDRND__");
3822
Craig Topper8c7f2512014-11-03 06:51:41 +00003823 if (HasFSGSBASE)
3824 Builder.defineMacro("__FSGSBASE__");
3825
Craig Topper22967d42011-12-25 05:06:45 +00003826 if (HasBMI)
3827 Builder.defineMacro("__BMI__");
3828
3829 if (HasBMI2)
3830 Builder.defineMacro("__BMI2__");
3831
Craig Topper1de83482011-12-29 16:10:46 +00003832 if (HasPOPCNT)
3833 Builder.defineMacro("__POPCNT__");
3834
Michael Liao625a8752012-11-10 05:17:46 +00003835 if (HasRTM)
3836 Builder.defineMacro("__RTM__");
3837
Michael Liao74f4eaf2013-03-26 17:52:08 +00003838 if (HasPRFCHW)
3839 Builder.defineMacro("__PRFCHW__");
3840
Michael Liaoffaae352013-03-29 05:17:55 +00003841 if (HasRDSEED)
3842 Builder.defineMacro("__RDSEED__");
3843
Robert Khasanov50e6f582014-09-19 09:53:48 +00003844 if (HasADX)
3845 Builder.defineMacro("__ADX__");
3846
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003847 if (HasTBM)
3848 Builder.defineMacro("__TBM__");
3849
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003850 if (HasMWAITX)
3851 Builder.defineMacro("__MWAITX__");
3852
Rafael Espindolae62e2792013-08-20 13:44:29 +00003853 switch (XOPLevel) {
3854 case XOP:
3855 Builder.defineMacro("__XOP__");
3856 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00003857 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00003858 case SSE4A:
3859 Builder.defineMacro("__SSE4A__");
3860 case NoXOP:
3861 break;
3862 }
Craig Topperffdb46c2011-12-30 07:33:42 +00003863
Craig Topperbba778b2012-06-03 21:46:30 +00003864 if (HasFMA)
3865 Builder.defineMacro("__FMA__");
3866
Manman Rena45358c2012-10-11 00:59:55 +00003867 if (HasF16C)
3868 Builder.defineMacro("__F16C__");
3869
Craig Topper679b53a2013-08-21 05:29:10 +00003870 if (HasAVX512CD)
3871 Builder.defineMacro("__AVX512CD__");
3872 if (HasAVX512ER)
3873 Builder.defineMacro("__AVX512ER__");
3874 if (HasAVX512PF)
3875 Builder.defineMacro("__AVX512PF__");
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003876 if (HasAVX512DQ)
3877 Builder.defineMacro("__AVX512DQ__");
3878 if (HasAVX512BW)
3879 Builder.defineMacro("__AVX512BW__");
3880 if (HasAVX512VL)
3881 Builder.defineMacro("__AVX512VL__");
Craig Topperb4f83a02016-02-29 06:51:38 +00003882 if (HasAVX512VBMI)
3883 Builder.defineMacro("__AVX512VBMI__");
3884 if (HasAVX512IFMA)
3885 Builder.defineMacro("__AVX512IFMA__");
Craig Topper679b53a2013-08-21 05:29:10 +00003886
Ben Langmuir58078d02013-09-19 13:22:04 +00003887 if (HasSHA)
3888 Builder.defineMacro("__SHA__");
3889
Craig Toppere33f51f2015-10-16 06:22:36 +00003890 if (HasFXSR)
3891 Builder.defineMacro("__FXSR__");
Craig Topperda9fe562015-10-15 05:23:38 +00003892 if (HasXSAVE)
3893 Builder.defineMacro("__XSAVE__");
3894 if (HasXSAVEOPT)
3895 Builder.defineMacro("__XSAVEOPT__");
3896 if (HasXSAVEC)
3897 Builder.defineMacro("__XSAVEC__");
3898 if (HasXSAVES)
3899 Builder.defineMacro("__XSAVES__");
Asaf Badouha9d1e182015-12-31 14:14:07 +00003900 if (HasPKU)
3901 Builder.defineMacro("__PKU__");
Nick Lewycky50e8f482013-10-05 20:14:27 +00003902 if (HasCX16)
3903 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
Craig Topper78b47872017-02-08 06:48:58 +00003904 if (HasCLFLUSHOPT)
3905 Builder.defineMacro("__CLFLUSHOPT__");
Craig Topper8c708cf2017-02-08 07:36:58 +00003906 if (HasCLWB)
3907 Builder.defineMacro("__CLWB__");
Craig Topperb16cb822017-02-08 07:56:42 +00003908 if (HasMPX)
3909 Builder.defineMacro("__MPX__");
Craig Topper204ecff2017-02-08 08:23:17 +00003910 if (HasSGX)
3911 Builder.defineMacro("__SGX__");
Craig Topperd2bf7b02017-02-08 08:23:40 +00003912 if (HasPREFETCHWT1)
3913 Builder.defineMacro("__PREFETCHWT1__");
Craig Topper45742262017-02-09 06:10:14 +00003914 if (HasCLZERO)
3915 Builder.defineMacro("__CLZERO__");
Nick Lewycky50e8f482013-10-05 20:14:27 +00003916
Chris Lattner96e43572009-03-02 22:40:39 +00003917 // Each case falls through to the previous one here.
3918 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003919 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00003920 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00003921 case AVX2:
3922 Builder.defineMacro("__AVX2__");
3923 case AVX:
3924 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00003925 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003926 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00003927 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003928 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00003929 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003930 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003931 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003932 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003933 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003934 Builder.defineMacro("__SSE2__");
3935 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00003936 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003937 Builder.defineMacro("__SSE__");
3938 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00003939 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00003940 break;
3941 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003942
Derek Schuffc7dd7222012-10-11 15:52:22 +00003943 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003944 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003945 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00003946 case AVX2:
3947 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003948 case SSE42:
3949 case SSE41:
3950 case SSSE3:
3951 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003952 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003953 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003954 break;
3955 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003956 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003957 break;
3958 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003959 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003960 }
3961 }
3962
Anders Carlssone437c682010-01-27 03:47:49 +00003963 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00003964 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00003965 case AMD3DNowAthlon:
3966 Builder.defineMacro("__3dNOW_A__");
3967 case AMD3DNow:
3968 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00003969 case MMX:
3970 Builder.defineMacro("__MMX__");
3971 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00003972 break;
3973 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00003974
3975 if (CPU >= CK_i486) {
3976 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
3977 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
3978 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
3979 }
3980 if (CPU >= CK_i586)
3981 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00003982}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003983
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003984bool X86TargetInfo::hasFeature(StringRef Feature) const {
3985 return llvm::StringSwitch<bool>(Feature)
3986 .Case("aes", HasAES)
3987 .Case("avx", SSELevel >= AVX)
3988 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00003989 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00003990 .Case("avx512cd", HasAVX512CD)
3991 .Case("avx512er", HasAVX512ER)
3992 .Case("avx512pf", HasAVX512PF)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003993 .Case("avx512dq", HasAVX512DQ)
3994 .Case("avx512bw", HasAVX512BW)
3995 .Case("avx512vl", HasAVX512VL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003996 .Case("avx512vbmi", HasAVX512VBMI)
3997 .Case("avx512ifma", HasAVX512IFMA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003998 .Case("bmi", HasBMI)
3999 .Case("bmi2", HasBMI2)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00004000 .Case("clflushopt", HasCLFLUSHOPT)
4001 .Case("clwb", HasCLWB)
Craig Topper45742262017-02-09 06:10:14 +00004002 .Case("clzero", HasCLZERO)
Nick Lewycky50e8f482013-10-05 20:14:27 +00004003 .Case("cx16", HasCX16)
4004 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00004005 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00004006 .Case("fma4", XOPLevel >= FMA4)
Craig Topper8c7f2512014-11-03 06:51:41 +00004007 .Case("fsgsbase", HasFSGSBASE)
Craig Toppere33f51f2015-10-16 06:22:36 +00004008 .Case("fxsr", HasFXSR)
Craig Topper8dbc5842014-11-03 07:05:26 +00004009 .Case("lzcnt", HasLZCNT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004010 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
4011 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
4012 .Case("mmx", MMX3DNowLevel >= MMX)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00004013 .Case("movbe", HasMOVBE)
4014 .Case("mpx", HasMPX)
Craig Topper3f122a72012-05-31 05:18:48 +00004015 .Case("pclmul", HasPCLMUL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00004016 .Case("pku", HasPKU)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004017 .Case("popcnt", HasPOPCNT)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00004018 .Case("prefetchwt1", HasPREFETCHWT1)
Michael Liao74f4eaf2013-03-26 17:52:08 +00004019 .Case("prfchw", HasPRFCHW)
Craig Topper8dbc5842014-11-03 07:05:26 +00004020 .Case("rdrnd", HasRDRND)
Michael Liaoffaae352013-03-29 05:17:55 +00004021 .Case("rdseed", HasRDSEED)
Craig Topper8dbc5842014-11-03 07:05:26 +00004022 .Case("rtm", HasRTM)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00004023 .Case("sgx", HasSGX)
Ben Langmuir58078d02013-09-19 13:22:04 +00004024 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004025 .Case("sse", SSELevel >= SSE1)
4026 .Case("sse2", SSELevel >= SSE2)
4027 .Case("sse3", SSELevel >= SSE3)
4028 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00004029 .Case("sse4.1", SSELevel >= SSE41)
4030 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00004031 .Case("sse4a", XOPLevel >= SSE4A)
Craig Topper8dbc5842014-11-03 07:05:26 +00004032 .Case("tbm", HasTBM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004033 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00004034 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
4035 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00004036 .Case("xop", XOPLevel >= XOP)
Craig Topperda9fe562015-10-15 05:23:38 +00004037 .Case("xsave", HasXSAVE)
4038 .Case("xsavec", HasXSAVEC)
4039 .Case("xsaves", HasXSAVES)
4040 .Case("xsaveopt", HasXSAVEOPT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004041 .Default(false);
4042}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004043
Eric Christopherd9832702015-06-29 21:00:05 +00004044// We can't use a generic validation scheme for the features accepted here
4045// versus subtarget features accepted in the target attribute because the
4046// bitfield structure that's initialized in the runtime only supports the
4047// below currently rather than the full range of subtarget features. (See
4048// X86TargetInfo::hasFeature for a somewhat comprehensive list).
4049bool X86TargetInfo::validateCpuSupports(StringRef FeatureStr) const {
4050 return llvm::StringSwitch<bool>(FeatureStr)
4051 .Case("cmov", true)
4052 .Case("mmx", true)
4053 .Case("popcnt", true)
4054 .Case("sse", true)
4055 .Case("sse2", true)
4056 .Case("sse3", true)
Benjamin Kramerf4c520d2016-05-20 15:21:08 +00004057 .Case("ssse3", true)
Eric Christopherd9832702015-06-29 21:00:05 +00004058 .Case("sse4.1", true)
4059 .Case("sse4.2", true)
4060 .Case("avx", true)
4061 .Case("avx2", true)
4062 .Case("sse4a", true)
4063 .Case("fma4", true)
4064 .Case("xop", true)
4065 .Case("fma", true)
4066 .Case("avx512f", true)
4067 .Case("bmi", true)
4068 .Case("bmi2", true)
Benjamin Kramerf4c520d2016-05-20 15:21:08 +00004069 .Case("aes", true)
4070 .Case("pclmul", true)
4071 .Case("avx512vl", true)
4072 .Case("avx512bw", true)
4073 .Case("avx512dq", true)
4074 .Case("avx512cd", true)
4075 .Case("avx512er", true)
4076 .Case("avx512pf", true)
4077 .Case("avx512vbmi", true)
4078 .Case("avx512ifma", true)
Eric Christopherd9832702015-06-29 21:00:05 +00004079 .Default(false);
4080}
4081
Eli Friedman3fd920a2008-08-20 02:34:37 +00004082bool
Anders Carlsson58436352009-02-28 17:11:49 +00004083X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00004084 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00004085 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004086 default: return false;
Alexey Bataev91e58602015-07-20 12:08:00 +00004087 // Constant constraints.
4088 case 'e': // 32-bit signed integer constant for use with sign-extending x86_64
4089 // instructions.
4090 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
4091 // x86_64 instructions.
4092 case 's':
4093 Info.setRequiresImmediate();
4094 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00004095 case 'I':
4096 Info.setRequiresImmediate(0, 31);
4097 return true;
4098 case 'J':
4099 Info.setRequiresImmediate(0, 63);
4100 return true;
4101 case 'K':
4102 Info.setRequiresImmediate(-128, 127);
4103 return true;
4104 case 'L':
Alexey Bataev91e58602015-07-20 12:08:00 +00004105 Info.setRequiresImmediate({ int(0xff), int(0xffff), int(0xffffffff) });
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00004106 return true;
4107 case 'M':
4108 Info.setRequiresImmediate(0, 3);
4109 return true;
4110 case 'N':
4111 Info.setRequiresImmediate(0, 255);
4112 return true;
4113 case 'O':
4114 Info.setRequiresImmediate(0, 127);
4115 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00004116 // Register constraints.
4117 case 'Y': // 'Y' is the first character for several 2-character constraints.
4118 // Shift the pointer to the second character of the constraint.
4119 Name++;
4120 switch (*Name) {
4121 default:
4122 return false;
4123 case '0': // First SSE register.
4124 case 't': // Any SSE register, when SSE2 is enabled.
4125 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
4126 case 'm': // Any MMX register, when inter-unit moves enabled.
Michael Zuckerman849a6a52016-10-31 17:23:52 +00004127 case 'k': // AVX512 arch mask registers: k1-k7.
Alexey Bataev91e58602015-07-20 12:08:00 +00004128 Info.setAllowsRegister();
4129 return true;
4130 }
4131 case 'f': // Any x87 floating point stack register.
Akira Hatanaka88ef7282014-07-18 23:30:30 +00004132 // Constraint 'f' cannot be used for output operands.
4133 if (Info.ConstraintStr[0] == '=')
4134 return false;
Akira Hatanaka88ef7282014-07-18 23:30:30 +00004135 Info.setAllowsRegister();
4136 return true;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004137 case 'a': // eax.
4138 case 'b': // ebx.
4139 case 'c': // ecx.
4140 case 'd': // edx.
4141 case 'S': // esi.
4142 case 'D': // edi.
4143 case 'A': // edx:eax.
Alexey Bataev91e58602015-07-20 12:08:00 +00004144 case 't': // Top of floating point stack.
4145 case 'u': // Second from top of floating point stack.
Eli Friedman3fd920a2008-08-20 02:34:37 +00004146 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00004147 case 'y': // Any MMX register.
Michael Zuckerman62f516f2016-11-01 13:16:44 +00004148 case 'v': // Any {X,Y,Z}MM register (Arch & context dependent)
Anders Carlsson5f7ee682008-10-06 19:17:39 +00004149 case 'x': // Any SSE register.
Michael Zuckerman849a6a52016-10-31 17:23:52 +00004150 case 'k': // Any AVX512 mask register (same as Yk, additionaly allows k0
4151 // for intermideate k reg operations).
Eli Friedman3fd920a2008-08-20 02:34:37 +00004152 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00004153 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
4154 case 'l': // "Index" registers: any general register that can be used as an
4155 // index in a base+index memory access.
4156 Info.setAllowsRegister();
4157 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00004158 // Floating point constant constraints.
Dale Johannesen46742a42010-08-24 22:33:12 +00004159 case 'C': // SSE floating point constant.
4160 case 'G': // x87 floating point constant.
Eli Friedman3fd920a2008-08-20 02:34:37 +00004161 return true;
4162 }
4163}
4164
Akira Hatanaka974131e2014-09-18 18:17:18 +00004165bool X86TargetInfo::validateOutputSize(StringRef Constraint,
4166 unsigned Size) const {
4167 // Strip off constraint modifiers.
4168 while (Constraint[0] == '=' ||
4169 Constraint[0] == '+' ||
4170 Constraint[0] == '&')
4171 Constraint = Constraint.substr(1);
4172
4173 return validateOperandSize(Constraint, Size);
4174}
4175
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004176bool X86TargetInfo::validateInputSize(StringRef Constraint,
4177 unsigned Size) const {
Akira Hatanaka974131e2014-09-18 18:17:18 +00004178 return validateOperandSize(Constraint, Size);
4179}
4180
4181bool X86TargetInfo::validateOperandSize(StringRef Constraint,
4182 unsigned Size) const {
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004183 switch (Constraint[0]) {
4184 default: break;
Michael Zuckerman849a6a52016-10-31 17:23:52 +00004185 case 'k':
4186 // Registers k0-k7 (AVX512) size limit is 64 bit.
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004187 case 'y':
4188 return Size <= 64;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004189 case 'f':
4190 case 't':
4191 case 'u':
4192 return Size <= 128;
Michael Zuckerman62f516f2016-11-01 13:16:44 +00004193 case 'v':
Hans Wennborg3c619a42014-09-18 20:24:04 +00004194 case 'x':
Alexey Bataev91e58602015-07-20 12:08:00 +00004195 if (SSELevel >= AVX512F)
4196 // 512-bit zmm registers can be used if target supports AVX512F.
4197 return Size <= 512U;
4198 else if (SSELevel >= AVX)
4199 // 256-bit ymm registers can be used if target supports AVX.
4200 return Size <= 256U;
4201 return Size <= 128U;
4202 case 'Y':
4203 // 'Y' is the first character for several 2-character constraints.
4204 switch (Constraint[1]) {
4205 default: break;
4206 case 'm':
4207 // 'Ym' is synonymous with 'y'.
Michael Zuckerman849a6a52016-10-31 17:23:52 +00004208 case 'k':
Alexey Bataev91e58602015-07-20 12:08:00 +00004209 return Size <= 64;
4210 case 'i':
4211 case 't':
4212 // 'Yi' and 'Yt' are synonymous with 'x' when SSE2 is enabled.
4213 if (SSELevel >= AVX512F)
4214 return Size <= 512U;
4215 else if (SSELevel >= AVX)
4216 return Size <= 256U;
4217 return SSELevel >= SSE2 && Size <= 128U;
4218 }
4219
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004220 }
4221
4222 return true;
4223}
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00004224
Eli Friedman3fd920a2008-08-20 02:34:37 +00004225std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004226X86TargetInfo::convertConstraint(const char *&Constraint) const {
4227 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004228 case 'a': return std::string("{ax}");
4229 case 'b': return std::string("{bx}");
4230 case 'c': return std::string("{cx}");
4231 case 'd': return std::string("{dx}");
4232 case 'S': return std::string("{si}");
4233 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00004234 case 'p': // address
4235 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00004236 case 't': // top of floating point stack.
4237 return std::string("{st}");
4238 case 'u': // second from top of floating point stack.
4239 return std::string("{st(1)}"); // second from top of floating point stack.
Michael Zuckerman849a6a52016-10-31 17:23:52 +00004240 case 'Y':
4241 switch (Constraint[1]) {
4242 default:
4243 // Break from inner switch and fall through (copy single char),
4244 // continue parsing after copying the current constraint into
4245 // the return string.
4246 break;
4247 case 'k':
4248 // "^" hints llvm that this is a 2 letter constraint.
4249 // "Constraint++" is used to promote the string iterator
4250 // to the next constraint.
4251 return std::string("^") + std::string(Constraint++, 2);
4252 }
4253 LLVM_FALLTHROUGH;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004254 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004255 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00004256 }
4257}
Chris Lattner5ba61f02006-10-14 07:39:34 +00004258
Eli Friedman3fd920a2008-08-20 02:34:37 +00004259// X86-32 generic target
4260class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00004261public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004262 X86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4263 : X86TargetInfo(Triple, Opts) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004264 DoubleAlign = LongLongAlign = 32;
4265 LongDoubleWidth = 96;
4266 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00004267 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00004268 resetDataLayout("e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128");
Eli Friedman32ca82a2009-03-29 20:31:09 +00004269 SizeType = UnsignedInt;
4270 PtrDiffType = SignedInt;
4271 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00004272 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00004273
4274 // Use fpret for all types.
4275 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
4276 (1 << TargetInfo::Double) |
4277 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004278
4279 // x86-32 has atomics up to 8 bytes
4280 // FIXME: Check that we actually have cmpxchg8b before setting
4281 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
4282 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004283 }
Craig Topper3164f332014-03-11 03:39:26 +00004284 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004285 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004286 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004287
Craig Topper3164f332014-03-11 03:39:26 +00004288 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00004289 if (RegNo == 0) return 0;
4290 if (RegNo == 1) return 2;
4291 return -1;
4292 }
Akira Hatanaka974131e2014-09-18 18:17:18 +00004293 bool validateOperandSize(StringRef Constraint,
4294 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00004295 switch (Constraint[0]) {
4296 default: break;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004297 case 'R':
4298 case 'q':
4299 case 'Q':
Bill Wendling887b4852012-11-12 06:42:51 +00004300 case 'a':
4301 case 'b':
4302 case 'c':
4303 case 'd':
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004304 case 'S':
4305 case 'D':
Bill Wendling3c7fed82012-11-12 18:52:32 +00004306 return Size <= 32;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004307 case 'A':
4308 return Size <= 64;
Bill Wendling887b4852012-11-12 06:42:51 +00004309 }
4310
Akira Hatanaka974131e2014-09-18 18:17:18 +00004311 return X86TargetInfo::validateOperandSize(Constraint, Size);
Bill Wendling887b4852012-11-12 06:42:51 +00004312 }
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00004313 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
4314 return llvm::makeArrayRef(BuiltinInfoX86, clang::X86::LastX86CommonBuiltin -
4315 Builtin::FirstTSBuiltin + 1);
4316 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004317};
Eli Friedman3fd920a2008-08-20 02:34:37 +00004318
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004319class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
4320public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004321 NetBSDI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4322 : NetBSDTargetInfo<X86_32TargetInfo>(Triple, Opts) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004323
Craig Topper3164f332014-03-11 03:39:26 +00004324 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00004325 unsigned Major, Minor, Micro;
4326 getTriple().getOSVersion(Major, Minor, Micro);
4327 // New NetBSD uses the default rounding mode.
4328 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
4329 return X86_32TargetInfo::getFloatEvalMethod();
4330 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004331 return 1;
4332 }
4333};
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004334
Eli Friedmane3aa4542009-07-05 18:47:56 +00004335class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
4336public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004337 OpenBSDI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4338 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00004339 SizeType = UnsignedLong;
4340 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004341 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00004342 }
4343};
Eli Friedmane3aa4542009-07-05 18:47:56 +00004344
Eli Friedman9fa28852012-08-08 23:57:20 +00004345class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
4346public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004347 BitrigI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4348 : BitrigTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman9fa28852012-08-08 23:57:20 +00004349 SizeType = UnsignedLong;
4350 IntPtrType = SignedLong;
4351 PtrDiffType = SignedLong;
4352 }
4353};
Eli Friedman9fa28852012-08-08 23:57:20 +00004354
Torok Edwinb2b37c62009-06-30 17:10:35 +00004355class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004356public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004357 DarwinI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4358 : DarwinTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004359 LongDoubleWidth = 128;
4360 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004361 SuitableAlign = 128;
Tim Northover5627d392015-10-30 16:30:45 +00004362 MaxVectorAlign = 256;
4363 // The watchOS simulator uses the builtin bool type for Objective-C.
4364 llvm::Triple T = llvm::Triple(Triple);
4365 if (T.isWatchOS())
4366 UseSignedCharForObjCBool = false;
Eli Friedman32ca82a2009-03-29 20:31:09 +00004367 SizeType = UnsignedLong;
4368 IntPtrType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00004369 resetDataLayout("e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128");
Daniel Dunbarbd606522010-05-27 00:35:16 +00004370 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00004371 }
4372
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004373 bool handleTargetFeatures(std::vector<std::string> &Features,
4374 DiagnosticsEngine &Diags) override {
4375 if (!DarwinTargetInfo<X86_32TargetInfo>::handleTargetFeatures(Features,
4376 Diags))
4377 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004378 // We now know the features we have: we can decide how to align vectors.
4379 MaxVectorAlign =
4380 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004381 return true;
4382 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004383};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004384
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004385// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004386class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004387public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004388 WindowsX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4389 : WindowsTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Chris Lattner46be2e12009-06-24 17:12:15 +00004390 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00004391 DoubleAlign = LongLongAlign = 64;
Reid Kleckner7510c092015-04-01 16:45:06 +00004392 bool IsWinCOFF =
4393 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
James Y Knightb214cbc2016-03-04 19:00:41 +00004394 resetDataLayout(IsWinCOFF
4395 ? "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
4396 : "e-m:e-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32");
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004397 }
Craig Topper3164f332014-03-11 03:39:26 +00004398 void getTargetDefines(const LangOptions &Opts,
4399 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004400 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
4401 }
4402};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004403
4404// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004405class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004406public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004407 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple,
4408 const TargetOptions &Opts)
4409 : WindowsX86_32TargetInfo(Triple, Opts) {
Eli Friedman015d6282011-03-22 21:25:11 +00004410 LongDoubleWidth = LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00004411 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004412 }
Craig Topper3164f332014-03-11 03:39:26 +00004413 void getTargetDefines(const LangOptions &Opts,
4414 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004415 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
4416 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
4417 // The value of the following reflects processor type.
4418 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
4419 // We lost the original triple, so we use the default.
4420 Builder.defineMacro("_M_IX86", "600");
4421 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004422};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004423
David Majnemerae1ed0e2015-05-28 04:36:18 +00004424static void addCygMingDefines(const LangOptions &Opts, MacroBuilder &Builder) {
Eric Christopherb093d692015-10-09 18:39:59 +00004425 // Mingw and cygwin define __declspec(a) to __attribute__((a)). Clang
4426 // supports __declspec natively under -fms-extensions, but we define a no-op
4427 // __declspec macro anyway for pre-processor compatibility.
Reid Kleckner47606832014-04-21 20:58:00 +00004428 if (Opts.MicrosoftExt)
4429 Builder.defineMacro("__declspec", "__declspec");
4430 else
4431 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
4432
4433 if (!Opts.MicrosoftExt) {
4434 // Provide macros for all the calling convention keywords. Provide both
4435 // single and double underscore prefixed variants. These are available on
4436 // x64 as well as x86, even though they have no effect.
4437 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
4438 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00004439 std::string GCCSpelling = "__attribute__((__";
4440 GCCSpelling += CC;
4441 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00004442 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
4443 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
4444 }
4445 }
4446}
4447
David Majnemerae1ed0e2015-05-28 04:36:18 +00004448static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
4449 Builder.defineMacro("__MSVCRT__");
4450 Builder.defineMacro("__MINGW32__");
4451 addCygMingDefines(Opts, Builder);
4452}
4453
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004454// x86-32 MinGW target
4455class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
4456public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004457 MinGWX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4458 : WindowsX86_32TargetInfo(Triple, Opts) {}
Craig Topper3164f332014-03-11 03:39:26 +00004459 void getTargetDefines(const LangOptions &Opts,
4460 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004461 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004462 DefineStd(Builder, "WIN32", Opts);
4463 DefineStd(Builder, "WINNT", Opts);
4464 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00004465 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004466 }
4467};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004468
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004469// x86-32 Cygwin target
4470class CygwinX86_32TargetInfo : public X86_32TargetInfo {
4471public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004472 CygwinX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4473 : X86_32TargetInfo(Triple, Opts) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004474 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004475 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00004476 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 +00004477 }
Craig Topper3164f332014-03-11 03:39:26 +00004478 void getTargetDefines(const LangOptions &Opts,
4479 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004480 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00004481 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004482 Builder.defineMacro("__CYGWIN__");
4483 Builder.defineMacro("__CYGWIN32__");
David Majnemerae1ed0e2015-05-28 04:36:18 +00004484 addCygMingDefines(Opts, Builder);
Saleem Abdulrasool56027092017-02-07 19:00:06 +00004485 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00004486 if (Opts.CPlusPlus)
4487 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00004488 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004489};
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004490
Chris Lattnerb986aba2010-04-11 19:29:39 +00004491// x86-32 Haiku target
Reid Kleckner330fb172016-05-11 16:19:05 +00004492class HaikuX86_32TargetInfo : public HaikuTargetInfo<X86_32TargetInfo> {
Chris Lattnerb986aba2010-04-11 19:29:39 +00004493public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004494 HaikuX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Reid Kleckner330fb172016-05-11 16:19:05 +00004495 : HaikuTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman04831922010-08-22 01:00:03 +00004496 }
Craig Topper3164f332014-03-11 03:39:26 +00004497 void getTargetDefines(const LangOptions &Opts,
4498 MacroBuilder &Builder) const override {
Reid Kleckner330fb172016-05-11 16:19:05 +00004499 HaikuTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
Chris Lattnerb986aba2010-04-11 19:29:39 +00004500 Builder.defineMacro("__INTEL__");
Chris Lattnerb986aba2010-04-11 19:29:39 +00004501 }
4502};
Chris Lattnerb986aba2010-04-11 19:29:39 +00004503
Alexey Bataevc99b0492015-11-25 09:24:26 +00004504// X86-32 MCU target
4505class MCUX86_32TargetInfo : public X86_32TargetInfo {
4506public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004507 MCUX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4508 : X86_32TargetInfo(Triple, Opts) {
Alexey Bataevc99b0492015-11-25 09:24:26 +00004509 LongDoubleWidth = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00004510 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
James Y Knightb214cbc2016-03-04 19:00:41 +00004511 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 +00004512 WIntType = UnsignedInt;
Alexey Bataevc99b0492015-11-25 09:24:26 +00004513 }
4514
4515 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
4516 // On MCU we support only C calling convention.
4517 return CC == CC_C ? CCCR_OK : CCCR_Warning;
4518 }
4519
4520 void getTargetDefines(const LangOptions &Opts,
4521 MacroBuilder &Builder) const override {
4522 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4523 Builder.defineMacro("__iamcu");
4524 Builder.defineMacro("__iamcu__");
4525 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00004526
4527 bool allowsLargerPreferedTypeAlignment() const override {
4528 return false;
4529 }
Alexey Bataevc99b0492015-11-25 09:24:26 +00004530};
4531
Douglas Gregor9fabd852011-07-01 22:41:14 +00004532// RTEMS Target
4533template<typename Target>
4534class RTEMSTargetInfo : public OSTargetInfo<Target> {
4535protected:
Craig Topper3164f332014-03-11 03:39:26 +00004536 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4537 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004538 // RTEMS defines; list based off of gcc output
4539
Douglas Gregor9fabd852011-07-01 22:41:14 +00004540 Builder.defineMacro("__rtems__");
4541 Builder.defineMacro("__ELF__");
4542 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004543
Douglas Gregor9fabd852011-07-01 22:41:14 +00004544public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004545 RTEMSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4546 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004547 switch (Triple.getArch()) {
4548 default:
4549 case llvm::Triple::x86:
4550 // this->MCountName = ".mcount";
4551 break;
4552 case llvm::Triple::mips:
4553 case llvm::Triple::mipsel:
4554 case llvm::Triple::ppc:
4555 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00004556 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004557 // this->MCountName = "_mcount";
4558 break;
4559 case llvm::Triple::arm:
4560 // this->MCountName = "__mcount";
4561 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004562 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004563 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00004564};
4565
Douglas Gregor9fabd852011-07-01 22:41:14 +00004566// x86-32 RTEMS target
4567class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
4568public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004569 RTEMSX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4570 : X86_32TargetInfo(Triple, Opts) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004571 SizeType = UnsignedLong;
4572 IntPtrType = SignedLong;
4573 PtrDiffType = SignedLong;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004574 }
Craig Topper3164f332014-03-11 03:39:26 +00004575 void getTargetDefines(const LangOptions &Opts,
4576 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004577 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4578 Builder.defineMacro("__INTEL__");
4579 Builder.defineMacro("__rtems__");
4580 }
4581};
Douglas Gregor9fabd852011-07-01 22:41:14 +00004582
Eli Friedman3fd920a2008-08-20 02:34:37 +00004583// x86-64 generic target
4584class X86_64TargetInfo : public X86TargetInfo {
4585public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004586 X86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4587 : X86TargetInfo(Triple, Opts) {
David Blaikie40f842d2014-07-10 18:46:15 +00004588 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
David Majnemer8fa8c382015-03-17 23:55:00 +00004589 bool IsWinCOFF =
4590 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Zinovy Nis1db95732014-07-10 15:27:19 +00004591 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00004592 LongDoubleWidth = 128;
4593 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00004594 LargeArrayMinWidth = 128;
4595 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004596 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00004597 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
4598 PtrDiffType = IsX32 ? SignedInt : SignedLong;
4599 IntPtrType = IsX32 ? SignedInt : SignedLong;
4600 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00004601 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00004602 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00004603
Eric Christopher4855ba82017-02-10 03:32:34 +00004604 // Use 128-bit alignment for 128-bit integers in linux.
4605 // FIXME: Figure out if we should change this for other oses.
Eric Christopher917e9522014-11-18 22:36:15 +00004606 // Pointers are 32-bit in x32.
Eric Christopher4855ba82017-02-10 03:32:34 +00004607 if (IsX32) {
4608 if (Triple.isOSLinux())
4609 resetDataLayout(
4610 "e-m:e-p:32:32-i64:64-i128:128-f80:128-n8:16:32:64-S128");
4611 else
4612 resetDataLayout("e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128");
4613 } else if (IsWinCOFF)
4614 resetDataLayout("e-m:w-i64:64-f80:128-n8:16:32:64-S128");
4615 else if (Triple.isOSLinux())
4616 resetDataLayout("e-m:e-i64:64-i128:128-f80:128-n8:16:32:64-S128");
4617 else
4618 resetDataLayout("e-m:e-i64:64-f80:128-n8:16:32:64-S128");
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00004619
4620 // Use fpret only for long double.
4621 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004622
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00004623 // Use fp2ret for _Complex long double.
4624 ComplexLongDoubleUsesFP2Ret = true;
4625
Charles Davisc7d5c942015-09-17 20:55:33 +00004626 // Make __builtin_ms_va_list available.
4627 HasBuiltinMSVaList = true;
4628
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004629 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004630 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00004631 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00004632 }
Craig Topper3164f332014-03-11 03:39:26 +00004633 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004634 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00004635 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004636
Craig Topper3164f332014-03-11 03:39:26 +00004637 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00004638 if (RegNo == 0) return 0;
4639 if (RegNo == 1) return 1;
4640 return -1;
4641 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004642
Craig Topper3164f332014-03-11 03:39:26 +00004643 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00004644 switch (CC) {
4645 case CC_C:
4646 case CC_Swift:
4647 case CC_X86VectorCall:
4648 case CC_IntelOclBicc:
4649 case CC_X86_64Win64:
Roman Levenstein35aa5ce2016-03-16 18:00:46 +00004650 case CC_PreserveMost:
4651 case CC_PreserveAll:
Erich Keane757d3172016-11-02 18:29:35 +00004652 case CC_X86RegCall:
John McCall477f2bb2016-03-03 06:39:32 +00004653 return CCCR_OK;
4654 default:
4655 return CCCR_Warning;
4656 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004657 }
4658
Craig Topper3164f332014-03-11 03:39:26 +00004659 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00004660 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004661 }
4662
Pavel Chupinfd223e12014-08-04 12:39:43 +00004663 // for x32 we need it here explicitly
4664 bool hasInt128Type() const override { return true; }
Reid Klecknerf27e7522016-02-01 18:58:24 +00004665 unsigned getUnwindWordWidth() const override { return 64; }
4666 unsigned getRegisterWidth() const override { return 64; }
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00004667
4668 bool validateGlobalRegisterVariable(StringRef RegName,
4669 unsigned RegSize,
4670 bool &HasSizeMismatch) const override {
4671 // rsp and rbp are the only 64-bit registers the x86 backend can currently
4672 // handle.
4673 if (RegName.equals("rsp") || RegName.equals("rbp")) {
4674 // Check that the register size is 64-bit.
4675 HasSizeMismatch = RegSize != 64;
4676 return true;
4677 }
4678
4679 // Check if the register is a 32-bit register the backend can handle.
4680 return X86TargetInfo::validateGlobalRegisterVariable(RegName, RegSize,
4681 HasSizeMismatch);
4682 }
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00004683 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
4684 return llvm::makeArrayRef(BuiltinInfoX86,
4685 X86::LastTSBuiltin - Builtin::FirstTSBuiltin);
4686 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004687};
Eli Friedman3fd920a2008-08-20 02:34:37 +00004688
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004689// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004690class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004691public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004692 WindowsX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4693 : WindowsTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004694 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00004695 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004696 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004697 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004698 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00004699 SizeType = UnsignedLongLong;
4700 PtrDiffType = SignedLongLong;
4701 IntPtrType = SignedLongLong;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004702 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004703
Craig Topper3164f332014-03-11 03:39:26 +00004704 void getTargetDefines(const LangOptions &Opts,
4705 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004706 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004707 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004708 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004709
Craig Topper3164f332014-03-11 03:39:26 +00004710 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004711 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00004712 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004713
Craig Topper3164f332014-03-11 03:39:26 +00004714 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004715 switch (CC) {
4716 case CC_X86StdCall:
4717 case CC_X86ThisCall:
4718 case CC_X86FastCall:
4719 return CCCR_Ignore;
4720 case CC_C:
4721 case CC_X86VectorCall:
4722 case CC_IntelOclBicc:
4723 case CC_X86_64SysV:
Arnold Schwaighofer4fc955e2016-10-12 18:59:24 +00004724 case CC_Swift:
Erich Keane757d3172016-11-02 18:29:35 +00004725 case CC_X86RegCall:
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004726 return CCCR_OK;
4727 default:
4728 return CCCR_Warning;
4729 }
Charles Davisb5a214e2013-08-30 04:39:01 +00004730 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004731};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004732
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004733// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004734class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004735public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004736 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple,
4737 const TargetOptions &Opts)
4738 : WindowsX86_64TargetInfo(Triple, Opts) {
Eli Friedman015d6282011-03-22 21:25:11 +00004739 LongDoubleWidth = LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00004740 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004741 }
Craig Topper3164f332014-03-11 03:39:26 +00004742 void getTargetDefines(const LangOptions &Opts,
4743 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004744 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
4745 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
David Majnemerb856e8f2015-07-26 23:17:29 +00004746 Builder.defineMacro("_M_X64", "100");
4747 Builder.defineMacro("_M_AMD64", "100");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004748 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004749};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004750
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004751// x86-64 MinGW target
4752class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
4753public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004754 MinGWX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4755 : WindowsX86_64TargetInfo(Triple, Opts) {
Reid Kleckner11a17192015-10-28 22:29:52 +00004756 // Mingw64 rounds long double size and alignment up to 16 bytes, but sticks
4757 // with x86 FP ops. Weird.
4758 LongDoubleWidth = LongDoubleAlign = 128;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00004759 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended();
Reid Kleckner11a17192015-10-28 22:29:52 +00004760 }
4761
Craig Topper3164f332014-03-11 03:39:26 +00004762 void getTargetDefines(const LangOptions &Opts,
4763 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004764 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004765 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004766 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00004767 addMinGWDefines(Opts, Builder);
Reid Klecknere070b992014-11-14 02:01:10 +00004768
4769 // GCC defines this macro when it is using __gxx_personality_seh0.
4770 if (!Opts.SjLjExceptions)
4771 Builder.defineMacro("__SEH__");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004772 }
4773};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004774
Yaron Kerend030d112015-07-22 17:38:19 +00004775// x86-64 Cygwin target
4776class CygwinX86_64TargetInfo : public X86_64TargetInfo {
4777public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004778 CygwinX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4779 : X86_64TargetInfo(Triple, Opts) {
Yaron Kerend030d112015-07-22 17:38:19 +00004780 TLSSupported = false;
4781 WCharType = UnsignedShort;
4782 }
4783 void getTargetDefines(const LangOptions &Opts,
4784 MacroBuilder &Builder) const override {
4785 X86_64TargetInfo::getTargetDefines(Opts, Builder);
4786 Builder.defineMacro("__x86_64__");
4787 Builder.defineMacro("__CYGWIN__");
4788 Builder.defineMacro("__CYGWIN64__");
4789 addCygMingDefines(Opts, Builder);
Saleem Abdulrasool56027092017-02-07 19:00:06 +00004790 DefineStd(Builder, "unix", Opts);
Yaron Kerend030d112015-07-22 17:38:19 +00004791 if (Opts.CPlusPlus)
4792 Builder.defineMacro("_GNU_SOURCE");
4793
4794 // GCC defines this macro when it is using __gxx_personality_seh0.
4795 if (!Opts.SjLjExceptions)
4796 Builder.defineMacro("__SEH__");
4797 }
4798};
4799
Eli Friedman2857ccb2009-07-01 03:36:11 +00004800class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
4801public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004802 DarwinX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4803 : DarwinTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00004804 Int64Type = SignedLongLong;
Tim Northovera2ee4332014-03-29 15:09:45 +00004805 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
4806 llvm::Triple T = llvm::Triple(Triple);
Bob Wilson946c04c2014-10-19 02:19:27 +00004807 if (T.isiOS())
Tim Northovera2ee4332014-03-29 15:09:45 +00004808 UseSignedCharForObjCBool = false;
James Y Knightb214cbc2016-03-04 19:00:41 +00004809 resetDataLayout("e-m:o-i64:64-f80:128-n8:16:32:64-S128");
Eli Friedman2857ccb2009-07-01 03:36:11 +00004810 }
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004811
4812 bool handleTargetFeatures(std::vector<std::string> &Features,
4813 DiagnosticsEngine &Diags) override {
4814 if (!DarwinTargetInfo<X86_64TargetInfo>::handleTargetFeatures(Features,
4815 Diags))
4816 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004817 // We now know the features we have: we can decide how to align vectors.
4818 MaxVectorAlign =
4819 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004820 return true;
4821 }
Eli Friedman2857ccb2009-07-01 03:36:11 +00004822};
Eli Friedman2857ccb2009-07-01 03:36:11 +00004823
Eli Friedman245f2292009-07-05 22:31:18 +00004824class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
4825public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004826 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4827 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Eli Friedman245f2292009-07-05 22:31:18 +00004828 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004829 Int64Type = SignedLongLong;
4830 }
4831};
Eli Friedman245f2292009-07-05 22:31:18 +00004832
Eli Friedman9fa28852012-08-08 23:57:20 +00004833class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
4834public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004835 BitrigX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4836 : BitrigTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004837 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004838 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00004839 }
4840};
Tim Northover9bb857a2013-01-31 12:13:10 +00004841
Eli Friedmanf05b7722008-08-20 07:44:10 +00004842class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004843 // Possible FPU choices.
4844 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004845 VFP2FPU = (1 << 0),
4846 VFP3FPU = (1 << 1),
4847 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00004848 NeonFPU = (1 << 3),
4849 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004850 };
4851
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004852 // Possible HWDiv features.
4853 enum HWDivMode {
4854 HWDivThumb = (1 << 0),
4855 HWDivARM = (1 << 1)
4856 };
4857
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004858 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004859 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004860 }
4861
4862 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4863 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004864
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004865 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004866
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004867 StringRef CPUProfile;
4868 StringRef CPUAttr;
4869
Rafael Espindolaeb265472013-08-21 21:59:03 +00004870 enum {
4871 FP_Default,
4872 FP_VFP,
4873 FP_Neon
4874 } FPMath;
4875
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004876 unsigned ArchISA;
Renato Goline84b0002015-10-08 16:43:26 +00004877 unsigned ArchKind = llvm::ARM::AK_ARMV4T;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004878 unsigned ArchProfile;
4879 unsigned ArchVersion;
4880
Bernard Ogdenda13af32013-10-24 18:32:51 +00004881 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004882
Logan Chien57086ce2012-10-10 06:56:20 +00004883 unsigned IsAAPCS : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004884 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004885
4886 // Initialized via features.
4887 unsigned SoftFloat : 1;
4888 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004889
Bernard Ogden18b57012013-10-29 09:47:51 +00004890 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00004891 unsigned Crypto : 1;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004892 unsigned DSP : 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004893 unsigned Unaligned : 1;
4894
4895 enum {
4896 LDREX_B = (1 << 0), /// byte (8-bit)
4897 LDREX_H = (1 << 1), /// half (16-bit)
4898 LDREX_W = (1 << 2), /// word (32-bit)
4899 LDREX_D = (1 << 3), /// double (64-bit)
4900 };
4901
4902 uint32_t LDREX;
Bernard Ogden18b57012013-10-29 09:47:51 +00004903
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004904 // ACLE 6.5.1 Hardware floating point
4905 enum {
4906 HW_FP_HP = (1 << 1), /// half (16-bit)
4907 HW_FP_SP = (1 << 2), /// single (32-bit)
4908 HW_FP_DP = (1 << 3), /// double (64-bit)
4909 };
4910 uint32_t HW_FP;
4911
Chris Lattner5cc15e02010-03-03 19:03:45 +00004912 static const Builtin::Info BuiltinInfo[];
4913
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004914 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004915 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004916
4917 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00004918 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004919
Renato Golin0201a9e2016-09-22 19:28:20 +00004920 // size_t is unsigned long on MachO-derived environments, NetBSD,
4921 // OpenBSD and Bitrig.
Renato Golin9ba39232015-02-27 16:35:48 +00004922 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD ||
Renato Golin0201a9e2016-09-22 19:28:20 +00004923 T.getOS() == llvm::Triple::OpenBSD ||
Renato Golin9ba39232015-02-27 16:35:48 +00004924 T.getOS() == llvm::Triple::Bitrig)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004925 SizeType = UnsignedLong;
4926 else
4927 SizeType = UnsignedInt;
4928
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004929 switch (T.getOS()) {
4930 case llvm::Triple::NetBSD:
Renato Golin0201a9e2016-09-22 19:28:20 +00004931 case llvm::Triple::OpenBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004932 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004933 break;
4934 case llvm::Triple::Win32:
4935 WCharType = UnsignedShort;
4936 break;
4937 case llvm::Triple::Linux:
4938 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004939 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
4940 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004941 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004942 }
4943
4944 UseBitFieldTypeAlignment = true;
4945
4946 ZeroLengthBitfieldBoundary = 0;
4947
Tim Northover147cd2f2014-10-14 22:12:21 +00004948 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
4949 // so set preferred for small types to 32.
4950 if (T.isOSBinFormatMachO()) {
James Y Knightb214cbc2016-03-04 19:00:41 +00004951 resetDataLayout(BigEndian
4952 ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4953 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Tim Northover147cd2f2014-10-14 22:12:21 +00004954 } else if (T.isOSWindows()) {
Tim Northover147cd2f2014-10-14 22:12:21 +00004955 assert(!BigEndian && "Windows on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004956 resetDataLayout("e"
4957 "-m:w"
4958 "-p:32:32"
4959 "-i64:64"
4960 "-v128:64:128"
4961 "-a:0:32"
4962 "-n32"
4963 "-S64");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00004964 } else if (T.isOSNaCl()) {
4965 assert(!BigEndian && "NaCl on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004966 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004967 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00004968 resetDataLayout(BigEndian
4969 ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4970 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004971 }
4972
4973 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004974 }
4975
Tim Northover5627d392015-10-30 16:30:45 +00004976 void setABIAPCS(bool IsAAPCS16) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00004977 const llvm::Triple &T = getTriple();
4978
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004979 IsAAPCS = false;
4980
Tim Northover5627d392015-10-30 16:30:45 +00004981 if (IsAAPCS16)
4982 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
4983 else
4984 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004985
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004986 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00004987 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004988 SizeType = UnsignedInt;
4989 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004990 SizeType = UnsignedLong;
4991
4992 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
4993 WCharType = SignedInt;
4994
4995 // Do not respect the alignment of bit-field types when laying out
4996 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
4997 UseBitFieldTypeAlignment = false;
4998
4999 /// gcc forces the alignment to 4 bytes, regardless of the type of the
5000 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
5001 /// gcc.
5002 ZeroLengthBitfieldBoundary = 32;
5003
Tim Northover5627d392015-10-30 16:30:45 +00005004 if (T.isOSBinFormatMachO() && IsAAPCS16) {
5005 assert(!BigEndian && "AAPCS16 does not support big-endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00005006 resetDataLayout("e-m:o-p:32:32-i64:64-a:0:32-n32-S128");
Tim Northover5627d392015-10-30 16:30:45 +00005007 } else if (T.isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00005008 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00005009 BigEndian
5010 ? "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 +00005011 : "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 +00005012 else
James Y Knightb214cbc2016-03-04 19:00:41 +00005013 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00005014 BigEndian
5015 ? "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 +00005016 : "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 +00005017
5018 // FIXME: Override "preferred align" for double and long long.
5019 }
5020
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005021 void setArchInfo() {
5022 StringRef ArchName = getTriple().getArchName();
5023
Renato Goline84b0002015-10-08 16:43:26 +00005024 ArchISA = llvm::ARM::parseArchISA(ArchName);
5025 CPU = llvm::ARM::getDefaultCPU(ArchName);
5026 unsigned AK = llvm::ARM::parseArch(ArchName);
5027 if (AK != llvm::ARM::AK_INVALID)
5028 ArchKind = AK;
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005029 setArchInfo(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005030 }
5031
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005032 void setArchInfo(unsigned Kind) {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005033 StringRef SubArch;
5034
5035 // cache TargetParser info
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005036 ArchKind = Kind;
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00005037 SubArch = llvm::ARM::getSubArch(ArchKind);
5038 ArchProfile = llvm::ARM::parseArchProfile(SubArch);
5039 ArchVersion = llvm::ARM::parseArchVersion(SubArch);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005040
5041 // cache CPU related strings
5042 CPUAttr = getCPUAttr();
5043 CPUProfile = getCPUProfile();
5044 }
5045
5046 void setAtomic() {
Eric Christopherb093d692015-10-09 18:39:59 +00005047 // when triple does not specify a sub arch,
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005048 // then we are not using inline atomics
Renato Goline84b0002015-10-08 16:43:26 +00005049 bool ShouldUseInlineAtomic =
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005050 (ArchISA == llvm::ARM::IK_ARM && ArchVersion >= 6) ||
5051 (ArchISA == llvm::ARM::IK_THUMB && ArchVersion >= 7);
Eric Christopherb093d692015-10-09 18:39:59 +00005052 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005053 if (ArchProfile == llvm::ARM::PK_M) {
5054 MaxAtomicPromoteWidth = 32;
5055 if (ShouldUseInlineAtomic)
5056 MaxAtomicInlineWidth = 32;
5057 }
5058 else {
5059 MaxAtomicPromoteWidth = 64;
5060 if (ShouldUseInlineAtomic)
5061 MaxAtomicInlineWidth = 64;
Eric Christopherb093d692015-10-09 18:39:59 +00005062 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005063 }
5064
5065 bool isThumb() const {
5066 return (ArchISA == llvm::ARM::IK_THUMB);
5067 }
5068
5069 bool supportsThumb() const {
5070 return CPUAttr.count('T') || ArchVersion >= 6;
5071 }
5072
5073 bool supportsThumb2() const {
Bradley Smithf4affc12016-03-03 13:52:22 +00005074 return CPUAttr.equals("6T2") ||
5075 (ArchVersion >= 7 && !CPUAttr.equals("8M_BASE"));
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005076 }
5077
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005078 StringRef getCPUAttr() const {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005079 // For most sub-arches, the build attribute CPU name is enough.
5080 // For Cortex variants, it's slightly different.
5081 switch(ArchKind) {
5082 default:
Chandler Carruthd96f37a2015-08-30 07:51:18 +00005083 return llvm::ARM::getCPUAttr(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005084 case llvm::ARM::AK_ARMV6M:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005085 return "6M";
Tim Northover525c73c2015-07-21 21:47:33 +00005086 case llvm::ARM::AK_ARMV7S:
5087 return "7S";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005088 case llvm::ARM::AK_ARMV7A:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005089 return "7A";
5090 case llvm::ARM::AK_ARMV7R:
5091 return "7R";
5092 case llvm::ARM::AK_ARMV7M:
5093 return "7M";
5094 case llvm::ARM::AK_ARMV7EM:
5095 return "7EM";
George Burgess IVfc970562017-02-09 23:30:10 +00005096 case llvm::ARM::AK_ARMV7VE:
5097 return "7VE";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005098 case llvm::ARM::AK_ARMV8A:
5099 return "8A";
5100 case llvm::ARM::AK_ARMV8_1A:
5101 return "8_1A";
Oliver Stannard3086c042016-02-11 16:05:52 +00005102 case llvm::ARM::AK_ARMV8_2A:
5103 return "8_2A";
Bradley Smithf4affc12016-03-03 13:52:22 +00005104 case llvm::ARM::AK_ARMV8MBaseline:
5105 return "8M_BASE";
5106 case llvm::ARM::AK_ARMV8MMainline:
5107 return "8M_MAIN";
Javed Absar00b74442016-10-07 12:08:41 +00005108 case llvm::ARM::AK_ARMV8R:
5109 return "8R";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005110 }
5111 }
5112
5113 StringRef getCPUProfile() const {
5114 switch(ArchProfile) {
5115 case llvm::ARM::PK_A:
5116 return "A";
5117 case llvm::ARM::PK_R:
5118 return "R";
5119 case llvm::ARM::PK_M:
5120 return "M";
5121 default:
5122 return "";
5123 }
5124 }
5125
Chris Lattner17df24e2008-04-21 18:56:49 +00005126public:
Matt Arsenaultf333de32016-09-07 07:08:02 +00005127 ARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005128 : TargetInfo(Triple), FPMath(FP_Default), IsAAPCS(true), LDREX(0),
5129 HW_FP(0) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005130
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00005131 switch (getTriple().getOS()) {
5132 case llvm::Triple::NetBSD:
Renato Golin0201a9e2016-09-22 19:28:20 +00005133 case llvm::Triple::OpenBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00005134 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00005135 break;
5136 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00005137 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00005138 break;
5139 }
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00005140
Renato Goline84b0002015-10-08 16:43:26 +00005141 // Cache arch related info.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005142 setArchInfo();
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00005143
Chris Lattner1a8f3942010-04-23 16:29:58 +00005144 // {} in inline assembly are neon specifiers, not assembly variant
5145 // specifiers.
5146 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005147
Eric Christopher0e261882014-12-05 01:06:59 +00005148 // FIXME: This duplicates code from the driver that sets the -target-abi
5149 // option - this code is used if -target-abi isn't passed and should
5150 // be unified in some way.
5151 if (Triple.isOSBinFormatMachO()) {
5152 // The backend is hardwired to assume AAPCS for M-class processors, ensure
5153 // the frontend matches that.
5154 if (Triple.getEnvironment() == llvm::Triple::EABI ||
5155 Triple.getOS() == llvm::Triple::UnknownOS ||
Zijiao Ma56a83722016-08-17 02:13:33 +00005156 ArchProfile == llvm::ARM::PK_M) {
Eric Christopher0e261882014-12-05 01:06:59 +00005157 setABI("aapcs");
Tim Northoverd88ecb32016-01-27 19:32:40 +00005158 } else if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00005159 setABI("aapcs16");
Eric Christopher0e261882014-12-05 01:06:59 +00005160 } else {
5161 setABI("apcs-gnu");
5162 }
5163 } else if (Triple.isOSWindows()) {
5164 // FIXME: this is invalid for WindowsCE
5165 setABI("aapcs");
5166 } else {
5167 // Select the default based on the platform.
5168 switch (Triple.getEnvironment()) {
5169 case llvm::Triple::Android:
5170 case llvm::Triple::GNUEABI:
5171 case llvm::Triple::GNUEABIHF:
Rafael Espindola0fa66802016-06-24 21:35:06 +00005172 case llvm::Triple::MuslEABI:
5173 case llvm::Triple::MuslEABIHF:
Eric Christopher0e261882014-12-05 01:06:59 +00005174 setABI("aapcs-linux");
5175 break;
5176 case llvm::Triple::EABIHF:
5177 case llvm::Triple::EABI:
5178 setABI("aapcs");
5179 break;
Eric Christopher560cc4f2014-12-18 02:08:55 +00005180 case llvm::Triple::GNU:
Renato Goline84b0002015-10-08 16:43:26 +00005181 setABI("apcs-gnu");
5182 break;
Eric Christopher0e261882014-12-05 01:06:59 +00005183 default:
5184 if (Triple.getOS() == llvm::Triple::NetBSD)
5185 setABI("apcs-gnu");
5186 else
5187 setABI("aapcs");
5188 break;
5189 }
5190 }
John McCall86353412010-08-21 22:46:04 +00005191
5192 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00005193 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005194
Renato Golin15b86152015-07-03 16:41:13 +00005195 // ARM has atomics up to 8 bytes
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005196 setAtomic();
Rafael Espindola5ab8e2e2015-07-02 15:14:10 +00005197
James Molloya7139222012-03-12 09:14:10 +00005198 // Do force alignment of members that follow zero length bitfields. If
Eric Christopher917e9522014-11-18 22:36:15 +00005199 // the alignment of the zero-length bitfield is greater than the member
5200 // that follows it, `bar', `bar' will be aligned as the type of the
James Molloya7139222012-03-12 09:14:10 +00005201 // zero length bitfield.
5202 UseZeroLengthBitfieldAlignment = true;
Saleem Abdulrasool9b5ba542016-04-10 03:19:47 +00005203
5204 if (Triple.getOS() == llvm::Triple::Linux ||
5205 Triple.getOS() == llvm::Triple::UnknownOS)
5206 this->MCountName =
5207 Opts.EABIVersion == "gnu" ? "\01__gnu_mcount_nc" : "\01mcount";
Eli Friedmanb5366062008-05-20 14:21:01 +00005208 }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00005209
Alp Toker4925ba72014-06-07 23:30:42 +00005210 StringRef getABI() const override { return ABI; }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00005211
Craig Topper3164f332014-03-11 03:39:26 +00005212 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00005213 ABI = Name;
5214
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00005215 // The defaults (above) are for AAPCS, check if we need to change them.
5216 //
5217 // FIXME: We need support for -meabi... we could just mangle it into the
5218 // name.
Tim Northover756447a2015-10-30 16:30:36 +00005219 if (Name == "apcs-gnu" || Name == "aapcs16") {
Tim Northover5627d392015-10-30 16:30:45 +00005220 setABIAPCS(Name == "aapcs16");
Rafael Espindolad6c2b722013-12-18 19:47:32 +00005221 return true;
5222 }
5223 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
5224 setABIAAPCS();
5225 return true;
5226 }
5227 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00005228 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00005229
Renato Golinf5c4dec2015-05-27 13:33:00 +00005230 // FIXME: This should be based on Arch attributes, not CPU names.
Eric Christopher8c47b422015-10-09 18:39:55 +00005231 bool
5232 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
5233 StringRef CPU,
5234 const std::vector<std::string> &FeaturesVec) const override {
5235
Mehdi Aminia0016ec2016-10-07 08:37:29 +00005236 std::vector<StringRef> TargetFeatures;
Bradley Smithb3501962015-11-16 11:16:36 +00005237 unsigned Arch = llvm::ARM::parseArch(getTriple().getArchName());
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005238
5239 // get default FPU features
Bradley Smithb3501962015-11-16 11:16:36 +00005240 unsigned FPUKind = llvm::ARM::getDefaultFPU(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005241 llvm::ARM::getFPUFeatures(FPUKind, TargetFeatures);
5242
5243 // get default Extension features
Bradley Smithb3501962015-11-16 11:16:36 +00005244 unsigned Extensions = llvm::ARM::getDefaultExtensions(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005245 llvm::ARM::getExtensionFeatures(Extensions, TargetFeatures);
5246
Mehdi Aminia0016ec2016-10-07 08:37:29 +00005247 for (auto Feature : TargetFeatures)
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005248 if (Feature[0] == '+')
Mehdi Aminia0016ec2016-10-07 08:37:29 +00005249 Features[Feature.drop_front(1)] = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005250
Eric Christopher007b0a02015-08-28 22:32:01 +00005251 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005252 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005253
Craig Topper3164f332014-03-11 03:39:26 +00005254 bool handleTargetFeatures(std::vector<std::string> &Features,
5255 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005256 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00005257 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00005258 Crypto = 0;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005259 DSP = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005260 Unaligned = 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005261 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005262 HWDiv = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005263
Ranjeet Singhac08e532015-06-24 23:39:25 +00005264 // This does not diagnose illegal cases like having both
5265 // "+vfpv2" and "+vfpv3" or having "+neon" and "+fp-only-sp".
5266 uint32_t HW_FP_remove = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005267 for (const auto &Feature : Features) {
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005268 if (Feature == "+soft-float") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00005269 SoftFloat = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005270 } else if (Feature == "+soft-float-abi") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00005271 SoftFloatABI = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005272 } else if (Feature == "+vfp2") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005273 FPU |= VFP2FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005274 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005275 } else if (Feature == "+vfp3") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005276 FPU |= VFP3FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005277 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005278 } else if (Feature == "+vfp4") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005279 FPU |= VFP4FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005280 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005281 } else if (Feature == "+fp-armv8") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00005282 FPU |= FPARMV8;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005283 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005284 } else if (Feature == "+neon") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005285 FPU |= NeonFPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005286 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005287 } else if (Feature == "+hwdiv") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005288 HWDiv |= HWDivThumb;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005289 } else if (Feature == "+hwdiv-arm") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005290 HWDiv |= HWDivARM;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005291 } else if (Feature == "+crc") {
Bernard Ogden18b57012013-10-29 09:47:51 +00005292 CRC = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005293 } else if (Feature == "+crypto") {
Tim Northover02e38602014-02-03 17:28:04 +00005294 Crypto = 1;
Artyom Skrobov05d85ae2015-10-23 17:19:02 +00005295 } else if (Feature == "+dsp") {
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005296 DSP = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005297 } else if (Feature == "+fp-only-sp") {
Matt Arsenault250024f2016-06-08 01:56:42 +00005298 HW_FP_remove |= HW_FP_DP;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005299 } else if (Feature == "+strict-align") {
5300 Unaligned = 0;
5301 } else if (Feature == "+fp16") {
5302 HW_FP |= HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005303 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00005304 }
Ranjeet Singhac08e532015-06-24 23:39:25 +00005305 HW_FP &= ~HW_FP_remove;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005306
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005307 switch (ArchVersion) {
5308 case 6:
5309 if (ArchProfile == llvm::ARM::PK_M)
5310 LDREX = 0;
5311 else if (ArchKind == llvm::ARM::AK_ARMV6K)
5312 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5313 else
5314 LDREX = LDREX_W;
5315 break;
5316 case 7:
5317 if (ArchProfile == llvm::ARM::PK_M)
5318 LDREX = LDREX_W | LDREX_H | LDREX_B ;
5319 else
5320 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5321 break;
5322 case 8:
5323 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5324 }
5325
Rafael Espindolaeb265472013-08-21 21:59:03 +00005326 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
5327 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
5328 return false;
5329 }
5330
5331 if (FPMath == FP_Neon)
5332 Features.push_back("+neonfp");
5333 else if (FPMath == FP_VFP)
5334 Features.push_back("-neonfp");
5335
Daniel Dunbar893d4752009-12-19 04:15:38 +00005336 // Remove front-end specific options which the backend handles differently.
Eric Christopher9e172d22015-05-12 01:26:21 +00005337 auto Feature =
5338 std::find(Features.begin(), Features.end(), "+soft-float-abi");
5339 if (Feature != Features.end())
5340 Features.erase(Feature);
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005341
Rafael Espindolaeb265472013-08-21 21:59:03 +00005342 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005343 }
5344
Craig Topper3164f332014-03-11 03:39:26 +00005345 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005346 return llvm::StringSwitch<bool>(Feature)
5347 .Case("arm", true)
Ben Langmuir587aeaf2015-08-07 01:59:56 +00005348 .Case("aarch32", true)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005349 .Case("softfloat", SoftFloat)
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005350 .Case("thumb", isThumb())
Amara Emerson8c3de542013-09-16 18:07:35 +00005351 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005352 .Case("hwdiv", HWDiv & HWDivThumb)
5353 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005354 .Default(false);
5355 }
Renato Golin15b86152015-07-03 16:41:13 +00005356
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005357 bool setCPU(const std::string &Name) override {
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005358 if (Name != "generic")
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00005359 setArchInfo(llvm::ARM::parseCPUArch(Name));
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005360
Renato Golin15b86152015-07-03 16:41:13 +00005361 if (ArchKind == llvm::ARM::AK_INVALID)
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005362 return false;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005363 setAtomic();
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005364 CPU = Name;
5365 return true;
5366 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005367
Craig Topper3164f332014-03-11 03:39:26 +00005368 bool setFPMath(StringRef Name) override;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005369
Craig Topper3164f332014-03-11 03:39:26 +00005370 void getTargetDefines(const LangOptions &Opts,
5371 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00005372 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005373 Builder.defineMacro("__arm");
5374 Builder.defineMacro("__arm__");
Weiming Zhaob0613132016-04-18 16:25:46 +00005375 // For bare-metal none-eabi.
5376 if (getTriple().getOS() == llvm::Triple::UnknownOS &&
5377 getTriple().getEnvironment() == llvm::Triple::EABI)
5378 Builder.defineMacro("__ELF__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00005379
Chris Lattnerecd49032009-03-02 22:27:17 +00005380 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005381 Builder.defineMacro("__REGISTER_PREFIX__", "");
Tim Northover5627d392015-10-30 16:30:45 +00005382
5383 // Unfortunately, __ARM_ARCH_7K__ is now more of an ABI descriptor. The CPU
5384 // happens to be Cortex-A7 though, so it should still get __ARM_ARCH_7A__.
Tim Northoverd88ecb32016-01-27 19:32:40 +00005385 if (getTriple().isWatchABI())
Tim Northover5627d392015-10-30 16:30:45 +00005386 Builder.defineMacro("__ARM_ARCH_7K__", "2");
5387
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005388 if (!CPUAttr.empty())
5389 Builder.defineMacro("__ARM_ARCH_" + CPUAttr + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005390
5391 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005392 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
Benjamin Kramerb42d9a52015-12-24 10:07:37 +00005393 Builder.defineMacro("__ARM_ARCH", Twine(ArchVersion));
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005394
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005395 if (ArchVersion >= 8) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005396 // ACLE 6.5.7 Crypto Extension
5397 if (Crypto)
5398 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
5399 // ACLE 6.5.8 CRC32 Extension
5400 if (CRC)
5401 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
5402 // ACLE 6.5.10 Numeric Maximum and Minimum
5403 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
5404 // ACLE 6.5.9 Directed Rounding
5405 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
James Molloy0ffb0932014-09-15 11:25:38 +00005406 }
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005407
5408 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
5409 // is not defined for the M-profile.
Bradley Smithf4affc12016-03-03 13:52:22 +00005410 // NOTE that the default profile is assumed to be 'A'
5411 if (CPUProfile.empty() || ArchProfile != llvm::ARM::PK_M)
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005412 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
5413
Bradley Smithf4affc12016-03-03 13:52:22 +00005414 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supports the original
5415 // Thumb ISA (including v6-M and v8-M Baseline). It is set to 2 if the
5416 // core supports the Thumb-2 ISA as found in the v6T2 architecture and all
5417 // v7 and v8 architectures excluding v8-M Baseline.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005418 if (supportsThumb2())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005419 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005420 else if (supportsThumb())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005421 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
5422
5423 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
5424 // instruction set such as ARM or Thumb.
5425 Builder.defineMacro("__ARM_32BIT_STATE", "1");
5426
5427 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
5428
5429 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005430 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005431 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00005432
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005433 // ACLE 6.4.3 Unaligned access supported in hardware
Eric Christopherb093d692015-10-09 18:39:59 +00005434 if (Unaligned)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005435 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Eric Christopherb093d692015-10-09 18:39:59 +00005436
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005437 // ACLE 6.4.4 LDREX/STREX
5438 if (LDREX)
5439 Builder.defineMacro("__ARM_FEATURE_LDREX", "0x" + llvm::utohexstr(LDREX));
5440
5441 // ACLE 6.4.5 CLZ
Eric Christopherb093d692015-10-09 18:39:59 +00005442 if (ArchVersion == 5 ||
5443 (ArchVersion == 6 && CPUProfile != "M") ||
5444 ArchVersion > 6)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005445 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
5446
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005447 // ACLE 6.5.1 Hardware Floating Point
5448 if (HW_FP)
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +00005449 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005450
Yi Konga44c4d72014-06-27 21:25:42 +00005451 // ACLE predefines.
5452 Builder.defineMacro("__ARM_ACLE", "200");
5453
Oliver Stannarddc2854c2015-09-03 12:40:58 +00005454 // FP16 support (we currently only support IEEE format).
5455 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
5456 Builder.defineMacro("__ARM_FP16_ARGS", "1");
5457
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005458 // ACLE 6.5.3 Fused multiply-accumulate (FMA)
Silviu Baranga632fdc52016-04-28 11:29:08 +00005459 if (ArchVersion >= 7 && (FPU & VFP4FPU))
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005460 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
5461
Mike Stump9d54bd72009-04-08 02:07:04 +00005462 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005463
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005464 // FIXME: It's more complicated than this and we don't really support
5465 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005466 // Windows on ARM does not "support" interworking
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005467 if (5 <= ArchVersion && ArchVersion <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005468 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005469
David Tweed8f676532012-10-25 13:33:01 +00005470 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00005471 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005472 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
Tim Northover862eaf82016-05-13 21:26:45 +00005473 if (!getTriple().isOSBinFormatMachO() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00005474 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005475 Builder.defineMacro("__ARM_PCS", "1");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005476 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005477
Tim Northover28fc0e12016-04-28 13:59:55 +00005478 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp" ||
5479 ABI == "aapcs16")
5480 Builder.defineMacro("__ARM_PCS_VFP", "1");
5481
Daniel Dunbar893d4752009-12-19 04:15:38 +00005482 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005483 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005484
Zijiao Ma56a83722016-08-17 02:13:33 +00005485 if (ArchKind == llvm::ARM::AK_XSCALE)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005486 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005487
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005488 if (isThumb()) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005489 Builder.defineMacro("__THUMBEL__");
5490 Builder.defineMacro("__thumb__");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005491 if (supportsThumb2())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005492 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005493 }
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005494
5495 // ACLE 6.4.9 32-bit SIMD instructions
5496 if (ArchVersion >= 6 && (CPUProfile != "M" || CPUAttr == "7EM"))
5497 Builder.defineMacro("__ARM_FEATURE_SIMD32", "1");
5498
5499 // ACLE 6.4.10 Hardware Integer Divide
Eric Christopherb093d692015-10-09 18:39:59 +00005500 if (((HWDiv & HWDivThumb) && isThumb()) ||
5501 ((HWDiv & HWDivARM) && !isThumb())) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005502 Builder.defineMacro("__ARM_FEATURE_IDIV", "1");
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005503 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005504 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005505
5506 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005507 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005508
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005509 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005510 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005511 if (FPU & VFP2FPU)
5512 Builder.defineMacro("__ARM_VFPV2__");
5513 if (FPU & VFP3FPU)
5514 Builder.defineMacro("__ARM_VFPV3__");
5515 if (FPU & VFP4FPU)
5516 Builder.defineMacro("__ARM_VFPV4__");
Tim Northoverc67803f2016-12-21 20:49:43 +00005517 if (FPU & FPARMV8)
5518 Builder.defineMacro("__ARM_FPV5__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005519 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00005520
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005521 // This only gets set when Neon instructions are actually available, unlike
5522 // the VFP define, hence the soft float and arch check. This is subtly
5523 // different from gcc, we follow the intent which was that it should be set
5524 // when Neon instructions are actually available.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005525 if ((FPU & NeonFPU) && !SoftFloat && ArchVersion >= 7) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005526 Builder.defineMacro("__ARM_NEON", "1");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005527 Builder.defineMacro("__ARM_NEON__");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005528 // current AArch32 NEON implementations do not support double-precision
5529 // floating-point even when it is present in VFP.
Eric Christopherb093d692015-10-09 18:39:59 +00005530 Builder.defineMacro("__ARM_NEON_FP",
5531 "0x" + llvm::utohexstr(HW_FP & ~HW_FP_DP));
Tim Northover5bb34ca2013-11-21 12:36:34 +00005532 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00005533
Bradley Smith0f28f0c2014-01-20 10:52:00 +00005534 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
5535 Opts.ShortWChar ? "2" : "4");
5536
5537 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5538 Opts.ShortEnums ? "1" : "4");
5539
Bradley Smithf4affc12016-03-03 13:52:22 +00005540 if (ArchVersion >= 6 && CPUAttr != "6M" && CPUAttr != "8M_BASE") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00005541 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5542 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5543 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5544 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
5545 }
Sergey Dmitrouk745f5302014-11-25 08:57:36 +00005546
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005547 // ACLE 6.4.7 DSP instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005548 if (DSP) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005549 Builder.defineMacro("__ARM_FEATURE_DSP", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005550 }
5551
5552 // ACLE 6.4.8 Saturation instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005553 bool SAT = false;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005554 if ((ArchVersion == 6 && CPUProfile != "M") || ArchVersion > 6 ) {
5555 Builder.defineMacro("__ARM_FEATURE_SAT", "1");
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005556 SAT = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005557 }
5558
5559 // ACLE 6.4.6 Q (saturation) flag
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005560 if (DSP || SAT)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005561 Builder.defineMacro("__ARM_FEATURE_QBIT", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005562
5563 if (Opts.UnsafeFPMath)
5564 Builder.defineMacro("__ARM_FP_FAST", "1");
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005565
5566 if (ArchKind == llvm::ARM::AK_ARMV8_1A)
5567 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
Chris Lattner17df24e2008-04-21 18:56:49 +00005568 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005569
Craig Topper6c03a542015-10-19 04:51:35 +00005570 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5571 return llvm::makeArrayRef(BuiltinInfo,
5572 clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner17df24e2008-04-21 18:56:49 +00005573 }
Craig Topper3164f332014-03-11 03:39:26 +00005574 bool isCLZForZeroUndef() const override { return false; }
5575 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northover5627d392015-10-30 16:30:45 +00005576 return IsAAPCS
5577 ? AAPCSABIBuiltinVaList
Tim Northoverd88ecb32016-01-27 19:32:40 +00005578 : (getTriple().isWatchABI() ? TargetInfo::CharPtrBuiltinVaList
5579 : TargetInfo::VoidPtrBuiltinVaList);
Chris Lattner17df24e2008-04-21 18:56:49 +00005580 }
Craig Topperf054e3a2015-10-19 03:52:27 +00005581 ArrayRef<const char *> getGCCRegNames() const override;
5582 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00005583 bool validateAsmConstraint(const char *&Name,
5584 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00005585 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00005586 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00005587 case 'l': // r0-r7
5588 case 'h': // r8-r15
JF Bastien750caef2016-02-19 06:54:45 +00005589 case 't': // VFP Floating point register single precision
5590 case 'w': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00005591 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00005592 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005593 case 'I':
5594 case 'J':
5595 case 'K':
5596 case 'L':
5597 case 'M':
5598 // FIXME
5599 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00005600 case 'Q': // A memory address that is a single base register.
5601 Info.setAllowsMemory();
5602 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005603 case 'U': // a memory reference...
5604 switch (Name[1]) {
5605 case 'q': // ...ARMV4 ldrsb
5606 case 'v': // ...VFP load/store (reg+constant offset)
5607 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00005608 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00005609 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00005610 case 'n': // valid address for Neon doubleword vector load/store
5611 case 'm': // valid address for Neon element and structure load/store
5612 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00005613 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005614 Info.setAllowsMemory();
5615 Name++;
5616 return true;
5617 }
Nate Begeman2908fa02008-04-22 05:03:19 +00005618 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005619 return false;
5620 }
Craig Topper3164f332014-03-11 03:39:26 +00005621 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005622 std::string R;
5623 switch (*Constraint) {
5624 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00005625 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005626 Constraint++;
5627 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00005628 case 'p': // 'p' should be translated to 'r' by default.
5629 R = std::string("r");
5630 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005631 default:
5632 return std::string(1, *Constraint);
5633 }
5634 return R;
5635 }
Akira Hatanaka987f1862014-08-22 06:05:21 +00005636 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005637 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005638 std::string &SuggestedModifier) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00005639 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00005640 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00005641
Bill Wendling9d1ee112012-10-25 23:28:48 +00005642 // Strip off constraint modifiers.
5643 while (Constraint[0] == '=' ||
5644 Constraint[0] == '+' ||
5645 Constraint[0] == '&')
5646 Constraint = Constraint.substr(1);
5647
5648 switch (Constraint[0]) {
5649 default: break;
5650 case 'r': {
5651 switch (Modifier) {
5652 default:
Tim Northover8f24b172013-12-08 15:24:55 +00005653 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00005654 case 'q':
5655 // A register of size 32 cannot fit a vector type.
5656 return false;
5657 }
5658 }
5659 }
5660
5661 return true;
5662 }
Craig Topper3164f332014-03-11 03:39:26 +00005663 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00005664 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00005665 return "";
5666 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005667
Craig Topper3164f332014-03-11 03:39:26 +00005668 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00005669 switch (CC) {
5670 case CC_AAPCS:
5671 case CC_AAPCS_VFP:
5672 case CC_Swift:
5673 return CCCR_OK;
5674 default:
5675 return CCCR_Warning;
5676 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005677 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00005678
Craig Topper3164f332014-03-11 03:39:26 +00005679 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00005680 if (RegNo == 0) return 0;
5681 if (RegNo == 1) return 1;
5682 return -1;
5683 }
Matthias Braund1e2fad2015-07-17 00:15:22 +00005684
5685 bool hasSjLjLowering() const override {
5686 return true;
5687 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005688};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005689
Rafael Espindolaeb265472013-08-21 21:59:03 +00005690bool ARMTargetInfo::setFPMath(StringRef Name) {
5691 if (Name == "neon") {
5692 FPMath = FP_Neon;
5693 return true;
5694 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
5695 Name == "vfp4") {
5696 FPMath = FP_VFP;
5697 return true;
5698 }
5699 return false;
5700}
5701
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005702const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005703 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005704 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005705 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
5706
5707 // Float registers
5708 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
5709 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
5710 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005711 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005712
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005713 // Double registers
5714 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
5715 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005716 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
5717 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005718
5719 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005720 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
5721 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005722};
5723
Craig Topperf054e3a2015-10-19 03:52:27 +00005724ArrayRef<const char *> ARMTargetInfo::getGCCRegNames() const {
5725 return llvm::makeArrayRef(GCCRegNames);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005726}
5727
5728const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005729 { { "a1" }, "r0" },
5730 { { "a2" }, "r1" },
5731 { { "a3" }, "r2" },
5732 { { "a4" }, "r3" },
5733 { { "v1" }, "r4" },
5734 { { "v2" }, "r5" },
5735 { { "v3" }, "r6" },
5736 { { "v4" }, "r7" },
5737 { { "v5" }, "r8" },
5738 { { "v6", "rfp" }, "r9" },
5739 { { "sl" }, "r10" },
5740 { { "fp" }, "r11" },
5741 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00005742 { { "r13" }, "sp" },
5743 { { "r14" }, "lr" },
5744 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005745 // The S, D and Q registers overlap, but aren't really aliases; we
5746 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005747};
5748
Craig Topperf054e3a2015-10-19 03:52:27 +00005749ArrayRef<TargetInfo::GCCRegAlias> ARMTargetInfo::getGCCRegAliases() const {
5750 return llvm::makeArrayRef(GCCRegAliases);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005751}
Chris Lattner5cc15e02010-03-03 19:03:45 +00005752
5753const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00005754#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005755 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005756#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5757 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00005758#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00005759
Craig Topper07d3b622015-08-07 05:14:44 +00005760#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005761 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005762#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005763 { #ID, TYPE, ATTRS, nullptr, LANG, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005764#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5765 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Albert Gutowski2a0621e2016-10-12 22:01:05 +00005766#define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANGS, FEATURE) \
5767 { #ID, TYPE, ATTRS, HEADER, LANGS, FEATURE },
Chris Lattner5cc15e02010-03-03 19:03:45 +00005768#include "clang/Basic/BuiltinsARM.def"
5769};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005770
5771class ARMleTargetInfo : public ARMTargetInfo {
5772public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005773 ARMleTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Matt Arsenaultf333de32016-09-07 07:08:02 +00005774 : ARMTargetInfo(Triple, Opts) {}
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005775 void getTargetDefines(const LangOptions &Opts,
5776 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005777 Builder.defineMacro("__ARMEL__");
5778 ARMTargetInfo::getTargetDefines(Opts, Builder);
5779 }
5780};
5781
5782class ARMbeTargetInfo : public ARMTargetInfo {
5783public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005784 ARMbeTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Matt Arsenaultf333de32016-09-07 07:08:02 +00005785 : ARMTargetInfo(Triple, Opts) {}
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005786 void getTargetDefines(const LangOptions &Opts,
5787 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005788 Builder.defineMacro("__ARMEB__");
5789 Builder.defineMacro("__ARM_BIG_ENDIAN");
5790 ARMTargetInfo::getTargetDefines(Opts, Builder);
5791 }
5792};
Chris Lattner17df24e2008-04-21 18:56:49 +00005793
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005794class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
5795 const llvm::Triple Triple;
5796public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005797 WindowsARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5798 : WindowsTargetInfo<ARMleTargetInfo>(Triple, Opts), Triple(Triple) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005799 WCharType = UnsignedShort;
5800 SizeType = UnsignedInt;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005801 }
5802 void getVisualStudioDefines(const LangOptions &Opts,
5803 MacroBuilder &Builder) const {
5804 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
5805
5806 // FIXME: this is invalid for WindowsCE
5807 Builder.defineMacro("_M_ARM_NT", "1");
5808 Builder.defineMacro("_M_ARMT", "_M_ARM");
5809 Builder.defineMacro("_M_THUMB", "_M_ARM");
5810
5811 assert((Triple.getArch() == llvm::Triple::arm ||
5812 Triple.getArch() == llvm::Triple::thumb) &&
5813 "invalid architecture for Windows ARM target info");
5814 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
5815 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
5816
5817 // TODO map the complete set of values
5818 // 31: VFPv3 40: VFPv4
5819 Builder.defineMacro("_M_ARM_FP", "31");
5820 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00005821 BuiltinVaListKind getBuiltinVaListKind() const override {
5822 return TargetInfo::CharPtrBuiltinVaList;
5823 }
Martell Malone7ccda3c2015-08-14 18:00:09 +00005824 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5825 switch (CC) {
5826 case CC_X86StdCall:
5827 case CC_X86ThisCall:
5828 case CC_X86FastCall:
5829 case CC_X86VectorCall:
5830 return CCCR_Ignore;
5831 case CC_C:
5832 return CCCR_OK;
5833 default:
5834 return CCCR_Warning;
5835 }
5836 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005837};
5838
5839// Windows ARM + Itanium C++ ABI Target
5840class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
5841public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005842 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple,
5843 const TargetOptions &Opts)
5844 : WindowsARMTargetInfo(Triple, Opts) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005845 TheCXXABI.set(TargetCXXABI::GenericARM);
5846 }
5847
5848 void getTargetDefines(const LangOptions &Opts,
5849 MacroBuilder &Builder) const override {
5850 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5851
5852 if (Opts.MSVCCompat)
5853 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5854 }
5855};
5856
5857// Windows ARM, MS (C++) ABI
5858class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
5859public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005860 MicrosoftARMleTargetInfo(const llvm::Triple &Triple,
5861 const TargetOptions &Opts)
5862 : WindowsARMTargetInfo(Triple, Opts) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005863 TheCXXABI.set(TargetCXXABI::Microsoft);
5864 }
5865
5866 void getTargetDefines(const LangOptions &Opts,
5867 MacroBuilder &Builder) const override {
5868 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5869 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5870 }
5871};
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005872
Yaron Keren321249c2015-07-15 13:32:23 +00005873// ARM MinGW target
5874class MinGWARMTargetInfo : public WindowsARMTargetInfo {
5875public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005876 MinGWARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5877 : WindowsARMTargetInfo(Triple, Opts) {
Yaron Keren321249c2015-07-15 13:32:23 +00005878 TheCXXABI.set(TargetCXXABI::GenericARM);
5879 }
5880
5881 void getTargetDefines(const LangOptions &Opts,
5882 MacroBuilder &Builder) const override {
5883 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5884 DefineStd(Builder, "WIN32", Opts);
5885 DefineStd(Builder, "WINNT", Opts);
5886 Builder.defineMacro("_ARM_");
5887 addMinGWDefines(Opts, Builder);
5888 }
5889};
5890
5891// ARM Cygwin target
5892class CygwinARMTargetInfo : public ARMleTargetInfo {
5893public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005894 CygwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5895 : ARMleTargetInfo(Triple, Opts) {
Yaron Keren321249c2015-07-15 13:32:23 +00005896 TLSSupported = false;
5897 WCharType = UnsignedShort;
5898 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00005899 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Yaron Keren321249c2015-07-15 13:32:23 +00005900 }
5901 void getTargetDefines(const LangOptions &Opts,
5902 MacroBuilder &Builder) const override {
5903 ARMleTargetInfo::getTargetDefines(Opts, Builder);
5904 Builder.defineMacro("_ARM_");
5905 Builder.defineMacro("__CYGWIN__");
5906 Builder.defineMacro("__CYGWIN32__");
Saleem Abdulrasool56027092017-02-07 19:00:06 +00005907 DefineStd(Builder, "unix", Opts);
Yaron Keren321249c2015-07-15 13:32:23 +00005908 if (Opts.CPlusPlus)
5909 Builder.defineMacro("_GNU_SOURCE");
5910 }
5911};
5912
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005913class DarwinARMTargetInfo : public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00005914protected:
Craig Topper3164f332014-03-11 03:39:26 +00005915 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5916 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00005917 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00005918 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005919
Torok Edwinb2b37c62009-06-30 17:10:35 +00005920public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005921 DarwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5922 : DarwinTargetInfo<ARMleTargetInfo>(Triple, Opts) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005923 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005924 // iOS always has 64-bit atomic instructions.
Eric Christopher917e9522014-11-18 22:36:15 +00005925 // FIXME: This should be based off of the target features in
5926 // ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005927 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00005928
Tim Northoverd88ecb32016-01-27 19:32:40 +00005929 if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00005930 // Darwin on iOS uses a variant of the ARM C++ ABI.
5931 TheCXXABI.set(TargetCXXABI::WatchOS);
5932
5933 // The 32-bit ABI is silent on what ptrdiff_t should be, but given that
5934 // size_t is long, it's a bit weird for it to be int.
5935 PtrDiffType = SignedLong;
5936
5937 // BOOL should be a real boolean on the new ABI
5938 UseSignedCharForObjCBool = false;
5939 } else
5940 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005941 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005942};
Eli Friedmanf05b7722008-08-20 07:44:10 +00005943
Tim Northover573cbee2014-05-24 12:52:07 +00005944class AArch64TargetInfo : public TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00005945 virtual void setDataLayout() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00005946 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5947 static const char *const GCCRegNames[];
5948
James Molloy75f5f9e2014-04-16 15:33:48 +00005949 enum FPUModeEnum {
5950 FPUMode,
5951 NeonMode
5952 };
5953
5954 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00005955 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00005956 unsigned Crypto;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005957 unsigned Unaligned;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005958 unsigned V8_1A;
James Molloy75f5f9e2014-04-16 15:33:48 +00005959
Tim Northovera2ee4332014-03-29 15:09:45 +00005960 static const Builtin::Info BuiltinInfo[];
5961
5962 std::string ABI;
5963
5964public:
Saleem Abdulrasool9b5ba542016-04-10 03:19:47 +00005965 AArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Tim Northovera2ee4332014-03-29 15:09:45 +00005966 : TargetInfo(Triple), ABI("aapcs") {
Tim Northover25e8a672014-05-24 12:51:25 +00005967 if (getTriple().getOS() == llvm::Triple::NetBSD) {
5968 WCharType = SignedInt;
5969
5970 // NetBSD apparently prefers consistency across ARM targets to consistency
5971 // across 64-bit targets.
5972 Int64Type = SignedLongLong;
5973 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005974 } else {
5975 WCharType = UnsignedInt;
5976 Int64Type = SignedLong;
5977 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005978 }
5979
Tim Northovera2ee4332014-03-29 15:09:45 +00005980 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005981 MaxVectorAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005982 MaxAtomicInlineWidth = 128;
5983 MaxAtomicPromoteWidth = 128;
5984
Tim Northovera6a19f12015-02-06 01:25:07 +00005985 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 128;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00005986 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Tim Northovera2ee4332014-03-29 15:09:45 +00005987
Tim Northovera2ee4332014-03-29 15:09:45 +00005988 // {} in inline assembly are neon specifiers, not assembly variant
5989 // specifiers.
5990 NoAsmVariants = true;
5991
Tim Northover7ad87af2015-01-16 18:44:04 +00005992 // AAPCS gives rules for bitfields. 7.1.7 says: "The container type
5993 // contributes to the alignment of the containing aggregate in the same way
5994 // a plain (non bit-field) member of that type would, without exception for
5995 // zero-sized or anonymous bit-fields."
Tim Northover5627d392015-10-30 16:30:45 +00005996 assert(UseBitFieldTypeAlignment && "bitfields affect type alignment");
Tim Northover7ad87af2015-01-16 18:44:04 +00005997 UseZeroLengthBitfieldAlignment = true;
5998
Tim Northover573cbee2014-05-24 12:52:07 +00005999 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00006000 TheCXXABI.set(TargetCXXABI::GenericAArch64);
Saleem Abdulrasoolc066d9c2016-04-12 03:05:03 +00006001
6002 if (Triple.getOS() == llvm::Triple::Linux ||
6003 Triple.getOS() == llvm::Triple::UnknownOS)
6004 this->MCountName = Opts.EABIVersion == "gnu" ? "\01_mcount" : "mcount";
Tim Northovera2ee4332014-03-29 15:09:45 +00006005 }
6006
Alp Toker4925ba72014-06-07 23:30:42 +00006007 StringRef getABI() const override { return ABI; }
David Blaikie1cbb9712014-11-14 19:09:44 +00006008 bool setABI(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006009 if (Name != "aapcs" && Name != "darwinpcs")
6010 return false;
6011
6012 ABI = Name;
6013 return true;
6014 }
6015
David Blaikie1cbb9712014-11-14 19:09:44 +00006016 bool setCPU(const std::string &Name) override {
Zijiao Ma33e95212016-07-28 06:24:48 +00006017 return Name == "generic" ||
6018 llvm::AArch64::parseCPUArch(Name) !=
6019 static_cast<unsigned>(llvm::AArch64::ArchKind::AK_INVALID);
Tim Northovera2ee4332014-03-29 15:09:45 +00006020 }
6021
Alexander Kornienko34eb2072015-04-11 02:00:23 +00006022 void getTargetDefines(const LangOptions &Opts,
6023 MacroBuilder &Builder) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006024 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00006025 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00006026
6027 // Target properties.
6028 Builder.defineMacro("_LP64");
6029 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00006030
6031 // ACLE predefines. Many can only have one possible value on v8 AArch64.
6032 Builder.defineMacro("__ARM_ACLE", "200");
6033 Builder.defineMacro("__ARM_ARCH", "8");
6034 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
6035
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006036 Builder.defineMacro("__ARM_64BIT_STATE", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00006037 Builder.defineMacro("__ARM_PCS_AAPCS64", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006038 Builder.defineMacro("__ARM_ARCH_ISA_A64", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00006039
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006040 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
6041 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
6042 Builder.defineMacro("__ARM_FEATURE_LDREX", "0xF");
6043 Builder.defineMacro("__ARM_FEATURE_IDIV", "1"); // As specified in ACLE
James Molloy0ffb0932014-09-15 11:25:38 +00006044 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006045 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
6046 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00006047
6048 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
6049
6050 // 0xe implies support for half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006051 Builder.defineMacro("__ARM_FP", "0xE");
Tim Northovera2ee4332014-03-29 15:09:45 +00006052
6053 // PCS specifies this for SysV variants, which is all we support. Other ABIs
6054 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006055 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
6056 Builder.defineMacro("__ARM_FP16_ARGS", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00006057
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00006058 if (Opts.UnsafeFPMath)
6059 Builder.defineMacro("__ARM_FP_FAST", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00006060
6061 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
6062
6063 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
6064 Opts.ShortEnums ? "1" : "4");
6065
James Molloy75f5f9e2014-04-16 15:33:48 +00006066 if (FPU == NeonMode) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006067 Builder.defineMacro("__ARM_NEON", "1");
James Molloy75f5f9e2014-04-16 15:33:48 +00006068 // 64-bit NEON supports half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006069 Builder.defineMacro("__ARM_NEON_FP", "0xE");
James Molloy75f5f9e2014-04-16 15:33:48 +00006070 }
Tim Northovera2ee4332014-03-29 15:09:45 +00006071
Bradley Smith418c5932014-05-02 15:17:51 +00006072 if (CRC)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006073 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
Bradley Smith418c5932014-05-02 15:17:51 +00006074
James Molloy75f5f9e2014-04-16 15:33:48 +00006075 if (Crypto)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006076 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
6077
6078 if (Unaligned)
6079 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Reid Klecknerd167d422015-05-06 15:31:46 +00006080
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00006081 if (V8_1A)
6082 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
6083
Reid Klecknerd167d422015-05-06 15:31:46 +00006084 // All of the __sync_(bool|val)_compare_and_swap_(1|2|4|8) builtins work.
6085 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
6086 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
6087 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
6088 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Tim Northovera2ee4332014-03-29 15:09:45 +00006089 }
6090
Craig Topper6c03a542015-10-19 04:51:35 +00006091 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6092 return llvm::makeArrayRef(BuiltinInfo,
6093 clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin);
Tim Northovera2ee4332014-03-29 15:09:45 +00006094 }
6095
David Blaikie1cbb9712014-11-14 19:09:44 +00006096 bool hasFeature(StringRef Feature) const override {
James Molloy75f5f9e2014-04-16 15:33:48 +00006097 return Feature == "aarch64" ||
6098 Feature == "arm64" ||
Ben Langmuir587aeaf2015-08-07 01:59:56 +00006099 Feature == "arm" ||
James Molloy75f5f9e2014-04-16 15:33:48 +00006100 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00006101 }
6102
James Molloy5e73df52014-04-16 15:06:20 +00006103 bool handleTargetFeatures(std::vector<std::string> &Features,
6104 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00006105 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00006106 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00006107 Crypto = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006108 Unaligned = 1;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00006109 V8_1A = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006110
Eric Christopher610fe112015-08-26 08:21:55 +00006111 for (const auto &Feature : Features) {
6112 if (Feature == "+neon")
James Molloy75f5f9e2014-04-16 15:33:48 +00006113 FPU = NeonMode;
Eric Christopher610fe112015-08-26 08:21:55 +00006114 if (Feature == "+crc")
Bradley Smith418c5932014-05-02 15:17:51 +00006115 CRC = 1;
Eric Christopher610fe112015-08-26 08:21:55 +00006116 if (Feature == "+crypto")
James Molloy75f5f9e2014-04-16 15:33:48 +00006117 Crypto = 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006118 if (Feature == "+strict-align")
6119 Unaligned = 0;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00006120 if (Feature == "+v8.1a")
6121 V8_1A = 1;
James Molloy75f5f9e2014-04-16 15:33:48 +00006122 }
6123
James Y Knightb214cbc2016-03-04 19:00:41 +00006124 setDataLayout();
James Molloy5e73df52014-04-16 15:06:20 +00006125
6126 return true;
6127 }
6128
John McCall477f2bb2016-03-03 06:39:32 +00006129 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
6130 switch (CC) {
6131 case CC_C:
6132 case CC_Swift:
Roman Levenstein35aa5ce2016-03-16 18:00:46 +00006133 case CC_PreserveMost:
6134 case CC_PreserveAll:
John McCall477f2bb2016-03-03 06:39:32 +00006135 return CCCR_OK;
6136 default:
6137 return CCCR_Warning;
6138 }
6139 }
6140
David Blaikie1cbb9712014-11-14 19:09:44 +00006141 bool isCLZForZeroUndef() const override { return false; }
Tim Northovera2ee4332014-03-29 15:09:45 +00006142
David Blaikie1cbb9712014-11-14 19:09:44 +00006143 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006144 return TargetInfo::AArch64ABIBuiltinVaList;
6145 }
6146
Craig Topperf054e3a2015-10-19 03:52:27 +00006147 ArrayRef<const char *> getGCCRegNames() const override;
6148 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00006149
Alexander Kornienko34eb2072015-04-11 02:00:23 +00006150 bool validateAsmConstraint(const char *&Name,
6151 TargetInfo::ConstraintInfo &Info) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006152 switch (*Name) {
6153 default:
6154 return false;
6155 case 'w': // Floating point and SIMD registers (V0-V31)
6156 Info.setAllowsRegister();
6157 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00006158 case 'I': // Constant that can be used with an ADD instruction
6159 case 'J': // Constant that can be used with a SUB instruction
6160 case 'K': // Constant that can be used with a 32-bit logical instruction
6161 case 'L': // Constant that can be used with a 64-bit logical instruction
6162 case 'M': // Constant that can be used as a 32-bit MOV immediate
6163 case 'N': // Constant that can be used as a 64-bit MOV immediate
6164 case 'Y': // Floating point constant zero
6165 case 'Z': // Integer constant zero
6166 return true;
6167 case 'Q': // A memory reference with base register and no offset
6168 Info.setAllowsMemory();
6169 return true;
6170 case 'S': // A symbolic address
6171 Info.setAllowsRegister();
6172 return true;
6173 case 'U':
Eric Christopher917e9522014-11-18 22:36:15 +00006174 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
6175 // Utf: A memory address suitable for ldp/stp in TF mode.
6176 // Usa: An absolute symbolic address.
6177 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
6178 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
Tim Northovera2ee4332014-03-29 15:09:45 +00006179 case 'z': // Zero register, wzr or xzr
6180 Info.setAllowsRegister();
6181 return true;
6182 case 'x': // Floating point and SIMD registers (V0-V15)
6183 Info.setAllowsRegister();
6184 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00006185 }
6186 return false;
6187 }
6188
Akira Hatanaka987f1862014-08-22 06:05:21 +00006189 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00006190 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00006191 std::string &SuggestedModifier) const override {
James Molloy8a157bf2014-07-25 10:19:47 +00006192 // Strip off constraint modifiers.
6193 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
6194 Constraint = Constraint.substr(1);
6195
6196 switch (Constraint[0]) {
6197 default:
6198 return true;
6199 case 'z':
6200 case 'r': {
6201 switch (Modifier) {
6202 case 'x':
6203 case 'w':
6204 // For now assume that the person knows what they're
6205 // doing with the modifier.
6206 return true;
6207 default:
6208 // By default an 'r' constraint will be in the 'x'
6209 // registers.
Akira Hatanaka987f1862014-08-22 06:05:21 +00006210 if (Size == 64)
6211 return true;
6212
6213 SuggestedModifier = "w";
6214 return false;
James Molloy8a157bf2014-07-25 10:19:47 +00006215 }
6216 }
6217 }
6218 }
6219
David Blaikie1cbb9712014-11-14 19:09:44 +00006220 const char *getClobbers() const override { return ""; }
Tim Northovera2ee4332014-03-29 15:09:45 +00006221
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00006222 int getEHDataRegisterNumber(unsigned RegNo) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006223 if (RegNo == 0)
6224 return 0;
6225 if (RegNo == 1)
6226 return 1;
6227 return -1;
6228 }
6229};
6230
Tim Northover573cbee2014-05-24 12:52:07 +00006231const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00006232 // 32-bit Integer registers
6233 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
6234 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
6235 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
6236
6237 // 64-bit Integer registers
6238 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
6239 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
6240 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
6241
6242 // 32-bit floating point regsisters
6243 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
6244 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
6245 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
6246
6247 // 64-bit floating point regsisters
6248 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
6249 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
6250 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
6251
6252 // Vector registers
6253 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
6254 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
6255 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
6256};
6257
Craig Topperf054e3a2015-10-19 03:52:27 +00006258ArrayRef<const char *> AArch64TargetInfo::getGCCRegNames() const {
6259 return llvm::makeArrayRef(GCCRegNames);
Tim Northovera2ee4332014-03-29 15:09:45 +00006260}
6261
Tim Northover573cbee2014-05-24 12:52:07 +00006262const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00006263 { { "w31" }, "wsp" },
6264 { { "x29" }, "fp" },
6265 { { "x30" }, "lr" },
6266 { { "x31" }, "sp" },
6267 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
6268 // don't want to substitute one of these for a different-sized one.
6269};
6270
Craig Topperf054e3a2015-10-19 03:52:27 +00006271ArrayRef<TargetInfo::GCCRegAlias> AArch64TargetInfo::getGCCRegAliases() const {
6272 return llvm::makeArrayRef(GCCRegAliases);
Tim Northovera2ee4332014-03-29 15:09:45 +00006273}
6274
Tim Northover573cbee2014-05-24 12:52:07 +00006275const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00006276#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006277 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00006278#include "clang/Basic/BuiltinsNEON.def"
6279
6280#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006281 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northover573cbee2014-05-24 12:52:07 +00006282#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00006283};
James Molloy5e73df52014-04-16 15:06:20 +00006284
Tim Northover573cbee2014-05-24 12:52:07 +00006285class AArch64leTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00006286 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00006287 if (getTriple().isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00006288 resetDataLayout("e-m:o-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006289 else
Chad Rosier4c077aa2016-07-07 20:02:25 +00006290 resetDataLayout("e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006291 }
6292
6293public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006294 AArch64leTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6295 : AArch64TargetInfo(Triple, Opts) {
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006296 }
James Molloy5e73df52014-04-16 15:06:20 +00006297 void getTargetDefines(const LangOptions &Opts,
6298 MacroBuilder &Builder) const override {
6299 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00006300 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00006301 }
6302};
6303
Tim Northover573cbee2014-05-24 12:52:07 +00006304class AArch64beTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00006305 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00006306 assert(!getTriple().isOSBinFormatMachO());
Chad Rosier4c077aa2016-07-07 20:02:25 +00006307 resetDataLayout("E-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006308 }
6309
6310public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006311 AArch64beTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6312 : AArch64TargetInfo(Triple, Opts) {}
James Molloy5e73df52014-04-16 15:06:20 +00006313 void getTargetDefines(const LangOptions &Opts,
6314 MacroBuilder &Builder) const override {
6315 Builder.defineMacro("__AARCH64EB__");
6316 Builder.defineMacro("__AARCH_BIG_ENDIAN");
6317 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00006318 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00006319 }
6320};
Tim Northovera2ee4332014-03-29 15:09:45 +00006321
Tim Northover573cbee2014-05-24 12:52:07 +00006322class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00006323protected:
6324 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
6325 MacroBuilder &Builder) const override {
6326 Builder.defineMacro("__AARCH64_SIMD__");
6327 Builder.defineMacro("__ARM64_ARCH_8__");
6328 Builder.defineMacro("__ARM_NEON__");
6329 Builder.defineMacro("__LITTLE_ENDIAN__");
6330 Builder.defineMacro("__REGISTER_PREFIX__", "");
6331 Builder.defineMacro("__arm64", "1");
6332 Builder.defineMacro("__arm64__", "1");
6333
6334 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
6335 }
6336
Tim Northovera2ee4332014-03-29 15:09:45 +00006337public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006338 DarwinAArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6339 : DarwinTargetInfo<AArch64leTargetInfo>(Triple, Opts) {
Tim Northovera2ee4332014-03-29 15:09:45 +00006340 Int64Type = SignedLongLong;
6341 WCharType = SignedInt;
6342 UseSignedCharForObjCBool = false;
6343
Tim Northovera6a19f12015-02-06 01:25:07 +00006344 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00006345 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Tim Northovera2ee4332014-03-29 15:09:45 +00006346
6347 TheCXXABI.set(TargetCXXABI::iOS64);
6348 }
6349
David Blaikie1cbb9712014-11-14 19:09:44 +00006350 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006351 return TargetInfo::CharPtrBuiltinVaList;
6352 }
6353};
Tim Northovera2ee4332014-03-29 15:09:45 +00006354
Tony Linthicum76329bf2011-12-12 21:14:55 +00006355// Hexagon abstract base class
6356class HexagonTargetInfo : public TargetInfo {
6357 static const Builtin::Info BuiltinInfo[];
6358 static const char * const GCCRegNames[];
6359 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6360 std::string CPU;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006361 bool HasHVX, HasHVXDouble;
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006362 bool UseLongCalls;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006363
Tony Linthicum76329bf2011-12-12 21:14:55 +00006364public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006365 HexagonTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6366 : TargetInfo(Triple) {
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00006367 // Specify the vector alignment explicitly. For v512x1, the calculated
6368 // alignment would be 512*alignment(i1), which is 512 bytes, instead of
6369 // the required minimum of 64 bytes.
James Y Knightb214cbc2016-03-04 19:00:41 +00006370 resetDataLayout("e-m:e-p:32:32:32-a:0-n16:32-"
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00006371 "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 +00006372 "v32:32:32-v64:64:64-v512:512:512-v1024:1024:1024-v2048:2048:2048");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006373 SizeType = UnsignedInt;
6374 PtrDiffType = SignedInt;
6375 IntPtrType = SignedInt;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006376
6377 // {} in inline assembly are packet specifiers, not assembly variant
6378 // specifiers.
6379 NoAsmVariants = true;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006380
6381 LargeArrayMinWidth = 64;
6382 LargeArrayAlign = 64;
6383 UseBitFieldTypeAlignment = true;
6384 ZeroLengthBitfieldBoundary = 32;
6385 HasHVX = HasHVXDouble = false;
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006386 UseLongCalls = false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006387 }
6388
Craig Topper6c03a542015-10-19 04:51:35 +00006389 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6390 return llvm::makeArrayRef(BuiltinInfo,
6391 clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006392 }
6393
Craig Topper3164f332014-03-11 03:39:26 +00006394 bool validateAsmConstraint(const char *&Name,
6395 TargetInfo::ConstraintInfo &Info) const override {
Krzysztof Parzyszeke0026e42016-05-18 14:56:14 +00006396 switch (*Name) {
6397 case 'v':
6398 case 'q':
6399 if (HasHVX) {
6400 Info.setAllowsRegister();
6401 return true;
6402 }
6403 break;
Krzysztof Parzyszek89fb4412016-05-20 13:50:32 +00006404 case 's':
6405 // Relocatable constant.
6406 return true;
Krzysztof Parzyszeke0026e42016-05-18 14:56:14 +00006407 }
6408 return false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006409 }
6410
Craig Topper3164f332014-03-11 03:39:26 +00006411 void getTargetDefines(const LangOptions &Opts,
6412 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006413
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006414 bool isCLZForZeroUndef() const override { return false; }
6415
Craig Topper3164f332014-03-11 03:39:26 +00006416 bool hasFeature(StringRef Feature) const override {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006417 return llvm::StringSwitch<bool>(Feature)
6418 .Case("hexagon", true)
6419 .Case("hvx", HasHVX)
6420 .Case("hvx-double", HasHVXDouble)
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006421 .Case("long-calls", UseLongCalls)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006422 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006423 }
Craig Topper3164f332014-03-11 03:39:26 +00006424
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006425 bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6426 StringRef CPU, const std::vector<std::string> &FeaturesVec)
6427 const override;
6428
6429 bool handleTargetFeatures(std::vector<std::string> &Features,
6430 DiagnosticsEngine &Diags) override;
6431
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006432 void setFeatureEnabled(llvm::StringMap<bool> &Features, StringRef Name,
6433 bool Enabled) const override;
6434
Craig Topper3164f332014-03-11 03:39:26 +00006435 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006436 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006437 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006438 ArrayRef<const char *> getGCCRegNames() const override;
6439 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00006440 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006441 return "";
6442 }
Sebastian Pop86500282012-01-13 20:37:10 +00006443
6444 static const char *getHexagonCPUSuffix(StringRef Name) {
6445 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00006446 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006447 .Case("hexagonv5", "5")
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006448 .Case("hexagonv55", "55")
6449 .Case("hexagonv60", "60")
Craig Topperf1186c52014-05-08 06:41:40 +00006450 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00006451 }
6452
Craig Topper3164f332014-03-11 03:39:26 +00006453 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00006454 if (!getHexagonCPUSuffix(Name))
6455 return false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006456 CPU = Name;
6457 return true;
6458 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006459
6460 int getEHDataRegisterNumber(unsigned RegNo) const override {
6461 return RegNo < 2 ? RegNo : -1;
6462 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006463};
6464
6465void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006466 MacroBuilder &Builder) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006467 Builder.defineMacro("__qdsp6__", "1");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006468 Builder.defineMacro("__hexagon__", "1");
6469
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006470 if (CPU == "hexagonv4") {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006471 Builder.defineMacro("__HEXAGON_V4__");
6472 Builder.defineMacro("__HEXAGON_ARCH__", "4");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006473 if (Opts.HexagonQdsp6Compat) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006474 Builder.defineMacro("__QDSP6_V4__");
6475 Builder.defineMacro("__QDSP6_ARCH__", "4");
6476 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006477 } else if (CPU == "hexagonv5") {
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006478 Builder.defineMacro("__HEXAGON_V5__");
6479 Builder.defineMacro("__HEXAGON_ARCH__", "5");
6480 if(Opts.HexagonQdsp6Compat) {
6481 Builder.defineMacro("__QDSP6_V5__");
6482 Builder.defineMacro("__QDSP6_ARCH__", "5");
6483 }
Krzysztof Parzyszeka58ff512016-04-21 14:30:04 +00006484 } else if (CPU == "hexagonv55") {
6485 Builder.defineMacro("__HEXAGON_V55__");
6486 Builder.defineMacro("__HEXAGON_ARCH__", "55");
6487 Builder.defineMacro("__QDSP6_V55__");
6488 Builder.defineMacro("__QDSP6_ARCH__", "55");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006489 } else if (CPU == "hexagonv60") {
6490 Builder.defineMacro("__HEXAGON_V60__");
6491 Builder.defineMacro("__HEXAGON_ARCH__", "60");
6492 Builder.defineMacro("__QDSP6_V60__");
6493 Builder.defineMacro("__QDSP6_ARCH__", "60");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006494 }
Krzysztof Parzyszek7f0756c2016-04-18 18:38:11 +00006495
6496 if (hasFeature("hvx")) {
6497 Builder.defineMacro("__HVX__");
6498 if (hasFeature("hvx-double"))
6499 Builder.defineMacro("__HVXDBL__");
6500 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006501}
6502
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006503bool HexagonTargetInfo::initFeatureMap(llvm::StringMap<bool> &Features,
6504 DiagnosticsEngine &Diags, StringRef CPU,
6505 const std::vector<std::string> &FeaturesVec) const {
6506 // Default for v60: -hvx, -hvx-double.
6507 Features["hvx"] = false;
6508 Features["hvx-double"] = false;
6509 Features["long-calls"] = false;
6510
6511 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
6512}
6513
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006514bool HexagonTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
6515 DiagnosticsEngine &Diags) {
6516 for (auto &F : Features) {
6517 if (F == "+hvx")
6518 HasHVX = true;
6519 else if (F == "-hvx")
6520 HasHVX = HasHVXDouble = false;
6521 else if (F == "+hvx-double")
6522 HasHVX = HasHVXDouble = true;
6523 else if (F == "-hvx-double")
6524 HasHVXDouble = false;
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006525
6526 if (F == "+long-calls")
6527 UseLongCalls = true;
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006528 else if (F == "-long-calls")
6529 UseLongCalls = false;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006530 }
6531 return true;
6532}
6533
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006534void HexagonTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
6535 StringRef Name, bool Enabled) const {
6536 if (Enabled) {
6537 if (Name == "hvx-double")
6538 Features["hvx"] = true;
6539 } else {
6540 if (Name == "hvx")
6541 Features["hvx-double"] = false;
6542 }
6543 Features[Name] = Enabled;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006544}
6545
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006546const char *const HexagonTargetInfo::GCCRegNames[] = {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006547 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6548 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6549 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6550 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
6551 "p0", "p1", "p2", "p3",
6552 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
6553};
6554
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006555ArrayRef<const char*> HexagonTargetInfo::getGCCRegNames() const {
Craig Topperf054e3a2015-10-19 03:52:27 +00006556 return llvm::makeArrayRef(GCCRegNames);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006557}
6558
Tony Linthicum76329bf2011-12-12 21:14:55 +00006559const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
6560 { { "sp" }, "r29" },
6561 { { "fp" }, "r30" },
6562 { { "lr" }, "r31" },
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006563};
Tony Linthicum76329bf2011-12-12 21:14:55 +00006564
Craig Topperf054e3a2015-10-19 03:52:27 +00006565ArrayRef<TargetInfo::GCCRegAlias> HexagonTargetInfo::getGCCRegAliases() const {
6566 return llvm::makeArrayRef(GCCRegAliases);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006567}
6568
6569
6570const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00006571#define BUILTIN(ID, TYPE, ATTRS) \
6572 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
6573#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
6574 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tony Linthicum76329bf2011-12-12 21:14:55 +00006575#include "clang/Basic/BuiltinsHexagon.def"
6576};
Tony Linthicum76329bf2011-12-12 21:14:55 +00006577
Jacques Pienaard964cc22016-03-28 21:02:54 +00006578class LanaiTargetInfo : public TargetInfo {
6579 // Class for Lanai (32-bit).
6580 // The CPU profiles supported by the Lanai backend
6581 enum CPUKind {
6582 CK_NONE,
6583 CK_V11,
6584 } CPU;
6585
6586 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6587 static const char *const GCCRegNames[];
6588
6589public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006590 LanaiTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6591 : TargetInfo(Triple) {
Jacques Pienaard964cc22016-03-28 21:02:54 +00006592 // Description string has to be kept in sync with backend.
6593 resetDataLayout("E" // Big endian
6594 "-m:e" // ELF name manging
6595 "-p:32:32" // 32 bit pointers, 32 bit aligned
6596 "-i64:64" // 64 bit integers, 64 bit aligned
6597 "-a:0:32" // 32 bit alignment of objects of aggregate type
6598 "-n32" // 32 bit native integer width
6599 "-S64" // 64 bit natural stack alignment
6600 );
6601
6602 // Setting RegParmMax equal to what mregparm was set to in the old
6603 // toolchain
6604 RegParmMax = 4;
6605
6606 // Set the default CPU to V11
6607 CPU = CK_V11;
6608
6609 // Temporary approach to make everything at least word-aligned and allow for
6610 // safely casting between pointers with different alignment requirements.
6611 // TODO: Remove this when there are no more cast align warnings on the
6612 // firmware.
6613 MinGlobalAlign = 32;
6614 }
6615
6616 void getTargetDefines(const LangOptions &Opts,
6617 MacroBuilder &Builder) const override {
6618 // Define __lanai__ when building for target lanai.
6619 Builder.defineMacro("__lanai__");
6620
6621 // Set define for the CPU specified.
6622 switch (CPU) {
6623 case CK_V11:
6624 Builder.defineMacro("__LANAI_V11__");
6625 break;
6626 case CK_NONE:
6627 llvm_unreachable("Unhandled target CPU");
6628 }
6629 }
6630
6631 bool setCPU(const std::string &Name) override {
6632 CPU = llvm::StringSwitch<CPUKind>(Name)
6633 .Case("v11", CK_V11)
6634 .Default(CK_NONE);
6635
6636 return CPU != CK_NONE;
6637 }
6638
6639 bool hasFeature(StringRef Feature) const override {
6640 return llvm::StringSwitch<bool>(Feature).Case("lanai", true).Default(false);
6641 }
6642
6643 ArrayRef<const char *> getGCCRegNames() const override;
6644
6645 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
6646
6647 BuiltinVaListKind getBuiltinVaListKind() const override {
6648 return TargetInfo::VoidPtrBuiltinVaList;
6649 }
6650
6651 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
6652
6653 bool validateAsmConstraint(const char *&Name,
6654 TargetInfo::ConstraintInfo &info) const override {
6655 return false;
6656 }
6657
6658 const char *getClobbers() const override { return ""; }
6659};
6660
6661const char *const LanaiTargetInfo::GCCRegNames[] = {
6662 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10",
6663 "r11", "r12", "r13", "r14", "r15", "r16", "r17", "r18", "r19", "r20", "r21",
6664 "r22", "r23", "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"};
6665
6666ArrayRef<const char *> LanaiTargetInfo::getGCCRegNames() const {
6667 return llvm::makeArrayRef(GCCRegNames);
6668}
6669
6670const TargetInfo::GCCRegAlias LanaiTargetInfo::GCCRegAliases[] = {
6671 {{"pc"}, "r2"},
6672 {{"sp"}, "r4"},
6673 {{"fp"}, "r5"},
6674 {{"rv"}, "r8"},
6675 {{"rr1"}, "r10"},
6676 {{"rr2"}, "r11"},
6677 {{"rca"}, "r15"},
6678};
6679
6680ArrayRef<TargetInfo::GCCRegAlias> LanaiTargetInfo::getGCCRegAliases() const {
6681 return llvm::makeArrayRef(GCCRegAliases);
6682}
6683
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006684// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
6685class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00006686 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6687 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006688 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00006689public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006690 SparcTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
James Y Knighta3518ad2016-01-27 01:04:51 +00006691 : TargetInfo(Triple), SoftFloat(false) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006692
Joerg Sonnenbergerd0be8dc2016-03-07 17:19:15 +00006693 int getEHDataRegisterNumber(unsigned RegNo) const override {
6694 if (RegNo == 0) return 24;
6695 if (RegNo == 1) return 25;
6696 return -1;
6697 }
6698
Craig Topper3164f332014-03-11 03:39:26 +00006699 bool handleTargetFeatures(std::vector<std::string> &Features,
6700 DiagnosticsEngine &Diags) override {
Jacob Baungard Hansen13a49372016-05-24 08:30:08 +00006701 // Check if software floating point is enabled
Eric Christopherfb481a42015-04-29 23:32:17 +00006702 auto Feature = std::find(Features.begin(), Features.end(), "+soft-float");
6703 if (Feature != Features.end()) {
6704 SoftFloat = true;
Eric Christopherfb481a42015-04-29 23:32:17 +00006705 }
Rafael Espindolaeb265472013-08-21 21:59:03 +00006706 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006707 }
Craig Topper3164f332014-03-11 03:39:26 +00006708 void getTargetDefines(const LangOptions &Opts,
6709 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006710 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006711 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006712
6713 if (SoftFloat)
6714 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00006715 }
Craig Topper3164f332014-03-11 03:39:26 +00006716
6717 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006718 return llvm::StringSwitch<bool>(Feature)
6719 .Case("softfloat", SoftFloat)
6720 .Case("sparc", true)
6721 .Default(false);
6722 }
Craig Topper3164f332014-03-11 03:39:26 +00006723
Chris Dewhurst0381cd72016-06-15 12:44:47 +00006724 bool hasSjLjLowering() const override {
6725 return true;
6726 }
6727
Craig Topper6c03a542015-10-19 04:51:35 +00006728 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006729 // FIXME: Implement!
Craig Topper6c03a542015-10-19 04:51:35 +00006730 return None;
Gabor Greif49991682008-02-21 16:29:08 +00006731 }
Craig Topper3164f332014-03-11 03:39:26 +00006732 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006733 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00006734 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006735 ArrayRef<const char *> getGCCRegNames() const override;
6736 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00006737 bool validateAsmConstraint(const char *&Name,
6738 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006739 // FIXME: Implement!
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00006740 switch (*Name) {
6741 case 'I': // Signed 13-bit constant
6742 case 'J': // Zero
6743 case 'K': // 32-bit constant with the low 12 bits clear
6744 case 'L': // A constant in the range supported by movcc (11-bit signed imm)
6745 case 'M': // A constant in the range supported by movrcc (19-bit signed imm)
6746 case 'N': // Same as 'K' but zext (required for SIMode)
6747 case 'O': // The constant 4096
6748 return true;
6749 }
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006750 return false;
Gabor Greif49991682008-02-21 16:29:08 +00006751 }
Craig Topper3164f332014-03-11 03:39:26 +00006752 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006753 // FIXME: Implement!
6754 return "";
Gabor Greif49991682008-02-21 16:29:08 +00006755 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006756
6757 // No Sparc V7 for now, the backend doesn't support it anyway.
6758 enum CPUKind {
6759 CK_GENERIC,
6760 CK_V8,
6761 CK_SUPERSPARC,
6762 CK_SPARCLITE,
6763 CK_F934,
6764 CK_HYPERSPARC,
6765 CK_SPARCLITE86X,
6766 CK_SPARCLET,
6767 CK_TSC701,
6768 CK_V9,
6769 CK_ULTRASPARC,
6770 CK_ULTRASPARC3,
6771 CK_NIAGARA,
6772 CK_NIAGARA2,
6773 CK_NIAGARA3,
Douglas Katzman6871afc2016-03-15 22:34:02 +00006774 CK_NIAGARA4,
Douglas Katzman87da5f42016-07-25 16:36:02 +00006775 CK_MYRIAD2100,
6776 CK_MYRIAD2150,
6777 CK_MYRIAD2450,
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006778 CK_LEON2,
6779 CK_LEON2_AT697E,
6780 CK_LEON2_AT697F,
6781 CK_LEON3,
6782 CK_LEON3_UT699,
6783 CK_LEON3_GR712RC,
6784 CK_LEON4,
6785 CK_LEON4_GR740
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006786 } CPU = CK_GENERIC;
6787
6788 enum CPUGeneration {
6789 CG_V8,
6790 CG_V9,
6791 };
6792
6793 CPUGeneration getCPUGeneration(CPUKind Kind) const {
6794 switch (Kind) {
6795 case CK_GENERIC:
6796 case CK_V8:
6797 case CK_SUPERSPARC:
6798 case CK_SPARCLITE:
6799 case CK_F934:
6800 case CK_HYPERSPARC:
6801 case CK_SPARCLITE86X:
6802 case CK_SPARCLET:
6803 case CK_TSC701:
Douglas Katzman87da5f42016-07-25 16:36:02 +00006804 case CK_MYRIAD2100:
6805 case CK_MYRIAD2150:
6806 case CK_MYRIAD2450:
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006807 case CK_LEON2:
6808 case CK_LEON2_AT697E:
6809 case CK_LEON2_AT697F:
6810 case CK_LEON3:
6811 case CK_LEON3_UT699:
6812 case CK_LEON3_GR712RC:
6813 case CK_LEON4:
6814 case CK_LEON4_GR740:
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006815 return CG_V8;
6816 case CK_V9:
6817 case CK_ULTRASPARC:
6818 case CK_ULTRASPARC3:
6819 case CK_NIAGARA:
6820 case CK_NIAGARA2:
6821 case CK_NIAGARA3:
6822 case CK_NIAGARA4:
6823 return CG_V9;
6824 }
Aaron Ballmana9a72852015-11-11 13:42:02 +00006825 llvm_unreachable("Unexpected CPU kind");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006826 }
6827
6828 CPUKind getCPUKind(StringRef Name) const {
6829 return llvm::StringSwitch<CPUKind>(Name)
6830 .Case("v8", CK_V8)
6831 .Case("supersparc", CK_SUPERSPARC)
6832 .Case("sparclite", CK_SPARCLITE)
6833 .Case("f934", CK_F934)
6834 .Case("hypersparc", CK_HYPERSPARC)
6835 .Case("sparclite86x", CK_SPARCLITE86X)
6836 .Case("sparclet", CK_SPARCLET)
6837 .Case("tsc701", CK_TSC701)
6838 .Case("v9", CK_V9)
6839 .Case("ultrasparc", CK_ULTRASPARC)
6840 .Case("ultrasparc3", CK_ULTRASPARC3)
6841 .Case("niagara", CK_NIAGARA)
6842 .Case("niagara2", CK_NIAGARA2)
6843 .Case("niagara3", CK_NIAGARA3)
6844 .Case("niagara4", CK_NIAGARA4)
Douglas Katzman87da5f42016-07-25 16:36:02 +00006845 .Case("ma2100", CK_MYRIAD2100)
6846 .Case("ma2150", CK_MYRIAD2150)
6847 .Case("ma2450", CK_MYRIAD2450)
6848 // FIXME: the myriad2[.n] spellings are obsolete,
6849 // but a grace period is needed to allow updating dependent builds.
6850 .Case("myriad2", CK_MYRIAD2100)
6851 .Case("myriad2.1", CK_MYRIAD2100)
6852 .Case("myriad2.2", CK_MYRIAD2150)
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006853 .Case("leon2", CK_LEON2)
6854 .Case("at697e", CK_LEON2_AT697E)
6855 .Case("at697f", CK_LEON2_AT697F)
6856 .Case("leon3", CK_LEON3)
6857 .Case("ut699", CK_LEON3_UT699)
6858 .Case("gr712rc", CK_LEON3_GR712RC)
6859 .Case("leon4", CK_LEON4)
6860 .Case("gr740", CK_LEON4_GR740)
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006861 .Default(CK_GENERIC);
6862 }
6863
6864 bool setCPU(const std::string &Name) override {
6865 CPU = getCPUKind(Name);
6866 return CPU != CK_GENERIC;
6867 }
Gabor Greif49991682008-02-21 16:29:08 +00006868};
6869
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006870const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00006871 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6872 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6873 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6874 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
6875};
6876
Craig Topperf054e3a2015-10-19 03:52:27 +00006877ArrayRef<const char *> SparcTargetInfo::getGCCRegNames() const {
6878 return llvm::makeArrayRef(GCCRegNames);
Chris Lattner9b415d62009-01-27 01:58:38 +00006879}
6880
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006881const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00006882 { { "g0" }, "r0" },
6883 { { "g1" }, "r1" },
6884 { { "g2" }, "r2" },
6885 { { "g3" }, "r3" },
6886 { { "g4" }, "r4" },
6887 { { "g5" }, "r5" },
6888 { { "g6" }, "r6" },
6889 { { "g7" }, "r7" },
6890 { { "o0" }, "r8" },
6891 { { "o1" }, "r9" },
6892 { { "o2" }, "r10" },
6893 { { "o3" }, "r11" },
6894 { { "o4" }, "r12" },
6895 { { "o5" }, "r13" },
6896 { { "o6", "sp" }, "r14" },
6897 { { "o7" }, "r15" },
6898 { { "l0" }, "r16" },
6899 { { "l1" }, "r17" },
6900 { { "l2" }, "r18" },
6901 { { "l3" }, "r19" },
6902 { { "l4" }, "r20" },
6903 { { "l5" }, "r21" },
6904 { { "l6" }, "r22" },
6905 { { "l7" }, "r23" },
6906 { { "i0" }, "r24" },
6907 { { "i1" }, "r25" },
6908 { { "i2" }, "r26" },
6909 { { "i3" }, "r27" },
6910 { { "i4" }, "r28" },
6911 { { "i5" }, "r29" },
6912 { { "i6", "fp" }, "r30" },
6913 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00006914};
6915
Craig Topperf054e3a2015-10-19 03:52:27 +00006916ArrayRef<TargetInfo::GCCRegAlias> SparcTargetInfo::getGCCRegAliases() const {
6917 return llvm::makeArrayRef(GCCRegAliases);
Chris Lattner9b415d62009-01-27 01:58:38 +00006918}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006919
6920// SPARC v8 is the 32-bit mode selected by Triple::sparc.
6921class SparcV8TargetInfo : public SparcTargetInfo {
6922public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006923 SparcV8TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6924 : SparcTargetInfo(Triple, Opts) {
James Y Knightb214cbc2016-03-04 19:00:41 +00006925 resetDataLayout("E-m:e-p:32:32-i64:64-f128:64-n32-S64");
Brad Smith73859112015-08-13 21:45:57 +00006926 // NetBSD / OpenBSD use long (same as llvm default); everyone else uses int.
6927 switch (getTriple().getOS()) {
6928 default:
James Y Knight4b4d19e2015-06-04 15:36:29 +00006929 SizeType = UnsignedInt;
6930 IntPtrType = SignedInt;
6931 PtrDiffType = SignedInt;
Brad Smith73859112015-08-13 21:45:57 +00006932 break;
6933 case llvm::Triple::NetBSD:
6934 case llvm::Triple::OpenBSD:
6935 SizeType = UnsignedLong;
6936 IntPtrType = SignedLong;
6937 PtrDiffType = SignedLong;
6938 break;
Brad Smith56495d52015-08-13 22:00:53 +00006939 }
Douglas Katzman13f4a912016-11-09 15:43:51 +00006940 // Up to 32 bits are lock-free atomic, but we're willing to do atomic ops
6941 // on up to 64 bits.
6942 MaxAtomicPromoteWidth = 64;
6943 MaxAtomicInlineWidth = 32;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006944 }
6945
Craig Topper3164f332014-03-11 03:39:26 +00006946 void getTargetDefines(const LangOptions &Opts,
6947 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006948 SparcTargetInfo::getTargetDefines(Opts, Builder);
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006949 switch (getCPUGeneration(CPU)) {
6950 case CG_V8:
6951 Builder.defineMacro("__sparcv8");
6952 if (getTriple().getOS() != llvm::Triple::Solaris)
6953 Builder.defineMacro("__sparcv8__");
6954 break;
6955 case CG_V9:
6956 Builder.defineMacro("__sparcv9");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00006957 if (getTriple().getOS() != llvm::Triple::Solaris) {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006958 Builder.defineMacro("__sparcv9__");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00006959 Builder.defineMacro("__sparc_v9__");
6960 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006961 break;
6962 }
Douglas Katzman6871afc2016-03-15 22:34:02 +00006963 if (getTriple().getVendor() == llvm::Triple::Myriad) {
Douglas Katzman87da5f42016-07-25 16:36:02 +00006964 std::string MyriadArchValue, Myriad2Value;
6965 Builder.defineMacro("__sparc_v8__");
6966 Builder.defineMacro("__leon__");
Douglas Katzman6871afc2016-03-15 22:34:02 +00006967 switch (CPU) {
Douglas Katzman87da5f42016-07-25 16:36:02 +00006968 case CK_MYRIAD2150:
6969 MyriadArchValue = "__ma2150";
6970 Myriad2Value = "2";
Douglas Katzman6871afc2016-03-15 22:34:02 +00006971 break;
Douglas Katzman87da5f42016-07-25 16:36:02 +00006972 case CK_MYRIAD2450:
6973 MyriadArchValue = "__ma2450";
6974 Myriad2Value = "2";
Douglas Katzman6871afc2016-03-15 22:34:02 +00006975 break;
6976 default:
Douglas Katzman87da5f42016-07-25 16:36:02 +00006977 MyriadArchValue = "__ma2100";
6978 Myriad2Value = "1";
Douglas Katzman6871afc2016-03-15 22:34:02 +00006979 break;
6980 }
Douglas Katzman87da5f42016-07-25 16:36:02 +00006981 Builder.defineMacro(MyriadArchValue, "1");
6982 Builder.defineMacro(MyriadArchValue+"__", "1");
6983 Builder.defineMacro("__myriad2__", Myriad2Value);
6984 Builder.defineMacro("__myriad2", Myriad2Value);
Douglas Katzman6871afc2016-03-15 22:34:02 +00006985 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006986 }
Chris Dewhurst69fa1922016-05-04 09:33:30 +00006987
6988 bool hasSjLjLowering() const override {
6989 return true;
6990 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006991};
6992
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006993// SPARCV8el is the 32-bit little-endian mode selected by Triple::sparcel.
6994class SparcV8elTargetInfo : public SparcV8TargetInfo {
6995 public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006996 SparcV8elTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6997 : SparcV8TargetInfo(Triple, Opts) {
6998 resetDataLayout("e-m:e-p:32:32-i64:64-f128:64-n32-S64");
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006999 }
7000};
7001
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007002// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
7003class SparcV9TargetInfo : public SparcTargetInfo {
7004public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007005 SparcV9TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7006 : SparcTargetInfo(Triple, Opts) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007007 // FIXME: Support Sparc quad-precision long double?
James Y Knightb214cbc2016-03-04 19:00:41 +00007008 resetDataLayout("E-m:e-i64:64-n32:64-S128");
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00007009 // This is an LP64 platform.
7010 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00007011
7012 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00007013 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00007014 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00007015 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00007016 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00007017 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00007018
7019 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
7020 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
7021 LongDoubleWidth = 128;
7022 LongDoubleAlign = 128;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007023 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00007024 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007025 }
7026
Craig Topper3164f332014-03-11 03:39:26 +00007027 void getTargetDefines(const LangOptions &Opts,
7028 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007029 SparcTargetInfo::getTargetDefines(Opts, Builder);
7030 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00007031 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00007032 // Solaris doesn't need these variants, but the BSDs do.
7033 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00007034 Builder.defineMacro("__sparc64__");
7035 Builder.defineMacro("__sparc_v9__");
7036 Builder.defineMacro("__sparcv9__");
7037 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007038 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00007039
Craig Topper3164f332014-03-11 03:39:26 +00007040 bool setCPU(const std::string &Name) override {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00007041 if (!SparcTargetInfo::setCPU(Name))
7042 return false;
7043 return getCPUGeneration(CPU) == CG_V9;
Roman Divackyb1ae3d42014-02-25 18:35:30 +00007044 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007045};
7046
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007047class SystemZTargetInfo : public TargetInfo {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007048 static const Builtin::Info BuiltinInfo[];
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007049 static const char *const GCCRegNames[];
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007050 std::string CPU;
7051 bool HasTransactionalExecution;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007052 bool HasVector;
Ulrich Weigand47445072013-05-06 16:26:41 +00007053
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007054public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007055 SystemZTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Eric Christopherb093d692015-10-09 18:39:59 +00007056 : TargetInfo(Triple), CPU("z10"), HasTransactionalExecution(false),
7057 HasVector(false) {
Ulrich Weigand881497a2015-03-30 13:50:21 +00007058 IntMaxType = SignedLong;
7059 Int64Type = SignedLong;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007060 TLSSupported = true;
7061 IntWidth = IntAlign = 32;
7062 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
7063 PointerWidth = PointerAlign = 64;
7064 LongDoubleWidth = 128;
7065 LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007066 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Ulrich Weigandca3cb7f2015-04-21 17:29:35 +00007067 DefaultAlignForAttributeAligned = 64;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007068 MinGlobalAlign = 16;
James Y Knightb214cbc2016-03-04 19:00:41 +00007069 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 +00007070 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
7071 }
7072 void getTargetDefines(const LangOptions &Opts,
7073 MacroBuilder &Builder) const override {
7074 Builder.defineMacro("__s390__");
7075 Builder.defineMacro("__s390x__");
7076 Builder.defineMacro("__zarch__");
7077 Builder.defineMacro("__LONG_DOUBLE_128__");
Ulrich Weigandb038a522016-02-05 21:34:28 +00007078
Ulrich Weigand82a86cb2017-02-06 17:04:22 +00007079 const std::string ISARev = llvm::StringSwitch<std::string>(CPU)
7080 .Cases("arch8", "z10", "8")
7081 .Cases("arch9", "z196", "9")
7082 .Cases("arch10", "zEC12", "10")
7083 .Cases("arch11", "z13", "11")
7084 .Default("");
7085 if (!ISARev.empty())
7086 Builder.defineMacro("__ARCH__", ISARev);
7087
Ulrich Weigandb038a522016-02-05 21:34:28 +00007088 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
7089 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
7090 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
7091 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
7092
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007093 if (HasTransactionalExecution)
7094 Builder.defineMacro("__HTM__");
Ulrich Weigand82a86cb2017-02-06 17:04:22 +00007095 if (HasVector)
7096 Builder.defineMacro("__VX__");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00007097 if (Opts.ZVector)
7098 Builder.defineMacro("__VEC__", "10301");
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007099 }
Craig Topper6c03a542015-10-19 04:51:35 +00007100 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7101 return llvm::makeArrayRef(BuiltinInfo,
7102 clang::SystemZ::LastTSBuiltin-Builtin::FirstTSBuiltin);
Ulrich Weigand47445072013-05-06 16:26:41 +00007103 }
7104
Craig Topperf054e3a2015-10-19 03:52:27 +00007105 ArrayRef<const char *> getGCCRegNames() const override;
7106 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007107 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00007108 return None;
Ulrich Weigand47445072013-05-06 16:26:41 +00007109 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007110 bool validateAsmConstraint(const char *&Name,
7111 TargetInfo::ConstraintInfo &info) const override;
7112 const char *getClobbers() const override {
7113 // FIXME: Is this really right?
7114 return "";
7115 }
7116 BuiltinVaListKind getBuiltinVaListKind() const override {
7117 return TargetInfo::SystemZBuiltinVaList;
7118 }
7119 bool setCPU(const std::string &Name) override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007120 CPU = Name;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007121 bool CPUKnown = llvm::StringSwitch<bool>(Name)
7122 .Case("z10", true)
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007123 .Case("arch8", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007124 .Case("z196", true)
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007125 .Case("arch9", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007126 .Case("zEC12", true)
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007127 .Case("arch10", true)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007128 .Case("z13", true)
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007129 .Case("arch11", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007130 .Default(false);
7131
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007132 return CPUKnown;
7133 }
Eric Christopher8c47b422015-10-09 18:39:55 +00007134 bool
7135 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7136 StringRef CPU,
7137 const std::vector<std::string> &FeaturesVec) const override {
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007138 if (CPU == "zEC12" || CPU == "arch10")
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007139 Features["transactional-execution"] = true;
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007140 if (CPU == "z13" || CPU == "arch11") {
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007141 Features["transactional-execution"] = true;
7142 Features["vector"] = true;
7143 }
Eric Christopher007b0a02015-08-28 22:32:01 +00007144 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007145 }
7146
7147 bool handleTargetFeatures(std::vector<std::string> &Features,
7148 DiagnosticsEngine &Diags) override {
7149 HasTransactionalExecution = false;
Eric Christopher610fe112015-08-26 08:21:55 +00007150 for (const auto &Feature : Features) {
7151 if (Feature == "+transactional-execution")
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007152 HasTransactionalExecution = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007153 else if (Feature == "+vector")
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007154 HasVector = true;
7155 }
7156 // If we use the vector ABI, vector types are 64-bit aligned.
7157 if (HasVector) {
7158 MaxVectorAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00007159 resetDataLayout("E-m:e-i1:8:16-i8:8:16-i64:64-f128:64"
7160 "-v128:64-a:8:16-n32:64");
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007161 }
7162 return true;
7163 }
7164
7165 bool hasFeature(StringRef Feature) const override {
7166 return llvm::StringSwitch<bool>(Feature)
Ulrich Weigandcc673442015-04-01 14:15:35 +00007167 .Case("systemz", true)
7168 .Case("htm", HasTransactionalExecution)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007169 .Case("vx", HasVector)
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007170 .Default(false);
7171 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007172
Bryan Chane3f1ed52016-04-28 13:56:43 +00007173 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
7174 switch (CC) {
7175 case CC_C:
7176 case CC_Swift:
7177 return CCCR_OK;
7178 default:
7179 return CCCR_Warning;
7180 }
7181 }
7182
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007183 StringRef getABI() const override {
7184 if (HasVector)
7185 return "vector";
7186 return "";
7187 }
Ulrich Weigand47fd2532015-06-16 15:21:47 +00007188
7189 bool useFloat128ManglingForLongDouble() const override {
7190 return true;
7191 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007192};
7193
7194const Builtin::Info SystemZTargetInfo::BuiltinInfo[] = {
7195#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00007196 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Jonas Paulsson3ace74a2016-03-30 15:51:24 +00007197#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
7198 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007199#include "clang/Basic/BuiltinsSystemZ.def"
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007200};
7201
7202const char *const SystemZTargetInfo::GCCRegNames[] = {
7203 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
7204 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
7205 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
7206 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
7207};
7208
Craig Topperf054e3a2015-10-19 03:52:27 +00007209ArrayRef<const char *> SystemZTargetInfo::getGCCRegNames() const {
7210 return llvm::makeArrayRef(GCCRegNames);
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007211}
7212
7213bool SystemZTargetInfo::
7214validateAsmConstraint(const char *&Name,
7215 TargetInfo::ConstraintInfo &Info) const {
7216 switch (*Name) {
7217 default:
7218 return false;
7219
7220 case 'a': // Address register
7221 case 'd': // Data register (equivalent to 'r')
7222 case 'f': // Floating-point register
7223 Info.setAllowsRegister();
7224 return true;
7225
7226 case 'I': // Unsigned 8-bit constant
7227 case 'J': // Unsigned 12-bit constant
7228 case 'K': // Signed 16-bit constant
7229 case 'L': // Signed 20-bit displacement (on all targets we support)
7230 case 'M': // 0x7fffffff
7231 return true;
7232
7233 case 'Q': // Memory with base and unsigned 12-bit displacement
7234 case 'R': // Likewise, plus an index
7235 case 'S': // Memory with base and signed 20-bit displacement
7236 case 'T': // Likewise, plus an index
7237 Info.setAllowsMemory();
7238 return true;
7239 }
7240}
Ulrich Weigand47445072013-05-06 16:26:41 +00007241
Eric Christopherc48497a2015-09-18 21:26:24 +00007242class MSP430TargetInfo : public TargetInfo {
7243 static const char *const GCCRegNames[];
Anton Korobeynikova0f54372009-05-03 13:43:08 +00007244
Eric Christopherc48497a2015-09-18 21:26:24 +00007245public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007246 MSP430TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7247 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007248 TLSSupported = false;
7249 IntWidth = 16;
7250 IntAlign = 16;
7251 LongWidth = 32;
7252 LongLongWidth = 64;
7253 LongAlign = LongLongAlign = 16;
7254 PointerWidth = 16;
7255 PointerAlign = 16;
7256 SuitableAlign = 16;
7257 SizeType = UnsignedInt;
7258 IntMaxType = SignedLongLong;
7259 IntPtrType = SignedInt;
7260 PtrDiffType = SignedInt;
7261 SigAtomicType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00007262 resetDataLayout("e-m:e-p:16:16-i32:16:32-a:16-n8:16");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00007263 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007264 void getTargetDefines(const LangOptions &Opts,
7265 MacroBuilder &Builder) const override {
7266 Builder.defineMacro("MSP430");
7267 Builder.defineMacro("__MSP430__");
7268 // FIXME: defines for different 'flavours' of MCU
7269 }
Craig Topper6c03a542015-10-19 04:51:35 +00007270 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00007271 // FIXME: Implement.
Craig Topper6c03a542015-10-19 04:51:35 +00007272 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00007273 }
7274 bool hasFeature(StringRef Feature) const override {
7275 return Feature == "msp430";
7276 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007277 ArrayRef<const char *> getGCCRegNames() const override;
7278 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00007279 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00007280 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00007281 }
7282 bool validateAsmConstraint(const char *&Name,
7283 TargetInfo::ConstraintInfo &info) const override {
7284 // FIXME: implement
7285 switch (*Name) {
7286 case 'K': // the constant 1
7287 case 'L': // constant -1^20 .. 1^19
7288 case 'M': // constant 1-4:
Eli Friedmana9c3d712009-08-19 20:47:07 +00007289 return true;
7290 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007291 // No target constraints for now.
7292 return false;
7293 }
7294 const char *getClobbers() const override {
7295 // FIXME: Is this really right?
7296 return "";
7297 }
7298 BuiltinVaListKind getBuiltinVaListKind() const override {
7299 // FIXME: implement
7300 return TargetInfo::CharPtrBuiltinVaList;
7301 }
7302};
7303
7304const char *const MSP430TargetInfo::GCCRegNames[] = {
7305 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
7306 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"};
7307
Craig Topperf054e3a2015-10-19 03:52:27 +00007308ArrayRef<const char *> MSP430TargetInfo::getGCCRegNames() const {
7309 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00007310}
7311
7312// LLVM and Clang cannot be used directly to output native binaries for
7313// target, but is used to compile C code to llvm bitcode with correct
7314// type and alignment information.
7315//
7316// TCE uses the llvm bitcode as input and uses it for generating customized
7317// target processor and program binary. TCE co-design environment is
7318// publicly available in http://tce.cs.tut.fi
7319
7320static const unsigned TCEOpenCLAddrSpaceMap[] = {
7321 3, // opencl_global
7322 4, // opencl_local
7323 5, // opencl_constant
7324 // FIXME: generic has to be added to the target
7325 0, // opencl_generic
7326 0, // cuda_device
7327 0, // cuda_constant
7328 0 // cuda_shared
7329};
7330
7331class TCETargetInfo : public TargetInfo {
7332public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007333 TCETargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7334 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007335 TLSSupported = false;
7336 IntWidth = 32;
7337 LongWidth = LongLongWidth = 32;
7338 PointerWidth = 32;
7339 IntAlign = 32;
7340 LongAlign = LongLongAlign = 32;
7341 PointerAlign = 32;
7342 SuitableAlign = 32;
7343 SizeType = UnsignedInt;
7344 IntMaxType = SignedLong;
7345 IntPtrType = SignedInt;
7346 PtrDiffType = SignedInt;
7347 FloatWidth = 32;
7348 FloatAlign = 32;
7349 DoubleWidth = 32;
7350 DoubleAlign = 32;
7351 LongDoubleWidth = 32;
7352 LongDoubleAlign = 32;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007353 FloatFormat = &llvm::APFloat::IEEEsingle();
7354 DoubleFormat = &llvm::APFloat::IEEEsingle();
7355 LongDoubleFormat = &llvm::APFloat::IEEEsingle();
Pekka Jaaskelainen67354482016-11-16 15:22:31 +00007356 resetDataLayout("E-p:32:32:32-i1:8:8-i8:8:32-"
7357 "i16:16:32-i32:32:32-i64:32:32-"
7358 "f32:32:32-f64:32:32-v64:32:32-"
7359 "v128:32:32-v256:32:32-v512:32:32-"
7360 "v1024:32:32-a0:0:32-n32");
Eric Christopherc48497a2015-09-18 21:26:24 +00007361 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
7362 UseAddrSpaceMapMangling = true;
7363 }
7364
7365 void getTargetDefines(const LangOptions &Opts,
7366 MacroBuilder &Builder) const override {
7367 DefineStd(Builder, "tce", Opts);
7368 Builder.defineMacro("__TCE__");
7369 Builder.defineMacro("__TCE_V1__");
7370 }
7371 bool hasFeature(StringRef Feature) const override { return Feature == "tce"; }
7372
Craig Topper6c03a542015-10-19 04:51:35 +00007373 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007374 const char *getClobbers() const override { return ""; }
7375 BuiltinVaListKind getBuiltinVaListKind() const override {
7376 return TargetInfo::VoidPtrBuiltinVaList;
7377 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007378 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007379 bool validateAsmConstraint(const char *&Name,
7380 TargetInfo::ConstraintInfo &info) const override {
7381 return true;
7382 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007383 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7384 return None;
7385 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007386};
Eli Friedmana9c3d712009-08-19 20:47:07 +00007387
Pekka Jaaskelainen67354482016-11-16 15:22:31 +00007388class TCELETargetInfo : public TCETargetInfo {
7389public:
7390 TCELETargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7391 : TCETargetInfo(Triple, Opts) {
7392 BigEndian = false;
7393
7394 resetDataLayout("e-p:32:32:32-i1:8:8-i8:8:32-"
7395 "i16:16:32-i32:32:32-i64:32:32-"
7396 "f32:32:32-f64:32:32-v64:32:32-"
7397 "v128:32:32-v256:32:32-v512:32:32-"
7398 "v1024:32:32-a0:0:32-n32");
7399
7400 }
7401
7402 virtual void getTargetDefines(const LangOptions &Opts,
7403 MacroBuilder &Builder) const {
7404 DefineStd(Builder, "tcele", Opts);
7405 Builder.defineMacro("__TCE__");
7406 Builder.defineMacro("__TCE_V1__");
7407 Builder.defineMacro("__TCELE__");
7408 Builder.defineMacro("__TCELE_V1__");
7409 }
7410
7411};
7412
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007413class BPFTargetInfo : public TargetInfo {
7414public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007415 BPFTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7416 : TargetInfo(Triple) {
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007417 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
7418 SizeType = UnsignedLong;
7419 PtrDiffType = SignedLong;
7420 IntPtrType = SignedLong;
7421 IntMaxType = SignedLong;
7422 Int64Type = SignedLong;
7423 RegParmMax = 5;
7424 if (Triple.getArch() == llvm::Triple::bpfeb) {
James Y Knightb214cbc2016-03-04 19:00:41 +00007425 resetDataLayout("E-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007426 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00007427 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007428 }
7429 MaxAtomicPromoteWidth = 64;
7430 MaxAtomicInlineWidth = 64;
7431 TLSSupported = false;
7432 }
7433 void getTargetDefines(const LangOptions &Opts,
7434 MacroBuilder &Builder) const override {
7435 DefineStd(Builder, "bpf", Opts);
7436 Builder.defineMacro("__BPF__");
7437 }
7438 bool hasFeature(StringRef Feature) const override {
7439 return Feature == "bpf";
7440 }
7441
Craig Topper6c03a542015-10-19 04:51:35 +00007442 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007443 const char *getClobbers() const override {
7444 return "";
7445 }
7446 BuiltinVaListKind getBuiltinVaListKind() const override {
7447 return TargetInfo::VoidPtrBuiltinVaList;
7448 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007449 ArrayRef<const char *> getGCCRegNames() const override {
7450 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007451 }
7452 bool validateAsmConstraint(const char *&Name,
7453 TargetInfo::ConstraintInfo &info) const override {
7454 return true;
7455 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007456 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7457 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007458 }
7459};
7460
Daniel Sanders4672af62016-05-27 11:51:02 +00007461class MipsTargetInfo : public TargetInfo {
7462 void setDataLayout() {
Daniel Sanders55e40692016-06-03 10:11:01 +00007463 StringRef Layout;
7464
7465 if (ABI == "o32")
7466 Layout = "m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
7467 else if (ABI == "n32")
Daniel Sanders6a738832016-07-19 10:49:03 +00007468 Layout = "m:e-p:32:32-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Daniel Sanders55e40692016-06-03 10:11:01 +00007469 else if (ABI == "n64")
Daniel Sanders6a738832016-07-19 10:49:03 +00007470 Layout = "m:e-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Daniel Sanders55e40692016-06-03 10:11:01 +00007471 else
7472 llvm_unreachable("Invalid ABI");
7473
7474 if (BigEndian)
7475 resetDataLayout(("E-" + Layout).str());
7476 else
7477 resetDataLayout(("e-" + Layout).str());
Daniel Sanders4672af62016-05-27 11:51:02 +00007478 }
7479
Akira Hatanaka9064e362013-10-29 18:30:33 +00007480
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00007481 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007482 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00007483 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00007484 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007485 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00007486 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007487 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00007488 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007489 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007490 enum DspRevEnum {
7491 NoDSP, DSP1, DSP2
7492 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00007493 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007494
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007495protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00007496 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007497 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007498
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007499public:
Daniel Sanders4672af62016-05-27 11:51:02 +00007500 MipsTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007501 : TargetInfo(Triple), IsMips16(false), IsMicromips(false),
7502 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
7503 DspRev(NoDSP), HasMSA(false), HasFP64(false) {
Zoran Jovanovic26a12162015-02-18 15:21:35 +00007504 TheCXXABI.set(TargetCXXABI::GenericMIPS);
Daniel Sanders4672af62016-05-27 11:51:02 +00007505
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007506 setABI((getTriple().getArch() == llvm::Triple::mips ||
7507 getTriple().getArch() == llvm::Triple::mipsel)
7508 ? "o32"
7509 : "n64");
7510
7511 CPU = ABI == "o32" ? "mips32r2" : "mips64r2";
Zoran Jovanovic26a12162015-02-18 15:21:35 +00007512 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007513
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007514 bool isNaN2008Default() const {
7515 return CPU == "mips32r6" || CPU == "mips64r6";
7516 }
7517
7518 bool isFP64Default() const {
7519 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
7520 }
7521
Petar Jovanovicd55ae6b2015-02-26 18:19:22 +00007522 bool isNan2008() const override {
7523 return IsNan2008;
7524 }
7525
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007526 bool processorSupportsGPR64() const {
7527 return llvm::StringSwitch<bool>(CPU)
7528 .Case("mips3", true)
7529 .Case("mips4", true)
7530 .Case("mips5", true)
7531 .Case("mips64", true)
7532 .Case("mips64r2", true)
7533 .Case("mips64r3", true)
7534 .Case("mips64r5", true)
7535 .Case("mips64r6", true)
7536 .Case("octeon", true)
7537 .Default(false);
7538 return false;
7539 }
7540
Alp Toker4925ba72014-06-07 23:30:42 +00007541 StringRef getABI() const override { return ABI; }
Daniel Sanders4672af62016-05-27 11:51:02 +00007542 bool setABI(const std::string &Name) override {
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007543 if (Name == "o32") {
7544 setO32ABITypes();
7545 ABI = Name;
7546 return true;
Daniel Sanders4672af62016-05-27 11:51:02 +00007547 }
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007548
7549 if (Name == "n32") {
7550 setN32ABITypes();
7551 ABI = Name;
7552 return true;
7553 }
7554 if (Name == "n64") {
7555 setN64ABITypes();
7556 ABI = Name;
7557 return true;
Daniel Sanders4672af62016-05-27 11:51:02 +00007558 }
7559 return false;
7560 }
7561
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007562 void setO32ABITypes() {
7563 Int64Type = SignedLongLong;
7564 IntMaxType = Int64Type;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007565 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007566 LongDoubleWidth = LongDoubleAlign = 64;
7567 LongWidth = LongAlign = 32;
7568 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
7569 PointerWidth = PointerAlign = 32;
7570 PtrDiffType = SignedInt;
7571 SizeType = UnsignedInt;
7572 SuitableAlign = 64;
7573 }
7574
7575 void setN32N64ABITypes() {
7576 LongDoubleWidth = LongDoubleAlign = 128;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007577 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007578 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
7579 LongDoubleWidth = LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007580 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007581 }
7582 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
7583 SuitableAlign = 128;
7584 }
7585
Daniel Sanders4672af62016-05-27 11:51:02 +00007586 void setN64ABITypes() {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007587 setN32N64ABITypes();
Daniel Sanders4672af62016-05-27 11:51:02 +00007588 Int64Type = SignedLong;
7589 IntMaxType = Int64Type;
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007590 LongWidth = LongAlign = 64;
7591 PointerWidth = PointerAlign = 64;
7592 PtrDiffType = SignedLong;
7593 SizeType = UnsignedLong;
Daniel Sanders4672af62016-05-27 11:51:02 +00007594 }
7595
7596 void setN32ABITypes() {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007597 setN32N64ABITypes();
Daniel Sanders4672af62016-05-27 11:51:02 +00007598 Int64Type = SignedLongLong;
7599 IntMaxType = Int64Type;
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007600 LongWidth = LongAlign = 32;
7601 PointerWidth = PointerAlign = 32;
7602 PtrDiffType = SignedInt;
7603 SizeType = UnsignedInt;
Daniel Sanders4672af62016-05-27 11:51:02 +00007604 }
7605
Craig Topper3164f332014-03-11 03:39:26 +00007606 bool setCPU(const std::string &Name) override {
Eric Christopher0b26a612010-03-02 02:41:08 +00007607 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007608 return llvm::StringSwitch<bool>(Name)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007609 .Case("mips1", true)
7610 .Case("mips2", true)
Simon Atanasyan26610c52014-07-04 12:36:56 +00007611 .Case("mips3", true)
7612 .Case("mips4", true)
7613 .Case("mips5", true)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007614 .Case("mips32", true)
7615 .Case("mips32r2", true)
7616 .Case("mips32r3", true)
7617 .Case("mips32r5", true)
7618 .Case("mips32r6", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007619 .Case("mips64", true)
7620 .Case("mips64r2", true)
Simon Atanasyan162feb52015-02-20 23:37:40 +00007621 .Case("mips64r3", true)
7622 .Case("mips64r5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007623 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00007624 .Case("octeon", true)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007625 .Case("p5600", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007626 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00007627 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00007628 const std::string& getCPU() const { return CPU; }
Eric Christopher8c47b422015-10-09 18:39:55 +00007629 bool
7630 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7631 StringRef CPU,
7632 const std::vector<std::string> &FeaturesVec) const override {
Bhushan D. Attardebacb988732016-03-04 06:56:29 +00007633 if (CPU.empty())
7634 CPU = getCPU();
Simon Atanasyan4e16a422014-07-04 12:37:04 +00007635 if (CPU == "octeon")
7636 Features["mips64r2"] = Features["cnmips"] = true;
7637 else
7638 Features[CPU] = true;
Eric Christopher007b0a02015-08-28 22:32:01 +00007639 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Eric Christopher0b26a612010-03-02 02:41:08 +00007640 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007641
Craig Topper3164f332014-03-11 03:39:26 +00007642 void getTargetDefines(const LangOptions &Opts,
7643 MacroBuilder &Builder) const override {
Daniel Sanders4672af62016-05-27 11:51:02 +00007644 if (BigEndian) {
7645 DefineStd(Builder, "MIPSEB", Opts);
7646 Builder.defineMacro("_MIPSEB");
7647 } else {
7648 DefineStd(Builder, "MIPSEL", Opts);
7649 Builder.defineMacro("_MIPSEL");
7650 }
7651
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007652 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00007653 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007654 if (Opts.GNUMode)
7655 Builder.defineMacro("mips");
7656
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007657 if (ABI == "o32") {
Daniel Sanders4672af62016-05-27 11:51:02 +00007658 Builder.defineMacro("__mips", "32");
7659 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
7660 } else {
7661 Builder.defineMacro("__mips", "64");
7662 Builder.defineMacro("__mips64");
7663 Builder.defineMacro("__mips64__");
7664 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
7665 }
7666
7667 const std::string ISARev = llvm::StringSwitch<std::string>(getCPU())
7668 .Cases("mips32", "mips64", "1")
7669 .Cases("mips32r2", "mips64r2", "2")
7670 .Cases("mips32r3", "mips64r3", "3")
7671 .Cases("mips32r5", "mips64r5", "5")
7672 .Cases("mips32r6", "mips64r6", "6")
7673 .Default("");
7674 if (!ISARev.empty())
7675 Builder.defineMacro("__mips_isa_rev", ISARev);
7676
7677 if (ABI == "o32") {
7678 Builder.defineMacro("__mips_o32");
7679 Builder.defineMacro("_ABIO32", "1");
7680 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
Daniel Sanders07c86542016-05-27 14:30:23 +00007681 } else if (ABI == "n32") {
Daniel Sanders4672af62016-05-27 11:51:02 +00007682 Builder.defineMacro("__mips_n32");
7683 Builder.defineMacro("_ABIN32", "2");
7684 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
7685 } else if (ABI == "n64") {
7686 Builder.defineMacro("__mips_n64");
7687 Builder.defineMacro("_ABI64", "3");
7688 Builder.defineMacro("_MIPS_SIM", "_ABI64");
7689 } else
7690 llvm_unreachable("Invalid ABI.");
7691
Simon Atanasyan683535b2012-08-29 19:14:58 +00007692 Builder.defineMacro("__REGISTER_PREFIX__", "");
7693
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007694 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007695 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00007696 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007697 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007698 case SoftFloat:
7699 Builder.defineMacro("__mips_soft_float", Twine(1));
7700 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00007701 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00007702
Simon Atanasyan16071912013-04-14 14:07:30 +00007703 if (IsSingleFloat)
7704 Builder.defineMacro("__mips_single_float", Twine(1));
7705
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007706 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
7707 Builder.defineMacro("_MIPS_FPSET",
7708 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
7709
Simon Atanasyan72244b62012-07-05 16:06:06 +00007710 if (IsMips16)
7711 Builder.defineMacro("__mips16", Twine(1));
7712
Simon Atanasyan60777612013-04-14 14:07:51 +00007713 if (IsMicromips)
7714 Builder.defineMacro("__mips_micromips", Twine(1));
7715
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007716 if (IsNan2008)
7717 Builder.defineMacro("__mips_nan2008", Twine(1));
7718
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007719 switch (DspRev) {
7720 default:
7721 break;
7722 case DSP1:
7723 Builder.defineMacro("__mips_dsp_rev", Twine(1));
7724 Builder.defineMacro("__mips_dsp", Twine(1));
7725 break;
7726 case DSP2:
7727 Builder.defineMacro("__mips_dsp_rev", Twine(2));
7728 Builder.defineMacro("__mips_dspr2", Twine(1));
7729 Builder.defineMacro("__mips_dsp", Twine(1));
7730 break;
7731 }
7732
Jack Carter44ff1e52013-08-12 17:20:29 +00007733 if (HasMSA)
7734 Builder.defineMacro("__mips_msa", Twine(1));
7735
Simon Atanasyan26f19672012-04-05 19:28:31 +00007736 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
7737 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
7738 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00007739
7740 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
7741 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Daniel Sanders5176f7e2015-12-22 12:59:30 +00007742
7743 // These shouldn't be defined for MIPS-I but there's no need to check
7744 // for that since MIPS-I isn't supported.
7745 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
7746 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
7747 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007748
7749 // 32-bit MIPS processors don't have the necessary lld/scd instructions
7750 // found in 64-bit processors. In the case of O32 on a 64-bit processor,
7751 // the instructions exist but using them violates the ABI since they
7752 // require 64-bit GPRs and O32 only supports 32-bit GPRs.
7753 if (ABI == "n32" || ABI == "n64")
Daniel Sanders4672af62016-05-27 11:51:02 +00007754 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007755 }
7756
Craig Topper6c03a542015-10-19 04:51:35 +00007757 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7758 return llvm::makeArrayRef(BuiltinInfo,
7759 clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin);
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007760 }
Craig Topper3164f332014-03-11 03:39:26 +00007761 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00007762 return llvm::StringSwitch<bool>(Feature)
7763 .Case("mips", true)
7764 .Case("fp64", HasFP64)
7765 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00007766 }
Craig Topper3164f332014-03-11 03:39:26 +00007767 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00007768 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007769 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007770 ArrayRef<const char *> getGCCRegNames() const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00007771 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00007772 // CPU register names
7773 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007774 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
7775 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
7776 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00007777 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
7778 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007779 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
7780 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
7781 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
7782 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00007783 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007784 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Hrvoje Varga14c42ee2016-03-29 12:46:16 +00007785 "$fcc5","$fcc6","$fcc7","$ac1hi","$ac1lo","$ac2hi","$ac2lo",
7786 "$ac3hi","$ac3lo",
Daniel Sanders8b59af12013-11-12 12:56:01 +00007787 // MSA register names
7788 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
7789 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
7790 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
7791 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
7792 // MSA control register names
7793 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
7794 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007795 };
Craig Topperf054e3a2015-10-19 03:52:27 +00007796 return llvm::makeArrayRef(GCCRegNames);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007797 }
Craig Topper3164f332014-03-11 03:39:26 +00007798 bool validateAsmConstraint(const char *&Name,
7799 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007800 switch (*Name) {
7801 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00007802 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007803 case 'r': // CPU registers.
7804 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00007805 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007806 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00007807 case 'c': // $25 for indirect jumps
7808 case 'l': // lo register
7809 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007810 Info.setAllowsRegister();
7811 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00007812 case 'I': // Signed 16-bit constant
7813 case 'J': // Integer 0
7814 case 'K': // Unsigned 16-bit constant
7815 case 'L': // Signed 32-bit constant, lower 16-bit zeros (for lui)
7816 case 'M': // Constants not loadable via lui, addiu, or ori
7817 case 'N': // Constant -1 to -65535
7818 case 'O': // A signed 15-bit constant
7819 case 'P': // A constant between 1 go 65535
7820 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00007821 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00007822 Info.setAllowsMemory();
7823 return true;
Daniel Sanders48fa39e2015-03-30 13:47:23 +00007824 case 'Z':
7825 if (Name[1] == 'C') { // An address usable by ll, and sc.
7826 Info.setAllowsMemory();
7827 Name++; // Skip over 'Z'.
7828 return true;
7829 }
7830 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007831 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007832 }
7833
Daniel Sanders48fa39e2015-03-30 13:47:23 +00007834 std::string convertConstraint(const char *&Constraint) const override {
7835 std::string R;
7836 switch (*Constraint) {
7837 case 'Z': // Two-character constraint; add "^" hint for later parsing.
7838 if (Constraint[1] == 'C') {
7839 R = std::string("^") + std::string(Constraint, 2);
7840 Constraint++;
7841 return R;
7842 }
7843 break;
7844 }
7845 return TargetInfo::convertConstraint(Constraint);
7846 }
7847
Craig Topper3164f332014-03-11 03:39:26 +00007848 const char *getClobbers() const override {
Toma Tabacucfab40f2015-01-12 14:41:30 +00007849 // In GCC, $1 is not widely used in generated code (it's used only in a few
7850 // specific situations), so there is no real need for users to add it to
7851 // the clobbers list if they want to use it in their inline assembly code.
7852 //
7853 // In LLVM, $1 is treated as a normal GPR and is always allocatable during
7854 // code generation, so using it in inline assembly without adding it to the
7855 // clobbers list can cause conflicts between the inline assembly code and
7856 // the surrounding generated code.
7857 //
7858 // Another problem is that LLVM is allowed to choose $1 for inline assembly
7859 // operands, which will conflict with the ".set at" assembler option (which
7860 // we use only for inline assembly, in order to maintain compatibility with
7861 // GCC) and will also conflict with the user's usage of $1.
7862 //
7863 // The easiest way to avoid these conflicts and keep $1 as an allocatable
7864 // register for generated code is to automatically clobber $1 for all inline
7865 // assembly code.
7866 //
7867 // FIXME: We should automatically clobber $1 only for inline assembly code
7868 // which actually uses it. This would allow LLVM to use $1 for inline
7869 // assembly operands if the user's assembly code doesn't use it.
Toma Tabacu99411952014-12-17 12:02:58 +00007870 return "~{$1}";
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007871 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007872
Craig Topper3164f332014-03-11 03:39:26 +00007873 bool handleTargetFeatures(std::vector<std::string> &Features,
7874 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00007875 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00007876 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007877 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00007878 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007879 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007880 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007881 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007882
Eric Christopher610fe112015-08-26 08:21:55 +00007883 for (const auto &Feature : Features) {
7884 if (Feature == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00007885 IsSingleFloat = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007886 else if (Feature == "+soft-float")
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007887 FloatABI = SoftFloat;
Eric Christopher610fe112015-08-26 08:21:55 +00007888 else if (Feature == "+mips16")
Simon Atanasyan72244b62012-07-05 16:06:06 +00007889 IsMips16 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007890 else if (Feature == "+micromips")
Simon Atanasyan60777612013-04-14 14:07:51 +00007891 IsMicromips = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007892 else if (Feature == "+dsp")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007893 DspRev = std::max(DspRev, DSP1);
Eric Christopher610fe112015-08-26 08:21:55 +00007894 else if (Feature == "+dspr2")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007895 DspRev = std::max(DspRev, DSP2);
Eric Christopher610fe112015-08-26 08:21:55 +00007896 else if (Feature == "+msa")
Jack Carter44ff1e52013-08-12 17:20:29 +00007897 HasMSA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007898 else if (Feature == "+fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007899 HasFP64 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007900 else if (Feature == "-fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007901 HasFP64 = false;
Eric Christopher610fe112015-08-26 08:21:55 +00007902 else if (Feature == "+nan2008")
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007903 IsNan2008 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007904 else if (Feature == "-nan2008")
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007905 IsNan2008 = false;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007906 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007907
James Y Knightb214cbc2016-03-04 19:00:41 +00007908 setDataLayout();
Akira Hatanaka9064e362013-10-29 18:30:33 +00007909
Rafael Espindolaeb265472013-08-21 21:59:03 +00007910 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007911 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00007912
Craig Topper3164f332014-03-11 03:39:26 +00007913 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00007914 if (RegNo == 0) return 4;
7915 if (RegNo == 1) return 5;
7916 return -1;
7917 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00007918
7919 bool isCLZForZeroUndef() const override { return false; }
Daniel Sanders4672af62016-05-27 11:51:02 +00007920
7921 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7922 static const TargetInfo::GCCRegAlias O32RegAliases[] = {
7923 {{"at"}, "$1"}, {{"v0"}, "$2"}, {{"v1"}, "$3"},
7924 {{"a0"}, "$4"}, {{"a1"}, "$5"}, {{"a2"}, "$6"},
7925 {{"a3"}, "$7"}, {{"t0"}, "$8"}, {{"t1"}, "$9"},
7926 {{"t2"}, "$10"}, {{"t3"}, "$11"}, {{"t4"}, "$12"},
7927 {{"t5"}, "$13"}, {{"t6"}, "$14"}, {{"t7"}, "$15"},
7928 {{"s0"}, "$16"}, {{"s1"}, "$17"}, {{"s2"}, "$18"},
7929 {{"s3"}, "$19"}, {{"s4"}, "$20"}, {{"s5"}, "$21"},
7930 {{"s6"}, "$22"}, {{"s7"}, "$23"}, {{"t8"}, "$24"},
7931 {{"t9"}, "$25"}, {{"k0"}, "$26"}, {{"k1"}, "$27"},
7932 {{"gp"}, "$28"}, {{"sp", "$sp"}, "$29"}, {{"fp", "$fp"}, "$30"},
7933 {{"ra"}, "$31"}};
7934 static const TargetInfo::GCCRegAlias NewABIRegAliases[] = {
7935 {{"at"}, "$1"}, {{"v0"}, "$2"}, {{"v1"}, "$3"},
7936 {{"a0"}, "$4"}, {{"a1"}, "$5"}, {{"a2"}, "$6"},
7937 {{"a3"}, "$7"}, {{"a4"}, "$8"}, {{"a5"}, "$9"},
7938 {{"a6"}, "$10"}, {{"a7"}, "$11"}, {{"t0"}, "$12"},
7939 {{"t1"}, "$13"}, {{"t2"}, "$14"}, {{"t3"}, "$15"},
7940 {{"s0"}, "$16"}, {{"s1"}, "$17"}, {{"s2"}, "$18"},
7941 {{"s3"}, "$19"}, {{"s4"}, "$20"}, {{"s5"}, "$21"},
7942 {{"s6"}, "$22"}, {{"s7"}, "$23"}, {{"t8"}, "$24"},
7943 {{"t9"}, "$25"}, {{"k0"}, "$26"}, {{"k1"}, "$27"},
7944 {{"gp"}, "$28"}, {{"sp", "$sp"}, "$29"}, {{"fp", "$fp"}, "$30"},
7945 {{"ra"}, "$31"}};
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007946 if (ABI == "o32")
Daniel Sanders4672af62016-05-27 11:51:02 +00007947 return llvm::makeArrayRef(O32RegAliases);
7948 return llvm::makeArrayRef(NewABIRegAliases);
7949 }
7950
7951 bool hasInt128Type() const override {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007952 return ABI == "n32" || ABI == "n64";
Daniel Sanders4672af62016-05-27 11:51:02 +00007953 }
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007954
7955 bool validateTarget(DiagnosticsEngine &Diags) const override {
7956 // FIXME: It's valid to use O32 on a 64-bit CPU but the backend can't handle
7957 // this yet. It's better to fail here than on the backend assertion.
7958 if (processorSupportsGPR64() && ABI == "o32") {
7959 Diags.Report(diag::err_target_unsupported_abi) << ABI << CPU;
7960 return false;
7961 }
7962
7963 // 64-bit ABI's require 64-bit CPU's.
7964 if (!processorSupportsGPR64() && (ABI == "n32" || ABI == "n64")) {
7965 Diags.Report(diag::err_target_unsupported_abi) << ABI << CPU;
7966 return false;
7967 }
7968
7969 // FIXME: It's valid to use O32 on a mips64/mips64el triple but the backend
7970 // can't handle this yet. It's better to fail here than on the
7971 // backend assertion.
7972 if ((getTriple().getArch() == llvm::Triple::mips64 ||
7973 getTriple().getArch() == llvm::Triple::mips64el) &&
7974 ABI == "o32") {
7975 Diags.Report(diag::err_target_unsupported_abi_for_triple)
7976 << ABI << getTriple().str();
7977 return false;
7978 }
7979
7980 // FIXME: It's valid to use N32/N64 on a mips/mipsel triple but the backend
7981 // can't handle this yet. It's better to fail here than on the
7982 // backend assertion.
7983 if ((getTriple().getArch() == llvm::Triple::mips ||
7984 getTriple().getArch() == llvm::Triple::mipsel) &&
7985 (ABI == "n32" || ABI == "n64")) {
7986 Diags.Report(diag::err_target_unsupported_abi_for_triple)
7987 << ABI << getTriple().str();
7988 return false;
7989 }
7990
7991 return true;
7992 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007993};
7994
Daniel Sanders4672af62016-05-27 11:51:02 +00007995const Builtin::Info MipsTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00007996#define BUILTIN(ID, TYPE, ATTRS) \
7997 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7998#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7999 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00008000#include "clang/Basic/BuiltinsMips.def"
8001};
8002
Ivan Krasindd7403e2011-08-24 20:22:22 +00008003class PNaClTargetInfo : public TargetInfo {
8004public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008005 PNaClTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8006 : TargetInfo(Triple) {
Ivan Krasindd7403e2011-08-24 20:22:22 +00008007 this->LongAlign = 32;
8008 this->LongWidth = 32;
8009 this->PointerAlign = 32;
8010 this->PointerWidth = 32;
8011 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00008012 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00008013 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00008014 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00008015 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00008016 this->SizeType = TargetInfo::UnsignedInt;
8017 this->PtrDiffType = TargetInfo::SignedInt;
8018 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00008019 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00008020 }
8021
Craig Toppere6f17d02014-03-11 04:07:52 +00008022 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00008023 Builder.defineMacro("__le32__");
8024 Builder.defineMacro("__pnacl__");
8025 }
Craig Topper3164f332014-03-11 03:39:26 +00008026 void getTargetDefines(const LangOptions &Opts,
8027 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00008028 getArchDefines(Opts, Builder);
8029 }
Craig Topper3164f332014-03-11 03:39:26 +00008030 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00008031 return Feature == "pnacl";
8032 }
Craig Topper6c03a542015-10-19 04:51:35 +00008033 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Craig Topper3164f332014-03-11 03:39:26 +00008034 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00008035 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00008036 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008037 ArrayRef<const char *> getGCCRegNames() const override;
8038 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00008039 bool validateAsmConstraint(const char *&Name,
8040 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00008041 return false;
8042 }
8043
Craig Topper3164f332014-03-11 03:39:26 +00008044 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00008045 return "";
8046 }
8047};
8048
Craig Topperf054e3a2015-10-19 03:52:27 +00008049ArrayRef<const char *> PNaClTargetInfo::getGCCRegNames() const {
8050 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00008051}
8052
Craig Topperf054e3a2015-10-19 03:52:27 +00008053ArrayRef<TargetInfo::GCCRegAlias> PNaClTargetInfo::getGCCRegAliases() const {
8054 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00008055}
Ivan Krasindd7403e2011-08-24 20:22:22 +00008056
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008057// We attempt to use PNaCl (le32) frontend and Mips32EL backend.
Daniel Sanders4672af62016-05-27 11:51:02 +00008058class NaClMips32TargetInfo : public MipsTargetInfo {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008059public:
Daniel Sanders4672af62016-05-27 11:51:02 +00008060 NaClMips32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8061 : MipsTargetInfo(Triple, Opts) {}
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008062
8063 BuiltinVaListKind getBuiltinVaListKind() const override {
8064 return TargetInfo::PNaClABIBuiltinVaList;
8065 }
8066};
8067
JF Bastien643817d2014-09-12 17:52:47 +00008068class Le64TargetInfo : public TargetInfo {
8069 static const Builtin::Info BuiltinInfo[];
8070
8071public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008072 Le64TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
8073 : TargetInfo(Triple) {
JF Bastien643817d2014-09-12 17:52:47 +00008074 NoAsmVariants = true;
8075 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
8076 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00008077 resetDataLayout("e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128");
JF Bastien643817d2014-09-12 17:52:47 +00008078 }
8079
8080 void getTargetDefines(const LangOptions &Opts,
8081 MacroBuilder &Builder) const override {
Saleem Abdulrasool56027092017-02-07 19:00:06 +00008082 DefineStd(Builder, "unix", Opts);
JF Bastien643817d2014-09-12 17:52:47 +00008083 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
8084 Builder.defineMacro("__ELF__");
8085 }
Craig Topper6c03a542015-10-19 04:51:35 +00008086 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
8087 return llvm::makeArrayRef(BuiltinInfo,
8088 clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin);
JF Bastien643817d2014-09-12 17:52:47 +00008089 }
8090 BuiltinVaListKind getBuiltinVaListKind() const override {
8091 return TargetInfo::PNaClABIBuiltinVaList;
8092 }
8093 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00008094 ArrayRef<const char *> getGCCRegNames() const override {
8095 return None;
JF Bastien643817d2014-09-12 17:52:47 +00008096 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008097 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8098 return None;
JF Bastien643817d2014-09-12 17:52:47 +00008099 }
8100 bool validateAsmConstraint(const char *&Name,
8101 TargetInfo::ConstraintInfo &Info) const override {
8102 return false;
8103 }
8104
8105 bool hasProtectedVisibility() const override { return false; }
JF Bastien643817d2014-09-12 17:52:47 +00008106};
Dan Gohmanc2853072015-09-03 22:51:53 +00008107
8108class WebAssemblyTargetInfo : public TargetInfo {
8109 static const Builtin::Info BuiltinInfo[];
8110
8111 enum SIMDEnum {
8112 NoSIMD,
8113 SIMD128,
8114 } SIMDLevel;
8115
8116public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008117 explicit WebAssemblyTargetInfo(const llvm::Triple &T, const TargetOptions &)
Dan Gohmanc2853072015-09-03 22:51:53 +00008118 : TargetInfo(T), SIMDLevel(NoSIMD) {
Dan Gohmanc2853072015-09-03 22:51:53 +00008119 NoAsmVariants = true;
8120 SuitableAlign = 128;
8121 LargeArrayMinWidth = 128;
8122 LargeArrayAlign = 128;
8123 SimdDefaultAlign = 128;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00008124 SigAtomicType = SignedLong;
Dan Gohman6db46402015-11-10 21:01:46 +00008125 LongDoubleWidth = LongDoubleAlign = 128;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00008126 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Derek Schuffacdc8e62016-09-01 22:38:37 +00008127 SizeType = UnsignedInt;
8128 PtrDiffType = SignedInt;
8129 IntPtrType = SignedInt;
Dan Gohmanc2853072015-09-03 22:51:53 +00008130 }
8131
8132protected:
8133 void getTargetDefines(const LangOptions &Opts,
8134 MacroBuilder &Builder) const override {
8135 defineCPUMacros(Builder, "wasm", /*Tuning=*/false);
8136 if (SIMDLevel >= SIMD128)
8137 Builder.defineMacro("__wasm_simd128__");
8138 }
8139
8140private:
Eric Christopher8c47b422015-10-09 18:39:55 +00008141 bool
8142 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
8143 StringRef CPU,
8144 const std::vector<std::string> &FeaturesVec) const override {
Dan Gohmanc2853072015-09-03 22:51:53 +00008145 if (CPU == "bleeding-edge")
8146 Features["simd128"] = true;
8147 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
8148 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00008149 bool hasFeature(StringRef Feature) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00008150 return llvm::StringSwitch<bool>(Feature)
8151 .Case("simd128", SIMDLevel >= SIMD128)
8152 .Default(false);
8153 }
8154 bool handleTargetFeatures(std::vector<std::string> &Features,
Hans Wennborg7eb54642015-09-10 17:07:54 +00008155 DiagnosticsEngine &Diags) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00008156 for (const auto &Feature : Features) {
8157 if (Feature == "+simd128") {
8158 SIMDLevel = std::max(SIMDLevel, SIMD128);
8159 continue;
8160 }
8161 if (Feature == "-simd128") {
8162 SIMDLevel = std::min(SIMDLevel, SIMDEnum(SIMD128 - 1));
8163 continue;
8164 }
8165
8166 Diags.Report(diag::err_opt_not_valid_with_opt) << Feature
8167 << "-target-feature";
8168 return false;
8169 }
8170 return true;
8171 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00008172 bool setCPU(const std::string &Name) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00008173 return llvm::StringSwitch<bool>(Name)
8174 .Case("mvp", true)
8175 .Case("bleeding-edge", true)
8176 .Case("generic", true)
8177 .Default(false);
8178 }
Craig Topper6c03a542015-10-19 04:51:35 +00008179 ArrayRef<Builtin::Info> getTargetBuiltins() const final {
8180 return llvm::makeArrayRef(BuiltinInfo,
8181 clang::WebAssembly::LastTSBuiltin - Builtin::FirstTSBuiltin);
Dan Gohmanc2853072015-09-03 22:51:53 +00008182 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00008183 BuiltinVaListKind getBuiltinVaListKind() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00008184 return VoidPtrBuiltinVaList;
8185 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008186 ArrayRef<const char *> getGCCRegNames() const final {
8187 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00008188 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008189 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const final {
8190 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00008191 }
8192 bool
8193 validateAsmConstraint(const char *&Name,
Hans Wennborg7eb54642015-09-10 17:07:54 +00008194 TargetInfo::ConstraintInfo &Info) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00008195 return false;
8196 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00008197 const char *getClobbers() const final { return ""; }
8198 bool isCLZForZeroUndef() const final { return false; }
8199 bool hasInt128Type() const final { return true; }
Dan Gohmanab0e31f2015-09-14 21:49:41 +00008200 IntType getIntTypeByWidth(unsigned BitWidth,
8201 bool IsSigned) const final {
8202 // WebAssembly prefers long long for explicitly 64-bit integers.
8203 return BitWidth == 64 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
8204 : TargetInfo::getIntTypeByWidth(BitWidth, IsSigned);
8205 }
8206 IntType getLeastIntTypeByWidth(unsigned BitWidth,
8207 bool IsSigned) const final {
8208 // WebAssembly uses long long for int_least64_t and int_fast64_t.
8209 return BitWidth == 64
8210 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
8211 : TargetInfo::getLeastIntTypeByWidth(BitWidth, IsSigned);
8212 }
Dan Gohmanc2853072015-09-03 22:51:53 +00008213};
8214
8215const Builtin::Info WebAssemblyTargetInfo::BuiltinInfo[] = {
8216#define BUILTIN(ID, TYPE, ATTRS) \
8217 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
8218#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
8219 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
8220#include "clang/Basic/BuiltinsWebAssembly.def"
8221};
8222
8223class WebAssembly32TargetInfo : public WebAssemblyTargetInfo {
8224public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008225 explicit WebAssembly32TargetInfo(const llvm::Triple &T,
8226 const TargetOptions &Opts)
8227 : WebAssemblyTargetInfo(T, Opts) {
Dan Gohmanf1c34e62015-09-14 21:56:37 +00008228 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
James Y Knightb214cbc2016-03-04 19:00:41 +00008229 resetDataLayout("e-m:e-p:32:32-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00008230 }
8231
8232protected:
8233 void getTargetDefines(const LangOptions &Opts,
8234 MacroBuilder &Builder) const override {
8235 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
8236 defineCPUMacros(Builder, "wasm32", /*Tuning=*/false);
8237 }
8238};
8239
8240class WebAssembly64TargetInfo : public WebAssemblyTargetInfo {
8241public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008242 explicit WebAssembly64TargetInfo(const llvm::Triple &T,
8243 const TargetOptions &Opts)
8244 : WebAssemblyTargetInfo(T, Opts) {
Dan Gohmanc2853072015-09-03 22:51:53 +00008245 LongAlign = LongWidth = 64;
8246 PointerAlign = PointerWidth = 64;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00008247 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Derek Schuffacdc8e62016-09-01 22:38:37 +00008248 SizeType = UnsignedLong;
8249 PtrDiffType = SignedLong;
8250 IntPtrType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00008251 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00008252 }
8253
8254protected:
8255 void getTargetDefines(const LangOptions &Opts,
8256 MacroBuilder &Builder) const override {
8257 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
8258 defineCPUMacros(Builder, "wasm64", /*Tuning=*/false);
8259 }
8260};
8261
JF Bastien643817d2014-09-12 17:52:47 +00008262const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
8263#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00008264 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
JF Bastien643817d2014-09-12 17:52:47 +00008265#include "clang/Basic/BuiltinsLe64.def"
8266};
8267
Eric Christopherc48497a2015-09-18 21:26:24 +00008268static const unsigned SPIRAddrSpaceMap[] = {
8269 1, // opencl_global
8270 3, // opencl_local
8271 2, // opencl_constant
8272 4, // opencl_generic
8273 0, // cuda_device
8274 0, // cuda_constant
8275 0 // cuda_shared
8276};
8277class SPIRTargetInfo : public TargetInfo {
8278public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008279 SPIRTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
8280 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00008281 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
8282 "SPIR target must use unknown OS");
8283 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
8284 "SPIR target must use unknown environment type");
Eric Christopherc48497a2015-09-18 21:26:24 +00008285 TLSSupported = false;
8286 LongWidth = LongAlign = 64;
8287 AddrSpaceMap = &SPIRAddrSpaceMap;
8288 UseAddrSpaceMapMangling = true;
8289 // Define available target features
8290 // These must be defined in sorted order!
8291 NoAsmVariants = true;
8292 }
8293 void getTargetDefines(const LangOptions &Opts,
8294 MacroBuilder &Builder) const override {
8295 DefineStd(Builder, "SPIR", Opts);
8296 }
8297 bool hasFeature(StringRef Feature) const override {
8298 return Feature == "spir";
8299 }
Craig Topper3164f332014-03-11 03:39:26 +00008300
Craig Topper6c03a542015-10-19 04:51:35 +00008301 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00008302 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00008303 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00008304 bool validateAsmConstraint(const char *&Name,
8305 TargetInfo::ConstraintInfo &info) const override {
8306 return true;
8307 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008308 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8309 return None;
8310 }
Eric Christopherc48497a2015-09-18 21:26:24 +00008311 BuiltinVaListKind getBuiltinVaListKind() const override {
8312 return TargetInfo::VoidPtrBuiltinVaList;
8313 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00008314
Eric Christopherc48497a2015-09-18 21:26:24 +00008315 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Nikolay Haustov8c6538b2016-06-30 09:06:33 +00008316 return (CC == CC_SpirFunction || CC == CC_OpenCLKernel) ? CCCR_OK
8317 : CCCR_Warning;
Eric Christopherc48497a2015-09-18 21:26:24 +00008318 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00008319
Eric Christopherc48497a2015-09-18 21:26:24 +00008320 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
8321 return CC_SpirFunction;
8322 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00008323
8324 void setSupportedOpenCLOpts() override {
8325 // Assume all OpenCL extensions and optional core features are supported
8326 // for SPIR since it is a generic target.
Yaxun Liu5b746652016-12-18 05:18:55 +00008327 getSupportedOpenCLOpts().supportAll();
Yaxun Liu39cf40f2016-05-16 17:06:34 +00008328 }
Eric Christopherc48497a2015-09-18 21:26:24 +00008329};
Guy Benyeib798fc92012-12-11 21:38:14 +00008330
Eric Christopherc48497a2015-09-18 21:26:24 +00008331class SPIR32TargetInfo : public SPIRTargetInfo {
8332public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008333 SPIR32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8334 : SPIRTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00008335 PointerWidth = PointerAlign = 32;
8336 SizeType = TargetInfo::UnsignedInt;
8337 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +00008338 resetDataLayout("e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
8339 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00008340 }
8341 void getTargetDefines(const LangOptions &Opts,
8342 MacroBuilder &Builder) const override {
8343 DefineStd(Builder, "SPIR32", Opts);
8344 }
8345};
Guy Benyeib798fc92012-12-11 21:38:14 +00008346
Eric Christopherc48497a2015-09-18 21:26:24 +00008347class SPIR64TargetInfo : public SPIRTargetInfo {
8348public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008349 SPIR64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8350 : SPIRTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00008351 PointerWidth = PointerAlign = 64;
8352 SizeType = TargetInfo::UnsignedLong;
8353 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00008354 resetDataLayout("e-i64:64-v16:16-v24:32-v32:32-v48:64-"
8355 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00008356 }
8357 void getTargetDefines(const LangOptions &Opts,
8358 MacroBuilder &Builder) const override {
8359 DefineStd(Builder, "SPIR64", Opts);
8360 }
8361};
Guy Benyeib798fc92012-12-11 21:38:14 +00008362
Robert Lytton0e076492013-08-13 09:43:10 +00008363class XCoreTargetInfo : public TargetInfo {
8364 static const Builtin::Info BuiltinInfo[];
8365public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008366 XCoreTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
8367 : TargetInfo(Triple) {
Robert Lytton0e076492013-08-13 09:43:10 +00008368 NoAsmVariants = true;
8369 LongLongAlign = 32;
8370 SuitableAlign = 32;
8371 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00008372 SizeType = UnsignedInt;
8373 PtrDiffType = SignedInt;
8374 IntPtrType = SignedInt;
8375 WCharType = UnsignedChar;
8376 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00008377 UseZeroLengthBitfieldAlignment = true;
James Y Knightb214cbc2016-03-04 19:00:41 +00008378 resetDataLayout("e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32"
8379 "-f64:32-a:0:32-n32");
Robert Lytton0e076492013-08-13 09:43:10 +00008380 }
Craig Topper3164f332014-03-11 03:39:26 +00008381 void getTargetDefines(const LangOptions &Opts,
8382 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008383 Builder.defineMacro("__XS1B__");
8384 }
Craig Topper6c03a542015-10-19 04:51:35 +00008385 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
8386 return llvm::makeArrayRef(BuiltinInfo,
8387 clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin);
Robert Lytton0e076492013-08-13 09:43:10 +00008388 }
Craig Topper3164f332014-03-11 03:39:26 +00008389 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008390 return TargetInfo::VoidPtrBuiltinVaList;
8391 }
Craig Topper3164f332014-03-11 03:39:26 +00008392 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008393 return "";
8394 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008395 ArrayRef<const char *> getGCCRegNames() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008396 static const char * const GCCRegNames[] = {
8397 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
8398 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
8399 };
Craig Topperf054e3a2015-10-19 03:52:27 +00008400 return llvm::makeArrayRef(GCCRegNames);
Robert Lytton0e076492013-08-13 09:43:10 +00008401 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008402 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8403 return None;
Robert Lytton0e076492013-08-13 09:43:10 +00008404 }
Craig Topper3164f332014-03-11 03:39:26 +00008405 bool validateAsmConstraint(const char *&Name,
8406 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008407 return false;
8408 }
Craig Topper3164f332014-03-11 03:39:26 +00008409 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00008410 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
8411 return (RegNo < 2)? RegNo : -1;
8412 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00008413 bool allowsLargerPreferedTypeAlignment() const override {
8414 return false;
8415 }
Robert Lytton0e076492013-08-13 09:43:10 +00008416};
8417
8418const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00008419#define BUILTIN(ID, TYPE, ATTRS) \
8420 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
8421#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
8422 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Robert Lytton0e076492013-08-13 09:43:10 +00008423#include "clang/Basic/BuiltinsXCore.def"
8424};
Robert Lytton0e076492013-08-13 09:43:10 +00008425
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008426// x86_32 Android target
8427class AndroidX86_32TargetInfo : public LinuxTargetInfo<X86_32TargetInfo> {
8428public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008429 AndroidX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8430 : LinuxTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008431 SuitableAlign = 32;
8432 LongDoubleWidth = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00008433 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008434 }
8435};
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008436
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008437// x86_64 Android target
8438class AndroidX86_64TargetInfo : public LinuxTargetInfo<X86_64TargetInfo> {
8439public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008440 AndroidX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8441 : LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Stephan Bergmann17c7f702016-12-14 11:57:17 +00008442 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008443 }
Chih-Hung Hsieh0b0eeaa2015-07-24 18:12:54 +00008444
8445 bool useFloat128ManglingForLongDouble() const override {
8446 return true;
8447 }
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008448};
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008449
8450// 32-bit RenderScript is armv7 with width and align of 'long' set to 8-bytes
8451class RenderScript32TargetInfo : public ARMleTargetInfo {
8452public:
8453 RenderScript32TargetInfo(const llvm::Triple &Triple,
8454 const TargetOptions &Opts)
8455 : ARMleTargetInfo(llvm::Triple("armv7", Triple.getVendorName(),
8456 Triple.getOSName(),
8457 Triple.getEnvironmentName()),
8458 Opts) {
Pirama Arumuga Nainarbb846a32016-07-27 19:01:51 +00008459 IsRenderScriptTarget = true;
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008460 LongWidth = LongAlign = 64;
8461 }
8462 void getTargetDefines(const LangOptions &Opts,
8463 MacroBuilder &Builder) const override {
8464 Builder.defineMacro("__RENDERSCRIPT__");
8465 ARMleTargetInfo::getTargetDefines(Opts, Builder);
8466 }
8467};
8468
8469// 64-bit RenderScript is aarch64
8470class RenderScript64TargetInfo : public AArch64leTargetInfo {
8471public:
8472 RenderScript64TargetInfo(const llvm::Triple &Triple,
8473 const TargetOptions &Opts)
8474 : AArch64leTargetInfo(llvm::Triple("aarch64", Triple.getVendorName(),
8475 Triple.getOSName(),
8476 Triple.getEnvironmentName()),
Pirama Arumuga Nainarbb846a32016-07-27 19:01:51 +00008477 Opts) {
8478 IsRenderScriptTarget = true;
8479 }
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008480
8481 void getTargetDefines(const LangOptions &Opts,
8482 MacroBuilder &Builder) const override {
8483 Builder.defineMacro("__RENDERSCRIPT__");
8484 AArch64leTargetInfo::getTargetDefines(Opts, Builder);
8485 }
8486};
8487
Dylan McKayecb6e7b2017-02-07 06:04:18 +00008488/// Information about a specific microcontroller.
8489struct MCUInfo {
8490 const char *Name;
8491 const char *DefineName;
8492};
8493
8494// This list should be kept up-to-date with AVRDevices.td in LLVM.
8495static ArrayRef<MCUInfo> AVRMcus = {
8496 { "at90s1200", "__AVR_AT90S1200__" },
8497 { "attiny11", "__AVR_ATtiny11" },
8498 { "attiny12", "__AVR_ATtiny12" },
8499 { "attiny15", "__AVR_ATtiny15" },
8500 { "attiny28", "__AVR_ATtiny28" },
8501 { "at90s2313", "__AVR_AT90S2313" },
8502 { "at90s2323", "__AVR_AT90S2323" },
8503 { "at90s2333", "__AVR_AT90S2333" },
8504 { "at90s2343", "__AVR_AT90S2343" },
8505 { "attiny22", "__AVR_ATtiny22" },
8506 { "attiny26", "__AVR_ATtiny26" },
8507 { "at86rf401", "__AVR_AT86RF401" },
8508 { "at90s4414", "__AVR_AT90S4414" },
8509 { "at90s4433", "__AVR_AT90S4433" },
8510 { "at90s4434", "__AVR_AT90S4434" },
8511 { "at90s8515", "__AVR_AT90S8515" },
8512 { "at90c8534", "__AVR_AT90c8534" },
8513 { "at90s8535", "__AVR_AT90S8535" },
8514 { "ata5272", "__AVR_ATA5272" },
8515 { "attiny13", "__AVR_ATtiny13" },
8516 { "attiny13a", "__AVR_ATtiny13A" },
8517 { "attiny2313", "__AVR_ATtiny2313" },
8518 { "attiny2313a", "__AVR_ATtiny2313A" },
8519 { "attiny24", "__AVR_ATtiny24" },
8520 { "attiny24a", "__AVR_ATtiny24A" },
8521 { "attiny4313", "__AVR_ATtiny4313" },
8522 { "attiny44", "__AVR_ATtiny44" },
8523 { "attiny44a", "__AVR_ATtiny44A" },
8524 { "attiny84", "__AVR_ATtiny84" },
8525 { "attiny84a", "__AVR_ATtiny84A" },
8526 { "attiny25", "__AVR_ATtiny25" },
8527 { "attiny45", "__AVR_ATtiny45" },
8528 { "attiny85", "__AVR_ATtiny85" },
8529 { "attiny261", "__AVR_ATtiny261" },
8530 { "attiny261a", "__AVR_ATtiny261A" },
8531 { "attiny461", "__AVR_ATtiny461" },
8532 { "attiny461a", "__AVR_ATtiny461A" },
8533 { "attiny861", "__AVR_ATtiny861" },
8534 { "attiny861a", "__AVR_ATtiny861A" },
8535 { "attiny87", "__AVR_ATtiny87" },
8536 { "attiny43u", "__AVR_ATtiny43U" },
8537 { "attiny48", "__AVR_ATtiny48" },
8538 { "attiny88", "__AVR_ATtiny88" },
8539 { "attiny828", "__AVR_ATtiny828" },
8540 { "at43usb355", "__AVR_AT43USB355" },
8541 { "at76c711", "__AVR_AT76C711" },
8542 { "atmega103", "__AVR_ATmega103" },
8543 { "at43usb320", "__AVR_AT43USB320" },
8544 { "attiny167", "__AVR_ATtiny167" },
8545 { "at90usb82", "__AVR_AT90USB82" },
8546 { "at90usb162", "__AVR_AT90USB162" },
8547 { "ata5505", "__AVR_ATA5505" },
8548 { "atmega8u2", "__AVR_ATmega8U2" },
8549 { "atmega16u2", "__AVR_ATmega16U2" },
8550 { "atmega32u2", "__AVR_ATmega32U2" },
8551 { "attiny1634", "__AVR_ATtiny1634" },
8552 { "atmega8", "__AVR_ATmega8" },
8553 { "ata6289", "__AVR_ATA6289" },
8554 { "atmega8a", "__AVR_ATmega8A" },
8555 { "ata6285", "__AVR_ATA6285" },
8556 { "ata6286", "__AVR_ATA6286" },
8557 { "atmega48", "__AVR_ATmega48" },
8558 { "atmega48a", "__AVR_ATmega48A" },
8559 { "atmega48pa", "__AVR_ATmega48PA" },
8560 { "atmega48p", "__AVR_ATmega48P" },
8561 { "atmega88", "__AVR_ATmega88" },
8562 { "atmega88a", "__AVR_ATmega88A" },
8563 { "atmega88p", "__AVR_ATmega88P" },
8564 { "atmega88pa", "__AVR_ATmega88PA" },
8565 { "atmega8515", "__AVR_ATmega8515" },
8566 { "atmega8535", "__AVR_ATmega8535" },
8567 { "atmega8hva", "__AVR_ATmega8HVA" },
8568 { "at90pwm1", "__AVR_AT90PWM1" },
8569 { "at90pwm2", "__AVR_AT90PWM2" },
8570 { "at90pwm2b", "__AVR_AT90PWM2B" },
8571 { "at90pwm3", "__AVR_AT90PWM3" },
8572 { "at90pwm3b", "__AVR_AT90PWM3B" },
8573 { "at90pwm81", "__AVR_AT90PWM81" },
8574 { "ata5790", "__AVR_ATA5790" },
8575 { "ata5795", "__AVR_ATA5795" },
8576 { "atmega16", "__AVR_ATmega16" },
8577 { "atmega16a", "__AVR_ATmega16A" },
8578 { "atmega161", "__AVR_ATmega161" },
8579 { "atmega162", "__AVR_ATmega162" },
8580 { "atmega163", "__AVR_ATmega163" },
8581 { "atmega164a", "__AVR_ATmega164A" },
8582 { "atmega164p", "__AVR_ATmega164P" },
8583 { "atmega164pa", "__AVR_ATmega164PA" },
8584 { "atmega165", "__AVR_ATmega165" },
8585 { "atmega165a", "__AVR_ATmega165A" },
8586 { "atmega165p", "__AVR_ATmega165P" },
8587 { "atmega165pa", "__AVR_ATmega165PA" },
8588 { "atmega168", "__AVR_ATmega168" },
8589 { "atmega168a", "__AVR_ATmega168A" },
8590 { "atmega168p", "__AVR_ATmega168P" },
8591 { "atmega168pa", "__AVR_ATmega168PA" },
8592 { "atmega169", "__AVR_ATmega169" },
8593 { "atmega169a", "__AVR_ATmega169A" },
8594 { "atmega169p", "__AVR_ATmega169P" },
8595 { "atmega169pa", "__AVR_ATmega169PA" },
8596 { "atmega32", "__AVR_ATmega32" },
8597 { "atmega32a", "__AVR_ATmega32A" },
8598 { "atmega323", "__AVR_ATmega323" },
8599 { "atmega324a", "__AVR_ATmega324A" },
8600 { "atmega324p", "__AVR_ATmega324P" },
8601 { "atmega324pa", "__AVR_ATmega324PA" },
8602 { "atmega325", "__AVR_ATmega325" },
8603 { "atmega325a", "__AVR_ATmega325A" },
8604 { "atmega325p", "__AVR_ATmega325P" },
8605 { "atmega325pa", "__AVR_ATmega325PA" },
8606 { "atmega3250", "__AVR_ATmega3250" },
8607 { "atmega3250a", "__AVR_ATmega3250A" },
8608 { "atmega3250p", "__AVR_ATmega3250P" },
8609 { "atmega3250pa", "__AVR_ATmega3250PA" },
8610 { "atmega328", "__AVR_ATmega328" },
8611 { "atmega328p", "__AVR_ATmega328P" },
8612 { "atmega329", "__AVR_ATmega329" },
8613 { "atmega329a", "__AVR_ATmega329A" },
8614 { "atmega329p", "__AVR_ATmega329P" },
8615 { "atmega329pa", "__AVR_ATmega329PA" },
8616 { "atmega3290", "__AVR_ATmega3290" },
8617 { "atmega3290a", "__AVR_ATmega3290A" },
8618 { "atmega3290p", "__AVR_ATmega3290P" },
8619 { "atmega3290pa", "__AVR_ATmega3290PA" },
8620 { "atmega406", "__AVR_ATmega406" },
8621 { "atmega64", "__AVR_ATmega64" },
8622 { "atmega64a", "__AVR_ATmega64A" },
8623 { "atmega640", "__AVR_ATmega640" },
8624 { "atmega644", "__AVR_ATmega644" },
8625 { "atmega644a", "__AVR_ATmega644A" },
8626 { "atmega644p", "__AVR_ATmega644P" },
8627 { "atmega644pa", "__AVR_ATmega644PA" },
8628 { "atmega645", "__AVR_ATmega645" },
8629 { "atmega645a", "__AVR_ATmega645A" },
8630 { "atmega645p", "__AVR_ATmega645P" },
8631 { "atmega649", "__AVR_ATmega649" },
8632 { "atmega649a", "__AVR_ATmega649A" },
8633 { "atmega649p", "__AVR_ATmega649P" },
8634 { "atmega6450", "__AVR_ATmega6450" },
8635 { "atmega6450a", "__AVR_ATmega6450A" },
8636 { "atmega6450p", "__AVR_ATmega6450P" },
8637 { "atmega6490", "__AVR_ATmega6490" },
8638 { "atmega6490a", "__AVR_ATmega6490A" },
8639 { "atmega6490p", "__AVR_ATmega6490P" },
8640 { "atmega64rfr2", "__AVR_ATmega64RFR2" },
8641 { "atmega644rfr2", "__AVR_ATmega644RFR2" },
8642 { "atmega16hva", "__AVR_ATmega16HVA" },
8643 { "atmega16hva2", "__AVR_ATmega16HVA2" },
8644 { "atmega16hvb", "__AVR_ATmega16HVB" },
8645 { "atmega16hvbrevb", "__AVR_ATmega16HVBREVB" },
8646 { "atmega32hvb", "__AVR_ATmega32HVB" },
8647 { "atmega32hvbrevb", "__AVR_ATmega32HVBREVB" },
8648 { "atmega64hve", "__AVR_ATmega64HVE" },
8649 { "at90can32", "__AVR_AT90CAN32" },
8650 { "at90can64", "__AVR_AT90CAN64" },
8651 { "at90pwm161", "__AVR_AT90PWM161" },
8652 { "at90pwm216", "__AVR_AT90PWM216" },
8653 { "at90pwm316", "__AVR_AT90PWM316" },
8654 { "atmega32c1", "__AVR_ATmega32C1" },
8655 { "atmega64c1", "__AVR_ATmega64C1" },
8656 { "atmega16m1", "__AVR_ATmega16M1" },
8657 { "atmega32m1", "__AVR_ATmega32M1" },
8658 { "atmega64m1", "__AVR_ATmega64M1" },
8659 { "atmega16u4", "__AVR_ATmega16U4" },
8660 { "atmega32u4", "__AVR_ATmega32U4" },
8661 { "atmega32u6", "__AVR_ATmega32U6" },
8662 { "at90usb646", "__AVR_AT90USB646" },
8663 { "at90usb647", "__AVR_AT90USB647" },
8664 { "at90scr100", "__AVR_AT90SCR100" },
8665 { "at94k", "__AVR_AT94K" },
8666 { "m3000", "__AVR_AT000" },
8667 { "atmega128", "__AVR_ATmega128" },
8668 { "atmega128a", "__AVR_ATmega128A" },
8669 { "atmega1280", "__AVR_ATmega1280" },
8670 { "atmega1281", "__AVR_ATmega1281" },
8671 { "atmega1284", "__AVR_ATmega1284" },
8672 { "atmega1284p", "__AVR_ATmega1284P" },
8673 { "atmega128rfa1", "__AVR_ATmega128RFA1" },
8674 { "atmega128rfr2", "__AVR_ATmega128RFR2" },
8675 { "atmega1284rfr2", "__AVR_ATmega1284RFR2" },
8676 { "at90can128", "__AVR_AT90CAN128" },
8677 { "at90usb1286", "__AVR_AT90USB1286" },
8678 { "at90usb1287", "__AVR_AT90USB1287" },
8679 { "atmega2560", "__AVR_ATmega2560" },
8680 { "atmega2561", "__AVR_ATmega2561" },
8681 { "atmega256rfr2", "__AVR_ATmega256RFR2" },
8682 { "atmega2564rfr2", "__AVR_ATmega2564RFR2" },
8683 { "atxmega16a4", "__AVR_ATxmega16A4" },
8684 { "atxmega16a4u", "__AVR_ATxmega16a4U" },
8685 { "atxmega16c4", "__AVR_ATxmega16C4" },
8686 { "atxmega16d4", "__AVR_ATxmega16D4" },
8687 { "atxmega32a4", "__AVR_ATxmega32A4" },
8688 { "atxmega32a4u", "__AVR_ATxmega32A4U" },
8689 { "atxmega32c4", "__AVR_ATxmega32C4" },
8690 { "atxmega32d4", "__AVR_ATxmega32D4" },
8691 { "atxmega32e5", "__AVR_ATxmega32E5" },
8692 { "atxmega16e5", "__AVR_ATxmega16E5" },
8693 { "atxmega8e5", "__AVR_ATxmega8E5" },
8694 { "atxmega32x1", "__AVR_ATxmega32X1" },
8695 { "atxmega64a3", "__AVR_ATxmega64A3" },
8696 { "atxmega64a3u", "__AVR_ATxmega64A3U" },
8697 { "atxmega64a4u", "__AVR_ATxmega64A4U" },
8698 { "atxmega64b1", "__AVR_ATxmega64B1" },
8699 { "atxmega64b3", "__AVR_ATxmega64B3" },
8700 { "atxmega64c3", "__AVR_ATxmega64C3" },
8701 { "atxmega64d3", "__AVR_ATxmega64D3" },
8702 { "atxmega64d4", "__AVR_ATxmega64D4" },
8703 { "atxmega64a1", "__AVR_ATxmega64A1" },
8704 { "atxmega64a1u", "__AVR_ATxmega64A1U" },
8705 { "atxmega128a3", "__AVR_ATxmega128A3" },
8706 { "atxmega128a3u", "__AVR_ATxmega128A3U" },
8707 { "atxmega128b1", "__AVR_ATxmega128B1" },
8708 { "atxmega128b3", "__AVR_ATxmega128B3" },
8709 { "atxmega128c3", "__AVR_ATxmega128C3" },
8710 { "atxmega128d3", "__AVR_ATxmega128D3" },
8711 { "atxmega128d4", "__AVR_ATxmega128D4" },
8712 { "atxmega192a3", "__AVR_ATxmega192A3" },
8713 { "atxmega192a3u", "__AVR_ATxmega192A3U" },
8714 { "atxmega192c3", "__AVR_ATxmega192C3" },
8715 { "atxmega192d3", "__AVR_ATxmega192D3" },
8716 { "atxmega256a3", "__AVR_ATxmega256A3" },
8717 { "atxmega256a3u", "__AVR_ATxmega256A3U" },
8718 { "atxmega256a3b", "__AVR_ATxmega256A3B" },
8719 { "atxmega256a3bu", "__AVR_ATxmega256A3BU" },
8720 { "atxmega256c3", "__AVR_ATxmega256C3" },
8721 { "atxmega256d3", "__AVR_ATxmega256D3" },
8722 { "atxmega384c3", "__AVR_ATxmega384C3" },
8723 { "atxmega384d3", "__AVR_ATxmega384D3" },
8724 { "atxmega128a1", "__AVR_ATxmega128A1" },
8725 { "atxmega128a1u", "__AVR_ATxmega128A1U" },
8726 { "atxmega128a4u", "__AVR_ATxmega128a4U" },
8727 { "attiny4", "__AVR_ATtiny4" },
8728 { "attiny5", "__AVR_ATtiny5" },
8729 { "attiny9", "__AVR_ATtiny9" },
8730 { "attiny10", "__AVR_ATtiny10" },
8731 { "attiny20", "__AVR_ATtiny20" },
8732 { "attiny40", "__AVR_ATtiny40" },
8733 { "attiny102", "__AVR_ATtiny102" },
8734 { "attiny104", "__AVR_ATtiny104" },
8735};
Dylan McKay924fa3a2017-01-05 05:20:27 +00008736
8737// AVR Target
8738class AVRTargetInfo : public TargetInfo {
8739public:
8740 AVRTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
8741 : TargetInfo(Triple) {
8742 TLSSupported = false;
8743 PointerWidth = 16;
8744 PointerAlign = 8;
8745 IntWidth = 16;
8746 IntAlign = 8;
8747 LongWidth = 32;
8748 LongAlign = 8;
8749 LongLongWidth = 64;
8750 LongLongAlign = 8;
8751 SuitableAlign = 8;
8752 DefaultAlignForAttributeAligned = 8;
8753 HalfWidth = 16;
8754 HalfAlign = 8;
8755 FloatWidth = 32;
8756 FloatAlign = 8;
8757 DoubleWidth = 32;
8758 DoubleAlign = 8;
8759 DoubleFormat = &llvm::APFloat::IEEEsingle();
8760 LongDoubleWidth = 32;
8761 LongDoubleAlign = 8;
8762 LongDoubleFormat = &llvm::APFloat::IEEEsingle();
8763 SizeType = UnsignedInt;
8764 PtrDiffType = SignedInt;
8765 IntPtrType = SignedInt;
8766 Char16Type = UnsignedInt;
8767 WCharType = SignedInt;
8768 WIntType = SignedInt;
8769 Char32Type = UnsignedLong;
8770 SigAtomicType = SignedChar;
8771 resetDataLayout("e-p:16:16:16-i8:8:8-i16:16:16-i32:32:32-i64:64:64"
8772 "-f32:32:32-f64:64:64-n8");
8773 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008774
Dylan McKay924fa3a2017-01-05 05:20:27 +00008775 void getTargetDefines(const LangOptions &Opts,
8776 MacroBuilder &Builder) const override {
Dylan McKayecb6e7b2017-02-07 06:04:18 +00008777 Builder.defineMacro("AVR");
8778 Builder.defineMacro("__AVR");
Dylan McKay924fa3a2017-01-05 05:20:27 +00008779 Builder.defineMacro("__AVR__");
Dylan McKayecb6e7b2017-02-07 06:04:18 +00008780
8781 if (!this->CPU.empty()) {
8782 auto It = std::find_if(AVRMcus.begin(), AVRMcus.end(),
8783 [&](const MCUInfo &Info) { return Info.Name == this->CPU; });
8784
8785 if (It != AVRMcus.end())
8786 Builder.defineMacro(It->DefineName);
8787 }
Dylan McKay924fa3a2017-01-05 05:20:27 +00008788 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008789
Dylan McKay924fa3a2017-01-05 05:20:27 +00008790 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
8791 return None;
8792 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008793
Dylan McKay924fa3a2017-01-05 05:20:27 +00008794 BuiltinVaListKind getBuiltinVaListKind() const override {
8795 return TargetInfo::VoidPtrBuiltinVaList;
8796 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008797
Dylan McKay924fa3a2017-01-05 05:20:27 +00008798 const char *getClobbers() const override {
8799 return "";
8800 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008801
Dylan McKay924fa3a2017-01-05 05:20:27 +00008802 ArrayRef<const char *> getGCCRegNames() const override {
8803 static const char * const GCCRegNames[] = {
8804 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
8805 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
8806 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
Dylan McKay95aa2652017-01-05 07:17:46 +00008807 "r24", "r25", "X", "Y", "Z", "SP"
Dylan McKay924fa3a2017-01-05 05:20:27 +00008808 };
8809 return llvm::makeArrayRef(GCCRegNames);
8810 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008811
Dylan McKay924fa3a2017-01-05 05:20:27 +00008812 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8813 return None;
8814 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008815
Dylan McKay924fa3a2017-01-05 05:20:27 +00008816 ArrayRef<TargetInfo::AddlRegName> getGCCAddlRegNames() const override {
8817 static const TargetInfo::AddlRegName AddlRegNames[] = {
8818 { { "r26", "r27"}, 26 },
8819 { { "r28", "r29"}, 27 },
8820 { { "r30", "r31"}, 28 },
8821 { { "SPL", "SPH"}, 29 },
8822 };
8823 return llvm::makeArrayRef(AddlRegNames);
8824 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008825
Dylan McKay924fa3a2017-01-05 05:20:27 +00008826 bool validateAsmConstraint(const char *&Name,
8827 TargetInfo::ConstraintInfo &Info) const override {
Dylan McKayd31534c2017-02-06 09:01:59 +00008828 // There aren't any multi-character AVR specific constraints.
8829 if (StringRef(Name).size() > 1) return false;
8830
8831 switch (*Name) {
8832 default: return false;
8833 case 'a': // Simple upper registers
8834 case 'b': // Base pointer registers pairs
8835 case 'd': // Upper register
8836 case 'l': // Lower registers
8837 case 'e': // Pointer register pairs
8838 case 'q': // Stack pointer register
8839 case 'r': // Any register
8840 case 'w': // Special upper register pairs
8841 case 't': // Temporary register
8842 case 'x': case 'X': // Pointer register pair X
8843 case 'y': case 'Y': // Pointer register pair Y
8844 case 'z': case 'Z': // Pointer register pair Z
8845 Info.setAllowsRegister();
8846 return true;
8847 case 'I': // 6-bit positive integer constant
8848 Info.setRequiresImmediate(0, 63);
8849 return true;
8850 case 'J': // 6-bit negative integer constant
8851 Info.setRequiresImmediate(-63, 0);
8852 return true;
8853 case 'K': // Integer constant (Range: 2)
8854 Info.setRequiresImmediate(2);
8855 return true;
8856 case 'L': // Integer constant (Range: 0)
8857 Info.setRequiresImmediate(0);
8858 return true;
8859 case 'M': // 8-bit integer constant
8860 Info.setRequiresImmediate(0, 0xff);
8861 return true;
8862 case 'N': // Integer constant (Range: -1)
8863 Info.setRequiresImmediate(-1);
8864 return true;
8865 case 'O': // Integer constant (Range: 8, 16, 24)
8866 Info.setRequiresImmediate({8, 16, 24});
8867 return true;
8868 case 'P': // Integer constant (Range: 1)
8869 Info.setRequiresImmediate(1);
8870 return true;
8871 case 'R': // Integer constant (Range: -6 to 5)
8872 Info.setRequiresImmediate(-6, 5);
8873 return true;
8874 case 'G': // Floating point constant
8875 case 'Q': // A memory address based on Y or Z pointer with displacement.
8876 return true;
8877 }
8878
Dylan McKay924fa3a2017-01-05 05:20:27 +00008879 return false;
8880 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008881
Dylan McKay924fa3a2017-01-05 05:20:27 +00008882 IntType getIntTypeByWidth(unsigned BitWidth,
8883 bool IsSigned) const final {
8884 // AVR prefers int for 16-bit integers.
8885 return BitWidth == 16 ? (IsSigned ? SignedInt : UnsignedInt)
8886 : TargetInfo::getIntTypeByWidth(BitWidth, IsSigned);
8887 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008888
Dylan McKay924fa3a2017-01-05 05:20:27 +00008889 IntType getLeastIntTypeByWidth(unsigned BitWidth,
8890 bool IsSigned) const final {
8891 // AVR uses int for int_least16_t and int_fast16_t.
8892 return BitWidth == 16
8893 ? (IsSigned ? SignedInt : UnsignedInt)
8894 : TargetInfo::getLeastIntTypeByWidth(BitWidth, IsSigned);
8895 }
Dylan McKayecb6e7b2017-02-07 06:04:18 +00008896
8897 bool setCPU(const std::string &Name) override {
8898 bool IsFamily = llvm::StringSwitch<bool>(Name)
8899 .Case("avr1", true)
8900 .Case("avr2", true)
8901 .Case("avr25", true)
8902 .Case("avr3", true)
8903 .Case("avr31", true)
8904 .Case("avr35", true)
8905 .Case("avr4", true)
8906 .Case("avr5", true)
8907 .Case("avr51", true)
8908 .Case("avr6", true)
8909 .Case("avrxmega1", true)
8910 .Case("avrxmega2", true)
8911 .Case("avrxmega3", true)
8912 .Case("avrxmega4", true)
8913 .Case("avrxmega5", true)
8914 .Case("avrxmega6", true)
8915 .Case("avrxmega7", true)
8916 .Case("avrtiny", true)
8917 .Default(false);
8918
8919 if (IsFamily) this->CPU = Name;
8920
8921 bool IsMCU = std::find_if(AVRMcus.begin(), AVRMcus.end(),
8922 [&](const MCUInfo &Info) { return Info.Name == Name; }) != AVRMcus.end();
8923
8924 if (IsMCU) this->CPU = Name;
8925
8926 return IsFamily || IsMCU;
8927 }
8928
8929protected:
8930 std::string CPU;
Dylan McKay924fa3a2017-01-05 05:20:27 +00008931};
8932
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008933} // end anonymous namespace
8934
Chris Lattner5ba61f02006-10-14 07:39:34 +00008935//===----------------------------------------------------------------------===//
8936// Driver code
8937//===----------------------------------------------------------------------===//
8938
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008939static TargetInfo *AllocateTarget(const llvm::Triple &Triple,
8940 const TargetOptions &Opts) {
Daniel Dunbar52322032009-08-18 05:47:58 +00008941 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00008942
Daniel Dunbar52322032009-08-18 05:47:58 +00008943 switch (Triple.getArch()) {
8944 default:
Craig Topperf1186c52014-05-08 06:41:40 +00008945 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00008946
Tim Northover2a0783d2014-05-30 14:14:07 +00008947 case llvm::Triple::xcore:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008948 return new XCoreTargetInfo(Triple, Opts);
Tim Northover2a0783d2014-05-30 14:14:07 +00008949
8950 case llvm::Triple::hexagon:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008951 return new HexagonTargetInfo(Triple, Opts);
Tim Northover2a0783d2014-05-30 14:14:07 +00008952
Jacques Pienaard964cc22016-03-28 21:02:54 +00008953 case llvm::Triple::lanai:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008954 return new LanaiTargetInfo(Triple, Opts);
Jacques Pienaard964cc22016-03-28 21:02:54 +00008955
Tim Northover2a0783d2014-05-30 14:14:07 +00008956 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00008957 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008958 return new DarwinAArch64TargetInfo(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00008959
8960 switch (os) {
Ed Schoutenea9448e2015-10-15 15:07:07 +00008961 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008962 return new CloudABITargetInfo<AArch64leTargetInfo>(Triple, Opts);
Ed Maste6a9eda52014-11-13 16:55:42 +00008963 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008964 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Petr Hosek9834fcd2016-10-24 22:55:57 +00008965 case llvm::Triple::Fuchsia:
8966 return new FuchsiaTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00008967 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008968 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple, Opts);
James Molloy5e73df52014-04-16 15:06:20 +00008969 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008970 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00008971 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008972 return new AArch64leTargetInfo(Triple, Opts);
James Molloy5e73df52014-04-16 15:06:20 +00008973 }
8974
Christian Pirker9b019ae2014-02-25 13:51:00 +00008975 case llvm::Triple::aarch64_be:
8976 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00008977 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008978 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Petr Hosek9834fcd2016-10-24 22:55:57 +00008979 case llvm::Triple::Fuchsia:
8980 return new FuchsiaTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00008981 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008982 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00008983 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008984 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00008985 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008986 return new AArch64beTargetInfo(Triple, Opts);
Tim Northover9bb857a2013-01-31 12:13:10 +00008987 }
8988
Daniel Dunbar52322032009-08-18 05:47:58 +00008989 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00008990 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00008991 if (Triple.isOSBinFormatMachO())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008992 return new DarwinARMTargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008993
Daniel Dunbar52322032009-08-18 05:47:58 +00008994 switch (os) {
Ed Schoutenc6d1a732016-09-05 18:38:34 +00008995 case llvm::Triple::CloudABI:
8996 return new CloudABITargetInfo<ARMleTargetInfo>(Triple, Opts);
Rafael Espindolaad8fed52010-06-10 00:46:51 +00008997 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008998 return new LinuxTargetInfo<ARMleTargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008999 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009000 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009001 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009002 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00009003 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009004 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00009005 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009006 return new BitrigTargetInfo<ARMleTargetInfo>(Triple, Opts);
Douglas Gregor9fabd852011-07-01 22:41:14 +00009007 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009008 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00009009 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009010 return new NaClTargetInfo<ARMleTargetInfo>(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00009011 case llvm::Triple::Win32:
9012 switch (Triple.getEnvironment()) {
Yaron Keren321249c2015-07-15 13:32:23 +00009013 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009014 return new CygwinARMTargetInfo(Triple, Opts);
Yaron Keren321249c2015-07-15 13:32:23 +00009015 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009016 return new MinGWARMTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00009017 case llvm::Triple::Itanium:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009018 return new ItaniumWindowsARMleTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00009019 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00009020 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009021 return new MicrosoftARMleTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00009022 }
Daniel Dunbar52322032009-08-18 05:47:58 +00009023 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009024 return new ARMleTargetInfo(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009025 }
9026
9027 case llvm::Triple::armeb:
9028 case llvm::Triple::thumbeb:
9029 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009030 return new DarwinARMTargetInfo(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009031
9032 switch (os) {
9033 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009034 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009035 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009036 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009037 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009038 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009039 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009040 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009041 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009042 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009043 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009044 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009045 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009046 return new NaClTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009047 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009048 return new ARMbeTargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009049 }
Eli Friedmanb5366062008-05-20 14:21:01 +00009050
Dylan McKay924fa3a2017-01-05 05:20:27 +00009051 case llvm::Triple::avr:
9052 return new AVRTargetInfo(Triple, Opts);
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00009053 case llvm::Triple::bpfeb:
9054 case llvm::Triple::bpfel:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009055 return new BPFTargetInfo(Triple, Opts);
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00009056
Daniel Dunbar52322032009-08-18 05:47:58 +00009057 case llvm::Triple::msp430:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009058 return new MSP430TargetInfo(Triple, Opts);
Eli Friedmanb5366062008-05-20 14:21:01 +00009059
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00009060 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009061 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009062 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00009063 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009064 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00009065 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009066 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009067 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009068 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009069 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009070 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00009071 return new MipsTargetInfo(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009072 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00009073
9074 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009075 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009076 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00009077 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009078 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00009079 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009080 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009081 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009082 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009083 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00009084 case llvm::Triple::NaCl:
Daniel Sanders4672af62016-05-27 11:51:02 +00009085 return new NaClTargetInfo<NaClMips32TargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009086 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00009087 return new MipsTargetInfo(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009088 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00009089
Akira Hatanakabef17452011-09-20 19:21:49 +00009090 case llvm::Triple::mips64:
9091 switch (os) {
9092 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00009093 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009094 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00009095 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009096 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009097 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009098 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009099 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00009100 case llvm::Triple::OpenBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009101 return new OpenBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009102 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00009103 return new MipsTargetInfo(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009104 }
9105
9106 case llvm::Triple::mips64el:
9107 switch (os) {
9108 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00009109 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009110 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00009111 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009112 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009113 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009114 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009115 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00009116 case llvm::Triple::OpenBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009117 return new OpenBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009118 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00009119 return new MipsTargetInfo(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009120 }
9121
Ivan Krasindd7403e2011-08-24 20:22:22 +00009122 case llvm::Triple::le32:
9123 switch (os) {
Douglas Katzman78d7c542015-05-12 21:18:10 +00009124 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009125 return new NaClTargetInfo<PNaClTargetInfo>(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00009126 default:
9127 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00009128 }
9129
JF Bastien643817d2014-09-12 17:52:47 +00009130 case llvm::Triple::le64:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009131 return new Le64TargetInfo(Triple, Opts);
JF Bastien643817d2014-09-12 17:52:47 +00009132
Daniel Dunbar52322032009-08-18 05:47:58 +00009133 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00009134 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009135 return new DarwinPPC32TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009136 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00009137 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009138 return new LinuxTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009139 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009140 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009141 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009142 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00009143 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009144 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009145 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009146 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009147 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009148 return new PPC32TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009149 }
Daniel Dunbar52322032009-08-18 05:47:58 +00009150
9151 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00009152 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009153 return new DarwinPPC64TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009154 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00009155 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009156 return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009157 case llvm::Triple::Lv2:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009158 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009159 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009160 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009161 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009162 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009163 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009164 return new PPC64TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009165 }
Daniel Dunbar52322032009-08-18 05:47:58 +00009166
Bill Schmidt778d3872013-07-26 01:36:11 +00009167 case llvm::Triple::ppc64le:
9168 switch (os) {
9169 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009170 return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger22a2d992015-04-10 20:53:48 +00009171 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009172 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Bill Schmidt778d3872013-07-26 01:36:11 +00009173 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009174 return new PPC64TargetInfo(Triple, Opts);
Bill Schmidt778d3872013-07-26 01:36:11 +00009175 }
9176
Peter Collingbournec947aae2012-05-20 23:28:41 +00009177 case llvm::Triple::nvptx:
Justin Lebarb6626592017-01-05 16:53:21 +00009178 return new NVPTXTargetInfo(Triple, Opts, /*TargetPointerWidth=*/32);
Peter Collingbournec947aae2012-05-20 23:28:41 +00009179 case llvm::Triple::nvptx64:
Justin Lebarb6626592017-01-05 16:53:21 +00009180 return new NVPTXTargetInfo(Triple, Opts, /*TargetPointerWidth=*/64);
Peter Collingbournec947aae2012-05-20 23:28:41 +00009181
Tom Stellardd8e38a32015-01-06 20:34:47 +00009182 case llvm::Triple::amdgcn:
Eli Friedmand13b41e2012-10-12 23:32:00 +00009183 case llvm::Triple::r600:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009184 return new AMDGPUTargetInfo(Triple, Opts);
Eli Friedmand13b41e2012-10-12 23:32:00 +00009185
Daniel Dunbar52322032009-08-18 05:47:58 +00009186 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009187 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00009188 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009189 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009190 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009191 return new SolarisTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009192 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009193 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00009194 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009195 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009196 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009197 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009198 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009199 return new SparcV8TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009200 }
Daniel Dunbar52322032009-08-18 05:47:58 +00009201
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009202 // The 'sparcel' architecture copies all the above cases except for Solaris.
9203 case llvm::Triple::sparcel:
9204 switch (os) {
9205 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009206 return new LinuxTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009207 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009208 return new NetBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009209 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009210 return new OpenBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009211 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009212 return new RTEMSTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009213 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009214 return new SparcV8elTargetInfo(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009215 }
9216
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009217 case llvm::Triple::sparcv9:
9218 switch (os) {
9219 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009220 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009221 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009222 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009223 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009224 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009225 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009226 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009227 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009228 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009229 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009230 return new SparcV9TargetInfo(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009231 }
9232
Ulrich Weigand47445072013-05-06 16:26:41 +00009233 case llvm::Triple::systemz:
9234 switch (os) {
9235 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009236 return new LinuxTargetInfo<SystemZTargetInfo>(Triple, Opts);
Ulrich Weigand47445072013-05-06 16:26:41 +00009237 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009238 return new SystemZTargetInfo(Triple, Opts);
Ulrich Weigand47445072013-05-06 16:26:41 +00009239 }
9240
Eli Friedmana9c3d712009-08-19 20:47:07 +00009241 case llvm::Triple::tce:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009242 return new TCETargetInfo(Triple, Opts);
Eli Friedmana9c3d712009-08-19 20:47:07 +00009243
Pekka Jaaskelainen67354482016-11-16 15:22:31 +00009244 case llvm::Triple::tcele:
9245 return new TCELETargetInfo(Triple, Opts);
9246
Daniel Dunbar52322032009-08-18 05:47:58 +00009247 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00009248 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009249 return new DarwinI386TargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00009250
Daniel Dunbar52322032009-08-18 05:47:58 +00009251 switch (os) {
Ed Schouten7893e682015-06-13 21:33:49 +00009252 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009253 return new CloudABITargetInfo<X86_32TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009254 case llvm::Triple::Linux: {
9255 switch (Triple.getEnvironment()) {
9256 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009257 return new LinuxTargetInfo<X86_32TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009258 case llvm::Triple::Android:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009259 return new AndroidX86_32TargetInfo(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009260 }
9261 }
Daniel Dunbar52322032009-08-18 05:47:58 +00009262 case llvm::Triple::DragonFly:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009263 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009264 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009265 return new NetBSDI386TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009266 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009267 return new OpenBSDI386TargetInfo(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00009268 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009269 return new BitrigI386TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009270 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009271 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00009272 case llvm::Triple::KFreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009273 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009274 case llvm::Triple::Minix:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009275 return new MinixTargetInfo<X86_32TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009276 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009277 return new SolarisTargetInfo<X86_32TargetInfo>(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009278 case llvm::Triple::Win32: {
9279 switch (Triple.getEnvironment()) {
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009280 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009281 return new CygwinX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009282 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009283 return new MinGWX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00009284 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009285 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00009286 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009287 return new MicrosoftX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009288 }
9289 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00009290 case llvm::Triple::Haiku:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009291 return new HaikuX86_32TargetInfo(Triple, Opts);
Douglas Gregor9fabd852011-07-01 22:41:14 +00009292 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009293 return new RTEMSX86_32TargetInfo(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00009294 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009295 return new NaClTargetInfo<X86_32TargetInfo>(Triple, Opts);
Alexey Bataevc99b0492015-11-25 09:24:26 +00009296 case llvm::Triple::ELFIAMCU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009297 return new MCUX86_32TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009298 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009299 return new X86_32TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009300 }
9301
9302 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009303 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009304 return new DarwinX86_64TargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00009305
Daniel Dunbar52322032009-08-18 05:47:58 +00009306 switch (os) {
Ed Schoutenf33c6072015-03-11 08:42:46 +00009307 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009308 return new CloudABITargetInfo<X86_64TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009309 case llvm::Triple::Linux: {
9310 switch (Triple.getEnvironment()) {
9311 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009312 return new LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009313 case llvm::Triple::Android:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009314 return new AndroidX86_64TargetInfo(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009315 }
9316 }
Chris Lattner002ba6b2010-01-09 05:41:14 +00009317 case llvm::Triple::DragonFly:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009318 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009319 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009320 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009321 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009322 return new OpenBSDX86_64TargetInfo(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00009323 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009324 return new BitrigX86_64TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009325 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009326 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Petr Hosek9834fcd2016-10-24 22:55:57 +00009327 case llvm::Triple::Fuchsia:
9328 return new FuchsiaTargetInfo<X86_64TargetInfo>(Triple, Opts);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00009329 case llvm::Triple::KFreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009330 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009331 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009332 return new SolarisTargetInfo<X86_64TargetInfo>(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009333 case llvm::Triple::Win32: {
9334 switch (Triple.getEnvironment()) {
Yaron Kerend030d112015-07-22 17:38:19 +00009335 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009336 return new CygwinX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009337 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009338 return new MinGWX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009339 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00009340 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009341 return new MicrosoftX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009342 }
9343 }
Reid Kleckner330fb172016-05-11 16:19:05 +00009344 case llvm::Triple::Haiku:
9345 return new HaikuTargetInfo<X86_64TargetInfo>(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00009346 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009347 return new NaClTargetInfo<X86_64TargetInfo>(Triple, Opts);
Alex Rosenberg12207fa2015-01-27 14:47:44 +00009348 case llvm::Triple::PS4:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009349 return new PS4OSTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009350 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009351 return new X86_64TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009352 }
Guy Benyeib798fc92012-12-11 21:38:14 +00009353
Douglas Katzman78d7c542015-05-12 21:18:10 +00009354 case llvm::Triple::spir: {
9355 if (Triple.getOS() != llvm::Triple::UnknownOS ||
9356 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
9357 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009358 return new SPIR32TargetInfo(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00009359 }
9360 case llvm::Triple::spir64: {
9361 if (Triple.getOS() != llvm::Triple::UnknownOS ||
9362 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
9363 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009364 return new SPIR64TargetInfo(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00009365 }
Dan Gohmanc2853072015-09-03 22:51:53 +00009366 case llvm::Triple::wasm32:
Dan Gohman839f2152017-01-17 21:46:38 +00009367 if (Triple.getSubArch() != llvm::Triple::NoSubArch ||
9368 Triple.getVendor() != llvm::Triple::UnknownVendor ||
9369 Triple.getOS() != llvm::Triple::UnknownOS ||
9370 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment ||
9371 !(Triple.isOSBinFormatELF() || Triple.isOSBinFormatWasm()))
Dan Gohmanc2853072015-09-03 22:51:53 +00009372 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009373 return new WebAssemblyOSTargetInfo<WebAssembly32TargetInfo>(Triple, Opts);
Dan Gohmanc2853072015-09-03 22:51:53 +00009374 case llvm::Triple::wasm64:
Dan Gohman839f2152017-01-17 21:46:38 +00009375 if (Triple.getSubArch() != llvm::Triple::NoSubArch ||
9376 Triple.getVendor() != llvm::Triple::UnknownVendor ||
9377 Triple.getOS() != llvm::Triple::UnknownOS ||
9378 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment ||
9379 !(Triple.isOSBinFormatELF() || Triple.isOSBinFormatWasm()))
Dan Gohmanc2853072015-09-03 22:51:53 +00009380 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009381 return new WebAssemblyOSTargetInfo<WebAssembly64TargetInfo>(Triple, Opts);
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00009382
9383 case llvm::Triple::renderscript32:
9384 return new LinuxTargetInfo<RenderScript32TargetInfo>(Triple, Opts);
9385 case llvm::Triple::renderscript64:
9386 return new LinuxTargetInfo<RenderScript64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009387 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00009388}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009389
9390/// CreateTargetInfo - Return the target info object for the specified target
Eric Christophere4f73b32015-08-07 19:07:08 +00009391/// options.
Alp Toker80758082014-07-06 05:26:44 +00009392TargetInfo *
9393TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
Saleem Abdulrasool10a49722016-04-08 16:52:00 +00009394 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00009395 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009396
9397 // Construct the target
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009398 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple, *Opts));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009399 if (!Target) {
9400 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00009401 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009402 }
Alp Toker80758082014-07-06 05:26:44 +00009403 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009404
Daniel Dunbaracde99e2009-12-18 18:42:37 +00009405 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00009406 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
9407 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00009408 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00009409 }
9410
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009411 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00009412 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
9413 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00009414 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009415 }
9416
Rafael Espindolaeb265472013-08-21 21:59:03 +00009417 // Set the fp math unit.
9418 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
9419 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00009420 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00009421 }
9422
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009423 // Compute the default target features, we need the target to handle this
9424 // because features may have dependencies on one another.
9425 llvm::StringMap<bool> Features;
Eric Christopher007b0a02015-08-28 22:32:01 +00009426 if (!Target->initFeatureMap(Features, Diags, Opts->CPU,
9427 Opts->FeaturesAsWritten))
Eric Christopher6b454372015-08-25 13:45:24 +00009428 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009429
9430 // Add the features to the compile options.
Douglas Gregorf8715de2012-11-16 04:24:59 +00009431 Opts->Features.clear();
Aaron Ballmanb226d3d2015-08-12 13:38:59 +00009432 for (const auto &F : Features)
9433 Opts->Features.push_back((F.getValue() ? "+" : "-") + F.getKey().str());
9434
Eric Christopher3ff21b32013-10-16 21:26:26 +00009435 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00009436 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009437
Yaxun Liu39cf40f2016-05-16 17:06:34 +00009438 Target->setSupportedOpenCLOpts();
Alexey Bader0ea07532016-11-01 15:50:52 +00009439 Target->setOpenCLExtensionOpts();
Yaxun Liu39cf40f2016-05-16 17:06:34 +00009440
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00009441 if (!Target->validateTarget(Diags))
9442 return nullptr;
9443
Ahmed Charles9a16beb2014-03-07 19:33:25 +00009444 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009445}