blob: 48d493142d188bea61e6f3d3e329297f1becb1f0 [file] [log] [blame]
Eric Christopherb39156d2015-08-26 04:23:11 +00001//===--- Targets.cpp - Implement target feature support -------------------===//
Chris Lattner5ba61f02006-10-14 07:39:34 +00002//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner5b12ab82007-12-29 19:59:25 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Chris Lattner5ba61f02006-10-14 07:39:34 +00007//
8//===----------------------------------------------------------------------===//
9//
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000010// This file implements construction of a TargetInfo object from a
Ted Kremenek6f6ff372007-12-12 18:05:32 +000011// target triple.
Chris Lattner5ba61f02006-10-14 07:39:34 +000012//
13//===----------------------------------------------------------------------===//
14
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000015#include "clang/Basic/Builtins.h"
Justin Lebar62907612016-07-06 21:21:39 +000016#include "clang/Basic/Cuda.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000017#include "clang/Basic/Diagnostic.h"
Chris Lattnerc7c6dd42008-12-04 22:54:33 +000018#include "clang/Basic/LangOptions.h"
Chandler Carruth26b29a02010-01-20 06:13:02 +000019#include "clang/Basic/MacroBuilder.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000020#include "clang/Basic/TargetBuiltins.h"
Justin Lebar62907612016-07-06 21:21:39 +000021#include "clang/Basic/TargetInfo.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000022#include "clang/Basic/TargetOptions.h"
Tim Northover756447a2015-10-30 16:30:36 +000023#include "clang/Basic/Version.h"
Yaxun Liu2c17e822016-08-09 19:43:38 +000024#include "clang/Frontend/CodeGenOptions.h"
Eli Friedman7cef49e2008-05-20 14:27:34 +000025#include "llvm/ADT/APFloat.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000026#include "llvm/ADT/STLExtras.h"
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +000027#include "llvm/ADT/StringExtras.h"
Daniel Dunbar58bc48c2009-08-19 20:04:03 +000028#include "llvm/ADT/StringRef.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000029#include "llvm/ADT/StringSwitch.h"
Chris Lattner859c37a2009-08-12 06:24:27 +000030#include "llvm/ADT/Triple.h"
Chris Lattner30ba6742009-08-10 19:03:04 +000031#include "llvm/MC/MCSectionMachO.h"
David Blaikie76bd3c82011-09-23 05:35:21 +000032#include "llvm/Support/ErrorHandling.h"
Renato Golinf5c4dec2015-05-27 13:33:00 +000033#include "llvm/Support/TargetParser.h"
Benjamin Kramerdc2f0062010-01-09 18:20:57 +000034#include <algorithm>
Ahmed Charlesdfca6f92014-03-09 11:36:40 +000035#include <memory>
Hans Wennborg7eb54642015-09-10 17:07:54 +000036
Chris Lattner5ba61f02006-10-14 07:39:34 +000037using namespace clang;
38
Chris Lattner5ba61f02006-10-14 07:39:34 +000039//===----------------------------------------------------------------------===//
Chris Lattner1f5ad112006-10-14 18:32:12 +000040// Common code shared among targets.
Chris Lattner5ba61f02006-10-14 07:39:34 +000041//===----------------------------------------------------------------------===//
42
Chris Lattner1e1c0b92009-03-20 16:06:38 +000043/// DefineStd - Define a macro name and standard variants. For example if
44/// MacroName is "unix", then this will define "__unix", "__unix__", and "unix"
45/// when in GNU mode.
Chris Lattner0e62c1c2011-07-23 10:55:15 +000046static void DefineStd(MacroBuilder &Builder, StringRef MacroName,
Chris Lattner1e1c0b92009-03-20 16:06:38 +000047 const LangOptions &Opts) {
48 assert(MacroName[0] != '_' && "Identifier should be in the user's namespace");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000049
Chris Lattner1e1c0b92009-03-20 16:06:38 +000050 // If in GNU mode (e.g. -std=gnu99 but not -std=c99) define the raw identifier
51 // in the user's namespace.
52 if (Opts.GNUMode)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000053 Builder.defineMacro(MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000054
Chris Lattner1e1c0b92009-03-20 16:06:38 +000055 // Define __unix.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000056 Builder.defineMacro("__" + MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000057
Chris Lattner1e1c0b92009-03-20 16:06:38 +000058 // Define __unix__.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000059 Builder.defineMacro("__" + MacroName + "__");
Chris Lattner1e1c0b92009-03-20 16:06:38 +000060}
61
Benjamin Kramere3b442d2012-01-10 11:50:09 +000062static void defineCPUMacros(MacroBuilder &Builder, StringRef CPUName,
63 bool Tuning = true) {
64 Builder.defineMacro("__" + CPUName);
65 Builder.defineMacro("__" + CPUName + "__");
66 if (Tuning)
67 Builder.defineMacro("__tune_" + CPUName + "__");
68}
69
Justin Lebar76945b22016-04-29 23:05:19 +000070static TargetInfo *AllocateTarget(const llvm::Triple &Triple,
71 const TargetOptions &Opts);
72
Chris Lattner09d98f52008-10-05 21:50:58 +000073//===----------------------------------------------------------------------===//
74// Defines specific to certain operating systems.
75//===----------------------------------------------------------------------===//
Chris Lattner30ba6742009-08-10 19:03:04 +000076
Torok Edwinb2b37c62009-06-30 17:10:35 +000077namespace {
Douglas Gregorc05d2a12009-07-01 15:12:53 +000078template<typename TgtInfo>
79class OSTargetInfo : public TgtInfo {
Torok Edwinb2b37c62009-06-30 17:10:35 +000080protected:
Daniel Dunbar40165182009-08-24 09:10:05 +000081 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000082 MacroBuilder &Builder) const=0;
Torok Edwinb2b37c62009-06-30 17:10:35 +000083public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +000084 OSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
85 : TgtInfo(Triple, Opts) {}
Craig Topper3164f332014-03-11 03:39:26 +000086 void getTargetDefines(const LangOptions &Opts,
87 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000088 TgtInfo::getTargetDefines(Opts, Builder);
89 getOSDefines(Opts, TgtInfo::getTriple(), Builder);
Torok Edwin4e054162009-06-30 17:00:25 +000090 }
Torok Edwinb2b37c62009-06-30 17:10:35 +000091
92};
Chris Lattner30ba6742009-08-10 19:03:04 +000093
Eric Christopher7d0c7252015-09-24 21:17:04 +000094// CloudABI Target
95template <typename Target>
96class CloudABITargetInfo : public OSTargetInfo<Target> {
97protected:
98 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
99 MacroBuilder &Builder) const override {
100 Builder.defineMacro("__CloudABI__");
101 Builder.defineMacro("__ELF__");
102
103 // CloudABI uses ISO/IEC 10646:2012 for wchar_t, char16_t and char32_t.
104 Builder.defineMacro("__STDC_ISO_10646__", "201206L");
105 Builder.defineMacro("__STDC_UTF_16__");
106 Builder.defineMacro("__STDC_UTF_32__");
107 }
108
109public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000110 CloudABITargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
111 : OSTargetInfo<Target>(Triple, Opts) {}
Eric Christopher7d0c7252015-09-24 21:17:04 +0000112};
113
Daniel Dunbard86666f2010-01-26 01:44:04 +0000114static void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000115 const llvm::Triple &Triple,
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000116 StringRef &PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000117 VersionTuple &PlatformMinVersion) {
Bob Wilson834400b2013-08-19 20:23:37 +0000118 Builder.defineMacro("__APPLE_CC__", "6000");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000119 Builder.defineMacro("__APPLE__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000120 Builder.defineMacro("OBJC_NEW_PROPERTIES");
Alexander Potapenkob4f81902012-09-20 10:10:01 +0000121 // AddressSanitizer doesn't play well with source fortification, which is on
122 // by default on Darwin.
Alexey Samsonovedf99a92014-11-07 22:29:38 +0000123 if (Opts.Sanitize.has(SanitizerKind::Address))
124 Builder.defineMacro("_FORTIFY_SOURCE", "0");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000125
John McCall460ce582015-10-22 18:38:17 +0000126 // Darwin defines __weak, __strong, and __unsafe_unretained even in C mode.
127 if (!Opts.ObjC1) {
John McCall31168b02011-06-15 23:02:42 +0000128 // __weak is always defined, for use in blocks and with objc pointers.
129 Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))");
John McCall460ce582015-10-22 18:38:17 +0000130 Builder.defineMacro("__strong", "");
John McCall31168b02011-06-15 23:02:42 +0000131 Builder.defineMacro("__unsafe_unretained", "");
John McCall31168b02011-06-15 23:02:42 +0000132 }
Eric Christopher0c912c52011-07-07 22:55:26 +0000133
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000134 if (Opts.Static)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000135 Builder.defineMacro("__STATIC__");
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000136 else
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000137 Builder.defineMacro("__DYNAMIC__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000138
139 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000140 Builder.defineMacro("_REENTRANT");
Daniel Dunbar497ff132009-04-10 19:52:24 +0000141
Daniel Dunbarecf13562011-04-19 21:40:34 +0000142 // Get the platform type and version number from the triple.
Daniel Dunbar497ff132009-04-10 19:52:24 +0000143 unsigned Maj, Min, Rev;
Bob Wilson8e5acc52012-01-31 23:52:58 +0000144 if (Triple.isMacOSX()) {
145 Triple.getMacOSXVersion(Maj, Min, Rev);
Manman Renccf25bb2016-06-28 20:55:30 +0000146 PlatformName = "macos";
Daniel Dunbarecf13562011-04-19 21:40:34 +0000147 } else {
Bob Wilson8e5acc52012-01-31 23:52:58 +0000148 Triple.getOSVersion(Maj, Min, Rev);
149 PlatformName = llvm::Triple::getOSTypeName(Triple.getOS());
Daniel Dunbarecf13562011-04-19 21:40:34 +0000150 }
Daniel Dunbard86666f2010-01-26 01:44:04 +0000151
Sebastian Pop422377c2012-01-20 22:01:23 +0000152 // If -target arch-pc-win32-macho option specified, we're
Eric Christopherb081ba62011-07-29 21:20:35 +0000153 // generating code for Win32 ABI. No need to emit
Chad Rosierb90e4022011-07-19 20:00:06 +0000154 // __ENVIRONMENT_XX_OS_VERSION_MIN_REQUIRED__.
155 if (PlatformName == "win32") {
156 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
157 return;
158 }
159
Evan Cheng31dd9a62014-01-26 23:12:43 +0000160 // Set the appropriate OS version define.
161 if (Triple.isiOS()) {
Bob Wilson4cf27c42016-07-18 20:29:14 +0000162 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
163 char Str[7];
164 if (Maj < 10) {
165 Str[0] = '0' + Maj;
166 Str[1] = '0' + (Min / 10);
167 Str[2] = '0' + (Min % 10);
168 Str[3] = '0' + (Rev / 10);
169 Str[4] = '0' + (Rev % 10);
170 Str[5] = '\0';
171 } else {
172 // Handle versions >= 10.
173 Str[0] = '0' + (Maj / 10);
174 Str[1] = '0' + (Maj % 10);
175 Str[2] = '0' + (Min / 10);
176 Str[3] = '0' + (Min % 10);
177 Str[4] = '0' + (Rev / 10);
178 Str[5] = '0' + (Rev % 10);
179 Str[6] = '\0';
180 }
Tim Northover67465f82015-10-30 16:30:30 +0000181 if (Triple.isTvOS())
182 Builder.defineMacro("__ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__", Str);
183 else
184 Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__",
185 Str);
186
187 } else if (Triple.isWatchOS()) {
188 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
189 char Str[6];
190 Str[0] = '0' + Maj;
191 Str[1] = '0' + (Min / 10);
192 Str[2] = '0' + (Min % 10);
193 Str[3] = '0' + (Rev / 10);
194 Str[4] = '0' + (Rev % 10);
195 Str[5] = '\0';
196 Builder.defineMacro("__ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__", Str);
Evan Cheng31dd9a62014-01-26 23:12:43 +0000197 } else if (Triple.isMacOSX()) {
198 // Note that the Driver allows versions which aren't representable in the
199 // define (because we only get a single digit for the minor and micro
200 // revision numbers). So, we limit them to the maximum representable
201 // version.
202 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
Bob Wilson2a3710e2014-08-08 21:45:53 +0000203 char Str[7];
204 if (Maj < 10 || (Maj == 10 && Min < 10)) {
205 Str[0] = '0' + (Maj / 10);
206 Str[1] = '0' + (Maj % 10);
207 Str[2] = '0' + std::min(Min, 9U);
208 Str[3] = '0' + std::min(Rev, 9U);
209 Str[4] = '\0';
210 } else {
211 // Handle versions > 10.9.
212 Str[0] = '0' + (Maj / 10);
213 Str[1] = '0' + (Maj % 10);
214 Str[2] = '0' + (Min / 10);
215 Str[3] = '0' + (Min % 10);
216 Str[4] = '0' + (Rev / 10);
217 Str[5] = '0' + (Rev % 10);
218 Str[6] = '\0';
219 }
Evan Cheng31dd9a62014-01-26 23:12:43 +0000220 Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
Daniel Dunbar497ff132009-04-10 19:52:24 +0000221 }
Daniel Dunbarecf13562011-04-19 21:40:34 +0000222
Tim Northover157d9112014-01-16 08:48:16 +0000223 // Tell users about the kernel if there is one.
224 if (Triple.isOSDarwin())
225 Builder.defineMacro("__MACH__");
226
Chris Bieneman46977b62016-04-29 17:53:00 +0000227 // The Watch ABI uses Dwarf EH.
228 if(Triple.isWatchABI())
229 Builder.defineMacro("__ARM_DWARF_EH__");
230
Daniel Dunbarecf13562011-04-19 21:40:34 +0000231 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
Eli Friedman3fd920a2008-08-20 02:34:37 +0000232}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000233
Torok Edwinb2b37c62009-06-30 17:10:35 +0000234template<typename Target>
235class DarwinTargetInfo : public OSTargetInfo<Target> {
236protected:
Craig Topper3164f332014-03-11 03:39:26 +0000237 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
238 MacroBuilder &Builder) const override {
Eric Christopher0c912c52011-07-07 22:55:26 +0000239 getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000240 this->PlatformMinVersion);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000241 }
Mike Stump11289f42009-09-09 15:08:12 +0000242
Torok Edwinb2b37c62009-06-30 17:10:35 +0000243public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000244 DarwinTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
245 : OSTargetInfo<Target>(Triple, Opts) {
Tim Northovera12d0a92016-01-07 09:04:46 +0000246 // By default, no TLS, and we whitelist permitted architecture/OS
247 // combinations.
248 this->TLSSupported = false;
249
250 if (Triple.isMacOSX())
251 this->TLSSupported = !Triple.isMacOSXVersionLT(10, 7);
252 else if (Triple.isiOS()) {
253 // 64-bit iOS supported it from 8 onwards, 32-bit from 9 onwards.
254 if (Triple.getArch() == llvm::Triple::x86_64 ||
255 Triple.getArch() == llvm::Triple::aarch64)
256 this->TLSSupported = !Triple.isOSVersionLT(8);
257 else if (Triple.getArch() == llvm::Triple::x86 ||
258 Triple.getArch() == llvm::Triple::arm ||
259 Triple.getArch() == llvm::Triple::thumb)
260 this->TLSSupported = !Triple.isOSVersionLT(9);
261 } else if (Triple.isWatchOS())
262 this->TLSSupported = !Triple.isOSVersionLT(2);
263
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000264 this->MCountName = "\01mcount";
265 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000266
Craig Topper3164f332014-03-11 03:39:26 +0000267 std::string isValidSectionSpecifier(StringRef SR) const override {
Chris Lattner30ba6742009-08-10 19:03:04 +0000268 // Let MCSectionMachO validate this.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000269 StringRef Segment, Section;
Chris Lattner30ba6742009-08-10 19:03:04 +0000270 unsigned TAA, StubSize;
Daniel Dunbar75942372011-03-19 02:06:21 +0000271 bool HasTAA;
Chris Lattner30ba6742009-08-10 19:03:04 +0000272 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
Daniel Dunbar75942372011-03-19 02:06:21 +0000273 TAA, HasTAA, StubSize);
Chris Lattner30ba6742009-08-10 19:03:04 +0000274 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000275
Craig Topper3164f332014-03-11 03:39:26 +0000276 const char *getStaticInitSectionSpecifier() const override {
Anders Carlsson851318a2010-06-08 22:47:50 +0000277 // FIXME: We should return 0 when building kexts.
278 return "__TEXT,__StaticInit,regular,pure_instructions";
279 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000280
John McCalleed64c72012-01-29 01:20:30 +0000281 /// Darwin does not support protected visibility. Darwin's "default"
282 /// is very similar to ELF's "protected"; Darwin requires a "weak"
283 /// attribute on declarations that can be dynamically replaced.
Craig Topper3164f332014-03-11 03:39:26 +0000284 bool hasProtectedVisibility() const override {
John McCalleed64c72012-01-29 01:20:30 +0000285 return false;
286 }
Akira Hatanaka68ab7fe2016-03-31 06:36:07 +0000287
288 unsigned getExnObjectAlignment() const override {
289 // The alignment of an exception object is 8-bytes for darwin since
290 // libc++abi doesn't declare _Unwind_Exception with __attribute__((aligned))
291 // and therefore doesn't guarantee 16-byte alignment.
292 return 64;
293 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000294};
295
Chris Lattner30ba6742009-08-10 19:03:04 +0000296
Torok Edwinb2b37c62009-06-30 17:10:35 +0000297// DragonFlyBSD Target
298template<typename Target>
299class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
300protected:
Craig Topper3164f332014-03-11 03:39:26 +0000301 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
302 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000303 // DragonFly defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000304 Builder.defineMacro("__DragonFly__");
305 Builder.defineMacro("__DragonFly_cc_version", "100001");
306 Builder.defineMacro("__ELF__");
307 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
308 Builder.defineMacro("__tune_i386__");
Saleem Abdulrasool56027092017-02-07 19:00:06 +0000309 DefineStd(Builder, "unix", Opts);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000310 }
311public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000312 DragonFlyBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
313 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000314 switch (Triple.getArch()) {
315 default:
316 case llvm::Triple::x86:
317 case llvm::Triple::x86_64:
318 this->MCountName = ".mcount";
319 break;
320 }
Eli Friedman4286fba2012-02-10 23:02:29 +0000321 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000322};
323
Dimitry Andricc6d924c2016-05-20 17:27:22 +0000324#ifndef FREEBSD_CC_VERSION
325#define FREEBSD_CC_VERSION 0U
326#endif
327
Torok Edwinb2b37c62009-06-30 17:10:35 +0000328// FreeBSD Target
329template<typename Target>
330class FreeBSDTargetInfo : public OSTargetInfo<Target> {
331protected:
Craig Topper3164f332014-03-11 03:39:26 +0000332 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
333 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000334 // FreeBSD defines; list based off of gcc output
335
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000336 unsigned Release = Triple.getOSMajorVersion();
337 if (Release == 0U)
Dimitry Andricc6d924c2016-05-20 17:27:22 +0000338 Release = 8U;
339 unsigned CCVersion = FREEBSD_CC_VERSION;
340 if (CCVersion == 0U)
341 CCVersion = Release * 100000U + 1U;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000342
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000343 Builder.defineMacro("__FreeBSD__", Twine(Release));
Dimitry Andricc6d924c2016-05-20 17:27:22 +0000344 Builder.defineMacro("__FreeBSD_cc_version", Twine(CCVersion));
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000345 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
Saleem Abdulrasool56027092017-02-07 19:00:06 +0000346 DefineStd(Builder, "unix", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000347 Builder.defineMacro("__ELF__");
Ed Schoutend0621462013-09-29 07:54:52 +0000348
349 // On FreeBSD, wchar_t contains the number of the code point as
350 // used by the character set of the locale. These character sets are
351 // not necessarily a superset of ASCII.
Richard Smith00a4a852015-01-13 01:47:45 +0000352 //
353 // FIXME: This is wrong; the macro refers to the numerical values
354 // of wchar_t *literals*, which are not locale-dependent. However,
355 // FreeBSD systems apparently depend on us getting this wrong, and
356 // setting this to 1 is conforming even if all the basic source
357 // character literals have the same encoding as char and wchar_t.
Ed Schoutend0621462013-09-29 07:54:52 +0000358 Builder.defineMacro("__STDC_MB_MIGHT_NEQ_WC__", "1");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000359 }
360public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000361 FreeBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
362 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000363 switch (Triple.getArch()) {
364 default:
365 case llvm::Triple::x86:
366 case llvm::Triple::x86_64:
367 this->MCountName = ".mcount";
368 break;
369 case llvm::Triple::mips:
370 case llvm::Triple::mipsel:
371 case llvm::Triple::ppc:
372 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +0000373 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000374 this->MCountName = "_mcount";
375 break;
376 case llvm::Triple::arm:
377 this->MCountName = "__mcount";
378 break;
Duncan Sands9cb27e92009-07-08 13:55:08 +0000379 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000380 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000381};
382
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000383// GNU/kFreeBSD Target
384template<typename Target>
385class KFreeBSDTargetInfo : public OSTargetInfo<Target> {
386protected:
Craig Topper3164f332014-03-11 03:39:26 +0000387 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
388 MacroBuilder &Builder) const override {
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000389 // GNU/kFreeBSD defines; list based off of gcc output
390
Saleem Abdulrasool56027092017-02-07 19:00:06 +0000391 DefineStd(Builder, "unix", Opts);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000392 Builder.defineMacro("__FreeBSD_kernel__");
393 Builder.defineMacro("__GLIBC__");
394 Builder.defineMacro("__ELF__");
395 if (Opts.POSIXThreads)
396 Builder.defineMacro("_REENTRANT");
397 if (Opts.CPlusPlus)
398 Builder.defineMacro("_GNU_SOURCE");
399 }
400public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000401 KFreeBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
402 : OSTargetInfo<Target>(Triple, Opts) {}
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000403};
404
Reid Kleckner330fb172016-05-11 16:19:05 +0000405// Haiku Target
406template<typename Target>
407class HaikuTargetInfo : public OSTargetInfo<Target> {
408protected:
409 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
410 MacroBuilder &Builder) const override {
411 // Haiku defines; list based off of gcc output
412 Builder.defineMacro("__HAIKU__");
413 Builder.defineMacro("__ELF__");
Saleem Abdulrasool56027092017-02-07 19:00:06 +0000414 DefineStd(Builder, "unix", Opts);
Reid Kleckner330fb172016-05-11 16:19:05 +0000415 }
416public:
417 HaikuTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
418 : OSTargetInfo<Target>(Triple, Opts) {
419 this->SizeType = TargetInfo::UnsignedLong;
420 this->IntPtrType = TargetInfo::SignedLong;
421 this->PtrDiffType = TargetInfo::SignedLong;
422 this->ProcessIDType = TargetInfo::SignedLong;
423 this->TLSSupported = false;
424
425 }
426};
427
Chris Lattner3e2ee142010-07-07 16:01:42 +0000428// Minix Target
429template<typename Target>
430class MinixTargetInfo : public OSTargetInfo<Target> {
431protected:
Craig Topper3164f332014-03-11 03:39:26 +0000432 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
433 MacroBuilder &Builder) const override {
Chris Lattner3e2ee142010-07-07 16:01:42 +0000434 // Minix defines
435
436 Builder.defineMacro("__minix", "3");
437 Builder.defineMacro("_EM_WSIZE", "4");
438 Builder.defineMacro("_EM_PSIZE", "4");
439 Builder.defineMacro("_EM_SSIZE", "2");
440 Builder.defineMacro("_EM_LSIZE", "4");
441 Builder.defineMacro("_EM_FSIZE", "4");
442 Builder.defineMacro("_EM_DSIZE", "8");
Eli Friedman83de5132011-12-08 23:54:21 +0000443 Builder.defineMacro("__ELF__");
Saleem Abdulrasool56027092017-02-07 19:00:06 +0000444 DefineStd(Builder, "unix", Opts);
Chris Lattner3e2ee142010-07-07 16:01:42 +0000445 }
446public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000447 MinixTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
448 : OSTargetInfo<Target>(Triple, Opts) {}
Chris Lattner3e2ee142010-07-07 16:01:42 +0000449};
450
Torok Edwinb2b37c62009-06-30 17:10:35 +0000451// Linux target
452template<typename Target>
453class LinuxTargetInfo : public OSTargetInfo<Target> {
454protected:
Craig Topper3164f332014-03-11 03:39:26 +0000455 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
456 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000457 // Linux defines; list based off of gcc output
Saleem Abdulrasool56027092017-02-07 19:00:06 +0000458 DefineStd(Builder, "unix", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000459 DefineStd(Builder, "linux", Opts);
460 Builder.defineMacro("__gnu_linux__");
461 Builder.defineMacro("__ELF__");
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +0000462 if (Triple.isAndroid()) {
Evgeniy Stepanov94dc4c92012-04-26 12:08:09 +0000463 Builder.defineMacro("__ANDROID__", "1");
Dan Albert84aee012015-03-03 18:28:38 +0000464 unsigned Maj, Min, Rev;
David Majnemer5c2589a2015-06-01 23:38:25 +0000465 Triple.getEnvironmentVersion(Maj, Min, Rev);
Dan Albert84aee012015-03-03 18:28:38 +0000466 this->PlatformName = "android";
467 this->PlatformMinVersion = VersionTuple(Maj, Min, Rev);
Stephen Hinesa89d8ff2016-11-11 01:29:39 +0000468 if (Maj)
469 Builder.defineMacro("__ANDROID_API__", Twine(Maj));
Dan Albert84aee012015-03-03 18:28:38 +0000470 }
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000471 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000472 Builder.defineMacro("_REENTRANT");
Douglas Gregor3ecc6652010-04-21 05:52:38 +0000473 if (Opts.CPlusPlus)
474 Builder.defineMacro("_GNU_SOURCE");
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +0000475 if (this->HasFloat128)
476 Builder.defineMacro("__FLOAT128__");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000477 }
478public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000479 LinuxTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
480 : OSTargetInfo<Target>(Triple, Opts) {
Douglas Gregore6d6e512011-01-12 21:19:25 +0000481 this->WIntType = TargetInfo::UnsignedInt;
Hal Finkelecdb4542014-03-30 13:00:06 +0000482
483 switch (Triple.getArch()) {
484 default:
485 break;
486 case llvm::Triple::ppc:
487 case llvm::Triple::ppc64:
488 case llvm::Triple::ppc64le:
489 this->MCountName = "_mcount";
490 break;
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +0000491 case llvm::Triple::x86:
492 case llvm::Triple::x86_64:
493 case llvm::Triple::systemz:
494 this->HasFloat128 = true;
495 break;
Hal Finkelecdb4542014-03-30 13:00:06 +0000496 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000497 }
Benjamin Kramera518b222011-10-15 17:53:33 +0000498
Craig Topper3164f332014-03-11 03:39:26 +0000499 const char *getStaticInitSectionSpecifier() const override {
Benjamin Kramera518b222011-10-15 17:53:33 +0000500 return ".text.startup";
501 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000502};
503
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000504// NetBSD Target
505template<typename Target>
506class NetBSDTargetInfo : public OSTargetInfo<Target> {
507protected:
Craig Topper3164f332014-03-11 03:39:26 +0000508 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
509 MacroBuilder &Builder) const override {
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000510 // NetBSD defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000511 Builder.defineMacro("__NetBSD__");
512 Builder.defineMacro("__unix__");
513 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000514 if (Opts.POSIXThreads)
Joerg Sonnenberger84502662017-01-16 14:07:24 +0000515 Builder.defineMacro("_REENTRANT");
Joerg Sonnenbergercc1edb52014-05-13 18:58:36 +0000516
517 switch (Triple.getArch()) {
518 default:
519 break;
520 case llvm::Triple::arm:
521 case llvm::Triple::armeb:
522 case llvm::Triple::thumb:
523 case llvm::Triple::thumbeb:
524 Builder.defineMacro("__ARM_DWARF_EH__");
525 break;
526 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000527 }
528public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000529 NetBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
530 : OSTargetInfo<Target>(Triple, Opts) {
Joerg Sonnenberger740f3f42015-04-10 21:02:53 +0000531 this->MCountName = "_mcount";
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000532 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000533};
534
Torok Edwinb2b37c62009-06-30 17:10:35 +0000535// OpenBSD Target
536template<typename Target>
537class OpenBSDTargetInfo : public OSTargetInfo<Target> {
538protected:
Craig Topper3164f332014-03-11 03:39:26 +0000539 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
540 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000541 // OpenBSD defines; list based off of gcc output
542
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000543 Builder.defineMacro("__OpenBSD__");
Saleem Abdulrasool56027092017-02-07 19:00:06 +0000544 DefineStd(Builder, "unix", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000545 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000546 if (Opts.POSIXThreads)
Chris Lattner024e12d2012-04-25 06:12:24 +0000547 Builder.defineMacro("_REENTRANT");
Brad Smith0561a5a2017-02-20 03:18:15 +0000548 if (this->HasFloat128)
549 Builder.defineMacro("__FLOAT128__");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000550 }
551public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000552 OpenBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
553 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000554 this->TLSSupported = false;
Eli Friedman3715d1f2011-12-15 02:15:56 +0000555
Eli Friedman3715d1f2011-12-15 02:15:56 +0000556 switch (Triple.getArch()) {
Eli Friedman3715d1f2011-12-15 02:15:56 +0000557 case llvm::Triple::x86:
558 case llvm::Triple::x86_64:
Brad Smith0561a5a2017-02-20 03:18:15 +0000559 this->HasFloat128 = true;
560 // FALLTHROUGH
561 default:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000562 this->MCountName = "__mcount";
563 break;
564 case llvm::Triple::mips64:
565 case llvm::Triple::mips64el:
566 case llvm::Triple::ppc:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000567 case llvm::Triple::sparcv9:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000568 this->MCountName = "_mcount";
569 break;
570 }
571 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000572};
573
Eli Friedman9fa28852012-08-08 23:57:20 +0000574// Bitrig Target
575template<typename Target>
576class BitrigTargetInfo : public OSTargetInfo<Target> {
577protected:
Craig Topper3164f332014-03-11 03:39:26 +0000578 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
579 MacroBuilder &Builder) const override {
Eli Friedman9fa28852012-08-08 23:57:20 +0000580 // Bitrig defines; list based off of gcc output
581
582 Builder.defineMacro("__Bitrig__");
Saleem Abdulrasool56027092017-02-07 19:00:06 +0000583 DefineStd(Builder, "unix", Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +0000584 Builder.defineMacro("__ELF__");
585 if (Opts.POSIXThreads)
586 Builder.defineMacro("_REENTRANT");
Renato Golin9ba39232015-02-27 16:35:48 +0000587
588 switch (Triple.getArch()) {
589 default:
590 break;
591 case llvm::Triple::arm:
592 case llvm::Triple::armeb:
593 case llvm::Triple::thumb:
594 case llvm::Triple::thumbeb:
595 Builder.defineMacro("__ARM_DWARF_EH__");
596 break;
597 }
Eli Friedman9fa28852012-08-08 23:57:20 +0000598 }
599public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000600 BitrigTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
601 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000602 this->MCountName = "__mcount";
Eli Friedman9fa28852012-08-08 23:57:20 +0000603 }
604};
605
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000606// PSP Target
607template<typename Target>
608class PSPTargetInfo : public OSTargetInfo<Target> {
609protected:
Craig Topper3164f332014-03-11 03:39:26 +0000610 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
611 MacroBuilder &Builder) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000612 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000613 Builder.defineMacro("PSP");
614 Builder.defineMacro("_PSP");
615 Builder.defineMacro("__psp__");
616 Builder.defineMacro("__ELF__");
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000617 }
618public:
James Y Knightb214cbc2016-03-04 19:00:41 +0000619 PSPTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {}
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000620};
621
John Thompsone467e192009-11-19 17:18:50 +0000622// PS3 PPU Target
623template<typename Target>
624class PS3PPUTargetInfo : public OSTargetInfo<Target> {
625protected:
Craig Topper3164f332014-03-11 03:39:26 +0000626 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
627 MacroBuilder &Builder) const override {
John Thompsone467e192009-11-19 17:18:50 +0000628 // PS3 PPU defines.
John Thompson957816f2010-03-25 16:18:32 +0000629 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000630 Builder.defineMacro("__PPU__");
631 Builder.defineMacro("__CELLOS_LV2__");
632 Builder.defineMacro("__ELF__");
633 Builder.defineMacro("__LP32__");
John Thompson07a61a42010-06-24 22:44:13 +0000634 Builder.defineMacro("_ARCH_PPC64");
635 Builder.defineMacro("__powerpc64__");
John Thompsone467e192009-11-19 17:18:50 +0000636 }
637public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000638 PS3PPUTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
639 : OSTargetInfo<Target>(Triple, Opts) {
Nick Lewyckyc0a61732011-12-16 22:32:39 +0000640 this->LongWidth = this->LongAlign = 32;
641 this->PointerWidth = this->PointerAlign = 32;
John Thompson07a61a42010-06-24 22:44:13 +0000642 this->IntMaxType = TargetInfo::SignedLongLong;
John Thompson07a61a42010-06-24 22:44:13 +0000643 this->Int64Type = TargetInfo::SignedLongLong;
John Thompson6f8dba72009-12-18 14:21:08 +0000644 this->SizeType = TargetInfo::UnsignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +0000645 this->resetDataLayout("E-m:e-p:32:32-i64:64-n32:64");
John Thompsone467e192009-11-19 17:18:50 +0000646 }
647};
648
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000649template <typename Target>
650class PS4OSTargetInfo : public OSTargetInfo<Target> {
651protected:
652 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
653 MacroBuilder &Builder) const override {
654 Builder.defineMacro("__FreeBSD__", "9");
655 Builder.defineMacro("__FreeBSD_cc_version", "900001");
656 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
Saleem Abdulrasool56027092017-02-07 19:00:06 +0000657 DefineStd(Builder, "unix", Opts);
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000658 Builder.defineMacro("__ELF__");
Paul Robinson9d613612016-05-16 17:22:25 +0000659 Builder.defineMacro("__ORBIS__");
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000660 }
661public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000662 PS4OSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
663 : OSTargetInfo<Target>(Triple, Opts) {
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000664 this->WCharType = this->UnsignedShort;
665
Paul Robinsond30e2ee2015-07-14 20:52:32 +0000666 // On PS4, TLS variable cannot be aligned to more than 32 bytes (256 bits).
667 this->MaxTLSAlign = 256;
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000668
Sunil Srivastava0ce2f222016-02-05 20:50:02 +0000669 // On PS4, do not honor explicit bit field alignment,
670 // as in "__attribute__((aligned(2))) int b : 1;".
671 this->UseExplicitBitFieldAlignment = false;
672
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000673 switch (Triple.getArch()) {
674 default:
675 case llvm::Triple::x86_64:
676 this->MCountName = ".mcount";
677 break;
678 }
679 }
680};
681
Torok Edwinb2b37c62009-06-30 17:10:35 +0000682// Solaris target
683template<typename Target>
684class SolarisTargetInfo : public OSTargetInfo<Target> {
685protected:
Craig Topper3164f332014-03-11 03:39:26 +0000686 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
687 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000688 DefineStd(Builder, "sun", Opts);
Saleem Abdulrasool56027092017-02-07 19:00:06 +0000689 DefineStd(Builder, "unix", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000690 Builder.defineMacro("__ELF__");
691 Builder.defineMacro("__svr4__");
692 Builder.defineMacro("__SVR4");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000693 // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and
694 // newer, but to 500 for everything else. feature_test.h has a check to
695 // ensure that you are not using C99 with an old version of X/Open or C89
Richard Smithab506ad2014-10-20 23:26:58 +0000696 // with a new version.
697 if (Opts.C99)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000698 Builder.defineMacro("_XOPEN_SOURCE", "600");
699 else
700 Builder.defineMacro("_XOPEN_SOURCE", "500");
David Chisnalle04307e2012-03-02 10:49:52 +0000701 if (Opts.CPlusPlus)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000702 Builder.defineMacro("__C99FEATURES__");
David Chisnall0c1941cb2012-02-17 18:35:11 +0000703 Builder.defineMacro("_LARGEFILE_SOURCE");
704 Builder.defineMacro("_LARGEFILE64_SOURCE");
705 Builder.defineMacro("__EXTENSIONS__");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000706 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000707 }
708public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000709 SolarisTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
710 : OSTargetInfo<Target>(Triple, Opts) {
David Chisnallb526e932012-03-28 18:04:14 +0000711 this->WCharType = this->SignedInt;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000712 // FIXME: WIntType should be SignedLong
713 }
714};
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000715
716// Windows target
717template<typename Target>
718class WindowsTargetInfo : public OSTargetInfo<Target> {
719protected:
Craig Topper3164f332014-03-11 03:39:26 +0000720 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
721 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000722 Builder.defineMacro("_WIN32");
723 }
724 void getVisualStudioDefines(const LangOptions &Opts,
725 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000726 if (Opts.CPlusPlus) {
David Majnemerf6072342014-07-01 22:24:56 +0000727 if (Opts.RTTIData)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000728 Builder.defineMacro("_CPPRTTI");
729
Reid Kleckner16514352015-01-30 21:42:55 +0000730 if (Opts.CXXExceptions)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000731 Builder.defineMacro("_CPPUNWIND");
732 }
733
David Majnemer6a658902015-07-22 22:36:26 +0000734 if (Opts.Bool)
735 Builder.defineMacro("__BOOL_DEFINED");
736
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000737 if (!Opts.CharIsSigned)
738 Builder.defineMacro("_CHAR_UNSIGNED");
739
740 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
741 // but it works for now.
742 if (Opts.POSIXThreads)
743 Builder.defineMacro("_MT");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000744
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +0000745 if (Opts.MSCompatibilityVersion) {
746 Builder.defineMacro("_MSC_VER",
747 Twine(Opts.MSCompatibilityVersion / 100000));
748 Builder.defineMacro("_MSC_FULL_VER", Twine(Opts.MSCompatibilityVersion));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000749 // FIXME We cannot encode the revision information into 32-bits
750 Builder.defineMacro("_MSC_BUILD", Twine(1));
David Majnemeraaf2b842015-03-18 07:53:18 +0000751
David Majnemerb710a932015-05-11 03:57:49 +0000752 if (Opts.CPlusPlus11 && Opts.isCompatibleWithMSVC(LangOptions::MSVC2015))
David Majnemeraaf2b842015-03-18 07:53:18 +0000753 Builder.defineMacro("_HAS_CHAR16_T_LANGUAGE_SUPPORT", Twine(1));
David Majnemer017cf352016-06-28 03:13:16 +0000754
755 if (Opts.isCompatibleWithMSVC(LangOptions::MSVC2015)) {
756 if (Opts.CPlusPlus1z)
757 Builder.defineMacro("_MSVC_LANG", "201403L");
758 else if (Opts.CPlusPlus14)
759 Builder.defineMacro("_MSVC_LANG", "201402L");
760 }
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000761 }
Reid Kleckner6f6e76d2014-04-16 20:10:16 +0000762
763 if (Opts.MicrosoftExt) {
764 Builder.defineMacro("_MSC_EXTENSIONS");
765
766 if (Opts.CPlusPlus11) {
767 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
768 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
769 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
770 }
771 }
772
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000773 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000774 }
775
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000776public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000777 WindowsTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
778 : OSTargetInfo<Target>(Triple, Opts) {}
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000779};
780
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000781template <typename Target>
782class NaClTargetInfo : public OSTargetInfo<Target> {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000783protected:
Craig Topper3164f332014-03-11 03:39:26 +0000784 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
785 MacroBuilder &Builder) const override {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000786 if (Opts.POSIXThreads)
787 Builder.defineMacro("_REENTRANT");
788 if (Opts.CPlusPlus)
789 Builder.defineMacro("_GNU_SOURCE");
790
Saleem Abdulrasool56027092017-02-07 19:00:06 +0000791 DefineStd(Builder, "unix", Opts);
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000792 Builder.defineMacro("__ELF__");
793 Builder.defineMacro("__native_client__");
794 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000795
796public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000797 NaClTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
798 : OSTargetInfo<Target>(Triple, Opts) {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000799 this->LongAlign = 32;
800 this->LongWidth = 32;
801 this->PointerAlign = 32;
802 this->PointerWidth = 32;
803 this->IntMaxType = TargetInfo::SignedLongLong;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000804 this->Int64Type = TargetInfo::SignedLongLong;
805 this->DoubleAlign = 64;
806 this->LongDoubleWidth = 64;
807 this->LongDoubleAlign = 64;
Jan Wen Voung1f9c4ee2014-01-15 21:42:41 +0000808 this->LongLongWidth = 64;
809 this->LongLongAlign = 64;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000810 this->SizeType = TargetInfo::UnsignedInt;
811 this->PtrDiffType = TargetInfo::SignedInt;
812 this->IntPtrType = TargetInfo::SignedInt;
Guy Blank294cbbd2016-08-18 08:44:33 +0000813 // RegParmMax is inherited from the underlying architecture.
Stephan Bergmann17c7f702016-12-14 11:57:17 +0000814 this->LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Rafael Espindola1c09b262013-12-18 23:41:04 +0000815 if (Triple.getArch() == llvm::Triple::arm) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +0000816 // Handled in ARM's setABI().
Rafael Espindola1c09b262013-12-18 23:41:04 +0000817 } else if (Triple.getArch() == llvm::Triple::x86) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000818 this->resetDataLayout("e-m:e-p:32:32-i64:64-n8:16:32-S128");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000819 } else if (Triple.getArch() == llvm::Triple::x86_64) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000820 this->resetDataLayout("e-m:e-p:32:32-i64:64-n8:16:32:64-S128");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000821 } else if (Triple.getArch() == llvm::Triple::mipsel) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000822 // Handled on mips' setDataLayout.
Rafael Espindola1c09b262013-12-18 23:41:04 +0000823 } else {
824 assert(Triple.getArch() == llvm::Triple::le32);
James Y Knightb214cbc2016-03-04 19:00:41 +0000825 this->resetDataLayout("e-p:32:32-i64:64");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000826 }
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000827 }
828};
Torok Edwinb2b37c62009-06-30 17:10:35 +0000829
Petr Hosek62e1d232016-10-06 06:08:09 +0000830// Fuchsia Target
831template<typename Target>
832class FuchsiaTargetInfo : public OSTargetInfo<Target> {
833protected:
834 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
835 MacroBuilder &Builder) const override {
836 Builder.defineMacro("__Fuchsia__");
837 Builder.defineMacro("__ELF__");
838 if (Opts.POSIXThreads)
839 Builder.defineMacro("_REENTRANT");
840 // Required by the libc++ locale support.
841 if (Opts.CPlusPlus)
842 Builder.defineMacro("_GNU_SOURCE");
843 }
844public:
845 FuchsiaTargetInfo(const llvm::Triple &Triple,
846 const TargetOptions &Opts)
847 : OSTargetInfo<Target>(Triple, Opts) {
848 this->MCountName = "__mcount";
849 }
850};
851
Dan Gohmanc2853072015-09-03 22:51:53 +0000852// WebAssembly target
853template <typename Target>
854class WebAssemblyOSTargetInfo : public OSTargetInfo<Target> {
855 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Hans Wennborg7eb54642015-09-10 17:07:54 +0000856 MacroBuilder &Builder) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +0000857 // A common platform macro.
858 if (Opts.POSIXThreads)
859 Builder.defineMacro("_REENTRANT");
860 // Follow g++ convention and predefine _GNU_SOURCE for C++.
861 if (Opts.CPlusPlus)
862 Builder.defineMacro("_GNU_SOURCE");
863 }
864
865 // As an optimization, group static init code together in a section.
Hans Wennborg7eb54642015-09-10 17:07:54 +0000866 const char *getStaticInitSectionSpecifier() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +0000867 return ".text.__startup";
868 }
869
870public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000871 explicit WebAssemblyOSTargetInfo(const llvm::Triple &Triple,
872 const TargetOptions &Opts)
873 : OSTargetInfo<Target>(Triple, Opts) {
Dan Gohmanc2853072015-09-03 22:51:53 +0000874 this->MCountName = "__mcount";
Dan Gohmanc2853072015-09-03 22:51:53 +0000875 this->TheCXXABI.set(TargetCXXABI::WebAssembly);
876 }
877};
Dan Gohmanc2853072015-09-03 22:51:53 +0000878
Chris Lattner09d98f52008-10-05 21:50:58 +0000879//===----------------------------------------------------------------------===//
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000880// Specific target implementations.
881//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000882
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000883// PPC abstract base class
884class PPCTargetInfo : public TargetInfo {
885 static const Builtin::Info BuiltinInfo[];
886 static const char * const GCCRegNames[];
887 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Hal Finkel8eb59282012-06-11 22:35:19 +0000888 std::string CPU;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000889
890 // Target cpu features.
Eric Christopher758aad72017-03-21 22:06:18 +0000891 bool HasAltivec;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000892 bool HasVSX;
Bill Schmidt8c184e32014-10-10 17:21:23 +0000893 bool HasP8Vector;
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +0000894 bool HasP8Crypto;
Nemanja Ivanovic35458c22015-04-11 10:43:36 +0000895 bool HasDirectMove;
Hal Finkel0d0a1a52015-03-11 19:14:15 +0000896 bool HasQPX;
Kit Barton8246f282015-03-25 19:41:41 +0000897 bool HasHTM;
Nemanja Ivanovic239eec72015-04-09 23:58:16 +0000898 bool HasBPERMD;
899 bool HasExtDiv;
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +0000900 bool HasP9Vector;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000901
Ulrich Weigand8afad612014-07-28 13:17:52 +0000902protected:
903 std::string ABI;
904
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000905public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000906 PPCTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Eric Christopher758aad72017-03-21 22:06:18 +0000907 : TargetInfo(Triple), HasAltivec(false), HasVSX(false), HasP8Vector(false),
Saleem Abdulrasool10a49722016-04-08 16:52:00 +0000908 HasP8Crypto(false), HasDirectMove(false), HasQPX(false), HasHTM(false),
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +0000909 HasBPERMD(false), HasExtDiv(false), HasP9Vector(false) {
Eric Christopher153dad42017-03-25 02:55:21 +0000910 SuitableAlign = 128;
Alexey Bataev00396512015-07-02 03:40:19 +0000911 SimdDefaultAlign = 128;
Nico Weber3435ede2012-01-31 02:07:33 +0000912 LongDoubleWidth = LongDoubleAlign = 128;
Stephan Bergmann17c7f702016-12-14 11:57:17 +0000913 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble();
Nico Weber3435ede2012-01-31 02:07:33 +0000914 }
Eli Friedman9ffd4a92009-06-05 07:05:05 +0000915
Hal Finkel6b984f02012-07-03 16:51:04 +0000916 /// \brief Flags for architecture specific defines.
917 typedef enum {
918 ArchDefineNone = 0,
919 ArchDefineName = 1 << 0, // <name> is substituted for arch name.
920 ArchDefinePpcgr = 1 << 1,
921 ArchDefinePpcsq = 1 << 2,
922 ArchDefine440 = 1 << 3,
923 ArchDefine603 = 1 << 4,
924 ArchDefine604 = 1 << 5,
925 ArchDefinePwr4 = 1 << 6,
Bill Schmidt38378a02013-02-01 20:23:10 +0000926 ArchDefinePwr5 = 1 << 7,
927 ArchDefinePwr5x = 1 << 8,
928 ArchDefinePwr6 = 1 << 9,
929 ArchDefinePwr6x = 1 << 10,
930 ArchDefinePwr7 = 1 << 11,
Will Schmidtf0487512014-06-26 13:34:10 +0000931 ArchDefinePwr8 = 1 << 12,
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +0000932 ArchDefinePwr9 = 1 << 13,
933 ArchDefineA2 = 1 << 14,
934 ArchDefineA2q = 1 << 15
Hal Finkel6b984f02012-07-03 16:51:04 +0000935 } ArchDefineTypes;
936
Eric Christopher3646e622017-03-22 06:36:09 +0000937 // Set the language option for altivec based on our value.
938 void adjust(LangOptions &Opts) override {
939 if (HasAltivec)
940 Opts.AltiVec = 1;
941 TargetInfo::adjust(Opts);
942 }
943
Bill Schmidt38378a02013-02-01 20:23:10 +0000944 // Note: GCC recognizes the following additional cpus:
945 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
946 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
947 // titan, rs64.
Craig Topper3164f332014-03-11 03:39:26 +0000948 bool setCPU(const std::string &Name) override {
Hal Finkel8eb59282012-06-11 22:35:19 +0000949 bool CPUKnown = llvm::StringSwitch<bool>(Name)
950 .Case("generic", true)
951 .Case("440", true)
952 .Case("450", true)
953 .Case("601", true)
954 .Case("602", true)
955 .Case("603", true)
956 .Case("603e", true)
957 .Case("603ev", true)
958 .Case("604", true)
959 .Case("604e", true)
960 .Case("620", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000961 .Case("630", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000962 .Case("g3", true)
963 .Case("7400", true)
964 .Case("g4", true)
965 .Case("7450", true)
966 .Case("g4+", true)
967 .Case("750", true)
968 .Case("970", true)
969 .Case("g5", true)
970 .Case("a2", true)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +0000971 .Case("a2q", true)
Hal Finkelf6d6cb02012-09-18 22:25:03 +0000972 .Case("e500mc", true)
973 .Case("e5500", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000974 .Case("power3", true)
975 .Case("pwr3", true)
976 .Case("power4", true)
977 .Case("pwr4", true)
978 .Case("power5", true)
979 .Case("pwr5", true)
980 .Case("power5x", true)
981 .Case("pwr5x", true)
982 .Case("power6", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000983 .Case("pwr6", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000984 .Case("power6x", true)
985 .Case("pwr6x", true)
986 .Case("power7", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000987 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +0000988 .Case("power8", true)
989 .Case("pwr8", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +0000990 .Case("power9", true)
991 .Case("pwr9", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000992 .Case("powerpc", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000993 .Case("ppc", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000994 .Case("powerpc64", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000995 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +0000996 .Case("powerpc64le", true)
997 .Case("ppc64le", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000998 .Default(false);
999
1000 if (CPUKnown)
1001 CPU = Name;
1002
1003 return CPUKnown;
1004 }
1005
Ulrich Weigand8afad612014-07-28 13:17:52 +00001006
1007 StringRef getABI() const override { return ABI; }
1008
Craig Topper6c03a542015-10-19 04:51:35 +00001009 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
1010 return llvm::makeArrayRef(BuiltinInfo,
1011 clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner10a5b382007-01-29 05:24:35 +00001012 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001013
Craig Topper3164f332014-03-11 03:39:26 +00001014 bool isCLZForZeroUndef() const override { return false; }
Bob Wilson19a2f2b2012-01-28 18:02:29 +00001015
Craig Topper3164f332014-03-11 03:39:26 +00001016 void getTargetDefines(const LangOptions &Opts,
1017 MacroBuilder &Builder) const override;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001018
Eric Christopher8c47b422015-10-09 18:39:55 +00001019 bool
1020 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
1021 StringRef CPU,
1022 const std::vector<std::string> &FeaturesVec) const override;
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001023
Craig Topper3164f332014-03-11 03:39:26 +00001024 bool handleTargetFeatures(std::vector<std::string> &Features,
1025 DiagnosticsEngine &Diags) override;
1026 bool hasFeature(StringRef Feature) const override;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001027 void setFeatureEnabled(llvm::StringMap<bool> &Features, StringRef Name,
1028 bool Enabled) const override;
Craig Topper3164f332014-03-11 03:39:26 +00001029
Craig Topperf054e3a2015-10-19 03:52:27 +00001030 ArrayRef<const char *> getGCCRegNames() const override;
1031 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00001032 bool validateAsmConstraint(const char *&Name,
1033 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00001034 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +00001035 default: return false;
1036 case 'O': // Zero
John Thompson07a61a42010-06-24 22:44:13 +00001037 break;
Anders Carlssonf511f642007-11-27 04:11:28 +00001038 case 'b': // Base register
1039 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +00001040 Info.setAllowsRegister();
John Thompson07a61a42010-06-24 22:44:13 +00001041 break;
1042 // FIXME: The following are added to allow parsing.
1043 // I just took a guess at what the actions should be.
1044 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001045 case 'd': // Floating point register (containing 64-bit value)
John Thompson07a61a42010-06-24 22:44:13 +00001046 case 'v': // Altivec vector register
1047 Info.setAllowsRegister();
1048 break;
1049 case 'w':
1050 switch (Name[1]) {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001051 case 'd':// VSX vector register to hold vector double data
1052 case 'f':// VSX vector register to hold vector float data
1053 case 's':// VSX vector register to hold scalar float data
1054 case 'a':// Any VSX register
Hal Finkelf7a07a52014-03-02 18:24:18 +00001055 case 'c':// An individual CR bit
John Thompson07a61a42010-06-24 22:44:13 +00001056 break;
1057 default:
1058 return false;
1059 }
1060 Info.setAllowsRegister();
1061 Name++; // Skip over 'w'.
1062 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001063 case 'h': // `MQ', `CTR', or `LINK' register
1064 case 'q': // `MQ' register
1065 case 'c': // `CTR' register
1066 case 'l': // `LINK' register
1067 case 'x': // `CR' register (condition register) number 0
1068 case 'y': // `CR' register (condition register)
1069 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson07a61a42010-06-24 22:44:13 +00001070 Info.setAllowsRegister();
1071 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001072 case 'I': // Signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +00001073 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001074 // (use `L' instead for SImode constants)
1075 case 'K': // Unsigned 16-bit constant
1076 case 'L': // Signed 16-bit constant shifted left 16 bits
1077 case 'M': // Constant larger than 31
1078 case 'N': // Exact power of 2
1079 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +00001080 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001081 // register with one instruction per word
John Thompson07a61a42010-06-24 22:44:13 +00001082 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001083 // into a register using three instructions
John Thompson07a61a42010-06-24 22:44:13 +00001084 break;
1085 case 'm': // Memory operand. Note that on PowerPC targets, m can
1086 // include addresses that update the base register. It
1087 // is therefore only safe to use `m' in an asm statement
1088 // if that asm statement accesses the operand exactly once.
1089 // The asm statement must also use `%U<opno>' as a
Sebastian Redldd008712010-08-17 22:42:34 +00001090 // placeholder for the "update" flag in the corresponding
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001091 // load or store instruction. For example:
John Thompson07a61a42010-06-24 22:44:13 +00001092 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001093 // is correct but:
John Thompson07a61a42010-06-24 22:44:13 +00001094 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
1095 // is not. Use es rather than m if you don't want the base
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001096 // register to be updated.
1097 case 'e':
John Thompsonceebdf12010-06-25 00:02:05 +00001098 if (Name[1] != 's')
1099 return false;
Sebastian Redldd008712010-08-17 22:42:34 +00001100 // es: A "stable" memory operand; that is, one which does not
John Thompson07a61a42010-06-24 22:44:13 +00001101 // include any automodification of the base register. Unlike
1102 // `m', this constraint can be used in asm statements that
1103 // might access the operand several times, or that might not
John Thompsonceebdf12010-06-25 00:02:05 +00001104 // access it at all.
John Thompson07a61a42010-06-24 22:44:13 +00001105 Info.setAllowsMemory();
John Thompsonceebdf12010-06-25 00:02:05 +00001106 Name++; // Skip over 'e'.
John Thompson07a61a42010-06-24 22:44:13 +00001107 break;
1108 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001109 // usually better to use `m' or `es' in asm statements)
John Thompson07a61a42010-06-24 22:44:13 +00001110 case 'Z': // Memory operand that is an indexed or indirect from a
1111 // register (it is usually better to use `m' or `es' in
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001112 // asm statements)
John Thompson07a61a42010-06-24 22:44:13 +00001113 Info.setAllowsMemory();
1114 Info.setAllowsRegister();
1115 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001116 case 'R': // AIX TOC entry
John Thompson07a61a42010-06-24 22:44:13 +00001117 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001118 // register (`p' is preferable for asm statements)
1119 case 'S': // Constant suitable as a 64-bit mask operand
1120 case 'T': // Constant suitable as a 32-bit mask operand
1121 case 'U': // System V Release 4 small data area reference
John Thompson07a61a42010-06-24 22:44:13 +00001122 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001123 // instructions
1124 case 'W': // Vector constant that does not require memory
1125 case 'j': // Vector constant that is all zeros.
John Thompson07a61a42010-06-24 22:44:13 +00001126 break;
1127 // End FIXME.
Anders Carlssonf511f642007-11-27 04:11:28 +00001128 }
John Thompson07a61a42010-06-24 22:44:13 +00001129 return true;
Anders Carlssonf511f642007-11-27 04:11:28 +00001130 }
Craig Topper3164f332014-03-11 03:39:26 +00001131 std::string convertConstraint(const char *&Constraint) const override {
Hal Finkelf7a07a52014-03-02 18:24:18 +00001132 std::string R;
1133 switch (*Constraint) {
1134 case 'e':
1135 case 'w':
1136 // Two-character constraint; add "^" hint for later parsing.
1137 R = std::string("^") + std::string(Constraint, 2);
1138 Constraint++;
1139 break;
1140 default:
1141 return TargetInfo::convertConstraint(Constraint);
1142 }
1143 return R;
1144 }
Craig Topper3164f332014-03-11 03:39:26 +00001145 const char *getClobbers() const override {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001146 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +00001147 }
Craig Topper3164f332014-03-11 03:39:26 +00001148 int getEHDataRegisterNumber(unsigned RegNo) const override {
Adhemerval Zanella5d874ae2013-01-22 20:02:45 +00001149 if (RegNo == 0) return 3;
1150 if (RegNo == 1) return 4;
1151 return -1;
1152 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00001153
1154 bool hasSjLjLowering() const override {
1155 return true;
1156 }
David Majnemer2617ea62015-06-09 18:05:33 +00001157
1158 bool useFloat128ManglingForLongDouble() const override {
1159 return LongDoubleWidth == 128 &&
Stephan Bergmann17c7f702016-12-14 11:57:17 +00001160 LongDoubleFormat == &llvm::APFloat::PPCDoubleDouble() &&
David Majnemer2617ea62015-06-09 18:05:33 +00001161 getTriple().isOSBinFormatELF();
1162 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001163};
Anders Carlssonf511f642007-11-27 04:11:28 +00001164
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001165const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00001166#define BUILTIN(ID, TYPE, ATTRS) \
1167 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1168#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1169 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5abdec72009-06-14 01:05:48 +00001170#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001171};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001172
Eric Christopher917e9522014-11-18 22:36:15 +00001173/// handleTargetFeatures - Perform initialization based on the user
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001174/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00001175bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001176 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00001177 for (const auto &Feature : Features) {
Eric Christopher758aad72017-03-21 22:06:18 +00001178 if (Feature == "+altivec") {
1179 HasAltivec = true;
1180 } else if (Feature == "+vsx") {
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001181 HasVSX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001182 } else if (Feature == "+bpermd") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001183 HasBPERMD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001184 } else if (Feature == "+extdiv") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001185 HasExtDiv = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001186 } else if (Feature == "+power8-vector") {
Bill Schmidt8c184e32014-10-10 17:21:23 +00001187 HasP8Vector = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001188 } else if (Feature == "+crypto") {
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001189 HasP8Crypto = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001190 } else if (Feature == "+direct-move") {
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001191 HasDirectMove = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001192 } else if (Feature == "+qpx") {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001193 HasQPX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001194 } else if (Feature == "+htm") {
Kit Barton8246f282015-03-25 19:41:41 +00001195 HasHTM = true;
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001196 } else if (Feature == "+float128") {
1197 HasFloat128 = true;
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001198 } else if (Feature == "+power9-vector") {
1199 HasP9Vector = true;
Kit Barton8246f282015-03-25 19:41:41 +00001200 }
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001201 // TODO: Finish this list and add an assert that we've handled them
1202 // all.
1203 }
Eric Christopher02c33352015-08-25 00:59:11 +00001204
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001205 return true;
1206}
1207
Chris Lattnerecd49032009-03-02 22:27:17 +00001208/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
1209/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001210void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001211 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00001212 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001213 Builder.defineMacro("__ppc__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001214 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001215 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001216 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001217 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001218 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001219 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001220 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001221 Builder.defineMacro("__ppc64__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001222 Builder.defineMacro("__PPC64__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001223 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001224
Chris Lattnerecd49032009-03-02 22:27:17 +00001225 // Target properties.
Bill Schmidt778d3872013-07-26 01:36:11 +00001226 if (getTriple().getArch() == llvm::Triple::ppc64le) {
1227 Builder.defineMacro("_LITTLE_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001228 } else {
1229 if (getTriple().getOS() != llvm::Triple::NetBSD &&
1230 getTriple().getOS() != llvm::Triple::OpenBSD)
1231 Builder.defineMacro("_BIG_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001232 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001233
Ulrich Weigand8afad612014-07-28 13:17:52 +00001234 // ABI options.
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001235 if (ABI == "elfv1" || ABI == "elfv1-qpx")
Ulrich Weigand8afad612014-07-28 13:17:52 +00001236 Builder.defineMacro("_CALL_ELF", "1");
1237 if (ABI == "elfv2")
1238 Builder.defineMacro("_CALL_ELF", "2");
1239
Eric Christopher2fd2eda2017-03-25 03:33:59 +00001240 // This typically is only for a new enough linker (bfd >= 2.16.2 or gold), but
1241 // our suppport post-dates this and it should work on all linux platforms. It
1242 // is guaranteed to work on all elfv2 platforms.
1243 if (getTriple().getOS() == llvm::Triple::Linux)
1244 Builder.defineMacro("_CALL_LINUX", "1");
1245
Chris Lattnerecd49032009-03-02 22:27:17 +00001246 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001247 Builder.defineMacro("__NATURAL_ALIGNMENT__");
1248 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001249
Chris Lattnerecd49032009-03-02 22:27:17 +00001250 // FIXME: Should be controlled by command line option.
Eric Christopheree214102017-03-25 06:37:23 +00001251 if (LongDoubleWidth == 128) {
Roman Divacky13b586f2013-07-03 19:45:54 +00001252 Builder.defineMacro("__LONG_DOUBLE_128__");
Eric Christopheree214102017-03-25 06:37:23 +00001253 Builder.defineMacro("__LONGDOUBLE128");
1254 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001255
Eric Christopher32ac5e42017-02-15 07:50:11 +00001256 // Define this for elfv2 (64-bit only) or 64-bit darwin.
1257 if (ABI == "elfv2" ||
1258 (getTriple().getOS() == llvm::Triple::Darwin && PointerWidth == 64))
1259 Builder.defineMacro("__STRUCT_PARM_ALIGN__", "16");
1260
Hal Finkel8eb59282012-06-11 22:35:19 +00001261 // CPU identification.
Eric Christopherb70819e2017-03-25 02:29:18 +00001262 ArchDefineTypes defs =
1263 (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
1264 .Case("440", ArchDefineName)
1265 .Case("450", ArchDefineName | ArchDefine440)
1266 .Case("601", ArchDefineName)
1267 .Case("602", ArchDefineName | ArchDefinePpcgr)
1268 .Case("603", ArchDefineName | ArchDefinePpcgr)
1269 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1270 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1271 .Case("604", ArchDefineName | ArchDefinePpcgr)
1272 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
1273 .Case("620", ArchDefineName | ArchDefinePpcgr)
1274 .Case("630", ArchDefineName | ArchDefinePpcgr)
1275 .Case("7400", ArchDefineName | ArchDefinePpcgr)
1276 .Case("7450", ArchDefineName | ArchDefinePpcgr)
1277 .Case("750", ArchDefineName | ArchDefinePpcgr)
1278 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr |
1279 ArchDefinePpcsq)
1280 .Case("a2", ArchDefineA2)
1281 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
1282 .Case("pwr3", ArchDefinePpcgr)
1283 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
1284 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr |
1285 ArchDefinePpcsq)
1286 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4 |
1287 ArchDefinePpcgr | ArchDefinePpcsq)
1288 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5 |
1289 ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1290 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x |
1291 ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr |
1292 ArchDefinePpcsq)
1293 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6 |
1294 ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4 |
1295 ArchDefinePpcgr | ArchDefinePpcsq)
1296 .Case("pwr8", ArchDefineName | ArchDefinePwr7 | ArchDefinePwr6x |
1297 ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5 |
1298 ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1299 .Case("pwr9", ArchDefineName | ArchDefinePwr8 | ArchDefinePwr7 |
1300 ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x |
1301 ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr |
1302 ArchDefinePpcsq)
1303 .Case("power3", ArchDefinePpcgr)
1304 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1305 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr |
1306 ArchDefinePpcsq)
1307 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4 |
1308 ArchDefinePpcgr | ArchDefinePpcsq)
1309 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5 |
1310 ArchDefinePwr4 | ArchDefinePpcgr |
1311 ArchDefinePpcsq)
1312 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x |
1313 ArchDefinePwr5 | ArchDefinePwr4 |
1314 ArchDefinePpcgr | ArchDefinePpcsq)
1315 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6 |
1316 ArchDefinePwr5x | ArchDefinePwr5 |
1317 ArchDefinePwr4 | ArchDefinePpcgr |
1318 ArchDefinePpcsq)
1319 .Case("power8", ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr6x |
1320 ArchDefinePwr6 | ArchDefinePwr5x |
1321 ArchDefinePwr5 | ArchDefinePwr4 |
1322 ArchDefinePpcgr | ArchDefinePpcsq)
1323 .Case("power9", ArchDefinePwr9 | ArchDefinePwr8 | ArchDefinePwr7 |
1324 ArchDefinePwr6x | ArchDefinePwr6 |
1325 ArchDefinePwr5x | ArchDefinePwr5 |
1326 ArchDefinePwr4 | ArchDefinePpcgr |
1327 ArchDefinePpcsq)
1328 // powerpc64le automatically defaults to at least power8.
1329 .Case("ppc64le", ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr6x |
1330 ArchDefinePwr6 | ArchDefinePwr5x |
1331 ArchDefinePwr5 | ArchDefinePwr4 |
1332 ArchDefinePpcgr | ArchDefinePpcsq)
1333 .Default(ArchDefineNone);
Hal Finkel6b984f02012-07-03 16:51:04 +00001334
1335 if (defs & ArchDefineName)
1336 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
1337 if (defs & ArchDefinePpcgr)
1338 Builder.defineMacro("_ARCH_PPCGR");
1339 if (defs & ArchDefinePpcsq)
1340 Builder.defineMacro("_ARCH_PPCSQ");
1341 if (defs & ArchDefine440)
Hal Finkel8eb59282012-06-11 22:35:19 +00001342 Builder.defineMacro("_ARCH_440");
Hal Finkel6b984f02012-07-03 16:51:04 +00001343 if (defs & ArchDefine603)
1344 Builder.defineMacro("_ARCH_603");
1345 if (defs & ArchDefine604)
1346 Builder.defineMacro("_ARCH_604");
Bill Schmidt38378a02013-02-01 20:23:10 +00001347 if (defs & ArchDefinePwr4)
Hal Finkel6b984f02012-07-03 16:51:04 +00001348 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt38378a02013-02-01 20:23:10 +00001349 if (defs & ArchDefinePwr5)
Hal Finkel6b984f02012-07-03 16:51:04 +00001350 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt38378a02013-02-01 20:23:10 +00001351 if (defs & ArchDefinePwr5x)
1352 Builder.defineMacro("_ARCH_PWR5X");
1353 if (defs & ArchDefinePwr6)
Hal Finkel8eb59282012-06-11 22:35:19 +00001354 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt38378a02013-02-01 20:23:10 +00001355 if (defs & ArchDefinePwr6x)
1356 Builder.defineMacro("_ARCH_PWR6X");
1357 if (defs & ArchDefinePwr7)
1358 Builder.defineMacro("_ARCH_PWR7");
Will Schmidtf0487512014-06-26 13:34:10 +00001359 if (defs & ArchDefinePwr8)
1360 Builder.defineMacro("_ARCH_PWR8");
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001361 if (defs & ArchDefinePwr9)
1362 Builder.defineMacro("_ARCH_PWR9");
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001363 if (defs & ArchDefineA2)
1364 Builder.defineMacro("_ARCH_A2");
1365 if (defs & ArchDefineA2q) {
1366 Builder.defineMacro("_ARCH_A2Q");
1367 Builder.defineMacro("_ARCH_QP");
1368 }
1369
1370 if (getTriple().getVendor() == llvm::Triple::BGQ) {
1371 Builder.defineMacro("__bg__");
1372 Builder.defineMacro("__THW_BLUEGENE__");
1373 Builder.defineMacro("__bgq__");
1374 Builder.defineMacro("__TOS_BGQ__");
1375 }
Bill Schmidt38378a02013-02-01 20:23:10 +00001376
Eric Christopher758aad72017-03-21 22:06:18 +00001377 if (HasAltivec) {
1378 Builder.defineMacro("__VEC__", "10206");
1379 Builder.defineMacro("__ALTIVEC__");
1380 }
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001381 if (HasVSX)
1382 Builder.defineMacro("__VSX__");
Bill Schmidt8c184e32014-10-10 17:21:23 +00001383 if (HasP8Vector)
Bill Schmidt59eb7672014-10-10 15:09:43 +00001384 Builder.defineMacro("__POWER8_VECTOR__");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001385 if (HasP8Crypto)
1386 Builder.defineMacro("__CRYPTO__");
Kit Barton8246f282015-03-25 19:41:41 +00001387 if (HasHTM)
1388 Builder.defineMacro("__HTM__");
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001389 if (HasFloat128)
1390 Builder.defineMacro("__FLOAT128__");
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001391 if (HasP9Vector)
1392 Builder.defineMacro("__POWER9_VECTOR__");
Hal Finkela57b8902015-10-01 13:39:49 +00001393
1394 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
1395 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
1396 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
1397 if (PointerWidth == 64)
1398 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001399
Eric Christopher0d361162017-03-25 05:40:13 +00001400 // We have support for the bswap intrinsics so we can define this.
1401 Builder.defineMacro("__HAVE_BSWAP__", "1");
1402
Bill Schmidt38378a02013-02-01 20:23:10 +00001403 // FIXME: The following are not yet generated here by Clang, but are
1404 // generated by GCC:
1405 //
1406 // _SOFT_FLOAT_
1407 // __RECIP_PRECISION__
1408 // __APPLE_ALTIVEC__
Bill Schmidt38378a02013-02-01 20:23:10 +00001409 // __RECIP__
1410 // __RECIPF__
1411 // __RSQRTE__
1412 // __RSQRTEF__
1413 // _SOFT_DOUBLE_
1414 // __NO_LWSYNC__
Bill Schmidt38378a02013-02-01 20:23:10 +00001415 // __CMODEL_MEDIUM__
1416 // __CMODEL_LARGE__
1417 // _CALL_SYSV
1418 // _CALL_DARWIN
1419 // __NO_FPRS__
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001420}
1421
Eric Christophera8a14c32015-08-31 18:39:16 +00001422// Handle explicit options being passed to the compiler here: if we've
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001423// explicitly turned off vsx and turned on any of:
1424// - power8-vector
1425// - direct-move
1426// - float128
1427// - power9-vector
1428// then go ahead and error since the customer has expressed an incompatible
Eric Christophera8a14c32015-08-31 18:39:16 +00001429// set of options.
1430static bool ppcUserFeaturesCheck(DiagnosticsEngine &Diags,
Eric Christopher8c47b422015-10-09 18:39:55 +00001431 const std::vector<std::string> &FeaturesVec) {
Eric Christophera8a14c32015-08-31 18:39:16 +00001432
1433 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "-vsx") !=
1434 FeaturesVec.end()) {
1435 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+power8-vector") !=
1436 FeaturesVec.end()) {
1437 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mpower8-vector"
1438 << "-mno-vsx";
1439 return false;
1440 }
1441
1442 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+direct-move") !=
1443 FeaturesVec.end()) {
1444 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mdirect-move"
1445 << "-mno-vsx";
1446 return false;
1447 }
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001448
1449 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+float128") !=
1450 FeaturesVec.end()) {
1451 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mfloat128"
1452 << "-mno-vsx";
1453 return false;
1454 }
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001455
1456 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+power9-vector") !=
1457 FeaturesVec.end()) {
1458 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mpower9-vector"
1459 << "-mno-vsx";
1460 return false;
1461 }
Eric Christophera8a14c32015-08-31 18:39:16 +00001462 }
1463
1464 return true;
1465}
1466
Eric Christopher8c47b422015-10-09 18:39:55 +00001467bool PPCTargetInfo::initFeatureMap(
1468 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
1469 const std::vector<std::string> &FeaturesVec) const {
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001470 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1471 .Case("7400", true)
1472 .Case("g4", true)
1473 .Case("7450", true)
1474 .Case("g4+", true)
1475 .Case("970", true)
1476 .Case("g5", true)
1477 .Case("pwr6", true)
1478 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +00001479 .Case("pwr8", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001480 .Case("pwr9", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001481 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +00001482 .Case("ppc64le", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001483 .Default(false);
Hal Finkelb58ce852013-02-01 18:44:19 +00001484
1485 Features["qpx"] = (CPU == "a2q");
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001486 Features["power9-vector"] = (CPU == "pwr9");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001487 Features["crypto"] = llvm::StringSwitch<bool>(CPU)
1488 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001489 .Case("pwr9", true)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001490 .Case("pwr8", true)
1491 .Default(false);
1492 Features["power8-vector"] = llvm::StringSwitch<bool>(CPU)
1493 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001494 .Case("pwr9", true)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001495 .Case("pwr8", true)
1496 .Default(false);
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001497 Features["bpermd"] = llvm::StringSwitch<bool>(CPU)
1498 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001499 .Case("pwr9", true)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001500 .Case("pwr8", true)
1501 .Case("pwr7", true)
1502 .Default(false);
1503 Features["extdiv"] = llvm::StringSwitch<bool>(CPU)
1504 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001505 .Case("pwr9", true)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001506 .Case("pwr8", true)
1507 .Case("pwr7", true)
1508 .Default(false);
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001509 Features["direct-move"] = llvm::StringSwitch<bool>(CPU)
1510 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001511 .Case("pwr9", true)
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001512 .Case("pwr8", true)
1513 .Default(false);
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001514 Features["vsx"] = llvm::StringSwitch<bool>(CPU)
1515 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001516 .Case("pwr9", true)
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001517 .Case("pwr8", true)
1518 .Case("pwr7", true)
1519 .Default(false);
Eric Christopher74fa24f2017-03-20 21:12:53 +00001520 Features["htm"] = llvm::StringSwitch<bool>(CPU)
1521 .Case("ppc64le", true)
1522 .Case("pwr9", true)
1523 .Case("pwr8", true)
1524 .Default(false);
Eric Christopheref1e2952015-08-28 02:13:58 +00001525
Eric Christophera8a14c32015-08-31 18:39:16 +00001526 if (!ppcUserFeaturesCheck(Diags, FeaturesVec))
1527 return false;
Eric Christopher007b0a02015-08-28 22:32:01 +00001528
Eric Christopher007b0a02015-08-28 22:32:01 +00001529 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001530}
1531
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001532bool PPCTargetInfo::hasFeature(StringRef Feature) const {
Bill Schmidte6e9d152014-11-02 14:56:41 +00001533 return llvm::StringSwitch<bool>(Feature)
Eric Christopher758aad72017-03-21 22:06:18 +00001534 .Case("powerpc", true)
1535 .Case("altivec", HasAltivec)
1536 .Case("vsx", HasVSX)
1537 .Case("power8-vector", HasP8Vector)
1538 .Case("crypto", HasP8Crypto)
1539 .Case("direct-move", HasDirectMove)
1540 .Case("qpx", HasQPX)
1541 .Case("htm", HasHTM)
1542 .Case("bpermd", HasBPERMD)
1543 .Case("extdiv", HasExtDiv)
1544 .Case("float128", HasFloat128)
1545 .Case("power9-vector", HasP9Vector)
1546 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001547}
Chris Lattner17df24e2008-04-21 18:56:49 +00001548
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001549void PPCTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
1550 StringRef Name, bool Enabled) const {
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001551 // If we're enabling direct-move or power8-vector go ahead and enable vsx
1552 // as well. Do the inverse if we're disabling vsx. We'll diagnose any user
1553 // incompatible options.
1554 if (Enabled) {
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001555 if (Name == "direct-move" ||
1556 Name == "power8-vector" ||
1557 Name == "float128" ||
1558 Name == "power9-vector") {
1559 // power9-vector is really a superset of power8-vector so encode that.
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001560 Features[Name] = Features["vsx"] = true;
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001561 if (Name == "power9-vector")
1562 Features["power8-vector"] = true;
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001563 } else {
1564 Features[Name] = true;
1565 }
1566 } else {
1567 if (Name == "vsx") {
1568 Features[Name] = Features["direct-move"] = Features["power8-vector"] =
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001569 Features["float128"] = Features["power9-vector"] = false;
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001570 } else {
1571 Features[Name] = false;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001572 }
1573 }
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001574}
1575
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001576const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001577 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1578 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1579 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1580 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1581 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1582 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1583 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1584 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001585 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001586 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001587 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001588 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1589 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1590 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1591 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001592 "vrsave", "vscr",
1593 "spe_acc", "spefscr",
1594 "sfp"
1595};
Chris Lattner10a5b382007-01-29 05:24:35 +00001596
Craig Topperf054e3a2015-10-19 03:52:27 +00001597ArrayRef<const char*> PPCTargetInfo::getGCCRegNames() const {
1598 return llvm::makeArrayRef(GCCRegNames);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001599}
Chris Lattner5ba61f02006-10-14 07:39:34 +00001600
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001601const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1602 // While some of these aliases do map to different registers
1603 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001604 { { "0" }, "r0" },
1605 { { "1"}, "r1" },
1606 { { "2" }, "r2" },
1607 { { "3" }, "r3" },
1608 { { "4" }, "r4" },
1609 { { "5" }, "r5" },
1610 { { "6" }, "r6" },
1611 { { "7" }, "r7" },
1612 { { "8" }, "r8" },
1613 { { "9" }, "r9" },
1614 { { "10" }, "r10" },
1615 { { "11" }, "r11" },
1616 { { "12" }, "r12" },
1617 { { "13" }, "r13" },
1618 { { "14" }, "r14" },
1619 { { "15" }, "r15" },
1620 { { "16" }, "r16" },
1621 { { "17" }, "r17" },
1622 { { "18" }, "r18" },
1623 { { "19" }, "r19" },
1624 { { "20" }, "r20" },
1625 { { "21" }, "r21" },
1626 { { "22" }, "r22" },
1627 { { "23" }, "r23" },
1628 { { "24" }, "r24" },
1629 { { "25" }, "r25" },
1630 { { "26" }, "r26" },
1631 { { "27" }, "r27" },
1632 { { "28" }, "r28" },
1633 { { "29" }, "r29" },
1634 { { "30" }, "r30" },
1635 { { "31" }, "r31" },
1636 { { "fr0" }, "f0" },
1637 { { "fr1" }, "f1" },
1638 { { "fr2" }, "f2" },
1639 { { "fr3" }, "f3" },
1640 { { "fr4" }, "f4" },
1641 { { "fr5" }, "f5" },
1642 { { "fr6" }, "f6" },
1643 { { "fr7" }, "f7" },
1644 { { "fr8" }, "f8" },
1645 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +00001646 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001647 { { "fr11" }, "f11" },
1648 { { "fr12" }, "f12" },
1649 { { "fr13" }, "f13" },
1650 { { "fr14" }, "f14" },
1651 { { "fr15" }, "f15" },
1652 { { "fr16" }, "f16" },
1653 { { "fr17" }, "f17" },
1654 { { "fr18" }, "f18" },
1655 { { "fr19" }, "f19" },
1656 { { "fr20" }, "f20" },
1657 { { "fr21" }, "f21" },
1658 { { "fr22" }, "f22" },
1659 { { "fr23" }, "f23" },
1660 { { "fr24" }, "f24" },
1661 { { "fr25" }, "f25" },
1662 { { "fr26" }, "f26" },
1663 { { "fr27" }, "f27" },
1664 { { "fr28" }, "f28" },
1665 { { "fr29" }, "f29" },
1666 { { "fr30" }, "f30" },
1667 { { "fr31" }, "f31" },
1668 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001669};
1670
Craig Topperf054e3a2015-10-19 03:52:27 +00001671ArrayRef<TargetInfo::GCCRegAlias> PPCTargetInfo::getGCCRegAliases() const {
1672 return llvm::makeArrayRef(GCCRegAliases);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001673}
Chris Lattner02dffbd2006-10-14 07:50:21 +00001674
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001675class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001676public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001677 PPC32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1678 : PPCTargetInfo(Triple, Opts) {
James Y Knightb214cbc2016-03-04 19:00:41 +00001679 resetDataLayout("E-m:e-p:32:32-i64:64-n32");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001680
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001681 switch (getTriple().getOS()) {
Nico Weber3435ede2012-01-31 02:07:33 +00001682 case llvm::Triple::Linux:
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001683 case llvm::Triple::FreeBSD:
1684 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001685 SizeType = UnsignedInt;
Hal Finkel26908382012-03-02 20:54:36 +00001686 PtrDiffType = SignedInt;
1687 IntPtrType = SignedInt;
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001688 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +00001689 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001690 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001691 }
Roman Divacky816dcd12012-03-13 16:53:54 +00001692
Roman Divacky3ffe7462012-03-13 19:20:17 +00001693 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1694 LongDoubleWidth = LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00001695 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Roman Divacky3ffe7462012-03-13 19:20:17 +00001696 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001697
1698 // PPC32 supports atomics up to 4 bytes.
1699 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divacky965b0b72011-01-06 08:27:10 +00001700 }
1701
Craig Topper3164f332014-03-11 03:39:26 +00001702 BuiltinVaListKind getBuiltinVaListKind() const override {
Roman Divacky965b0b72011-01-06 08:27:10 +00001703 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Inge5d3fb222012-06-16 03:34:49 +00001704 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman873f65a2008-08-21 00:13:15 +00001705 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001706};
Chris Lattner5ba61f02006-10-14 07:39:34 +00001707
Bill Schmidt778d3872013-07-26 01:36:11 +00001708// Note: ABI differences may eventually require us to have a separate
1709// TargetInfo for little endian.
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001710class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001711public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001712 PPC64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1713 : PPCTargetInfo(Triple, Opts) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001714 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001715 IntMaxType = SignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001716 Int64Type = SignedLong;
Roman Divacky816dcd12012-03-13 16:53:54 +00001717
Eric Christopherf6ee1f32017-02-10 04:35:21 +00001718 if ((Triple.getArch() == llvm::Triple::ppc64le)) {
1719 resetDataLayout("e-m:e-i64:64-n32:64");
Eric Christopher4855ba82017-02-10 03:32:34 +00001720 ABI = "elfv2";
Eric Christopherf6ee1f32017-02-10 04:35:21 +00001721 } else {
1722 resetDataLayout("E-m:e-i64:64-n32:64");
Eric Christopher4855ba82017-02-10 03:32:34 +00001723 ABI = "elfv1";
Eric Christopherf6ee1f32017-02-10 04:35:21 +00001724 }
Eric Christopher4855ba82017-02-10 03:32:34 +00001725
Eric Christopherf6ee1f32017-02-10 04:35:21 +00001726 switch (getTriple().getOS()) {
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001727 case llvm::Triple::FreeBSD:
Roman Divacky3ffe7462012-03-13 19:20:17 +00001728 LongDoubleWidth = LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00001729 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001730 break;
Joerg Sonnenbergeraac82c42014-10-15 19:52:03 +00001731 case llvm::Triple::NetBSD:
1732 IntMaxType = SignedLongLong;
1733 Int64Type = SignedLongLong;
1734 break;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001735 default:
1736 break;
Ulrich Weigand8afad612014-07-28 13:17:52 +00001737 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001738
1739 // PPC64 supports atomics up to 8 bytes.
1740 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001741 }
Craig Topper3164f332014-03-11 03:39:26 +00001742 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001743 return TargetInfo::CharPtrBuiltinVaList;
Roman Divacky965b0b72011-01-06 08:27:10 +00001744 }
Eric Christophere6b7cf42015-07-10 18:25:52 +00001745 // PPC64 Linux-specific ABI options.
Ulrich Weigand8afad612014-07-28 13:17:52 +00001746 bool setABI(const std::string &Name) override {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001747 if (Name == "elfv1" || Name == "elfv1-qpx" || Name == "elfv2") {
Ulrich Weigand8afad612014-07-28 13:17:52 +00001748 ABI = Name;
1749 return true;
1750 }
1751 return false;
1752 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001753};
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001754
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001755class DarwinPPC32TargetInfo : public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001756public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001757 DarwinPPC32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1758 : DarwinTargetInfo<PPC32TargetInfo>(Triple, Opts) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001759 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +00001760 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Eric Christopher917e9522014-11-18 22:36:15 +00001761 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev68d773c2012-01-17 22:40:00 +00001762 LongLongAlign = 32;
James Y Knightb214cbc2016-03-04 19:00:41 +00001763 resetDataLayout("E-m:o-p:32:32-f64:32:64-n32");
Roman Divacky965b0b72011-01-06 08:27:10 +00001764 }
Craig Topper3164f332014-03-11 03:39:26 +00001765 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001766 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001767 }
1768};
1769
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001770class DarwinPPC64TargetInfo : public DarwinTargetInfo<PPC64TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001771public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001772 DarwinPPC64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1773 : DarwinTargetInfo<PPC64TargetInfo>(Triple, Opts) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001774 HasAlignMac68kSupport = true;
James Y Knightb214cbc2016-03-04 19:00:41 +00001775 resetDataLayout("E-m:o-i64:64-n32:64");
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001776 }
1777};
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001778
Eric Christopherc48497a2015-09-18 21:26:24 +00001779static const unsigned NVPTXAddrSpaceMap[] = {
1780 1, // opencl_global
1781 3, // opencl_local
1782 4, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00001783 // FIXME: generic has to be added to the target
Eric Christopherc48497a2015-09-18 21:26:24 +00001784 0, // opencl_generic
1785 1, // cuda_device
1786 4, // cuda_constant
1787 3, // cuda_shared
1788};
1789
1790class NVPTXTargetInfo : public TargetInfo {
1791 static const char *const GCCRegNames[];
1792 static const Builtin::Info BuiltinInfo[];
Justin Lebar62907612016-07-06 21:21:39 +00001793 CudaArch GPU;
Justin Lebarb6626592017-01-05 16:53:21 +00001794 std::unique_ptr<TargetInfo> HostTarget;
Reid Klecknerbbc01782014-12-03 21:53:36 +00001795
Eric Christopherc48497a2015-09-18 21:26:24 +00001796public:
Justin Lebarb6626592017-01-05 16:53:21 +00001797 NVPTXTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts,
1798 unsigned TargetPointerWidth)
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001799 : TargetInfo(Triple) {
Justin Lebarb6626592017-01-05 16:53:21 +00001800 assert((TargetPointerWidth == 32 || TargetPointerWidth == 64) &&
1801 "NVPTX only supports 32- and 64-bit modes.");
1802
Eric Christopherc48497a2015-09-18 21:26:24 +00001803 TLSSupported = false;
Eric Christopherc48497a2015-09-18 21:26:24 +00001804 AddrSpaceMap = &NVPTXAddrSpaceMap;
1805 UseAddrSpaceMapMangling = true;
Justin Lebarb6626592017-01-05 16:53:21 +00001806
Eric Christopherc48497a2015-09-18 21:26:24 +00001807 // Define available target features
1808 // These must be defined in sorted order!
1809 NoAsmVariants = true;
Justin Lebar62907612016-07-06 21:21:39 +00001810 GPU = CudaArch::SM_20;
Justin Lebar76945b22016-04-29 23:05:19 +00001811
Justin Lebarb6626592017-01-05 16:53:21 +00001812 if (TargetPointerWidth == 32)
1813 resetDataLayout("e-p:32:32-i64:64-v16:16-v32:32-n16:32:64");
1814 else
1815 resetDataLayout("e-i64:64-v16:16-v32:32-n16:32:64");
1816
Justin Lebar76945b22016-04-29 23:05:19 +00001817 // If possible, get a TargetInfo for our host triple, so we can match its
1818 // types.
1819 llvm::Triple HostTriple(Opts.HostTriple);
Justin Lebarb6626592017-01-05 16:53:21 +00001820 if (!HostTriple.isNVPTX())
1821 HostTarget.reset(AllocateTarget(llvm::Triple(Opts.HostTriple), Opts));
1822
1823 // If no host target, make some guesses about the data layout and return.
Justin Lebar76945b22016-04-29 23:05:19 +00001824 if (!HostTarget) {
Justin Lebarb6626592017-01-05 16:53:21 +00001825 LongWidth = LongAlign = TargetPointerWidth;
1826 PointerWidth = PointerAlign = TargetPointerWidth;
1827 switch (TargetPointerWidth) {
1828 case 32:
1829 SizeType = TargetInfo::UnsignedInt;
1830 PtrDiffType = TargetInfo::SignedInt;
1831 IntPtrType = TargetInfo::SignedInt;
1832 break;
1833 case 64:
1834 SizeType = TargetInfo::UnsignedLong;
1835 PtrDiffType = TargetInfo::SignedLong;
1836 IntPtrType = TargetInfo::SignedLong;
1837 break;
1838 default:
1839 llvm_unreachable("TargetPointerWidth must be 32 or 64");
1840 }
Justin Lebar76945b22016-04-29 23:05:19 +00001841 return;
1842 }
1843
Justin Lebarb6626592017-01-05 16:53:21 +00001844 // Copy properties from host target.
Justin Lebar76945b22016-04-29 23:05:19 +00001845 PointerWidth = HostTarget->getPointerWidth(/* AddrSpace = */ 0);
1846 PointerAlign = HostTarget->getPointerAlign(/* AddrSpace = */ 0);
1847 BoolWidth = HostTarget->getBoolWidth();
1848 BoolAlign = HostTarget->getBoolAlign();
1849 IntWidth = HostTarget->getIntWidth();
1850 IntAlign = HostTarget->getIntAlign();
1851 HalfWidth = HostTarget->getHalfWidth();
1852 HalfAlign = HostTarget->getHalfAlign();
1853 FloatWidth = HostTarget->getFloatWidth();
1854 FloatAlign = HostTarget->getFloatAlign();
1855 DoubleWidth = HostTarget->getDoubleWidth();
1856 DoubleAlign = HostTarget->getDoubleAlign();
1857 LongWidth = HostTarget->getLongWidth();
1858 LongAlign = HostTarget->getLongAlign();
1859 LongLongWidth = HostTarget->getLongLongWidth();
1860 LongLongAlign = HostTarget->getLongLongAlign();
1861 MinGlobalAlign = HostTarget->getMinGlobalAlign();
Richard Smith59139022016-09-30 22:41:36 +00001862 NewAlign = HostTarget->getNewAlign();
Justin Lebar76945b22016-04-29 23:05:19 +00001863 DefaultAlignForAttributeAligned =
1864 HostTarget->getDefaultAlignForAttributeAligned();
1865 SizeType = HostTarget->getSizeType();
1866 IntMaxType = HostTarget->getIntMaxType();
1867 PtrDiffType = HostTarget->getPtrDiffType(/* AddrSpace = */ 0);
1868 IntPtrType = HostTarget->getIntPtrType();
1869 WCharType = HostTarget->getWCharType();
1870 WIntType = HostTarget->getWIntType();
1871 Char16Type = HostTarget->getChar16Type();
1872 Char32Type = HostTarget->getChar32Type();
1873 Int64Type = HostTarget->getInt64Type();
1874 SigAtomicType = HostTarget->getSigAtomicType();
1875 ProcessIDType = HostTarget->getProcessIDType();
1876
1877 UseBitFieldTypeAlignment = HostTarget->useBitFieldTypeAlignment();
1878 UseZeroLengthBitfieldAlignment =
1879 HostTarget->useZeroLengthBitfieldAlignment();
1880 UseExplicitBitFieldAlignment = HostTarget->useExplicitBitFieldAlignment();
1881 ZeroLengthBitfieldBoundary = HostTarget->getZeroLengthBitfieldBoundary();
1882
Justin Lebar5057f172016-09-09 20:35:43 +00001883 // This is a bit of a lie, but it controls __GCC_ATOMIC_XXX_LOCK_FREE, and
1884 // we need those macros to be identical on host and device, because (among
1885 // other things) they affect which standard library classes are defined, and
1886 // we need all classes to be defined on both the host and device.
1887 MaxAtomicInlineWidth = HostTarget->getMaxAtomicInlineWidth();
1888
Justin Lebar76945b22016-04-29 23:05:19 +00001889 // Properties intentionally not copied from host:
1890 // - LargeArrayMinWidth, LargeArrayAlign: Not visible across the
1891 // host/device boundary.
1892 // - SuitableAlign: Not visible across the host/device boundary, and may
1893 // correctly be different on host/device, e.g. if host has wider vector
1894 // types than device.
1895 // - LongDoubleWidth, LongDoubleAlign: nvptx's long double type is the same
1896 // as its double type, but that's not necessarily true on the host.
1897 // TODO: nvcc emits a warning when using long double on device; we should
1898 // do the same.
Eric Christopherc48497a2015-09-18 21:26:24 +00001899 }
1900 void getTargetDefines(const LangOptions &Opts,
1901 MacroBuilder &Builder) const override {
1902 Builder.defineMacro("__PTX__");
1903 Builder.defineMacro("__NVPTX__");
1904 if (Opts.CUDAIsDevice) {
1905 // Set __CUDA_ARCH__ for the GPU specified.
Justin Lebaref1aaac2016-07-06 21:21:14 +00001906 std::string CUDAArchCode = [this] {
1907 switch (GPU) {
Simon Pilgrim13dff572016-07-07 22:32:26 +00001908 case CudaArch::UNKNOWN:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001909 assert(false && "No GPU arch when compiling CUDA device code.");
1910 return "";
Justin Lebar62907612016-07-06 21:21:39 +00001911 case CudaArch::SM_20:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001912 return "200";
Justin Lebar62907612016-07-06 21:21:39 +00001913 case CudaArch::SM_21:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001914 return "210";
Justin Lebar62907612016-07-06 21:21:39 +00001915 case CudaArch::SM_30:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001916 return "300";
Justin Lebar62907612016-07-06 21:21:39 +00001917 case CudaArch::SM_32:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001918 return "320";
Justin Lebar62907612016-07-06 21:21:39 +00001919 case CudaArch::SM_35:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001920 return "350";
Justin Lebar62907612016-07-06 21:21:39 +00001921 case CudaArch::SM_37:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001922 return "370";
Justin Lebar62907612016-07-06 21:21:39 +00001923 case CudaArch::SM_50:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001924 return "500";
Justin Lebar62907612016-07-06 21:21:39 +00001925 case CudaArch::SM_52:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001926 return "520";
Justin Lebar62907612016-07-06 21:21:39 +00001927 case CudaArch::SM_53:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001928 return "530";
Justin Lebar62907612016-07-06 21:21:39 +00001929 case CudaArch::SM_60:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001930 return "600";
Justin Lebar62907612016-07-06 21:21:39 +00001931 case CudaArch::SM_61:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001932 return "610";
Justin Lebar62907612016-07-06 21:21:39 +00001933 case CudaArch::SM_62:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001934 return "620";
1935 }
Simon Pilgrim13dff572016-07-07 22:32:26 +00001936 llvm_unreachable("unhandled CudaArch");
Justin Lebaref1aaac2016-07-06 21:21:14 +00001937 }();
Eric Christopherc48497a2015-09-18 21:26:24 +00001938 Builder.defineMacro("__CUDA_ARCH__", CUDAArchCode);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001939 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001940 }
Craig Topper6c03a542015-10-19 04:51:35 +00001941 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
1942 return llvm::makeArrayRef(BuiltinInfo,
1943 clang::NVPTX::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eric Christopherc48497a2015-09-18 21:26:24 +00001944 }
Artem Belevichfda99052016-09-28 17:47:35 +00001945 bool
1946 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
1947 StringRef CPU,
1948 const std::vector<std::string> &FeaturesVec) const override {
1949 Features["satom"] = GPU >= CudaArch::SM_60;
1950 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
1951 }
1952
Eric Christopherc48497a2015-09-18 21:26:24 +00001953 bool hasFeature(StringRef Feature) const override {
Artem Belevichfda99052016-09-28 17:47:35 +00001954 return llvm::StringSwitch<bool>(Feature)
1955 .Cases("ptx", "nvptx", true)
1956 .Case("satom", GPU >= CudaArch::SM_60) // Atomics w/ scope.
1957 .Default(false);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001958 }
1959
Craig Topperf054e3a2015-10-19 03:52:27 +00001960 ArrayRef<const char *> getGCCRegNames() const override;
1961 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00001962 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00001963 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00001964 }
1965 bool validateAsmConstraint(const char *&Name,
1966 TargetInfo::ConstraintInfo &Info) const override {
1967 switch (*Name) {
1968 default:
1969 return false;
1970 case 'c':
1971 case 'h':
1972 case 'r':
1973 case 'l':
1974 case 'f':
1975 case 'd':
1976 Info.setAllowsRegister();
1977 return true;
Eli Bendersky13467172015-04-01 20:29:18 +00001978 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001979 }
1980 const char *getClobbers() const override {
1981 // FIXME: Is this really right?
1982 return "";
1983 }
1984 BuiltinVaListKind getBuiltinVaListKind() const override {
1985 // FIXME: implement
1986 return TargetInfo::CharPtrBuiltinVaList;
1987 }
1988 bool setCPU(const std::string &Name) override {
Justin Lebar62907612016-07-06 21:21:39 +00001989 GPU = StringToCudaArch(Name);
1990 return GPU != CudaArch::UNKNOWN;
Eric Christopherc48497a2015-09-18 21:26:24 +00001991 }
Jan Vesely9674bd42016-06-17 19:02:14 +00001992 void setSupportedOpenCLOpts() override {
1993 auto &Opts = getSupportedOpenCLOpts();
Yaxun Liu5b746652016-12-18 05:18:55 +00001994 Opts.support("cl_clang_storage_class_specifiers");
1995 Opts.support("cl_khr_gl_sharing");
1996 Opts.support("cl_khr_icd");
Jan Vesely9674bd42016-06-17 19:02:14 +00001997
Yaxun Liu5b746652016-12-18 05:18:55 +00001998 Opts.support("cl_khr_fp64");
1999 Opts.support("cl_khr_byte_addressable_store");
2000 Opts.support("cl_khr_global_int32_base_atomics");
2001 Opts.support("cl_khr_global_int32_extended_atomics");
2002 Opts.support("cl_khr_local_int32_base_atomics");
2003 Opts.support("cl_khr_local_int32_extended_atomics");
Jan Vesely9674bd42016-06-17 19:02:14 +00002004 }
Justin Lebar86c4e632017-01-05 16:53:38 +00002005
2006 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
2007 // CUDA compilations support all of the host's calling conventions.
2008 //
2009 // TODO: We should warn if you apply a non-default CC to anything other than
2010 // a host function.
2011 if (HostTarget)
2012 return HostTarget->checkCallingConvention(CC);
2013 return CCCR_Warning;
2014 }
Eric Christopherc48497a2015-09-18 21:26:24 +00002015};
2016
2017const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
2018#define BUILTIN(ID, TYPE, ATTRS) \
2019 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
2020#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
2021 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Artem Belevichfda99052016-09-28 17:47:35 +00002022#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
2023 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Eric Christopherc48497a2015-09-18 21:26:24 +00002024#include "clang/Basic/BuiltinsNVPTX.def"
2025};
2026
2027const char *const NVPTXTargetInfo::GCCRegNames[] = {"r0"};
2028
Craig Topperf054e3a2015-10-19 03:52:27 +00002029ArrayRef<const char *> NVPTXTargetInfo::getGCCRegNames() const {
2030 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00002031}
2032
Yaxun Liu3464f922017-03-25 03:46:25 +00002033static const LangAS::Map AMDGPUPrivateIsZeroMap = {
2034 1, // opencl_global
2035 3, // opencl_local
2036 2, // opencl_constant
2037 4, // opencl_generic
2038 1, // cuda_device
2039 2, // cuda_constant
2040 3 // cuda_shared
2041};
2042static const LangAS::Map AMDGPUGenericIsZeroMap = {
2043 1, // opencl_global
2044 3, // opencl_local
2045 4, // opencl_constant
2046 0, // opencl_generic
2047 1, // cuda_device
2048 4, // cuda_constant
2049 3 // cuda_shared
Eli Friedmand13b41e2012-10-12 23:32:00 +00002050};
2051
Tom Stellarda96344b2014-08-21 13:58:40 +00002052// If you edit the description strings, make sure you update
2053// getPointerWidthV().
2054
Craig Topper273dbc62015-10-18 05:29:26 +00002055static const char *const DataLayoutStringR600 =
Rafael Espindola29db13a2014-01-03 18:13:17 +00002056 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
2057 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00002058
Yaxun Liu3464f922017-03-25 03:46:25 +00002059static const char *const DataLayoutStringSIPrivateIsZero =
Matt Arsenault6dc455f2016-05-31 16:58:18 +00002060 "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 +00002061 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
2062 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00002063
Yaxun Liu3464f922017-03-25 03:46:25 +00002064static const char *const DataLayoutStringSIGenericIsZero =
2065 "e-p:64:64-p1:64:64-p2:64:64-p3:32:32-p4:64:64-p5:32:32"
2066 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
2067 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
2068
Matt Arsenault250024f2016-06-08 01:56:42 +00002069class AMDGPUTargetInfo final : public TargetInfo {
Matt Arsenault56f008d2014-06-24 20:45:01 +00002070 static const Builtin::Info BuiltinInfo[];
Tom Stellard7b1059b2015-04-14 14:36:56 +00002071 static const char * const GCCRegNames[];
Matt Arsenault56f008d2014-06-24 20:45:01 +00002072
Yaxun Liu3464f922017-03-25 03:46:25 +00002073 struct AddrSpace {
2074 unsigned Generic, Global, Local, Constant, Private;
2075 AddrSpace(bool IsGenericZero_ = false){
2076 if (IsGenericZero_) {
2077 Generic = 0;
2078 Global = 1;
2079 Local = 3;
2080 Constant = 4;
2081 Private = 5;
2082 } else {
2083 Generic = 4;
2084 Global = 1;
2085 Local = 3;
2086 Constant = 2;
2087 Private = 0;
2088 }
2089 }
2090 };
2091
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002092 /// \brief The GPU profiles supported by the AMDGPU target.
Tom Stellardc74b1e02013-03-04 17:40:53 +00002093 enum GPUKind {
2094 GK_NONE,
2095 GK_R600,
2096 GK_R600_DOUBLE_OPS,
2097 GK_R700,
2098 GK_R700_DOUBLE_OPS,
2099 GK_EVERGREEN,
2100 GK_EVERGREEN_DOUBLE_OPS,
2101 GK_NORTHERN_ISLANDS,
2102 GK_CAYMAN,
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002103 GK_GFX6,
2104 GK_GFX7,
Matt Arsenaulteb952fd2017-02-18 19:02:41 +00002105 GK_GFX8,
2106 GK_GFX9
Tom Stellardc74b1e02013-03-04 17:40:53 +00002107 } GPU;
2108
Jan Veselyeebeaea2015-05-04 19:53:36 +00002109 bool hasFP64:1;
2110 bool hasFMAF:1;
2111 bool hasLDEXPF:1;
Yaxun Liud3e85b92016-09-13 17:37:09 +00002112 bool hasFullSpeedFP32Denorms:1;
Jan Veselya3abd6d2015-05-01 17:38:13 +00002113
Matt Arsenault250024f2016-06-08 01:56:42 +00002114 static bool isAMDGCN(const llvm::Triple &TT) {
2115 return TT.getArch() == llvm::Triple::amdgcn;
2116 }
2117
Yaxun Liu3464f922017-03-25 03:46:25 +00002118 static bool isGenericZero(const llvm::Triple &TT) {
2119 return TT.getEnvironmentName() == "amdgiz" ||
2120 TT.getEnvironmentName() == "amdgizcl";
2121 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00002122public:
Yaxun Liu2c17e822016-08-09 19:43:38 +00002123 AMDGPUTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Matt Arsenault250024f2016-06-08 01:56:42 +00002124 : TargetInfo(Triple) ,
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002125 GPU(isAMDGCN(Triple) ? GK_GFX6 : GK_R600),
Matt Arsenault250024f2016-06-08 01:56:42 +00002126 hasFP64(false),
2127 hasFMAF(false),
Yaxun Liu2c17e822016-08-09 19:43:38 +00002128 hasLDEXPF(false),
Yaxun Liu3464f922017-03-25 03:46:25 +00002129 hasFullSpeedFP32Denorms(false),
2130 AS(isGenericZero(Triple)){
Matt Arsenault250024f2016-06-08 01:56:42 +00002131 if (getTriple().getArch() == llvm::Triple::amdgcn) {
Jan Veselya3abd6d2015-05-01 17:38:13 +00002132 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00002133 hasFMAF = true;
2134 hasLDEXPF = true;
Tom Stellardd99fb952015-01-28 15:38:44 +00002135 }
Yaxun Liu3464f922017-03-25 03:46:25 +00002136 auto IsGenericZero = isGenericZero(Triple);
Matt Arsenault250024f2016-06-08 01:56:42 +00002137 resetDataLayout(getTriple().getArch() == llvm::Triple::amdgcn ?
Yaxun Liu3464f922017-03-25 03:46:25 +00002138 (IsGenericZero ? DataLayoutStringSIGenericIsZero :
2139 DataLayoutStringSIPrivateIsZero)
2140 : DataLayoutStringR600);
Matt Arsenault250024f2016-06-08 01:56:42 +00002141
Yaxun Liu3464f922017-03-25 03:46:25 +00002142 AddrSpaceMap = IsGenericZero ? &AMDGPUGenericIsZeroMap :
2143 &AMDGPUPrivateIsZeroMap;
David Tweed31d09b02013-09-13 12:04:22 +00002144 UseAddrSpaceMapMangling = true;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002145 }
2146
Tom Stellarda96344b2014-08-21 13:58:40 +00002147 uint64_t getPointerWidthV(unsigned AddrSpace) const override {
2148 if (GPU <= GK_CAYMAN)
2149 return 32;
2150
Yaxun Liu3464f922017-03-25 03:46:25 +00002151 if (AddrSpace == AS.Private || AddrSpace == AS.Local) {
2152 return 32;
Tom Stellarda96344b2014-08-21 13:58:40 +00002153 }
Yaxun Liu3464f922017-03-25 03:46:25 +00002154 return 64;
Tom Stellarda96344b2014-08-21 13:58:40 +00002155 }
2156
Yaxun Liu26f75662016-08-19 05:17:25 +00002157 uint64_t getMaxPointerWidth() const override {
2158 return getTriple().getArch() == llvm::Triple::amdgcn ? 64 : 32;
2159 }
2160
Craig Topper3164f332014-03-11 03:39:26 +00002161 const char * getClobbers() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00002162 return "";
2163 }
2164
Craig Topperf054e3a2015-10-19 03:52:27 +00002165 ArrayRef<const char *> getGCCRegNames() const override;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002166
Craig Topperf054e3a2015-10-19 03:52:27 +00002167 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
2168 return None;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002169 }
2170
Craig Topper3164f332014-03-11 03:39:26 +00002171 bool validateAsmConstraint(const char *&Name,
Tom Stellardd097e942015-11-19 22:11:58 +00002172 TargetInfo::ConstraintInfo &Info) const override {
2173 switch (*Name) {
2174 default: break;
2175 case 'v': // vgpr
2176 case 's': // sgpr
2177 Info.setAllowsRegister();
2178 return true;
2179 }
2180 return false;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002181 }
2182
Matt Arsenault250024f2016-06-08 01:56:42 +00002183 bool initFeatureMap(llvm::StringMap<bool> &Features,
2184 DiagnosticsEngine &Diags, StringRef CPU,
2185 const std::vector<std::string> &FeatureVec) const override;
2186
Yaxun Liu2c17e822016-08-09 19:43:38 +00002187 void adjustTargetOptions(const CodeGenOptions &CGOpts,
2188 TargetOptions &TargetOpts) const override {
Yaxun Liu2c17e822016-08-09 19:43:38 +00002189 bool hasFP32Denormals = false;
2190 bool hasFP64Denormals = false;
2191 for (auto &I : TargetOpts.FeaturesAsWritten) {
2192 if (I == "+fp32-denormals" || I == "-fp32-denormals")
2193 hasFP32Denormals = true;
Matt Arsenault09cca092017-01-23 22:31:14 +00002194 if (I == "+fp64-fp16-denormals" || I == "-fp64-fp16-denormals")
Yaxun Liu2c17e822016-08-09 19:43:38 +00002195 hasFP64Denormals = true;
2196 }
2197 if (!hasFP32Denormals)
Yaxun Liud3e85b92016-09-13 17:37:09 +00002198 TargetOpts.Features.push_back((Twine(hasFullSpeedFP32Denorms &&
2199 !CGOpts.FlushDenorm ? '+' : '-') + Twine("fp32-denormals")).str());
Matt Arsenault09cca092017-01-23 22:31:14 +00002200 // Always do not flush fp64 or fp16 denorms.
Yaxun Liu2c17e822016-08-09 19:43:38 +00002201 if (!hasFP64Denormals && hasFP64)
Matt Arsenault09cca092017-01-23 22:31:14 +00002202 TargetOpts.Features.push_back("+fp64-fp16-denormals");
Yaxun Liu2c17e822016-08-09 19:43:38 +00002203 }
2204
Craig Topper6c03a542015-10-19 04:51:35 +00002205 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
2206 return llvm::makeArrayRef(BuiltinInfo,
2207 clang::AMDGPU::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eli Friedmand13b41e2012-10-12 23:32:00 +00002208 }
2209
Craig Topper3164f332014-03-11 03:39:26 +00002210 void getTargetDefines(const LangOptions &Opts,
2211 MacroBuilder &Builder) const override {
Matt Arsenault5e020b22016-02-27 09:06:26 +00002212 if (getTriple().getArch() == llvm::Triple::amdgcn)
2213 Builder.defineMacro("__AMDGCN__");
2214 else
2215 Builder.defineMacro("__R600__");
2216
Jan Veselyeebeaea2015-05-04 19:53:36 +00002217 if (hasFMAF)
2218 Builder.defineMacro("__HAS_FMAF__");
2219 if (hasLDEXPF)
2220 Builder.defineMacro("__HAS_LDEXPF__");
Jan Vesely211ba782016-06-17 02:25:03 +00002221 if (hasFP64)
2222 Builder.defineMacro("__HAS_FP64__");
Eli Friedmand13b41e2012-10-12 23:32:00 +00002223 }
2224
Craig Topper3164f332014-03-11 03:39:26 +00002225 BuiltinVaListKind getBuiltinVaListKind() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00002226 return TargetInfo::CharPtrBuiltinVaList;
2227 }
2228
Matt Arsenault250024f2016-06-08 01:56:42 +00002229 static GPUKind parseR600Name(StringRef Name) {
2230 return llvm::StringSwitch<GPUKind>(Name)
Tom Stellardc74b1e02013-03-04 17:40:53 +00002231 .Case("r600" , GK_R600)
2232 .Case("rv610", GK_R600)
2233 .Case("rv620", GK_R600)
2234 .Case("rv630", GK_R600)
2235 .Case("rv635", GK_R600)
2236 .Case("rs780", GK_R600)
2237 .Case("rs880", GK_R600)
2238 .Case("rv670", GK_R600_DOUBLE_OPS)
2239 .Case("rv710", GK_R700)
2240 .Case("rv730", GK_R700)
2241 .Case("rv740", GK_R700_DOUBLE_OPS)
2242 .Case("rv770", GK_R700_DOUBLE_OPS)
2243 .Case("palm", GK_EVERGREEN)
2244 .Case("cedar", GK_EVERGREEN)
2245 .Case("sumo", GK_EVERGREEN)
2246 .Case("sumo2", GK_EVERGREEN)
2247 .Case("redwood", GK_EVERGREEN)
2248 .Case("juniper", GK_EVERGREEN)
2249 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
2250 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
2251 .Case("barts", GK_NORTHERN_ISLANDS)
2252 .Case("turks", GK_NORTHERN_ISLANDS)
2253 .Case("caicos", GK_NORTHERN_ISLANDS)
2254 .Case("cayman", GK_CAYMAN)
2255 .Case("aruba", GK_CAYMAN)
Matt Arsenault250024f2016-06-08 01:56:42 +00002256 .Default(GK_NONE);
2257 }
2258
2259 static GPUKind parseAMDGCNName(StringRef Name) {
2260 return llvm::StringSwitch<GPUKind>(Name)
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002261 .Case("tahiti", GK_GFX6)
2262 .Case("pitcairn", GK_GFX6)
2263 .Case("verde", GK_GFX6)
2264 .Case("oland", GK_GFX6)
2265 .Case("hainan", GK_GFX6)
2266 .Case("bonaire", GK_GFX7)
2267 .Case("kabini", GK_GFX7)
2268 .Case("kaveri", GK_GFX7)
2269 .Case("hawaii", GK_GFX7)
2270 .Case("mullins", GK_GFX7)
Yaxun Liue59a0bc2016-10-26 16:40:21 +00002271 .Case("gfx700", GK_GFX7)
2272 .Case("gfx701", GK_GFX7)
2273 .Case("gfx702", GK_GFX7)
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002274 .Case("tonga", GK_GFX8)
2275 .Case("iceland", GK_GFX8)
2276 .Case("carrizo", GK_GFX8)
2277 .Case("fiji", GK_GFX8)
2278 .Case("stoney", GK_GFX8)
2279 .Case("polaris10", GK_GFX8)
2280 .Case("polaris11", GK_GFX8)
Yaxun Liue59a0bc2016-10-26 16:40:21 +00002281 .Case("gfx800", GK_GFX8)
2282 .Case("gfx801", GK_GFX8)
2283 .Case("gfx802", GK_GFX8)
2284 .Case("gfx803", GK_GFX8)
2285 .Case("gfx804", GK_GFX8)
2286 .Case("gfx810", GK_GFX8)
Matt Arsenaulteb952fd2017-02-18 19:02:41 +00002287 .Case("gfx900", GK_GFX9)
2288 .Case("gfx901", GK_GFX9)
Tom Stellardc74b1e02013-03-04 17:40:53 +00002289 .Default(GK_NONE);
Matt Arsenault250024f2016-06-08 01:56:42 +00002290 }
Tom Stellardc74b1e02013-03-04 17:40:53 +00002291
Matt Arsenault250024f2016-06-08 01:56:42 +00002292 bool setCPU(const std::string &Name) override {
2293 if (getTriple().getArch() == llvm::Triple::amdgcn)
2294 GPU = parseAMDGCNName(Name);
2295 else
2296 GPU = parseR600Name(Name);
Tom Stellardc74b1e02013-03-04 17:40:53 +00002297
Matt Arsenault250024f2016-06-08 01:56:42 +00002298 return GPU != GK_NONE;
Tom Stellardc74b1e02013-03-04 17:40:53 +00002299 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002300
Jan Vesely211ba782016-06-17 02:25:03 +00002301 void setSupportedOpenCLOpts() override {
2302 auto &Opts = getSupportedOpenCLOpts();
Yaxun Liu5b746652016-12-18 05:18:55 +00002303 Opts.support("cl_clang_storage_class_specifiers");
2304 Opts.support("cl_khr_icd");
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002305
Jan Vesely211ba782016-06-17 02:25:03 +00002306 if (hasFP64)
Yaxun Liu5b746652016-12-18 05:18:55 +00002307 Opts.support("cl_khr_fp64");
Jan Vesely211ba782016-06-17 02:25:03 +00002308 if (GPU >= GK_EVERGREEN) {
Yaxun Liu5b746652016-12-18 05:18:55 +00002309 Opts.support("cl_khr_byte_addressable_store");
2310 Opts.support("cl_khr_global_int32_base_atomics");
2311 Opts.support("cl_khr_global_int32_extended_atomics");
2312 Opts.support("cl_khr_local_int32_base_atomics");
2313 Opts.support("cl_khr_local_int32_extended_atomics");
Jan Vesely211ba782016-06-17 02:25:03 +00002314 }
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002315 if (GPU >= GK_GFX6) {
Yaxun Liu5b746652016-12-18 05:18:55 +00002316 Opts.support("cl_khr_fp16");
2317 Opts.support("cl_khr_int64_base_atomics");
2318 Opts.support("cl_khr_int64_extended_atomics");
2319 Opts.support("cl_khr_mipmap_image");
2320 Opts.support("cl_khr_subgroups");
2321 Opts.support("cl_khr_3d_image_writes");
2322 Opts.support("cl_amd_media_ops");
2323 Opts.support("cl_amd_media_ops2");
Jan Vesely211ba782016-06-17 02:25:03 +00002324 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002325 }
Nikolay Haustov8c6538b2016-06-30 09:06:33 +00002326
Yaxun Liu99444cb2016-08-03 20:38:06 +00002327 LangAS::ID getOpenCLImageAddrSpace() const override {
2328 return LangAS::opencl_constant;
2329 }
2330
Konstantin Zhuravlyovd1ba16e2017-03-08 23:56:48 +00002331 /// \returns Target specific vtbl ptr address space.
2332 unsigned getVtblPtrAddressSpace() const override {
2333 // \todo: We currently have address spaces defined in AMDGPU Backend. It
2334 // would be nice if we could use it here instead of using bare numbers (same
2335 // applies to getDWARFAddressSpace).
2336 return 2; // constant.
2337 }
2338
2339 /// \returns If a target requires an address within a target specific address
2340 /// space \p AddressSpace to be converted in order to be used, then return the
2341 /// corresponding target specific DWARF address space.
2342 ///
2343 /// \returns Otherwise return None and no conversion will be emitted in the
2344 /// DWARF.
2345 Optional<unsigned> getDWARFAddressSpace(
2346 unsigned AddressSpace) const override {
Yaxun Liu3464f922017-03-25 03:46:25 +00002347 const unsigned DWARF_Private = 1;
2348 const unsigned DWARF_Local = 2;
2349 if (AddressSpace == AS.Private) {
2350 return DWARF_Private;
2351 } else if (AddressSpace == AS.Local) {
2352 return DWARF_Local;
2353 } else {
Konstantin Zhuravlyovd1ba16e2017-03-08 23:56:48 +00002354 return None;
2355 }
2356 }
2357
Nikolay Haustov8c6538b2016-06-30 09:06:33 +00002358 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
2359 switch (CC) {
2360 default:
2361 return CCCR_Warning;
2362 case CC_C:
2363 case CC_OpenCLKernel:
2364 return CCCR_OK;
2365 }
2366 }
Yaxun Liu402804b2016-12-15 08:09:08 +00002367
2368 // In amdgcn target the null pointer in global, constant, and generic
2369 // address space has value 0 but in private and local address space has
2370 // value ~0.
2371 uint64_t getNullPointerValue(unsigned AS) const override {
Matt Arsenaultbf5e3e42017-03-13 19:47:53 +00002372 return AS == LangAS::opencl_local ? ~0 : 0;
Yaxun Liu402804b2016-12-15 08:09:08 +00002373 }
Yaxun Liu3464f922017-03-25 03:46:25 +00002374
2375 const AddrSpace AS;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002376};
2377
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002378const Builtin::Info AMDGPUTargetInfo::BuiltinInfo[] = {
Matt Arsenault56f008d2014-06-24 20:45:01 +00002379#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00002380 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Matt Arsenault250024f2016-06-08 01:56:42 +00002381#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
2382 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002383#include "clang/Basic/BuiltinsAMDGPU.def"
Matt Arsenault56f008d2014-06-24 20:45:01 +00002384};
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002385const char * const AMDGPUTargetInfo::GCCRegNames[] = {
Tom Stellard7b1059b2015-04-14 14:36:56 +00002386 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
2387 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
2388 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
2389 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
2390 "v32", "v33", "v34", "v35", "v36", "v37", "v38", "v39",
2391 "v40", "v41", "v42", "v43", "v44", "v45", "v46", "v47",
2392 "v48", "v49", "v50", "v51", "v52", "v53", "v54", "v55",
2393 "v56", "v57", "v58", "v59", "v60", "v61", "v62", "v63",
2394 "v64", "v65", "v66", "v67", "v68", "v69", "v70", "v71",
2395 "v72", "v73", "v74", "v75", "v76", "v77", "v78", "v79",
2396 "v80", "v81", "v82", "v83", "v84", "v85", "v86", "v87",
2397 "v88", "v89", "v90", "v91", "v92", "v93", "v94", "v95",
2398 "v96", "v97", "v98", "v99", "v100", "v101", "v102", "v103",
2399 "v104", "v105", "v106", "v107", "v108", "v109", "v110", "v111",
2400 "v112", "v113", "v114", "v115", "v116", "v117", "v118", "v119",
2401 "v120", "v121", "v122", "v123", "v124", "v125", "v126", "v127",
2402 "v128", "v129", "v130", "v131", "v132", "v133", "v134", "v135",
2403 "v136", "v137", "v138", "v139", "v140", "v141", "v142", "v143",
2404 "v144", "v145", "v146", "v147", "v148", "v149", "v150", "v151",
2405 "v152", "v153", "v154", "v155", "v156", "v157", "v158", "v159",
2406 "v160", "v161", "v162", "v163", "v164", "v165", "v166", "v167",
2407 "v168", "v169", "v170", "v171", "v172", "v173", "v174", "v175",
2408 "v176", "v177", "v178", "v179", "v180", "v181", "v182", "v183",
2409 "v184", "v185", "v186", "v187", "v188", "v189", "v190", "v191",
2410 "v192", "v193", "v194", "v195", "v196", "v197", "v198", "v199",
2411 "v200", "v201", "v202", "v203", "v204", "v205", "v206", "v207",
2412 "v208", "v209", "v210", "v211", "v212", "v213", "v214", "v215",
2413 "v216", "v217", "v218", "v219", "v220", "v221", "v222", "v223",
2414 "v224", "v225", "v226", "v227", "v228", "v229", "v230", "v231",
2415 "v232", "v233", "v234", "v235", "v236", "v237", "v238", "v239",
2416 "v240", "v241", "v242", "v243", "v244", "v245", "v246", "v247",
2417 "v248", "v249", "v250", "v251", "v252", "v253", "v254", "v255",
2418 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
2419 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
2420 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
2421 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
2422 "s32", "s33", "s34", "s35", "s36", "s37", "s38", "s39",
2423 "s40", "s41", "s42", "s43", "s44", "s45", "s46", "s47",
2424 "s48", "s49", "s50", "s51", "s52", "s53", "s54", "s55",
2425 "s56", "s57", "s58", "s59", "s60", "s61", "s62", "s63",
2426 "s64", "s65", "s66", "s67", "s68", "s69", "s70", "s71",
2427 "s72", "s73", "s74", "s75", "s76", "s77", "s78", "s79",
2428 "s80", "s81", "s82", "s83", "s84", "s85", "s86", "s87",
2429 "s88", "s89", "s90", "s91", "s92", "s93", "s94", "s95",
2430 "s96", "s97", "s98", "s99", "s100", "s101", "s102", "s103",
2431 "s104", "s105", "s106", "s107", "s108", "s109", "s110", "s111",
2432 "s112", "s113", "s114", "s115", "s116", "s117", "s118", "s119",
Etienne Bergerone8ae26f2016-03-24 18:29:24 +00002433 "s120", "s121", "s122", "s123", "s124", "s125", "s126", "s127",
Matt Arsenaultb015d622016-02-27 09:06:22 +00002434 "exec", "vcc", "scc", "m0", "flat_scratch", "exec_lo", "exec_hi",
2435 "vcc_lo", "vcc_hi", "flat_scratch_lo", "flat_scratch_hi"
Tom Stellard7b1059b2015-04-14 14:36:56 +00002436};
2437
Craig Topperf054e3a2015-10-19 03:52:27 +00002438ArrayRef<const char *> AMDGPUTargetInfo::getGCCRegNames() const {
2439 return llvm::makeArrayRef(GCCRegNames);
Tom Stellard7b1059b2015-04-14 14:36:56 +00002440}
Matt Arsenault56f008d2014-06-24 20:45:01 +00002441
Matt Arsenault250024f2016-06-08 01:56:42 +00002442bool AMDGPUTargetInfo::initFeatureMap(
2443 llvm::StringMap<bool> &Features,
2444 DiagnosticsEngine &Diags, StringRef CPU,
2445 const std::vector<std::string> &FeatureVec) const {
2446
2447 // XXX - What does the member GPU mean if device name string passed here?
2448 if (getTriple().getArch() == llvm::Triple::amdgcn) {
2449 if (CPU.empty())
2450 CPU = "tahiti";
2451
2452 switch (parseAMDGCNName(CPU)) {
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002453 case GK_GFX6:
2454 case GK_GFX7:
Matt Arsenault250024f2016-06-08 01:56:42 +00002455 break;
2456
Matt Arsenaulta0c6dca2017-02-22 20:55:59 +00002457 case GK_GFX9:
2458 Features["gfx9-insts"] = true;
2459 LLVM_FALLTHROUGH;
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002460 case GK_GFX8:
Matt Arsenault250024f2016-06-08 01:56:42 +00002461 Features["s-memrealtime"] = true;
2462 Features["16-bit-insts"] = true;
Yaxun Liu4d867992017-03-10 01:30:46 +00002463 Features["dpp"] = true;
Matt Arsenault250024f2016-06-08 01:56:42 +00002464 break;
2465
2466 case GK_NONE:
2467 return false;
2468 default:
2469 llvm_unreachable("unhandled subtarget");
2470 }
2471 } else {
2472 if (CPU.empty())
2473 CPU = "r600";
2474
2475 switch (parseR600Name(CPU)) {
2476 case GK_R600:
2477 case GK_R700:
2478 case GK_EVERGREEN:
2479 case GK_NORTHERN_ISLANDS:
2480 break;
2481 case GK_R600_DOUBLE_OPS:
2482 case GK_R700_DOUBLE_OPS:
2483 case GK_EVERGREEN_DOUBLE_OPS:
2484 case GK_CAYMAN:
2485 Features["fp64"] = true;
2486 break;
2487 case GK_NONE:
2488 return false;
2489 default:
2490 llvm_unreachable("unhandled subtarget");
2491 }
2492 }
2493
2494 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeatureVec);
2495}
2496
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00002497const Builtin::Info BuiltinInfoX86[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00002498#define BUILTIN(ID, TYPE, ATTRS) \
2499 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002500#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
Craig Topper07d3b622015-08-07 05:14:44 +00002501 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Albert Gutowski727ab8a2016-09-14 21:19:43 +00002502#define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANGS, FEATURE) \
2503 { #ID, TYPE, ATTRS, HEADER, LANGS, FEATURE },
Chris Lattner5abdec72009-06-14 01:05:48 +00002504#include "clang/Basic/BuiltinsX86.def"
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00002505
2506#define BUILTIN(ID, TYPE, ATTRS) \
2507 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Albert Gutowski0fd6e962016-10-12 17:28:44 +00002508#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
2509 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00002510#define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANGS, FEATURE) \
2511 { #ID, TYPE, ATTRS, HEADER, LANGS, FEATURE },
2512#include "clang/Basic/BuiltinsX86_64.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00002513};
Eli Friedmanb5366062008-05-20 14:21:01 +00002514
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00002515
Nuno Lopescfca1f02009-12-23 17:49:57 +00002516static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002517 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
2518 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00002519 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002520 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
2521 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
2522 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00002523 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00002524 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
2525 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Marina Yatsina41c45fa2016-02-03 11:32:08 +00002526 "xmm16", "xmm17", "xmm18", "xmm19", "xmm20", "xmm21", "xmm22", "xmm23",
2527 "xmm24", "xmm25", "xmm26", "xmm27", "xmm28", "xmm29", "xmm30", "xmm31",
2528 "ymm16", "ymm17", "ymm18", "ymm19", "ymm20", "ymm21", "ymm22", "ymm23",
2529 "ymm24", "ymm25", "ymm26", "ymm27", "ymm28", "ymm29", "ymm30", "ymm31",
2530 "zmm0", "zmm1", "zmm2", "zmm3", "zmm4", "zmm5", "zmm6", "zmm7",
2531 "zmm8", "zmm9", "zmm10", "zmm11", "zmm12", "zmm13", "zmm14", "zmm15",
2532 "zmm16", "zmm17", "zmm18", "zmm19", "zmm20", "zmm21", "zmm22", "zmm23",
2533 "zmm24", "zmm25", "zmm26", "zmm27", "zmm28", "zmm29", "zmm30", "zmm31",
Michael Zuckerman15604b92016-10-31 14:16:57 +00002534 "k0", "k1", "k2", "k3", "k4", "k5", "k6", "k7",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002535};
2536
Eric Christophercdd36352011-06-21 00:05:20 +00002537const TargetInfo::AddlRegName AddlRegNames[] = {
2538 { { "al", "ah", "eax", "rax" }, 0 },
2539 { { "bl", "bh", "ebx", "rbx" }, 3 },
2540 { { "cl", "ch", "ecx", "rcx" }, 2 },
2541 { { "dl", "dh", "edx", "rdx" }, 1 },
2542 { { "esi", "rsi" }, 4 },
2543 { { "edi", "rdi" }, 5 },
2544 { { "esp", "rsp" }, 7 },
2545 { { "ebp", "rbp" }, 6 },
Alexey Bataeva7ab1b42015-09-04 03:42:23 +00002546 { { "r8d", "r8w", "r8b" }, 38 },
2547 { { "r9d", "r9w", "r9b" }, 39 },
2548 { { "r10d", "r10w", "r10b" }, 40 },
2549 { { "r11d", "r11w", "r11b" }, 41 },
2550 { { "r12d", "r12w", "r12b" }, 42 },
2551 { { "r13d", "r13w", "r13b" }, 43 },
2552 { { "r14d", "r14w", "r14b" }, 44 },
2553 { { "r15d", "r15w", "r15b" }, 45 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00002554};
2555
2556// X86 target abstract base class; x86-32 and x86-64 are very close, so
2557// most of the implementation can be shared.
2558class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00002559 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002560 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Craig Topper543f3bd2015-10-14 23:47:57 +00002561 } SSELevel = NoSSE;
Eli Friedman33465822011-07-08 23:31:17 +00002562 enum MMX3DNowEnum {
2563 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
Craig Topper543f3bd2015-10-14 23:47:57 +00002564 } MMX3DNowLevel = NoMMX3DNow;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002565 enum XOPEnum {
2566 NoXOP,
2567 SSE4A,
2568 FMA4,
2569 XOP
Craig Topper543f3bd2015-10-14 23:47:57 +00002570 } XOPLevel = NoXOP;
Anders Carlssone437c682010-01-27 03:47:49 +00002571
Craig Topper543f3bd2015-10-14 23:47:57 +00002572 bool HasAES = false;
2573 bool HasPCLMUL = false;
2574 bool HasLZCNT = false;
2575 bool HasRDRND = false;
2576 bool HasFSGSBASE = false;
2577 bool HasBMI = false;
2578 bool HasBMI2 = false;
2579 bool HasPOPCNT = false;
2580 bool HasRTM = false;
2581 bool HasPRFCHW = false;
2582 bool HasRDSEED = false;
2583 bool HasADX = false;
2584 bool HasTBM = false;
2585 bool HasFMA = false;
2586 bool HasF16C = false;
2587 bool HasAVX512CD = false;
2588 bool HasAVX512ER = false;
2589 bool HasAVX512PF = false;
2590 bool HasAVX512DQ = false;
2591 bool HasAVX512BW = false;
2592 bool HasAVX512VL = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002593 bool HasAVX512VBMI = false;
2594 bool HasAVX512IFMA = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002595 bool HasSHA = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002596 bool HasMPX = false;
2597 bool HasSGX = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002598 bool HasCX16 = false;
Craig Toppere33f51f2015-10-16 06:22:36 +00002599 bool HasFXSR = false;
Craig Topperda9fe562015-10-15 05:23:38 +00002600 bool HasXSAVE = false;
2601 bool HasXSAVEOPT = false;
2602 bool HasXSAVEC = false;
2603 bool HasXSAVES = false;
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00002604 bool HasMWAITX = false;
Craig Topper45742262017-02-09 06:10:14 +00002605 bool HasCLZERO = false;
Asaf Badouha9d1e182015-12-31 14:14:07 +00002606 bool HasPKU = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002607 bool HasCLFLUSHOPT = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002608 bool HasCLWB = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002609 bool HasMOVBE = false;
2610 bool HasPREFETCHWT1 = false;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00002611
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002612 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
2613 ///
2614 /// Each enumeration represents a particular CPU supported by Clang. These
2615 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
2616 enum CPUKind {
2617 CK_Generic,
2618
2619 /// \name i386
2620 /// i386-generation processors.
2621 //@{
2622 CK_i386,
2623 //@}
2624
2625 /// \name i486
2626 /// i486-generation processors.
2627 //@{
2628 CK_i486,
2629 CK_WinChipC6,
2630 CK_WinChip2,
2631 CK_C3,
2632 //@}
2633
2634 /// \name i586
2635 /// i586-generation processors, P5 microarchitecture based.
2636 //@{
2637 CK_i586,
2638 CK_Pentium,
2639 CK_PentiumMMX,
2640 //@}
2641
2642 /// \name i686
2643 /// i686-generation processors, P6 / Pentium M microarchitecture based.
2644 //@{
2645 CK_i686,
2646 CK_PentiumPro,
2647 CK_Pentium2,
2648 CK_Pentium3,
2649 CK_Pentium3M,
2650 CK_PentiumM,
2651 CK_C3_2,
2652
2653 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
2654 /// Clang however has some logic to suport this.
2655 // FIXME: Warn, deprecate, and potentially remove this.
2656 CK_Yonah,
2657 //@}
2658
2659 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00002660 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002661 //@{
2662 CK_Pentium4,
2663 CK_Pentium4M,
2664 CK_Prescott,
2665 CK_Nocona,
2666 //@}
2667
2668 /// \name Core
2669 /// Core microarchitecture based processors.
2670 //@{
2671 CK_Core2,
2672
2673 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
2674 /// codename which GCC no longer accepts as an option to -march, but Clang
2675 /// has some logic for recognizing it.
2676 // FIXME: Warn, deprecate, and potentially remove this.
2677 CK_Penryn,
2678 //@}
2679
2680 /// \name Atom
2681 /// Atom processors
2682 //@{
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002683 CK_Bonnell,
Preston Gurda3c58c02013-09-13 19:27:17 +00002684 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002685 //@}
2686
2687 /// \name Nehalem
2688 /// Nehalem microarchitecture based processors.
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002689 CK_Nehalem,
2690
2691 /// \name Westmere
2692 /// Westmere microarchitecture based processors.
2693 CK_Westmere,
2694
2695 /// \name Sandy Bridge
2696 /// Sandy Bridge microarchitecture based processors.
2697 CK_SandyBridge,
2698
2699 /// \name Ivy Bridge
2700 /// Ivy Bridge microarchitecture based processors.
2701 CK_IvyBridge,
2702
2703 /// \name Haswell
2704 /// Haswell microarchitecture based processors.
2705 CK_Haswell,
2706
2707 /// \name Broadwell
2708 /// Broadwell microarchitecture based processors.
Robert Khasanov50e6f582014-09-19 09:53:48 +00002709 CK_Broadwell,
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002710
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002711 /// \name Skylake Client
2712 /// Skylake client microarchitecture based processors.
2713 CK_SkylakeClient,
2714
2715 /// \name Skylake Server
2716 /// Skylake server microarchitecture based processors.
2717 CK_SkylakeServer,
2718
2719 /// \name Cannonlake Client
2720 /// Cannonlake client microarchitecture based processors.
2721 CK_Cannonlake,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002722
Craig Topper449314e2013-08-20 07:09:39 +00002723 /// \name Knights Landing
2724 /// Knights Landing processor.
2725 CK_KNL,
2726
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002727 /// \name Lakemont
2728 /// Lakemont microarchitecture based processors.
2729 CK_Lakemont,
2730
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002731 /// \name K6
2732 /// K6 architecture processors.
2733 //@{
2734 CK_K6,
2735 CK_K6_2,
2736 CK_K6_3,
2737 //@}
2738
2739 /// \name K7
2740 /// K7 architecture processors.
2741 //@{
2742 CK_Athlon,
2743 CK_AthlonThunderbird,
2744 CK_Athlon4,
2745 CK_AthlonXP,
2746 CK_AthlonMP,
2747 //@}
2748
2749 /// \name K8
2750 /// K8 architecture processors.
2751 //@{
2752 CK_Athlon64,
2753 CK_Athlon64SSE3,
2754 CK_AthlonFX,
2755 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00002756 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002757 CK_Opteron,
2758 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00002759 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002760 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002761
Benjamin Kramer569f2152012-01-10 11:50:18 +00002762 /// \name Bobcat
2763 /// Bobcat architecture processors.
2764 //@{
2765 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002766 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002767 //@}
2768
2769 /// \name Bulldozer
2770 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002771 //@{
2772 CK_BDVER1,
2773 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002774 CK_BDVER3,
Benjamin Kramer56c58222014-05-02 15:47:51 +00002775 CK_BDVER4,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002776 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002777
Craig Topperc45744a2017-01-10 06:02:12 +00002778 /// \name zen
2779 /// Zen architecture processors.
2780 //@{
2781 CK_ZNVER1,
2782 //@}
2783
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002784 /// This specification is deprecated and will be removed in the future.
2785 /// Users should prefer \see CK_K8.
2786 // FIXME: Warn on this when the CPU is set to it.
Saleem Abdulrasoolcb29c1a2014-11-17 18:40:15 +00002787 //@{
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002788 CK_x86_64,
2789 //@}
2790
2791 /// \name Geode
2792 /// Geode processors.
2793 //@{
2794 CK_Geode
2795 //@}
Craig Topper543f3bd2015-10-14 23:47:57 +00002796 } CPU = CK_Generic;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002797
Eric Christopherc50738f2015-08-27 00:05:50 +00002798 CPUKind getCPUKind(StringRef CPU) const {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002799 return llvm::StringSwitch<CPUKind>(CPU)
2800 .Case("i386", CK_i386)
2801 .Case("i486", CK_i486)
2802 .Case("winchip-c6", CK_WinChipC6)
2803 .Case("winchip2", CK_WinChip2)
2804 .Case("c3", CK_C3)
2805 .Case("i586", CK_i586)
2806 .Case("pentium", CK_Pentium)
2807 .Case("pentium-mmx", CK_PentiumMMX)
2808 .Case("i686", CK_i686)
2809 .Case("pentiumpro", CK_PentiumPro)
2810 .Case("pentium2", CK_Pentium2)
2811 .Case("pentium3", CK_Pentium3)
2812 .Case("pentium3m", CK_Pentium3M)
2813 .Case("pentium-m", CK_PentiumM)
2814 .Case("c3-2", CK_C3_2)
2815 .Case("yonah", CK_Yonah)
2816 .Case("pentium4", CK_Pentium4)
2817 .Case("pentium4m", CK_Pentium4M)
2818 .Case("prescott", CK_Prescott)
2819 .Case("nocona", CK_Nocona)
2820 .Case("core2", CK_Core2)
2821 .Case("penryn", CK_Penryn)
2822 .Case("bonnell", CK_Bonnell)
2823 .Case("atom", CK_Bonnell) // Legacy name.
2824 .Case("silvermont", CK_Silvermont)
2825 .Case("slm", CK_Silvermont) // Legacy name.
2826 .Case("nehalem", CK_Nehalem)
2827 .Case("corei7", CK_Nehalem) // Legacy name.
2828 .Case("westmere", CK_Westmere)
2829 .Case("sandybridge", CK_SandyBridge)
2830 .Case("corei7-avx", CK_SandyBridge) // Legacy name.
2831 .Case("ivybridge", CK_IvyBridge)
2832 .Case("core-avx-i", CK_IvyBridge) // Legacy name.
2833 .Case("haswell", CK_Haswell)
2834 .Case("core-avx2", CK_Haswell) // Legacy name.
2835 .Case("broadwell", CK_Broadwell)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002836 .Case("skylake", CK_SkylakeClient)
2837 .Case("skylake-avx512", CK_SkylakeServer)
2838 .Case("skx", CK_SkylakeServer) // Legacy name.
2839 .Case("cannonlake", CK_Cannonlake)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002840 .Case("knl", CK_KNL)
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002841 .Case("lakemont", CK_Lakemont)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002842 .Case("k6", CK_K6)
2843 .Case("k6-2", CK_K6_2)
2844 .Case("k6-3", CK_K6_3)
2845 .Case("athlon", CK_Athlon)
2846 .Case("athlon-tbird", CK_AthlonThunderbird)
2847 .Case("athlon-4", CK_Athlon4)
2848 .Case("athlon-xp", CK_AthlonXP)
2849 .Case("athlon-mp", CK_AthlonMP)
2850 .Case("athlon64", CK_Athlon64)
2851 .Case("athlon64-sse3", CK_Athlon64SSE3)
2852 .Case("athlon-fx", CK_AthlonFX)
2853 .Case("k8", CK_K8)
2854 .Case("k8-sse3", CK_K8SSE3)
2855 .Case("opteron", CK_Opteron)
2856 .Case("opteron-sse3", CK_OpteronSSE3)
2857 .Case("barcelona", CK_AMDFAM10)
2858 .Case("amdfam10", CK_AMDFAM10)
2859 .Case("btver1", CK_BTVER1)
2860 .Case("btver2", CK_BTVER2)
2861 .Case("bdver1", CK_BDVER1)
2862 .Case("bdver2", CK_BDVER2)
2863 .Case("bdver3", CK_BDVER3)
2864 .Case("bdver4", CK_BDVER4)
Craig Topperc45744a2017-01-10 06:02:12 +00002865 .Case("znver1", CK_ZNVER1)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002866 .Case("x86-64", CK_x86_64)
2867 .Case("geode", CK_Geode)
2868 .Default(CK_Generic);
2869 }
2870
Rafael Espindolaeb265472013-08-21 21:59:03 +00002871 enum FPMathKind {
2872 FP_Default,
2873 FP_SSE,
2874 FP_387
Craig Topper543f3bd2015-10-14 23:47:57 +00002875 } FPMath = FP_Default;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002876
Eli Friedman3fd920a2008-08-20 02:34:37 +00002877public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00002878 X86TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
2879 : TargetInfo(Triple) {
Stephan Bergmann17c7f702016-12-14 11:57:17 +00002880 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended();
Chris Lattner1f5ad112006-10-14 18:32:12 +00002881 }
Craig Topper3164f332014-03-11 03:39:26 +00002882 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00002883 // X87 evaluates with 80 bits "long double" precision.
2884 return SSELevel == NoSSE ? 2 : 0;
2885 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002886 ArrayRef<const char *> getGCCRegNames() const override {
2887 return llvm::makeArrayRef(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00002888 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002889 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
2890 return None;
Eric Christophercdd36352011-06-21 00:05:20 +00002891 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002892 ArrayRef<TargetInfo::AddlRegName> getGCCAddlRegNames() const override {
2893 return llvm::makeArrayRef(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00002894 }
Eric Christopherd9832702015-06-29 21:00:05 +00002895 bool validateCpuSupports(StringRef Name) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002896 bool validateAsmConstraint(const char *&Name,
Eric Christopher917e9522014-11-18 22:36:15 +00002897 TargetInfo::ConstraintInfo &info) const override;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002898
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00002899 bool validateGlobalRegisterVariable(StringRef RegName,
2900 unsigned RegSize,
2901 bool &HasSizeMismatch) const override {
2902 // esp and ebp are the only 32-bit registers the x86 backend can currently
2903 // handle.
2904 if (RegName.equals("esp") || RegName.equals("ebp")) {
2905 // Check that the register size is 32-bit.
2906 HasSizeMismatch = RegSize != 32;
2907 return true;
2908 }
2909
2910 return false;
2911 }
2912
Akira Hatanaka974131e2014-09-18 18:17:18 +00002913 bool validateOutputSize(StringRef Constraint, unsigned Size) const override;
2914
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002915 bool validateInputSize(StringRef Constraint, unsigned Size) const override;
2916
Akira Hatanaka974131e2014-09-18 18:17:18 +00002917 virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const;
2918
Craig Topper3164f332014-03-11 03:39:26 +00002919 std::string convertConstraint(const char *&Constraint) const override;
2920 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002921 return "~{dirflag},~{fpsr},~{flags}";
2922 }
Marina Yatsinac42fd032016-12-26 12:23:42 +00002923
2924 StringRef getConstraintRegister(const StringRef &Constraint,
2925 const StringRef &Expression) const override {
2926 StringRef::iterator I, E;
2927 for (I = Constraint.begin(), E = Constraint.end(); I != E; ++I) {
2928 if (isalpha(*I))
2929 break;
2930 }
2931 if (I == E)
2932 return "";
2933 switch (*I) {
2934 // For the register constraints, return the matching register name
2935 case 'a':
2936 return "ax";
2937 case 'b':
2938 return "bx";
2939 case 'c':
2940 return "cx";
2941 case 'd':
2942 return "dx";
2943 case 'S':
2944 return "si";
2945 case 'D':
2946 return "di";
2947 // In case the constraint is 'r' we need to return Expression
2948 case 'r':
2949 return Expression;
2950 default:
2951 // Default value if there is no constraint for the register
2952 return "";
2953 }
2954 return "";
2955 }
2956
Craig Topper3164f332014-03-11 03:39:26 +00002957 void getTargetDefines(const LangOptions &Opts,
2958 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00002959 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
2960 bool Enabled);
2961 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
2962 bool Enabled);
2963 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
2964 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002965 void setFeatureEnabled(llvm::StringMap<bool> &Features,
2966 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00002967 setFeatureEnabledImpl(Features, Name, Enabled);
2968 }
2969 // This exists purely to cut down on the number of virtual calls in
Eric Christopheref1e2952015-08-28 02:13:58 +00002970 // initFeatureMap which calls this repeatedly.
Craig Topper86d79ef2013-09-17 04:51:29 +00002971 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2972 StringRef Name, bool Enabled);
Eric Christopher8c47b422015-10-09 18:39:55 +00002973 bool
2974 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
2975 StringRef CPU,
2976 const std::vector<std::string> &FeaturesVec) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002977 bool hasFeature(StringRef Feature) const override;
2978 bool handleTargetFeatures(std::vector<std::string> &Features,
2979 DiagnosticsEngine &Diags) override;
Alp Toker4925ba72014-06-07 23:30:42 +00002980 StringRef getABI() const override {
Ahmed Bougacha0b938282015-06-22 21:31:43 +00002981 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX512F)
2982 return "avx512";
Craig Topperd945d502015-10-20 00:00:17 +00002983 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002984 return "avx";
Craig Topperd945d502015-10-20 00:00:17 +00002985 if (getTriple().getArch() == llvm::Triple::x86 &&
Derek Schuffc7dd7222012-10-11 15:52:22 +00002986 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002987 return "no-mmx";
2988 return "";
Eli Friedman33465822011-07-08 23:31:17 +00002989 }
Craig Topper3164f332014-03-11 03:39:26 +00002990 bool setCPU(const std::string &Name) override {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002991 CPU = getCPUKind(Name);
Chandler Carruth212334f2011-09-28 08:55:37 +00002992
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002993 // Perform any per-CPU checks necessary to determine if this CPU is
2994 // acceptable.
2995 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
2996 // invalid without explaining *why*.
2997 switch (CPU) {
2998 case CK_Generic:
2999 // No processor selected!
3000 return false;
3001
3002 case CK_i386:
3003 case CK_i486:
3004 case CK_WinChipC6:
3005 case CK_WinChip2:
3006 case CK_C3:
3007 case CK_i586:
3008 case CK_Pentium:
3009 case CK_PentiumMMX:
3010 case CK_i686:
3011 case CK_PentiumPro:
3012 case CK_Pentium2:
3013 case CK_Pentium3:
3014 case CK_Pentium3M:
3015 case CK_PentiumM:
3016 case CK_Yonah:
3017 case CK_C3_2:
3018 case CK_Pentium4:
3019 case CK_Pentium4M:
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003020 case CK_Lakemont:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00003021 case CK_Prescott:
3022 case CK_K6:
3023 case CK_K6_2:
3024 case CK_K6_3:
3025 case CK_Athlon:
3026 case CK_AthlonThunderbird:
3027 case CK_Athlon4:
3028 case CK_AthlonXP:
3029 case CK_AthlonMP:
3030 case CK_Geode:
3031 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00003032 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00003033 return false;
3034
3035 // Fallthrough
3036 case CK_Nocona:
3037 case CK_Core2:
3038 case CK_Penryn:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003039 case CK_Bonnell:
Preston Gurda3c58c02013-09-13 19:27:17 +00003040 case CK_Silvermont:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003041 case CK_Nehalem:
3042 case CK_Westmere:
3043 case CK_SandyBridge:
3044 case CK_IvyBridge:
3045 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00003046 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003047 case CK_SkylakeClient:
3048 case CK_SkylakeServer:
3049 case CK_Cannonlake:
Craig Topper449314e2013-08-20 07:09:39 +00003050 case CK_KNL:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00003051 case CK_Athlon64:
3052 case CK_Athlon64SSE3:
3053 case CK_AthlonFX:
3054 case CK_K8:
3055 case CK_K8SSE3:
3056 case CK_Opteron:
3057 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00003058 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00003059 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003060 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003061 case CK_BDVER1:
3062 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003063 case CK_BDVER3:
Benjamin Kramer56c58222014-05-02 15:47:51 +00003064 case CK_BDVER4:
Craig Topperc45744a2017-01-10 06:02:12 +00003065 case CK_ZNVER1:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00003066 case CK_x86_64:
3067 return true;
3068 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00003069 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003070 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003071
Craig Topper3164f332014-03-11 03:39:26 +00003072 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00003073
Craig Topper3164f332014-03-11 03:39:26 +00003074 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00003075 // Most of the non-ARM calling conventions are i386 conventions.
3076 switch (CC) {
3077 case CC_X86ThisCall:
3078 case CC_X86FastCall:
3079 case CC_X86StdCall:
3080 case CC_X86VectorCall:
Erich Keane757d3172016-11-02 18:29:35 +00003081 case CC_X86RegCall:
John McCall477f2bb2016-03-03 06:39:32 +00003082 case CC_C:
3083 case CC_Swift:
3084 case CC_X86Pascal:
3085 case CC_IntelOclBicc:
3086 return CCCR_OK;
3087 default:
3088 return CCCR_Warning;
3089 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003090 }
3091
Craig Topper3164f332014-03-11 03:39:26 +00003092 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00003093 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003094 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00003095
3096 bool hasSjLjLowering() const override {
3097 return true;
3098 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00003099
3100 void setSupportedOpenCLOpts() override {
Yaxun Liu5b746652016-12-18 05:18:55 +00003101 getSupportedOpenCLOpts().supportAll();
Yaxun Liu39cf40f2016-05-16 17:06:34 +00003102 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00003103};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00003104
Rafael Espindolaeb265472013-08-21 21:59:03 +00003105bool X86TargetInfo::setFPMath(StringRef Name) {
3106 if (Name == "387") {
3107 FPMath = FP_387;
3108 return true;
3109 }
3110 if (Name == "sse") {
3111 FPMath = FP_SSE;
3112 return true;
3113 }
3114 return false;
3115}
3116
Eric Christopher007b0a02015-08-28 22:32:01 +00003117bool X86TargetInfo::initFeatureMap(
3118 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
Eric Christopher8c47b422015-10-09 18:39:55 +00003119 const std::vector<std::string> &FeaturesVec) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003120 // FIXME: This *really* should not be here.
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003121 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00003122 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00003123 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003124
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003125 const CPUKind Kind = getCPUKind(CPU);
Andrey Turetskiy5f1cf5f2016-03-23 11:15:10 +00003126
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003127 // Enable X87 for all X86 processors but Lakemont.
3128 if (Kind != CK_Lakemont)
3129 setFeatureEnabledImpl(Features, "x87", true);
3130
3131 switch (Kind) {
Chandler Carruth212334f2011-09-28 08:55:37 +00003132 case CK_Generic:
3133 case CK_i386:
3134 case CK_i486:
3135 case CK_i586:
3136 case CK_Pentium:
3137 case CK_i686:
3138 case CK_PentiumPro:
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003139 case CK_Lakemont:
Chandler Carruth212334f2011-09-28 08:55:37 +00003140 break;
3141 case CK_PentiumMMX:
3142 case CK_Pentium2:
Craig Topperdb4dc082014-11-06 05:52:19 +00003143 case CK_K6:
3144 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00003145 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003146 break;
3147 case CK_Pentium3:
3148 case CK_Pentium3M:
Craig Topperdb4dc082014-11-06 05:52:19 +00003149 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00003150 setFeatureEnabledImpl(Features, "sse", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003151 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003152 break;
3153 case CK_PentiumM:
3154 case CK_Pentium4:
3155 case CK_Pentium4M:
3156 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00003157 setFeatureEnabledImpl(Features, "sse2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003158 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003159 break;
3160 case CK_Yonah:
3161 case CK_Prescott:
3162 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00003163 setFeatureEnabledImpl(Features, "sse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003164 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003165 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003166 break;
3167 case CK_Core2:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003168 case CK_Bonnell:
Craig Topper86d79ef2013-09-17 04:51:29 +00003169 setFeatureEnabledImpl(Features, "ssse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003170 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003171 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003172 break;
3173 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00003174 setFeatureEnabledImpl(Features, "sse4.1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003175 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003176 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003177 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003178 case CK_Cannonlake:
3179 setFeatureEnabledImpl(Features, "avx512ifma", true);
3180 setFeatureEnabledImpl(Features, "avx512vbmi", true);
3181 setFeatureEnabledImpl(Features, "sha", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003182 LLVM_FALLTHROUGH;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003183 case CK_SkylakeServer:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003184 setFeatureEnabledImpl(Features, "avx512f", true);
3185 setFeatureEnabledImpl(Features, "avx512cd", true);
3186 setFeatureEnabledImpl(Features, "avx512dq", true);
3187 setFeatureEnabledImpl(Features, "avx512bw", true);
3188 setFeatureEnabledImpl(Features, "avx512vl", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003189 setFeatureEnabledImpl(Features, "pku", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003190 setFeatureEnabledImpl(Features, "clwb", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003191 LLVM_FALLTHROUGH;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003192 case CK_SkylakeClient:
Craig Topperda9fe562015-10-15 05:23:38 +00003193 setFeatureEnabledImpl(Features, "xsavec", true);
3194 setFeatureEnabledImpl(Features, "xsaves", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003195 setFeatureEnabledImpl(Features, "mpx", true);
3196 setFeatureEnabledImpl(Features, "sgx", true);
3197 setFeatureEnabledImpl(Features, "clflushopt", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003198 LLVM_FALLTHROUGH;
Craig Topperdb4dc082014-11-06 05:52:19 +00003199 case CK_Broadwell:
3200 setFeatureEnabledImpl(Features, "rdseed", true);
3201 setFeatureEnabledImpl(Features, "adx", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003202 LLVM_FALLTHROUGH;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003203 case CK_Haswell:
Craig Topperdb4dc082014-11-06 05:52:19 +00003204 setFeatureEnabledImpl(Features, "avx2", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003205 setFeatureEnabledImpl(Features, "lzcnt", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003206 setFeatureEnabledImpl(Features, "bmi", true);
3207 setFeatureEnabledImpl(Features, "bmi2", true);
3208 setFeatureEnabledImpl(Features, "rtm", true);
3209 setFeatureEnabledImpl(Features, "fma", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003210 setFeatureEnabledImpl(Features, "movbe", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003211 LLVM_FALLTHROUGH;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003212 case CK_IvyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00003213 setFeatureEnabledImpl(Features, "rdrnd", true);
3214 setFeatureEnabledImpl(Features, "f16c", true);
3215 setFeatureEnabledImpl(Features, "fsgsbase", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003216 LLVM_FALLTHROUGH;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003217 case CK_SandyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00003218 setFeatureEnabledImpl(Features, "avx", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003219 setFeatureEnabledImpl(Features, "xsave", true);
3220 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003221 LLVM_FALLTHROUGH;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003222 case CK_Westmere:
Craig Topperdb4dc082014-11-06 05:52:19 +00003223 case CK_Silvermont:
3224 setFeatureEnabledImpl(Features, "aes", true);
3225 setFeatureEnabledImpl(Features, "pclmul", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003226 LLVM_FALLTHROUGH;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003227 case CK_Nehalem:
Craig Topperdb4dc082014-11-06 05:52:19 +00003228 setFeatureEnabledImpl(Features, "sse4.2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003229 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00003230 setFeatureEnabledImpl(Features, "cx16", true);
3231 break;
3232 case CK_KNL:
3233 setFeatureEnabledImpl(Features, "avx512f", true);
3234 setFeatureEnabledImpl(Features, "avx512cd", true);
3235 setFeatureEnabledImpl(Features, "avx512er", true);
3236 setFeatureEnabledImpl(Features, "avx512pf", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003237 setFeatureEnabledImpl(Features, "prefetchwt1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003238 setFeatureEnabledImpl(Features, "fxsr", true);
Robert Khasanov50e6f582014-09-19 09:53:48 +00003239 setFeatureEnabledImpl(Features, "rdseed", true);
3240 setFeatureEnabledImpl(Features, "adx", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00003241 setFeatureEnabledImpl(Features, "lzcnt", true);
3242 setFeatureEnabledImpl(Features, "bmi", true);
3243 setFeatureEnabledImpl(Features, "bmi2", true);
3244 setFeatureEnabledImpl(Features, "rtm", true);
3245 setFeatureEnabledImpl(Features, "fma", true);
3246 setFeatureEnabledImpl(Features, "rdrnd", true);
3247 setFeatureEnabledImpl(Features, "f16c", true);
3248 setFeatureEnabledImpl(Features, "fsgsbase", true);
3249 setFeatureEnabledImpl(Features, "aes", true);
3250 setFeatureEnabledImpl(Features, "pclmul", true);
3251 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003252 setFeatureEnabledImpl(Features, "xsaveopt", true);
3253 setFeatureEnabledImpl(Features, "xsave", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003254 setFeatureEnabledImpl(Features, "movbe", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003255 break;
3256 case CK_K6_2:
3257 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00003258 case CK_WinChip2:
3259 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00003260 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003261 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00003262 case CK_Athlon:
3263 case CK_AthlonThunderbird:
3264 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00003265 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00003266 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003267 case CK_Athlon4:
3268 case CK_AthlonXP:
3269 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00003270 setFeatureEnabledImpl(Features, "sse", true);
3271 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003272 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003273 break;
3274 case CK_K8:
3275 case CK_Opteron:
3276 case CK_Athlon64:
3277 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00003278 setFeatureEnabledImpl(Features, "sse2", true);
3279 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003280 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003281 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00003282 case CK_AMDFAM10:
3283 setFeatureEnabledImpl(Features, "sse4a", true);
3284 setFeatureEnabledImpl(Features, "lzcnt", true);
3285 setFeatureEnabledImpl(Features, "popcnt", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003286 LLVM_FALLTHROUGH;
Chandler Carruth212334f2011-09-28 08:55:37 +00003287 case CK_K8SSE3:
3288 case CK_OpteronSSE3:
3289 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00003290 setFeatureEnabledImpl(Features, "sse3", true);
3291 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003292 setFeatureEnabledImpl(Features, "fxsr", true);
Roman Divackyce253d82011-10-30 13:47:56 +00003293 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00003294 case CK_BTVER2:
3295 setFeatureEnabledImpl(Features, "avx", true);
3296 setFeatureEnabledImpl(Features, "aes", true);
3297 setFeatureEnabledImpl(Features, "pclmul", true);
3298 setFeatureEnabledImpl(Features, "bmi", true);
3299 setFeatureEnabledImpl(Features, "f16c", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003300 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003301 LLVM_FALLTHROUGH;
Benjamin Kramer569f2152012-01-10 11:50:18 +00003302 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00003303 setFeatureEnabledImpl(Features, "ssse3", true);
3304 setFeatureEnabledImpl(Features, "sse4a", true);
3305 setFeatureEnabledImpl(Features, "lzcnt", true);
3306 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00003307 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003308 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003309 setFeatureEnabledImpl(Features, "fxsr", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003310 break;
Craig Topperc45744a2017-01-10 06:02:12 +00003311 case CK_ZNVER1:
3312 setFeatureEnabledImpl(Features, "adx", true);
3313 setFeatureEnabledImpl(Features, "aes", true);
3314 setFeatureEnabledImpl(Features, "avx2", true);
3315 setFeatureEnabledImpl(Features, "bmi", true);
3316 setFeatureEnabledImpl(Features, "bmi2", true);
3317 setFeatureEnabledImpl(Features, "clflushopt", true);
Craig Topper45742262017-02-09 06:10:14 +00003318 setFeatureEnabledImpl(Features, "clzero", true);
Craig Topperc45744a2017-01-10 06:02:12 +00003319 setFeatureEnabledImpl(Features, "cx16", true);
3320 setFeatureEnabledImpl(Features, "f16c", true);
3321 setFeatureEnabledImpl(Features, "fma", true);
3322 setFeatureEnabledImpl(Features, "fsgsbase", true);
3323 setFeatureEnabledImpl(Features, "fxsr", true);
3324 setFeatureEnabledImpl(Features, "lzcnt", true);
3325 setFeatureEnabledImpl(Features, "mwaitx", true);
3326 setFeatureEnabledImpl(Features, "movbe", true);
3327 setFeatureEnabledImpl(Features, "pclmul", true);
3328 setFeatureEnabledImpl(Features, "popcnt", true);
3329 setFeatureEnabledImpl(Features, "prfchw", true);
3330 setFeatureEnabledImpl(Features, "rdrnd", true);
3331 setFeatureEnabledImpl(Features, "rdseed", true);
3332 setFeatureEnabledImpl(Features, "sha", true);
3333 setFeatureEnabledImpl(Features, "sse4a", true);
3334 setFeatureEnabledImpl(Features, "xsave", true);
3335 setFeatureEnabledImpl(Features, "xsavec", true);
3336 setFeatureEnabledImpl(Features, "xsaveopt", true);
3337 setFeatureEnabledImpl(Features, "xsaves", true);
3338 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003339 case CK_BDVER4:
3340 setFeatureEnabledImpl(Features, "avx2", true);
3341 setFeatureEnabledImpl(Features, "bmi2", true);
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003342 setFeatureEnabledImpl(Features, "mwaitx", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003343 LLVM_FALLTHROUGH;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003344 case CK_BDVER3:
Craig Topper8c7f2512014-11-03 06:51:41 +00003345 setFeatureEnabledImpl(Features, "fsgsbase", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003346 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003347 LLVM_FALLTHROUGH;
Craig Topper8c7f2512014-11-03 06:51:41 +00003348 case CK_BDVER2:
Andrea Di Biagio9760a442014-11-06 12:08:57 +00003349 setFeatureEnabledImpl(Features, "bmi", true);
3350 setFeatureEnabledImpl(Features, "fma", true);
3351 setFeatureEnabledImpl(Features, "f16c", true);
3352 setFeatureEnabledImpl(Features, "tbm", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003353 LLVM_FALLTHROUGH;
Andrea Di Biagio9760a442014-11-06 12:08:57 +00003354 case CK_BDVER1:
3355 // xop implies avx, sse4a and fma4.
Craig Topper86d79ef2013-09-17 04:51:29 +00003356 setFeatureEnabledImpl(Features, "xop", true);
3357 setFeatureEnabledImpl(Features, "lzcnt", true);
3358 setFeatureEnabledImpl(Features, "aes", true);
3359 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00003360 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003361 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003362 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003363 setFeatureEnabledImpl(Features, "xsave", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003364 break;
Eli Friedman33465822011-07-08 23:31:17 +00003365 }
Eric Christopherbbd746d2015-10-08 20:10:14 +00003366 if (!TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec))
3367 return false;
3368
3369 // Can't do this earlier because we need to be able to explicitly enable
3370 // or disable these features and the things that they depend upon.
3371
3372 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
3373 auto I = Features.find("sse4.2");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003374 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00003375 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-popcnt") ==
3376 FeaturesVec.end())
3377 Features["popcnt"] = true;
3378
3379 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
3380 I = Features.find("3dnow");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003381 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00003382 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-prfchw") ==
3383 FeaturesVec.end())
3384 Features["prfchw"] = true;
3385
Eric Christophera7260af2015-10-08 20:10:18 +00003386 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
3387 // then enable MMX.
3388 I = Features.find("sse");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003389 if (I != Features.end() && I->getValue() &&
Eric Christophera7260af2015-10-08 20:10:18 +00003390 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-mmx") ==
3391 FeaturesVec.end())
3392 Features["mmx"] = true;
3393
Eric Christopherbbd746d2015-10-08 20:10:14 +00003394 return true;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003395}
3396
Rafael Espindolae62e2792013-08-20 13:44:29 +00003397void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00003398 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003399 if (Enabled) {
3400 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003401 case AVX512F:
3402 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003403 case AVX2:
3404 Features["avx2"] = true;
3405 case AVX:
3406 Features["avx"] = true;
Craig Topperda9fe562015-10-15 05:23:38 +00003407 Features["xsave"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003408 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00003409 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003410 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00003411 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003412 case SSSE3:
3413 Features["ssse3"] = true;
3414 case SSE3:
3415 Features["sse3"] = true;
3416 case SSE2:
3417 Features["sse2"] = true;
3418 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00003419 Features["sse"] = true;
3420 case NoSSE:
3421 break;
3422 }
3423 return;
3424 }
3425
3426 switch (Level) {
3427 case NoSSE:
3428 case SSE1:
3429 Features["sse"] = false;
3430 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00003431 Features["sse2"] = Features["pclmul"] = Features["aes"] =
3432 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003433 case SSE3:
3434 Features["sse3"] = false;
3435 setXOPLevel(Features, NoXOP, false);
3436 case SSSE3:
3437 Features["ssse3"] = false;
3438 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00003439 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003440 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00003441 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003442 case AVX:
Craig Topperda9fe562015-10-15 05:23:38 +00003443 Features["fma"] = Features["avx"] = Features["f16c"] = Features["xsave"] =
3444 Features["xsaveopt"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00003445 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003446 case AVX2:
3447 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00003448 case AVX512F:
Eric Christopher917e9522014-11-18 22:36:15 +00003449 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
Craig Toppera31a5da2014-12-27 06:59:37 +00003450 Features["avx512pf"] = Features["avx512dq"] = Features["avx512bw"] =
Craig Topperb4f83a02016-02-29 06:51:38 +00003451 Features["avx512vl"] = Features["avx512vbmi"] =
3452 Features["avx512ifma"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003453 }
3454}
3455
3456void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00003457 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003458 if (Enabled) {
3459 switch (Level) {
3460 case AMD3DNowAthlon:
3461 Features["3dnowa"] = true;
3462 case AMD3DNow:
3463 Features["3dnow"] = true;
3464 case MMX:
3465 Features["mmx"] = true;
3466 case NoMMX3DNow:
3467 break;
3468 }
3469 return;
3470 }
3471
3472 switch (Level) {
3473 case NoMMX3DNow:
3474 case MMX:
3475 Features["mmx"] = false;
3476 case AMD3DNow:
3477 Features["3dnow"] = false;
3478 case AMD3DNowAthlon:
3479 Features["3dnowa"] = false;
3480 }
3481}
3482
3483void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00003484 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003485 if (Enabled) {
3486 switch (Level) {
3487 case XOP:
3488 Features["xop"] = true;
3489 case FMA4:
3490 Features["fma4"] = true;
3491 setSSELevel(Features, AVX, true);
3492 case SSE4A:
3493 Features["sse4a"] = true;
3494 setSSELevel(Features, SSE3, true);
3495 case NoXOP:
3496 break;
3497 }
3498 return;
3499 }
3500
3501 switch (Level) {
3502 case NoXOP:
3503 case SSE4A:
3504 Features["sse4a"] = false;
3505 case FMA4:
3506 Features["fma4"] = false;
3507 case XOP:
3508 Features["xop"] = false;
3509 }
3510}
3511
Craig Topper86d79ef2013-09-17 04:51:29 +00003512void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
3513 StringRef Name, bool Enabled) {
Eric Christopher298ac302015-07-01 00:08:32 +00003514 // This is a bit of a hack to deal with the sse4 target feature when used
3515 // as part of the target attribute. We handle sse4 correctly everywhere
3516 // else. See below for more information on how we handle the sse4 options.
3517 if (Name != "sse4")
3518 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00003519
Craig Topper29561122013-09-19 01:13:07 +00003520 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003521 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003522 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003523 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003524 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003525 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003526 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003527 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003528 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003529 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003530 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003531 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003532 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003533 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003534 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003535 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003536 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003537 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003538 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003539 if (Enabled)
3540 setSSELevel(Features, SSE2, Enabled);
3541 } else if (Name == "pclmul") {
3542 if (Enabled)
3543 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003544 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003545 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003546 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003547 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003548 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003549 setSSELevel(Features, AVX512F, Enabled);
Craig Topperb4f83a02016-02-29 06:51:38 +00003550 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf" ||
3551 Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl" ||
3552 Name == "avx512vbmi" || Name == "avx512ifma") {
Craig Topper679b53a2013-08-21 05:29:10 +00003553 if (Enabled)
3554 setSSELevel(Features, AVX512F, Enabled);
Craig Topper6c7ecc52016-11-09 04:51:03 +00003555 // Enable BWI instruction if VBMI is being enabled.
3556 if (Name == "avx512vbmi" && Enabled)
3557 Features["avx512bw"] = true;
3558 // Also disable VBMI if BWI is being disabled.
3559 if (Name == "avx512bw" && !Enabled)
3560 Features["avx512vbmi"] = false;
Craig Topper679b53a2013-08-21 05:29:10 +00003561 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003562 if (Enabled)
3563 setSSELevel(Features, AVX, Enabled);
3564 } else if (Name == "fma4") {
3565 setXOPLevel(Features, FMA4, Enabled);
3566 } else if (Name == "xop") {
3567 setXOPLevel(Features, XOP, Enabled);
3568 } else if (Name == "sse4a") {
3569 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00003570 } else if (Name == "f16c") {
3571 if (Enabled)
3572 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00003573 } else if (Name == "sha") {
3574 if (Enabled)
3575 setSSELevel(Features, SSE2, Enabled);
Eric Christopher298ac302015-07-01 00:08:32 +00003576 } else if (Name == "sse4") {
3577 // We can get here via the __target__ attribute since that's not controlled
3578 // via the -msse4/-mno-sse4 command line alias. Handle this the same way
3579 // here - turn on the sse4.2 if enabled, turn off the sse4.1 level if
3580 // disabled.
3581 if (Enabled)
3582 setSSELevel(Features, SSE42, Enabled);
3583 else
3584 setSSELevel(Features, SSE41, Enabled);
Craig Topperda9fe562015-10-15 05:23:38 +00003585 } else if (Name == "xsave") {
Craig Topper840927e2016-02-29 06:51:34 +00003586 if (!Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003587 Features["xsaveopt"] = false;
3588 } else if (Name == "xsaveopt" || Name == "xsavec" || Name == "xsaves") {
Craig Topper840927e2016-02-29 06:51:34 +00003589 if (Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003590 Features["xsave"] = true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003591 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003592}
3593
Eric Christopher3ff21b32013-10-16 21:26:26 +00003594/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003595/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00003596bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00003597 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00003598 for (const auto &Feature : Features) {
3599 if (Feature[0] != '+')
Daniel Dunbar979586e2009-11-11 09:38:56 +00003600 continue;
3601
Eric Christopher610fe112015-08-26 08:21:55 +00003602 if (Feature == "+aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00003603 HasAES = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003604 } else if (Feature == "+pclmul") {
Craig Topper3f122a72012-05-31 05:18:48 +00003605 HasPCLMUL = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003606 } else if (Feature == "+lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00003607 HasLZCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003608 } else if (Feature == "+rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00003609 HasRDRND = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003610 } else if (Feature == "+fsgsbase") {
Craig Topper8c7f2512014-11-03 06:51:41 +00003611 HasFSGSBASE = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003612 } else if (Feature == "+bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00003613 HasBMI = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003614 } else if (Feature == "+bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00003615 HasBMI2 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003616 } else if (Feature == "+popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00003617 HasPOPCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003618 } else if (Feature == "+rtm") {
Michael Liao625a8752012-11-10 05:17:46 +00003619 HasRTM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003620 } else if (Feature == "+prfchw") {
Michael Liao74f4eaf2013-03-26 17:52:08 +00003621 HasPRFCHW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003622 } else if (Feature == "+rdseed") {
Michael Liaoffaae352013-03-29 05:17:55 +00003623 HasRDSEED = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003624 } else if (Feature == "+adx") {
Robert Khasanov50e6f582014-09-19 09:53:48 +00003625 HasADX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003626 } else if (Feature == "+tbm") {
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003627 HasTBM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003628 } else if (Feature == "+fma") {
Craig Topperbba778b2012-06-03 21:46:30 +00003629 HasFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003630 } else if (Feature == "+f16c") {
Manman Rena45358c2012-10-11 00:59:55 +00003631 HasF16C = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003632 } else if (Feature == "+avx512cd") {
Craig Topper679b53a2013-08-21 05:29:10 +00003633 HasAVX512CD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003634 } else if (Feature == "+avx512er") {
Craig Topper679b53a2013-08-21 05:29:10 +00003635 HasAVX512ER = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003636 } else if (Feature == "+avx512pf") {
Craig Topper679b53a2013-08-21 05:29:10 +00003637 HasAVX512PF = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003638 } else if (Feature == "+avx512dq") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003639 HasAVX512DQ = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003640 } else if (Feature == "+avx512bw") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003641 HasAVX512BW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003642 } else if (Feature == "+avx512vl") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003643 HasAVX512VL = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003644 } else if (Feature == "+avx512vbmi") {
3645 HasAVX512VBMI = true;
3646 } else if (Feature == "+avx512ifma") {
3647 HasAVX512IFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003648 } else if (Feature == "+sha") {
Ben Langmuir58078d02013-09-19 13:22:04 +00003649 HasSHA = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003650 } else if (Feature == "+mpx") {
3651 HasMPX = true;
3652 } else if (Feature == "+movbe") {
3653 HasMOVBE = true;
3654 } else if (Feature == "+sgx") {
3655 HasSGX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003656 } else if (Feature == "+cx16") {
Nick Lewycky50e8f482013-10-05 20:14:27 +00003657 HasCX16 = true;
Craig Toppere33f51f2015-10-16 06:22:36 +00003658 } else if (Feature == "+fxsr") {
3659 HasFXSR = true;
Craig Topperda9fe562015-10-15 05:23:38 +00003660 } else if (Feature == "+xsave") {
3661 HasXSAVE = true;
3662 } else if (Feature == "+xsaveopt") {
3663 HasXSAVEOPT = true;
3664 } else if (Feature == "+xsavec") {
3665 HasXSAVEC = true;
3666 } else if (Feature == "+xsaves") {
3667 HasXSAVES = true;
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003668 } else if (Feature == "+mwaitx") {
3669 HasMWAITX = true;
Asaf Badouha9d1e182015-12-31 14:14:07 +00003670 } else if (Feature == "+pku") {
3671 HasPKU = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003672 } else if (Feature == "+clflushopt") {
3673 HasCLFLUSHOPT = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003674 } else if (Feature == "+clwb") {
3675 HasCLWB = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003676 } else if (Feature == "+prefetchwt1") {
3677 HasPREFETCHWT1 = true;
Craig Topper45742262017-02-09 06:10:14 +00003678 } else if (Feature == "+clzero") {
3679 HasCLZERO = true;
Nick Lewycky50e8f482013-10-05 20:14:27 +00003680 }
3681
Benjamin Kramer27402c62012-03-05 15:10:44 +00003682 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003683 .Case("+avx512f", AVX512F)
3684 .Case("+avx2", AVX2)
3685 .Case("+avx", AVX)
3686 .Case("+sse4.2", SSE42)
3687 .Case("+sse4.1", SSE41)
3688 .Case("+ssse3", SSSE3)
3689 .Case("+sse3", SSE3)
3690 .Case("+sse2", SSE2)
3691 .Case("+sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00003692 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003693 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003694
Eli Friedman33465822011-07-08 23:31:17 +00003695 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00003696 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003697 .Case("+3dnowa", AMD3DNowAthlon)
3698 .Case("+3dnow", AMD3DNow)
3699 .Case("+mmx", MMX)
Eli Friedman33465822011-07-08 23:31:17 +00003700 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00003701 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003702
3703 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003704 .Case("+xop", XOP)
3705 .Case("+fma4", FMA4)
3706 .Case("+sse4a", SSE4A)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003707 .Default(NoXOP);
3708 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003709 }
Eli Friedman33465822011-07-08 23:31:17 +00003710
Rafael Espindolaeb265472013-08-21 21:59:03 +00003711 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
3712 // matches the selected sse level.
Craig Topperd945d502015-10-20 00:00:17 +00003713 if ((FPMath == FP_SSE && SSELevel < SSE1) ||
3714 (FPMath == FP_387 && SSELevel >= SSE1)) {
3715 Diags.Report(diag::err_target_unsupported_fpmath) <<
3716 (FPMath == FP_SSE ? "sse" : "387");
Rafael Espindolaeb265472013-08-21 21:59:03 +00003717 return false;
3718 }
3719
Alexey Bataev00396512015-07-02 03:40:19 +00003720 SimdDefaultAlign =
Ahmed Bougacha68bf64e2015-08-27 22:24:56 +00003721 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Rafael Espindolaeb265472013-08-21 21:59:03 +00003722 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00003723}
Chris Lattnerecd49032009-03-02 22:27:17 +00003724
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003725/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
3726/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00003727void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003728 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00003729 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00003730 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003731 Builder.defineMacro("__amd64__");
3732 Builder.defineMacro("__amd64");
3733 Builder.defineMacro("__x86_64");
3734 Builder.defineMacro("__x86_64__");
Bob Wilsona2acb1e2014-08-08 23:46:28 +00003735 if (getTriple().getArchName() == "x86_64h") {
3736 Builder.defineMacro("__x86_64h");
3737 Builder.defineMacro("__x86_64h__");
3738 }
Chris Lattnerecd49032009-03-02 22:27:17 +00003739 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003740 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00003741 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003742
Chris Lattnerecd49032009-03-02 22:27:17 +00003743 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003744 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
3745 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00003746 switch (CPU) {
3747 case CK_Generic:
3748 break;
3749 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003750 // The rest are coming from the i386 define above.
3751 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003752 break;
3753 case CK_i486:
3754 case CK_WinChipC6:
3755 case CK_WinChip2:
3756 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003757 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00003758 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003759 case CK_PentiumMMX:
3760 Builder.defineMacro("__pentium_mmx__");
3761 Builder.defineMacro("__tune_pentium_mmx__");
3762 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003763 case CK_i586:
3764 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003765 defineCPUMacros(Builder, "i586");
3766 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00003767 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003768 case CK_Pentium3:
3769 case CK_Pentium3M:
3770 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003771 Builder.defineMacro("__tune_pentium3__");
3772 // Fallthrough
3773 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00003774 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003775 Builder.defineMacro("__tune_pentium2__");
3776 // Fallthrough
3777 case CK_PentiumPro:
3778 Builder.defineMacro("__tune_i686__");
3779 Builder.defineMacro("__tune_pentiumpro__");
3780 // Fallthrough
3781 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003782 Builder.defineMacro("__i686");
3783 Builder.defineMacro("__i686__");
3784 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
3785 Builder.defineMacro("__pentiumpro");
3786 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003787 break;
3788 case CK_Pentium4:
3789 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003790 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00003791 break;
3792 case CK_Yonah:
3793 case CK_Prescott:
3794 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003795 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00003796 break;
3797 case CK_Core2:
3798 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003799 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00003800 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003801 case CK_Bonnell:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003802 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00003803 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00003804 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00003805 defineCPUMacros(Builder, "slm");
3806 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003807 case CK_Nehalem:
3808 case CK_Westmere:
3809 case CK_SandyBridge:
3810 case CK_IvyBridge:
3811 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00003812 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003813 case CK_SkylakeClient:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003814 // FIXME: Historically, we defined this legacy name, it would be nice to
3815 // remove it at some point. We've never exposed fine-grained names for
3816 // recent primary x86 CPUs, and we should keep it that way.
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003817 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00003818 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003819 case CK_SkylakeServer:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003820 defineCPUMacros(Builder, "skx");
3821 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003822 case CK_Cannonlake:
3823 break;
Craig Topper449314e2013-08-20 07:09:39 +00003824 case CK_KNL:
3825 defineCPUMacros(Builder, "knl");
3826 break;
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003827 case CK_Lakemont:
3828 Builder.defineMacro("__tune_lakemont__");
3829 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003830 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003831 Builder.defineMacro("__k6_2__");
3832 Builder.defineMacro("__tune_k6_2__");
3833 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003834 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003835 if (CPU != CK_K6_2) { // In case of fallthrough
3836 // FIXME: GCC may be enabling these in cases where some other k6
3837 // architecture is specified but -m3dnow is explicitly provided. The
3838 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003839 Builder.defineMacro("__k6_3__");
3840 Builder.defineMacro("__tune_k6_3__");
3841 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003842 // Fallthrough
3843 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003844 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00003845 break;
3846 case CK_Athlon:
3847 case CK_AthlonThunderbird:
3848 case CK_Athlon4:
3849 case CK_AthlonXP:
3850 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003851 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003852 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003853 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003854 Builder.defineMacro("__tune_athlon_sse__");
3855 }
Chandler Carruth212334f2011-09-28 08:55:37 +00003856 break;
3857 case CK_K8:
3858 case CK_K8SSE3:
3859 case CK_x86_64:
3860 case CK_Opteron:
3861 case CK_OpteronSSE3:
3862 case CK_Athlon64:
3863 case CK_Athlon64SSE3:
3864 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003865 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00003866 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00003867 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003868 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00003869 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00003870 case CK_BTVER1:
3871 defineCPUMacros(Builder, "btver1");
3872 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003873 case CK_BTVER2:
3874 defineCPUMacros(Builder, "btver2");
3875 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003876 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003877 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003878 break;
3879 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003880 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003881 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003882 case CK_BDVER3:
3883 defineCPUMacros(Builder, "bdver3");
3884 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003885 case CK_BDVER4:
3886 defineCPUMacros(Builder, "bdver4");
3887 break;
Craig Topperc45744a2017-01-10 06:02:12 +00003888 case CK_ZNVER1:
3889 defineCPUMacros(Builder, "znver1");
3890 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003891 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003892 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00003893 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003894 }
Chris Lattner96e43572009-03-02 22:40:39 +00003895
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003896 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003897 Builder.defineMacro("__REGISTER_PREFIX__", "");
3898
Chris Lattner6df41af2009-04-19 17:32:33 +00003899 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
3900 // functions in glibc header files that use FP Stack inline asm which the
3901 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003902 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003903
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003904 if (HasAES)
3905 Builder.defineMacro("__AES__");
3906
Craig Topper3f122a72012-05-31 05:18:48 +00003907 if (HasPCLMUL)
3908 Builder.defineMacro("__PCLMUL__");
3909
Craig Topper22967d42011-12-25 05:06:45 +00003910 if (HasLZCNT)
3911 Builder.defineMacro("__LZCNT__");
3912
Benjamin Kramer1e250392012-07-07 09:39:18 +00003913 if (HasRDRND)
3914 Builder.defineMacro("__RDRND__");
3915
Craig Topper8c7f2512014-11-03 06:51:41 +00003916 if (HasFSGSBASE)
3917 Builder.defineMacro("__FSGSBASE__");
3918
Craig Topper22967d42011-12-25 05:06:45 +00003919 if (HasBMI)
3920 Builder.defineMacro("__BMI__");
3921
3922 if (HasBMI2)
3923 Builder.defineMacro("__BMI2__");
3924
Craig Topper1de83482011-12-29 16:10:46 +00003925 if (HasPOPCNT)
3926 Builder.defineMacro("__POPCNT__");
3927
Michael Liao625a8752012-11-10 05:17:46 +00003928 if (HasRTM)
3929 Builder.defineMacro("__RTM__");
3930
Michael Liao74f4eaf2013-03-26 17:52:08 +00003931 if (HasPRFCHW)
3932 Builder.defineMacro("__PRFCHW__");
3933
Michael Liaoffaae352013-03-29 05:17:55 +00003934 if (HasRDSEED)
3935 Builder.defineMacro("__RDSEED__");
3936
Robert Khasanov50e6f582014-09-19 09:53:48 +00003937 if (HasADX)
3938 Builder.defineMacro("__ADX__");
3939
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003940 if (HasTBM)
3941 Builder.defineMacro("__TBM__");
3942
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003943 if (HasMWAITX)
3944 Builder.defineMacro("__MWAITX__");
3945
Rafael Espindolae62e2792013-08-20 13:44:29 +00003946 switch (XOPLevel) {
3947 case XOP:
3948 Builder.defineMacro("__XOP__");
3949 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00003950 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00003951 case SSE4A:
3952 Builder.defineMacro("__SSE4A__");
3953 case NoXOP:
3954 break;
3955 }
Craig Topperffdb46c2011-12-30 07:33:42 +00003956
Craig Topperbba778b2012-06-03 21:46:30 +00003957 if (HasFMA)
3958 Builder.defineMacro("__FMA__");
3959
Manman Rena45358c2012-10-11 00:59:55 +00003960 if (HasF16C)
3961 Builder.defineMacro("__F16C__");
3962
Craig Topper679b53a2013-08-21 05:29:10 +00003963 if (HasAVX512CD)
3964 Builder.defineMacro("__AVX512CD__");
3965 if (HasAVX512ER)
3966 Builder.defineMacro("__AVX512ER__");
3967 if (HasAVX512PF)
3968 Builder.defineMacro("__AVX512PF__");
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003969 if (HasAVX512DQ)
3970 Builder.defineMacro("__AVX512DQ__");
3971 if (HasAVX512BW)
3972 Builder.defineMacro("__AVX512BW__");
3973 if (HasAVX512VL)
3974 Builder.defineMacro("__AVX512VL__");
Craig Topperb4f83a02016-02-29 06:51:38 +00003975 if (HasAVX512VBMI)
3976 Builder.defineMacro("__AVX512VBMI__");
3977 if (HasAVX512IFMA)
3978 Builder.defineMacro("__AVX512IFMA__");
Craig Topper679b53a2013-08-21 05:29:10 +00003979
Ben Langmuir58078d02013-09-19 13:22:04 +00003980 if (HasSHA)
3981 Builder.defineMacro("__SHA__");
3982
Craig Toppere33f51f2015-10-16 06:22:36 +00003983 if (HasFXSR)
3984 Builder.defineMacro("__FXSR__");
Craig Topperda9fe562015-10-15 05:23:38 +00003985 if (HasXSAVE)
3986 Builder.defineMacro("__XSAVE__");
3987 if (HasXSAVEOPT)
3988 Builder.defineMacro("__XSAVEOPT__");
3989 if (HasXSAVEC)
3990 Builder.defineMacro("__XSAVEC__");
3991 if (HasXSAVES)
3992 Builder.defineMacro("__XSAVES__");
Asaf Badouha9d1e182015-12-31 14:14:07 +00003993 if (HasPKU)
3994 Builder.defineMacro("__PKU__");
Nick Lewycky50e8f482013-10-05 20:14:27 +00003995 if (HasCX16)
3996 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
Craig Topper78b47872017-02-08 06:48:58 +00003997 if (HasCLFLUSHOPT)
3998 Builder.defineMacro("__CLFLUSHOPT__");
Craig Topper8c708cf2017-02-08 07:36:58 +00003999 if (HasCLWB)
4000 Builder.defineMacro("__CLWB__");
Craig Topperb16cb822017-02-08 07:56:42 +00004001 if (HasMPX)
4002 Builder.defineMacro("__MPX__");
Craig Topper204ecff2017-02-08 08:23:17 +00004003 if (HasSGX)
4004 Builder.defineMacro("__SGX__");
Craig Topperd2bf7b02017-02-08 08:23:40 +00004005 if (HasPREFETCHWT1)
4006 Builder.defineMacro("__PREFETCHWT1__");
Craig Topper45742262017-02-09 06:10:14 +00004007 if (HasCLZERO)
4008 Builder.defineMacro("__CLZERO__");
Nick Lewycky50e8f482013-10-05 20:14:27 +00004009
Chris Lattner96e43572009-03-02 22:40:39 +00004010 // Each case falls through to the previous one here.
4011 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00004012 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00004013 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00004014 case AVX2:
4015 Builder.defineMacro("__AVX2__");
4016 case AVX:
4017 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00004018 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004019 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00004020 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004021 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00004022 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004023 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00004024 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004025 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00004026 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004027 Builder.defineMacro("__SSE2__");
4028 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00004029 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004030 Builder.defineMacro("__SSE__");
4031 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00004032 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00004033 break;
4034 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004035
Derek Schuffc7dd7222012-10-11 15:52:22 +00004036 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004037 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00004038 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00004039 case AVX2:
4040 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004041 case SSE42:
4042 case SSE41:
4043 case SSSE3:
4044 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004045 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004046 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004047 break;
4048 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004049 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004050 break;
4051 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004052 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004053 }
4054 }
4055
Anders Carlssone437c682010-01-27 03:47:49 +00004056 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00004057 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00004058 case AMD3DNowAthlon:
4059 Builder.defineMacro("__3dNOW_A__");
4060 case AMD3DNow:
4061 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00004062 case MMX:
4063 Builder.defineMacro("__MMX__");
4064 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00004065 break;
4066 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00004067
4068 if (CPU >= CK_i486) {
4069 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
4070 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
4071 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
4072 }
4073 if (CPU >= CK_i586)
4074 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00004075}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004076
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004077bool X86TargetInfo::hasFeature(StringRef Feature) const {
4078 return llvm::StringSwitch<bool>(Feature)
4079 .Case("aes", HasAES)
4080 .Case("avx", SSELevel >= AVX)
4081 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00004082 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00004083 .Case("avx512cd", HasAVX512CD)
4084 .Case("avx512er", HasAVX512ER)
4085 .Case("avx512pf", HasAVX512PF)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00004086 .Case("avx512dq", HasAVX512DQ)
4087 .Case("avx512bw", HasAVX512BW)
4088 .Case("avx512vl", HasAVX512VL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00004089 .Case("avx512vbmi", HasAVX512VBMI)
4090 .Case("avx512ifma", HasAVX512IFMA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004091 .Case("bmi", HasBMI)
4092 .Case("bmi2", HasBMI2)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00004093 .Case("clflushopt", HasCLFLUSHOPT)
4094 .Case("clwb", HasCLWB)
Craig Topper45742262017-02-09 06:10:14 +00004095 .Case("clzero", HasCLZERO)
Nick Lewycky50e8f482013-10-05 20:14:27 +00004096 .Case("cx16", HasCX16)
4097 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00004098 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00004099 .Case("fma4", XOPLevel >= FMA4)
Craig Topper8c7f2512014-11-03 06:51:41 +00004100 .Case("fsgsbase", HasFSGSBASE)
Craig Toppere33f51f2015-10-16 06:22:36 +00004101 .Case("fxsr", HasFXSR)
Craig Topper8dbc5842014-11-03 07:05:26 +00004102 .Case("lzcnt", HasLZCNT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004103 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
4104 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
4105 .Case("mmx", MMX3DNowLevel >= MMX)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00004106 .Case("movbe", HasMOVBE)
4107 .Case("mpx", HasMPX)
Craig Topper3f122a72012-05-31 05:18:48 +00004108 .Case("pclmul", HasPCLMUL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00004109 .Case("pku", HasPKU)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004110 .Case("popcnt", HasPOPCNT)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00004111 .Case("prefetchwt1", HasPREFETCHWT1)
Michael Liao74f4eaf2013-03-26 17:52:08 +00004112 .Case("prfchw", HasPRFCHW)
Craig Topper8dbc5842014-11-03 07:05:26 +00004113 .Case("rdrnd", HasRDRND)
Michael Liaoffaae352013-03-29 05:17:55 +00004114 .Case("rdseed", HasRDSEED)
Craig Topper8dbc5842014-11-03 07:05:26 +00004115 .Case("rtm", HasRTM)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00004116 .Case("sgx", HasSGX)
Ben Langmuir58078d02013-09-19 13:22:04 +00004117 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004118 .Case("sse", SSELevel >= SSE1)
4119 .Case("sse2", SSELevel >= SSE2)
4120 .Case("sse3", SSELevel >= SSE3)
4121 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00004122 .Case("sse4.1", SSELevel >= SSE41)
4123 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00004124 .Case("sse4a", XOPLevel >= SSE4A)
Craig Topper8dbc5842014-11-03 07:05:26 +00004125 .Case("tbm", HasTBM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004126 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00004127 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
4128 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00004129 .Case("xop", XOPLevel >= XOP)
Craig Topperda9fe562015-10-15 05:23:38 +00004130 .Case("xsave", HasXSAVE)
4131 .Case("xsavec", HasXSAVEC)
4132 .Case("xsaves", HasXSAVES)
4133 .Case("xsaveopt", HasXSAVEOPT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004134 .Default(false);
4135}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004136
Eric Christopherd9832702015-06-29 21:00:05 +00004137// We can't use a generic validation scheme for the features accepted here
4138// versus subtarget features accepted in the target attribute because the
4139// bitfield structure that's initialized in the runtime only supports the
4140// below currently rather than the full range of subtarget features. (See
4141// X86TargetInfo::hasFeature for a somewhat comprehensive list).
4142bool X86TargetInfo::validateCpuSupports(StringRef FeatureStr) const {
4143 return llvm::StringSwitch<bool>(FeatureStr)
4144 .Case("cmov", true)
4145 .Case("mmx", true)
4146 .Case("popcnt", true)
4147 .Case("sse", true)
4148 .Case("sse2", true)
4149 .Case("sse3", true)
Benjamin Kramerf4c520d2016-05-20 15:21:08 +00004150 .Case("ssse3", true)
Eric Christopherd9832702015-06-29 21:00:05 +00004151 .Case("sse4.1", true)
4152 .Case("sse4.2", true)
4153 .Case("avx", true)
4154 .Case("avx2", true)
4155 .Case("sse4a", true)
4156 .Case("fma4", true)
4157 .Case("xop", true)
4158 .Case("fma", true)
4159 .Case("avx512f", true)
4160 .Case("bmi", true)
4161 .Case("bmi2", true)
Benjamin Kramerf4c520d2016-05-20 15:21:08 +00004162 .Case("aes", true)
4163 .Case("pclmul", true)
4164 .Case("avx512vl", true)
4165 .Case("avx512bw", true)
4166 .Case("avx512dq", true)
4167 .Case("avx512cd", true)
4168 .Case("avx512er", true)
4169 .Case("avx512pf", true)
4170 .Case("avx512vbmi", true)
4171 .Case("avx512ifma", true)
Eric Christopherd9832702015-06-29 21:00:05 +00004172 .Default(false);
4173}
4174
Eli Friedman3fd920a2008-08-20 02:34:37 +00004175bool
Anders Carlsson58436352009-02-28 17:11:49 +00004176X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00004177 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00004178 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004179 default: return false;
Alexey Bataev91e58602015-07-20 12:08:00 +00004180 // Constant constraints.
4181 case 'e': // 32-bit signed integer constant for use with sign-extending x86_64
4182 // instructions.
4183 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
4184 // x86_64 instructions.
4185 case 's':
4186 Info.setRequiresImmediate();
4187 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00004188 case 'I':
4189 Info.setRequiresImmediate(0, 31);
4190 return true;
4191 case 'J':
4192 Info.setRequiresImmediate(0, 63);
4193 return true;
4194 case 'K':
4195 Info.setRequiresImmediate(-128, 127);
4196 return true;
4197 case 'L':
Alexey Bataev91e58602015-07-20 12:08:00 +00004198 Info.setRequiresImmediate({ int(0xff), int(0xffff), int(0xffffffff) });
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00004199 return true;
4200 case 'M':
4201 Info.setRequiresImmediate(0, 3);
4202 return true;
4203 case 'N':
4204 Info.setRequiresImmediate(0, 255);
4205 return true;
4206 case 'O':
4207 Info.setRequiresImmediate(0, 127);
4208 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00004209 // Register constraints.
4210 case 'Y': // 'Y' is the first character for several 2-character constraints.
4211 // Shift the pointer to the second character of the constraint.
4212 Name++;
4213 switch (*Name) {
4214 default:
4215 return false;
4216 case '0': // First SSE register.
4217 case 't': // Any SSE register, when SSE2 is enabled.
4218 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
4219 case 'm': // Any MMX register, when inter-unit moves enabled.
Michael Zuckerman849a6a52016-10-31 17:23:52 +00004220 case 'k': // AVX512 arch mask registers: k1-k7.
Alexey Bataev91e58602015-07-20 12:08:00 +00004221 Info.setAllowsRegister();
4222 return true;
4223 }
4224 case 'f': // Any x87 floating point stack register.
Akira Hatanaka88ef7282014-07-18 23:30:30 +00004225 // Constraint 'f' cannot be used for output operands.
4226 if (Info.ConstraintStr[0] == '=')
4227 return false;
Akira Hatanaka88ef7282014-07-18 23:30:30 +00004228 Info.setAllowsRegister();
4229 return true;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004230 case 'a': // eax.
4231 case 'b': // ebx.
4232 case 'c': // ecx.
4233 case 'd': // edx.
4234 case 'S': // esi.
4235 case 'D': // edi.
4236 case 'A': // edx:eax.
Alexey Bataev91e58602015-07-20 12:08:00 +00004237 case 't': // Top of floating point stack.
4238 case 'u': // Second from top of floating point stack.
Eli Friedman3fd920a2008-08-20 02:34:37 +00004239 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00004240 case 'y': // Any MMX register.
Michael Zuckerman62f516f2016-11-01 13:16:44 +00004241 case 'v': // Any {X,Y,Z}MM register (Arch & context dependent)
Anders Carlsson5f7ee682008-10-06 19:17:39 +00004242 case 'x': // Any SSE register.
Michael Zuckerman849a6a52016-10-31 17:23:52 +00004243 case 'k': // Any AVX512 mask register (same as Yk, additionaly allows k0
4244 // for intermideate k reg operations).
Eli Friedman3fd920a2008-08-20 02:34:37 +00004245 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00004246 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
4247 case 'l': // "Index" registers: any general register that can be used as an
4248 // index in a base+index memory access.
4249 Info.setAllowsRegister();
4250 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00004251 // Floating point constant constraints.
Dale Johannesen46742a42010-08-24 22:33:12 +00004252 case 'C': // SSE floating point constant.
4253 case 'G': // x87 floating point constant.
Eli Friedman3fd920a2008-08-20 02:34:37 +00004254 return true;
4255 }
4256}
4257
Akira Hatanaka974131e2014-09-18 18:17:18 +00004258bool X86TargetInfo::validateOutputSize(StringRef Constraint,
4259 unsigned Size) const {
4260 // Strip off constraint modifiers.
4261 while (Constraint[0] == '=' ||
4262 Constraint[0] == '+' ||
4263 Constraint[0] == '&')
4264 Constraint = Constraint.substr(1);
4265
4266 return validateOperandSize(Constraint, Size);
4267}
4268
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004269bool X86TargetInfo::validateInputSize(StringRef Constraint,
4270 unsigned Size) const {
Akira Hatanaka974131e2014-09-18 18:17:18 +00004271 return validateOperandSize(Constraint, Size);
4272}
4273
4274bool X86TargetInfo::validateOperandSize(StringRef Constraint,
4275 unsigned Size) const {
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004276 switch (Constraint[0]) {
4277 default: break;
Michael Zuckerman849a6a52016-10-31 17:23:52 +00004278 case 'k':
4279 // Registers k0-k7 (AVX512) size limit is 64 bit.
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004280 case 'y':
4281 return Size <= 64;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004282 case 'f':
4283 case 't':
4284 case 'u':
4285 return Size <= 128;
Michael Zuckerman62f516f2016-11-01 13:16:44 +00004286 case 'v':
Hans Wennborg3c619a42014-09-18 20:24:04 +00004287 case 'x':
Alexey Bataev91e58602015-07-20 12:08:00 +00004288 if (SSELevel >= AVX512F)
4289 // 512-bit zmm registers can be used if target supports AVX512F.
4290 return Size <= 512U;
4291 else if (SSELevel >= AVX)
4292 // 256-bit ymm registers can be used if target supports AVX.
4293 return Size <= 256U;
4294 return Size <= 128U;
4295 case 'Y':
4296 // 'Y' is the first character for several 2-character constraints.
4297 switch (Constraint[1]) {
4298 default: break;
4299 case 'm':
4300 // 'Ym' is synonymous with 'y'.
Michael Zuckerman849a6a52016-10-31 17:23:52 +00004301 case 'k':
Alexey Bataev91e58602015-07-20 12:08:00 +00004302 return Size <= 64;
4303 case 'i':
4304 case 't':
4305 // 'Yi' and 'Yt' are synonymous with 'x' when SSE2 is enabled.
4306 if (SSELevel >= AVX512F)
4307 return Size <= 512U;
4308 else if (SSELevel >= AVX)
4309 return Size <= 256U;
4310 return SSELevel >= SSE2 && Size <= 128U;
4311 }
4312
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004313 }
4314
4315 return true;
4316}
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00004317
Eli Friedman3fd920a2008-08-20 02:34:37 +00004318std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004319X86TargetInfo::convertConstraint(const char *&Constraint) const {
4320 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004321 case 'a': return std::string("{ax}");
4322 case 'b': return std::string("{bx}");
4323 case 'c': return std::string("{cx}");
4324 case 'd': return std::string("{dx}");
4325 case 'S': return std::string("{si}");
4326 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00004327 case 'p': // address
4328 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00004329 case 't': // top of floating point stack.
4330 return std::string("{st}");
4331 case 'u': // second from top of floating point stack.
4332 return std::string("{st(1)}"); // second from top of floating point stack.
Michael Zuckerman849a6a52016-10-31 17:23:52 +00004333 case 'Y':
4334 switch (Constraint[1]) {
4335 default:
4336 // Break from inner switch and fall through (copy single char),
4337 // continue parsing after copying the current constraint into
4338 // the return string.
4339 break;
4340 case 'k':
4341 // "^" hints llvm that this is a 2 letter constraint.
4342 // "Constraint++" is used to promote the string iterator
4343 // to the next constraint.
4344 return std::string("^") + std::string(Constraint++, 2);
4345 }
4346 LLVM_FALLTHROUGH;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004347 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004348 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00004349 }
4350}
Chris Lattner5ba61f02006-10-14 07:39:34 +00004351
Eli Friedman3fd920a2008-08-20 02:34:37 +00004352// X86-32 generic target
4353class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00004354public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004355 X86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4356 : X86TargetInfo(Triple, Opts) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004357 DoubleAlign = LongLongAlign = 32;
4358 LongDoubleWidth = 96;
4359 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00004360 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00004361 resetDataLayout("e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128");
Eli Friedman32ca82a2009-03-29 20:31:09 +00004362 SizeType = UnsignedInt;
4363 PtrDiffType = SignedInt;
4364 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00004365 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00004366
4367 // Use fpret for all types.
4368 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
4369 (1 << TargetInfo::Double) |
4370 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004371
4372 // x86-32 has atomics up to 8 bytes
4373 // FIXME: Check that we actually have cmpxchg8b before setting
4374 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
4375 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004376 }
Craig Topper3164f332014-03-11 03:39:26 +00004377 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004378 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004379 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004380
Craig Topper3164f332014-03-11 03:39:26 +00004381 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00004382 if (RegNo == 0) return 0;
4383 if (RegNo == 1) return 2;
4384 return -1;
4385 }
Akira Hatanaka974131e2014-09-18 18:17:18 +00004386 bool validateOperandSize(StringRef Constraint,
4387 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00004388 switch (Constraint[0]) {
4389 default: break;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004390 case 'R':
4391 case 'q':
4392 case 'Q':
Bill Wendling887b4852012-11-12 06:42:51 +00004393 case 'a':
4394 case 'b':
4395 case 'c':
4396 case 'd':
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004397 case 'S':
4398 case 'D':
Bill Wendling3c7fed82012-11-12 18:52:32 +00004399 return Size <= 32;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004400 case 'A':
4401 return Size <= 64;
Bill Wendling887b4852012-11-12 06:42:51 +00004402 }
4403
Akira Hatanaka974131e2014-09-18 18:17:18 +00004404 return X86TargetInfo::validateOperandSize(Constraint, Size);
Bill Wendling887b4852012-11-12 06:42:51 +00004405 }
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00004406 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
4407 return llvm::makeArrayRef(BuiltinInfoX86, clang::X86::LastX86CommonBuiltin -
4408 Builtin::FirstTSBuiltin + 1);
4409 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004410};
Eli Friedman3fd920a2008-08-20 02:34:37 +00004411
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004412class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
4413public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004414 NetBSDI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4415 : NetBSDTargetInfo<X86_32TargetInfo>(Triple, Opts) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004416
Craig Topper3164f332014-03-11 03:39:26 +00004417 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00004418 unsigned Major, Minor, Micro;
4419 getTriple().getOSVersion(Major, Minor, Micro);
4420 // New NetBSD uses the default rounding mode.
4421 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
4422 return X86_32TargetInfo::getFloatEvalMethod();
4423 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004424 return 1;
4425 }
4426};
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004427
Eli Friedmane3aa4542009-07-05 18:47:56 +00004428class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
4429public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004430 OpenBSDI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4431 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00004432 SizeType = UnsignedLong;
4433 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004434 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00004435 }
4436};
Eli Friedmane3aa4542009-07-05 18:47:56 +00004437
Eli Friedman9fa28852012-08-08 23:57:20 +00004438class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
4439public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004440 BitrigI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4441 : BitrigTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman9fa28852012-08-08 23:57:20 +00004442 SizeType = UnsignedLong;
4443 IntPtrType = SignedLong;
4444 PtrDiffType = SignedLong;
4445 }
4446};
Eli Friedman9fa28852012-08-08 23:57:20 +00004447
Torok Edwinb2b37c62009-06-30 17:10:35 +00004448class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004449public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004450 DarwinI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4451 : DarwinTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004452 LongDoubleWidth = 128;
4453 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004454 SuitableAlign = 128;
Tim Northover5627d392015-10-30 16:30:45 +00004455 MaxVectorAlign = 256;
4456 // The watchOS simulator uses the builtin bool type for Objective-C.
4457 llvm::Triple T = llvm::Triple(Triple);
4458 if (T.isWatchOS())
4459 UseSignedCharForObjCBool = false;
Eli Friedman32ca82a2009-03-29 20:31:09 +00004460 SizeType = UnsignedLong;
4461 IntPtrType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00004462 resetDataLayout("e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128");
Daniel Dunbarbd606522010-05-27 00:35:16 +00004463 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00004464 }
4465
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004466 bool handleTargetFeatures(std::vector<std::string> &Features,
4467 DiagnosticsEngine &Diags) override {
4468 if (!DarwinTargetInfo<X86_32TargetInfo>::handleTargetFeatures(Features,
4469 Diags))
4470 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004471 // We now know the features we have: we can decide how to align vectors.
4472 MaxVectorAlign =
4473 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004474 return true;
4475 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004476};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004477
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004478// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004479class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004480public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004481 WindowsX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4482 : WindowsTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Chris Lattner46be2e12009-06-24 17:12:15 +00004483 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00004484 DoubleAlign = LongLongAlign = 64;
Reid Kleckner7510c092015-04-01 16:45:06 +00004485 bool IsWinCOFF =
4486 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
James Y Knightb214cbc2016-03-04 19:00:41 +00004487 resetDataLayout(IsWinCOFF
4488 ? "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
4489 : "e-m:e-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32");
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004490 }
Craig Topper3164f332014-03-11 03:39:26 +00004491 void getTargetDefines(const LangOptions &Opts,
4492 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004493 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
4494 }
4495};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004496
4497// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004498class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004499public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004500 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple,
4501 const TargetOptions &Opts)
4502 : WindowsX86_32TargetInfo(Triple, Opts) {
Eli Friedman015d6282011-03-22 21:25:11 +00004503 LongDoubleWidth = LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00004504 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004505 }
Craig Topper3164f332014-03-11 03:39:26 +00004506 void getTargetDefines(const LangOptions &Opts,
4507 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004508 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
4509 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
4510 // The value of the following reflects processor type.
4511 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
4512 // We lost the original triple, so we use the default.
4513 Builder.defineMacro("_M_IX86", "600");
4514 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004515};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004516
David Majnemerae1ed0e2015-05-28 04:36:18 +00004517static void addCygMingDefines(const LangOptions &Opts, MacroBuilder &Builder) {
Eric Christopherb093d692015-10-09 18:39:59 +00004518 // Mingw and cygwin define __declspec(a) to __attribute__((a)). Clang
4519 // supports __declspec natively under -fms-extensions, but we define a no-op
4520 // __declspec macro anyway for pre-processor compatibility.
Reid Kleckner47606832014-04-21 20:58:00 +00004521 if (Opts.MicrosoftExt)
4522 Builder.defineMacro("__declspec", "__declspec");
4523 else
4524 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
4525
4526 if (!Opts.MicrosoftExt) {
4527 // Provide macros for all the calling convention keywords. Provide both
4528 // single and double underscore prefixed variants. These are available on
4529 // x64 as well as x86, even though they have no effect.
4530 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
4531 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00004532 std::string GCCSpelling = "__attribute__((__";
4533 GCCSpelling += CC;
4534 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00004535 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
4536 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
4537 }
4538 }
4539}
4540
David Majnemerae1ed0e2015-05-28 04:36:18 +00004541static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
4542 Builder.defineMacro("__MSVCRT__");
4543 Builder.defineMacro("__MINGW32__");
4544 addCygMingDefines(Opts, Builder);
4545}
4546
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004547// x86-32 MinGW target
4548class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
4549public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004550 MinGWX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4551 : WindowsX86_32TargetInfo(Triple, Opts) {}
Craig Topper3164f332014-03-11 03:39:26 +00004552 void getTargetDefines(const LangOptions &Opts,
4553 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004554 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004555 DefineStd(Builder, "WIN32", Opts);
4556 DefineStd(Builder, "WINNT", Opts);
4557 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00004558 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004559 }
4560};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004561
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004562// x86-32 Cygwin target
4563class CygwinX86_32TargetInfo : public X86_32TargetInfo {
4564public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004565 CygwinX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4566 : X86_32TargetInfo(Triple, Opts) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004567 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004568 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00004569 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 +00004570 }
Craig Topper3164f332014-03-11 03:39:26 +00004571 void getTargetDefines(const LangOptions &Opts,
4572 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004573 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00004574 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004575 Builder.defineMacro("__CYGWIN__");
4576 Builder.defineMacro("__CYGWIN32__");
David Majnemerae1ed0e2015-05-28 04:36:18 +00004577 addCygMingDefines(Opts, Builder);
Saleem Abdulrasool56027092017-02-07 19:00:06 +00004578 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00004579 if (Opts.CPlusPlus)
4580 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00004581 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004582};
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004583
Chris Lattnerb986aba2010-04-11 19:29:39 +00004584// x86-32 Haiku target
Reid Kleckner330fb172016-05-11 16:19:05 +00004585class HaikuX86_32TargetInfo : public HaikuTargetInfo<X86_32TargetInfo> {
Chris Lattnerb986aba2010-04-11 19:29:39 +00004586public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004587 HaikuX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Reid Kleckner330fb172016-05-11 16:19:05 +00004588 : HaikuTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman04831922010-08-22 01:00:03 +00004589 }
Craig Topper3164f332014-03-11 03:39:26 +00004590 void getTargetDefines(const LangOptions &Opts,
4591 MacroBuilder &Builder) const override {
Reid Kleckner330fb172016-05-11 16:19:05 +00004592 HaikuTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
Chris Lattnerb986aba2010-04-11 19:29:39 +00004593 Builder.defineMacro("__INTEL__");
Chris Lattnerb986aba2010-04-11 19:29:39 +00004594 }
4595};
Chris Lattnerb986aba2010-04-11 19:29:39 +00004596
Alexey Bataevc99b0492015-11-25 09:24:26 +00004597// X86-32 MCU target
4598class MCUX86_32TargetInfo : public X86_32TargetInfo {
4599public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004600 MCUX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4601 : X86_32TargetInfo(Triple, Opts) {
Alexey Bataevc99b0492015-11-25 09:24:26 +00004602 LongDoubleWidth = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00004603 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
James Y Knightb214cbc2016-03-04 19:00:41 +00004604 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 +00004605 WIntType = UnsignedInt;
Alexey Bataevc99b0492015-11-25 09:24:26 +00004606 }
4607
4608 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
4609 // On MCU we support only C calling convention.
4610 return CC == CC_C ? CCCR_OK : CCCR_Warning;
4611 }
4612
4613 void getTargetDefines(const LangOptions &Opts,
4614 MacroBuilder &Builder) const override {
4615 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4616 Builder.defineMacro("__iamcu");
4617 Builder.defineMacro("__iamcu__");
4618 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00004619
4620 bool allowsLargerPreferedTypeAlignment() const override {
4621 return false;
4622 }
Alexey Bataevc99b0492015-11-25 09:24:26 +00004623};
4624
Douglas Gregor9fabd852011-07-01 22:41:14 +00004625// RTEMS Target
4626template<typename Target>
4627class RTEMSTargetInfo : public OSTargetInfo<Target> {
4628protected:
Craig Topper3164f332014-03-11 03:39:26 +00004629 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4630 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004631 // RTEMS defines; list based off of gcc output
4632
Douglas Gregor9fabd852011-07-01 22:41:14 +00004633 Builder.defineMacro("__rtems__");
4634 Builder.defineMacro("__ELF__");
4635 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004636
Douglas Gregor9fabd852011-07-01 22:41:14 +00004637public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004638 RTEMSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4639 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004640 switch (Triple.getArch()) {
4641 default:
4642 case llvm::Triple::x86:
4643 // this->MCountName = ".mcount";
4644 break;
4645 case llvm::Triple::mips:
4646 case llvm::Triple::mipsel:
4647 case llvm::Triple::ppc:
4648 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00004649 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004650 // this->MCountName = "_mcount";
4651 break;
4652 case llvm::Triple::arm:
4653 // this->MCountName = "__mcount";
4654 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004655 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004656 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00004657};
4658
Douglas Gregor9fabd852011-07-01 22:41:14 +00004659// x86-32 RTEMS target
4660class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
4661public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004662 RTEMSX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4663 : X86_32TargetInfo(Triple, Opts) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004664 SizeType = UnsignedLong;
4665 IntPtrType = SignedLong;
4666 PtrDiffType = SignedLong;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004667 }
Craig Topper3164f332014-03-11 03:39:26 +00004668 void getTargetDefines(const LangOptions &Opts,
4669 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004670 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4671 Builder.defineMacro("__INTEL__");
4672 Builder.defineMacro("__rtems__");
4673 }
4674};
Douglas Gregor9fabd852011-07-01 22:41:14 +00004675
Eli Friedman3fd920a2008-08-20 02:34:37 +00004676// x86-64 generic target
4677class X86_64TargetInfo : public X86TargetInfo {
4678public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004679 X86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4680 : X86TargetInfo(Triple, Opts) {
David Blaikie40f842d2014-07-10 18:46:15 +00004681 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
David Majnemer8fa8c382015-03-17 23:55:00 +00004682 bool IsWinCOFF =
4683 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Zinovy Nis1db95732014-07-10 15:27:19 +00004684 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00004685 LongDoubleWidth = 128;
4686 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00004687 LargeArrayMinWidth = 128;
4688 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004689 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00004690 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
4691 PtrDiffType = IsX32 ? SignedInt : SignedLong;
4692 IntPtrType = IsX32 ? SignedInt : SignedLong;
4693 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00004694 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00004695 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00004696
Eric Christopher917e9522014-11-18 22:36:15 +00004697 // Pointers are 32-bit in x32.
Eric Christopherf6ee1f32017-02-10 04:35:21 +00004698 resetDataLayout(IsX32
4699 ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128"
4700 : IsWinCOFF ? "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
4701 : "e-m:e-i64:64-f80:128-n8:16:32:64-S128");
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00004702
4703 // Use fpret only for long double.
4704 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004705
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00004706 // Use fp2ret for _Complex long double.
4707 ComplexLongDoubleUsesFP2Ret = true;
4708
Charles Davisc7d5c942015-09-17 20:55:33 +00004709 // Make __builtin_ms_va_list available.
4710 HasBuiltinMSVaList = true;
4711
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004712 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004713 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00004714 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00004715 }
Craig Topper3164f332014-03-11 03:39:26 +00004716 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004717 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00004718 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004719
Craig Topper3164f332014-03-11 03:39:26 +00004720 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00004721 if (RegNo == 0) return 0;
4722 if (RegNo == 1) return 1;
4723 return -1;
4724 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004725
Craig Topper3164f332014-03-11 03:39:26 +00004726 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00004727 switch (CC) {
4728 case CC_C:
4729 case CC_Swift:
4730 case CC_X86VectorCall:
4731 case CC_IntelOclBicc:
4732 case CC_X86_64Win64:
Roman Levenstein35aa5ce2016-03-16 18:00:46 +00004733 case CC_PreserveMost:
4734 case CC_PreserveAll:
Erich Keane757d3172016-11-02 18:29:35 +00004735 case CC_X86RegCall:
John McCall477f2bb2016-03-03 06:39:32 +00004736 return CCCR_OK;
4737 default:
4738 return CCCR_Warning;
4739 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004740 }
4741
Craig Topper3164f332014-03-11 03:39:26 +00004742 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00004743 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004744 }
4745
Pavel Chupinfd223e12014-08-04 12:39:43 +00004746 // for x32 we need it here explicitly
4747 bool hasInt128Type() const override { return true; }
Reid Klecknerf27e7522016-02-01 18:58:24 +00004748 unsigned getUnwindWordWidth() const override { return 64; }
4749 unsigned getRegisterWidth() const override { return 64; }
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00004750
4751 bool validateGlobalRegisterVariable(StringRef RegName,
4752 unsigned RegSize,
4753 bool &HasSizeMismatch) const override {
4754 // rsp and rbp are the only 64-bit registers the x86 backend can currently
4755 // handle.
4756 if (RegName.equals("rsp") || RegName.equals("rbp")) {
4757 // Check that the register size is 64-bit.
4758 HasSizeMismatch = RegSize != 64;
4759 return true;
4760 }
4761
4762 // Check if the register is a 32-bit register the backend can handle.
4763 return X86TargetInfo::validateGlobalRegisterVariable(RegName, RegSize,
4764 HasSizeMismatch);
4765 }
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00004766 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
4767 return llvm::makeArrayRef(BuiltinInfoX86,
4768 X86::LastTSBuiltin - Builtin::FirstTSBuiltin);
4769 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004770};
Eli Friedman3fd920a2008-08-20 02:34:37 +00004771
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004772// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004773class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004774public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004775 WindowsX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4776 : WindowsTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004777 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00004778 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004779 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004780 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004781 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00004782 SizeType = UnsignedLongLong;
4783 PtrDiffType = SignedLongLong;
4784 IntPtrType = SignedLongLong;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004785 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004786
Craig Topper3164f332014-03-11 03:39:26 +00004787 void getTargetDefines(const LangOptions &Opts,
4788 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004789 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004790 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004791 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004792
Craig Topper3164f332014-03-11 03:39:26 +00004793 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004794 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00004795 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004796
Craig Topper3164f332014-03-11 03:39:26 +00004797 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004798 switch (CC) {
4799 case CC_X86StdCall:
4800 case CC_X86ThisCall:
4801 case CC_X86FastCall:
4802 return CCCR_Ignore;
4803 case CC_C:
4804 case CC_X86VectorCall:
4805 case CC_IntelOclBicc:
4806 case CC_X86_64SysV:
Arnold Schwaighofer4fc955e2016-10-12 18:59:24 +00004807 case CC_Swift:
Erich Keane757d3172016-11-02 18:29:35 +00004808 case CC_X86RegCall:
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004809 return CCCR_OK;
4810 default:
4811 return CCCR_Warning;
4812 }
Charles Davisb5a214e2013-08-30 04:39:01 +00004813 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004814};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004815
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004816// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004817class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004818public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004819 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple,
4820 const TargetOptions &Opts)
4821 : WindowsX86_64TargetInfo(Triple, Opts) {
Eli Friedman015d6282011-03-22 21:25:11 +00004822 LongDoubleWidth = LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00004823 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004824 }
Craig Topper3164f332014-03-11 03:39:26 +00004825 void getTargetDefines(const LangOptions &Opts,
4826 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004827 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
4828 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
David Majnemerb856e8f2015-07-26 23:17:29 +00004829 Builder.defineMacro("_M_X64", "100");
4830 Builder.defineMacro("_M_AMD64", "100");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004831 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004832};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004833
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004834// x86-64 MinGW target
4835class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
4836public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004837 MinGWX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4838 : WindowsX86_64TargetInfo(Triple, Opts) {
Reid Kleckner11a17192015-10-28 22:29:52 +00004839 // Mingw64 rounds long double size and alignment up to 16 bytes, but sticks
4840 // with x86 FP ops. Weird.
4841 LongDoubleWidth = LongDoubleAlign = 128;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00004842 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended();
Reid Kleckner11a17192015-10-28 22:29:52 +00004843 }
4844
Craig Topper3164f332014-03-11 03:39:26 +00004845 void getTargetDefines(const LangOptions &Opts,
4846 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004847 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004848 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004849 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00004850 addMinGWDefines(Opts, Builder);
Reid Klecknere070b992014-11-14 02:01:10 +00004851
4852 // GCC defines this macro when it is using __gxx_personality_seh0.
4853 if (!Opts.SjLjExceptions)
4854 Builder.defineMacro("__SEH__");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004855 }
4856};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004857
Yaron Kerend030d112015-07-22 17:38:19 +00004858// x86-64 Cygwin target
4859class CygwinX86_64TargetInfo : public X86_64TargetInfo {
4860public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004861 CygwinX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4862 : X86_64TargetInfo(Triple, Opts) {
Yaron Kerend030d112015-07-22 17:38:19 +00004863 TLSSupported = false;
4864 WCharType = UnsignedShort;
4865 }
4866 void getTargetDefines(const LangOptions &Opts,
4867 MacroBuilder &Builder) const override {
4868 X86_64TargetInfo::getTargetDefines(Opts, Builder);
4869 Builder.defineMacro("__x86_64__");
4870 Builder.defineMacro("__CYGWIN__");
4871 Builder.defineMacro("__CYGWIN64__");
4872 addCygMingDefines(Opts, Builder);
Saleem Abdulrasool56027092017-02-07 19:00:06 +00004873 DefineStd(Builder, "unix", Opts);
Yaron Kerend030d112015-07-22 17:38:19 +00004874 if (Opts.CPlusPlus)
4875 Builder.defineMacro("_GNU_SOURCE");
4876
4877 // GCC defines this macro when it is using __gxx_personality_seh0.
4878 if (!Opts.SjLjExceptions)
4879 Builder.defineMacro("__SEH__");
4880 }
4881};
4882
Eli Friedman2857ccb2009-07-01 03:36:11 +00004883class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
4884public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004885 DarwinX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4886 : DarwinTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00004887 Int64Type = SignedLongLong;
Tim Northovera2ee4332014-03-29 15:09:45 +00004888 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
4889 llvm::Triple T = llvm::Triple(Triple);
Bob Wilson946c04c2014-10-19 02:19:27 +00004890 if (T.isiOS())
Tim Northovera2ee4332014-03-29 15:09:45 +00004891 UseSignedCharForObjCBool = false;
James Y Knightb214cbc2016-03-04 19:00:41 +00004892 resetDataLayout("e-m:o-i64:64-f80:128-n8:16:32:64-S128");
Eli Friedman2857ccb2009-07-01 03:36:11 +00004893 }
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004894
4895 bool handleTargetFeatures(std::vector<std::string> &Features,
4896 DiagnosticsEngine &Diags) override {
4897 if (!DarwinTargetInfo<X86_64TargetInfo>::handleTargetFeatures(Features,
4898 Diags))
4899 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004900 // We now know the features we have: we can decide how to align vectors.
4901 MaxVectorAlign =
4902 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004903 return true;
4904 }
Eli Friedman2857ccb2009-07-01 03:36:11 +00004905};
Eli Friedman2857ccb2009-07-01 03:36:11 +00004906
Eli Friedman245f2292009-07-05 22:31:18 +00004907class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
4908public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004909 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4910 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Eli Friedman245f2292009-07-05 22:31:18 +00004911 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004912 Int64Type = SignedLongLong;
4913 }
4914};
Eli Friedman245f2292009-07-05 22:31:18 +00004915
Eli Friedman9fa28852012-08-08 23:57:20 +00004916class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
4917public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004918 BitrigX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4919 : BitrigTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004920 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004921 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00004922 }
4923};
Tim Northover9bb857a2013-01-31 12:13:10 +00004924
Eli Friedmanf05b7722008-08-20 07:44:10 +00004925class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004926 // Possible FPU choices.
4927 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004928 VFP2FPU = (1 << 0),
4929 VFP3FPU = (1 << 1),
4930 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00004931 NeonFPU = (1 << 3),
4932 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004933 };
4934
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004935 // Possible HWDiv features.
4936 enum HWDivMode {
4937 HWDivThumb = (1 << 0),
4938 HWDivARM = (1 << 1)
4939 };
4940
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004941 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004942 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004943 }
4944
4945 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4946 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004947
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004948 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004949
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004950 StringRef CPUProfile;
4951 StringRef CPUAttr;
4952
Rafael Espindolaeb265472013-08-21 21:59:03 +00004953 enum {
4954 FP_Default,
4955 FP_VFP,
4956 FP_Neon
4957 } FPMath;
4958
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004959 unsigned ArchISA;
Renato Goline84b0002015-10-08 16:43:26 +00004960 unsigned ArchKind = llvm::ARM::AK_ARMV4T;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004961 unsigned ArchProfile;
4962 unsigned ArchVersion;
4963
Bernard Ogdenda13af32013-10-24 18:32:51 +00004964 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004965
Logan Chien57086ce2012-10-10 06:56:20 +00004966 unsigned IsAAPCS : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004967 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004968
4969 // Initialized via features.
4970 unsigned SoftFloat : 1;
4971 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004972
Bernard Ogden18b57012013-10-29 09:47:51 +00004973 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00004974 unsigned Crypto : 1;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004975 unsigned DSP : 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004976 unsigned Unaligned : 1;
4977
4978 enum {
4979 LDREX_B = (1 << 0), /// byte (8-bit)
4980 LDREX_H = (1 << 1), /// half (16-bit)
4981 LDREX_W = (1 << 2), /// word (32-bit)
4982 LDREX_D = (1 << 3), /// double (64-bit)
4983 };
4984
4985 uint32_t LDREX;
Bernard Ogden18b57012013-10-29 09:47:51 +00004986
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004987 // ACLE 6.5.1 Hardware floating point
4988 enum {
4989 HW_FP_HP = (1 << 1), /// half (16-bit)
4990 HW_FP_SP = (1 << 2), /// single (32-bit)
4991 HW_FP_DP = (1 << 3), /// double (64-bit)
4992 };
4993 uint32_t HW_FP;
4994
Chris Lattner5cc15e02010-03-03 19:03:45 +00004995 static const Builtin::Info BuiltinInfo[];
4996
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004997 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004998 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004999
5000 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00005001 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00005002
Renato Golin0201a9e2016-09-22 19:28:20 +00005003 // size_t is unsigned long on MachO-derived environments, NetBSD,
5004 // OpenBSD and Bitrig.
Renato Golin9ba39232015-02-27 16:35:48 +00005005 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD ||
Renato Golin0201a9e2016-09-22 19:28:20 +00005006 T.getOS() == llvm::Triple::OpenBSD ||
Renato Golin9ba39232015-02-27 16:35:48 +00005007 T.getOS() == llvm::Triple::Bitrig)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00005008 SizeType = UnsignedLong;
5009 else
5010 SizeType = UnsignedInt;
5011
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00005012 switch (T.getOS()) {
5013 case llvm::Triple::NetBSD:
Renato Golin0201a9e2016-09-22 19:28:20 +00005014 case llvm::Triple::OpenBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00005015 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00005016 break;
5017 case llvm::Triple::Win32:
5018 WCharType = UnsignedShort;
5019 break;
5020 case llvm::Triple::Linux:
5021 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00005022 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
5023 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00005024 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00005025 }
5026
5027 UseBitFieldTypeAlignment = true;
5028
5029 ZeroLengthBitfieldBoundary = 0;
5030
Tim Northover147cd2f2014-10-14 22:12:21 +00005031 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
5032 // so set preferred for small types to 32.
5033 if (T.isOSBinFormatMachO()) {
James Y Knightb214cbc2016-03-04 19:00:41 +00005034 resetDataLayout(BigEndian
5035 ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
5036 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Tim Northover147cd2f2014-10-14 22:12:21 +00005037 } else if (T.isOSWindows()) {
Tim Northover147cd2f2014-10-14 22:12:21 +00005038 assert(!BigEndian && "Windows on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00005039 resetDataLayout("e"
5040 "-m:w"
5041 "-p:32:32"
5042 "-i64:64"
5043 "-v128:64:128"
5044 "-a:0:32"
5045 "-n32"
5046 "-S64");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00005047 } else if (T.isOSNaCl()) {
5048 assert(!BigEndian && "NaCl on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00005049 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00005050 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00005051 resetDataLayout(BigEndian
5052 ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
5053 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00005054 }
5055
5056 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00005057 }
5058
Tim Northover5627d392015-10-30 16:30:45 +00005059 void setABIAPCS(bool IsAAPCS16) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00005060 const llvm::Triple &T = getTriple();
5061
Rafael Espindolaafa854c2013-12-18 20:24:51 +00005062 IsAAPCS = false;
5063
Tim Northover5627d392015-10-30 16:30:45 +00005064 if (IsAAPCS16)
5065 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
5066 else
5067 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00005068
Rafael Espindolad6c2b722013-12-18 19:47:32 +00005069 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00005070 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00005071 SizeType = UnsignedInt;
5072 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00005073 SizeType = UnsignedLong;
5074
5075 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
5076 WCharType = SignedInt;
5077
5078 // Do not respect the alignment of bit-field types when laying out
5079 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
5080 UseBitFieldTypeAlignment = false;
5081
5082 /// gcc forces the alignment to 4 bytes, regardless of the type of the
5083 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
5084 /// gcc.
5085 ZeroLengthBitfieldBoundary = 32;
5086
Tim Northover5627d392015-10-30 16:30:45 +00005087 if (T.isOSBinFormatMachO() && IsAAPCS16) {
5088 assert(!BigEndian && "AAPCS16 does not support big-endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00005089 resetDataLayout("e-m:o-p:32:32-i64:64-a:0:32-n32-S128");
Tim Northover5627d392015-10-30 16:30:45 +00005090 } else if (T.isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00005091 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00005092 BigEndian
5093 ? "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 +00005094 : "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 +00005095 else
James Y Knightb214cbc2016-03-04 19:00:41 +00005096 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00005097 BigEndian
5098 ? "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 +00005099 : "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 +00005100
5101 // FIXME: Override "preferred align" for double and long long.
5102 }
5103
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005104 void setArchInfo() {
5105 StringRef ArchName = getTriple().getArchName();
5106
Renato Goline84b0002015-10-08 16:43:26 +00005107 ArchISA = llvm::ARM::parseArchISA(ArchName);
5108 CPU = llvm::ARM::getDefaultCPU(ArchName);
5109 unsigned AK = llvm::ARM::parseArch(ArchName);
5110 if (AK != llvm::ARM::AK_INVALID)
5111 ArchKind = AK;
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005112 setArchInfo(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005113 }
5114
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005115 void setArchInfo(unsigned Kind) {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005116 StringRef SubArch;
5117
5118 // cache TargetParser info
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005119 ArchKind = Kind;
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00005120 SubArch = llvm::ARM::getSubArch(ArchKind);
5121 ArchProfile = llvm::ARM::parseArchProfile(SubArch);
5122 ArchVersion = llvm::ARM::parseArchVersion(SubArch);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005123
5124 // cache CPU related strings
5125 CPUAttr = getCPUAttr();
5126 CPUProfile = getCPUProfile();
5127 }
5128
5129 void setAtomic() {
Eric Christopherb093d692015-10-09 18:39:59 +00005130 // when triple does not specify a sub arch,
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005131 // then we are not using inline atomics
Renato Goline84b0002015-10-08 16:43:26 +00005132 bool ShouldUseInlineAtomic =
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005133 (ArchISA == llvm::ARM::IK_ARM && ArchVersion >= 6) ||
5134 (ArchISA == llvm::ARM::IK_THUMB && ArchVersion >= 7);
Eric Christopherb093d692015-10-09 18:39:59 +00005135 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005136 if (ArchProfile == llvm::ARM::PK_M) {
5137 MaxAtomicPromoteWidth = 32;
5138 if (ShouldUseInlineAtomic)
5139 MaxAtomicInlineWidth = 32;
5140 }
5141 else {
5142 MaxAtomicPromoteWidth = 64;
5143 if (ShouldUseInlineAtomic)
5144 MaxAtomicInlineWidth = 64;
Eric Christopherb093d692015-10-09 18:39:59 +00005145 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005146 }
5147
5148 bool isThumb() const {
5149 return (ArchISA == llvm::ARM::IK_THUMB);
5150 }
5151
5152 bool supportsThumb() const {
5153 return CPUAttr.count('T') || ArchVersion >= 6;
5154 }
5155
5156 bool supportsThumb2() const {
Bradley Smithf4affc12016-03-03 13:52:22 +00005157 return CPUAttr.equals("6T2") ||
5158 (ArchVersion >= 7 && !CPUAttr.equals("8M_BASE"));
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005159 }
5160
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005161 StringRef getCPUAttr() const {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005162 // For most sub-arches, the build attribute CPU name is enough.
5163 // For Cortex variants, it's slightly different.
5164 switch(ArchKind) {
5165 default:
Chandler Carruthd96f37a2015-08-30 07:51:18 +00005166 return llvm::ARM::getCPUAttr(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005167 case llvm::ARM::AK_ARMV6M:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005168 return "6M";
Tim Northover525c73c2015-07-21 21:47:33 +00005169 case llvm::ARM::AK_ARMV7S:
5170 return "7S";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005171 case llvm::ARM::AK_ARMV7A:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005172 return "7A";
5173 case llvm::ARM::AK_ARMV7R:
5174 return "7R";
5175 case llvm::ARM::AK_ARMV7M:
5176 return "7M";
5177 case llvm::ARM::AK_ARMV7EM:
5178 return "7EM";
George Burgess IVfc970562017-02-09 23:30:10 +00005179 case llvm::ARM::AK_ARMV7VE:
5180 return "7VE";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005181 case llvm::ARM::AK_ARMV8A:
5182 return "8A";
5183 case llvm::ARM::AK_ARMV8_1A:
5184 return "8_1A";
Oliver Stannard3086c042016-02-11 16:05:52 +00005185 case llvm::ARM::AK_ARMV8_2A:
5186 return "8_2A";
Bradley Smithf4affc12016-03-03 13:52:22 +00005187 case llvm::ARM::AK_ARMV8MBaseline:
5188 return "8M_BASE";
5189 case llvm::ARM::AK_ARMV8MMainline:
5190 return "8M_MAIN";
Javed Absar00b74442016-10-07 12:08:41 +00005191 case llvm::ARM::AK_ARMV8R:
5192 return "8R";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005193 }
5194 }
5195
5196 StringRef getCPUProfile() const {
5197 switch(ArchProfile) {
5198 case llvm::ARM::PK_A:
5199 return "A";
5200 case llvm::ARM::PK_R:
5201 return "R";
5202 case llvm::ARM::PK_M:
5203 return "M";
5204 default:
5205 return "";
5206 }
5207 }
5208
Chris Lattner17df24e2008-04-21 18:56:49 +00005209public:
Matt Arsenaultf333de32016-09-07 07:08:02 +00005210 ARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005211 : TargetInfo(Triple), FPMath(FP_Default), IsAAPCS(true), LDREX(0),
5212 HW_FP(0) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005213
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00005214 switch (getTriple().getOS()) {
5215 case llvm::Triple::NetBSD:
Renato Golin0201a9e2016-09-22 19:28:20 +00005216 case llvm::Triple::OpenBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00005217 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00005218 break;
5219 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00005220 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00005221 break;
5222 }
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00005223
Renato Goline84b0002015-10-08 16:43:26 +00005224 // Cache arch related info.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005225 setArchInfo();
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00005226
Chris Lattner1a8f3942010-04-23 16:29:58 +00005227 // {} in inline assembly are neon specifiers, not assembly variant
5228 // specifiers.
5229 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005230
Eric Christopher0e261882014-12-05 01:06:59 +00005231 // FIXME: This duplicates code from the driver that sets the -target-abi
5232 // option - this code is used if -target-abi isn't passed and should
5233 // be unified in some way.
5234 if (Triple.isOSBinFormatMachO()) {
5235 // The backend is hardwired to assume AAPCS for M-class processors, ensure
5236 // the frontend matches that.
5237 if (Triple.getEnvironment() == llvm::Triple::EABI ||
5238 Triple.getOS() == llvm::Triple::UnknownOS ||
Zijiao Ma56a83722016-08-17 02:13:33 +00005239 ArchProfile == llvm::ARM::PK_M) {
Eric Christopher0e261882014-12-05 01:06:59 +00005240 setABI("aapcs");
Tim Northoverd88ecb32016-01-27 19:32:40 +00005241 } else if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00005242 setABI("aapcs16");
Eric Christopher0e261882014-12-05 01:06:59 +00005243 } else {
5244 setABI("apcs-gnu");
5245 }
5246 } else if (Triple.isOSWindows()) {
5247 // FIXME: this is invalid for WindowsCE
5248 setABI("aapcs");
5249 } else {
5250 // Select the default based on the platform.
5251 switch (Triple.getEnvironment()) {
5252 case llvm::Triple::Android:
5253 case llvm::Triple::GNUEABI:
5254 case llvm::Triple::GNUEABIHF:
Rafael Espindola0fa66802016-06-24 21:35:06 +00005255 case llvm::Triple::MuslEABI:
5256 case llvm::Triple::MuslEABIHF:
Eric Christopher0e261882014-12-05 01:06:59 +00005257 setABI("aapcs-linux");
5258 break;
5259 case llvm::Triple::EABIHF:
5260 case llvm::Triple::EABI:
5261 setABI("aapcs");
5262 break;
Eric Christopher560cc4f2014-12-18 02:08:55 +00005263 case llvm::Triple::GNU:
Renato Goline84b0002015-10-08 16:43:26 +00005264 setABI("apcs-gnu");
5265 break;
Eric Christopher0e261882014-12-05 01:06:59 +00005266 default:
5267 if (Triple.getOS() == llvm::Triple::NetBSD)
5268 setABI("apcs-gnu");
Brad Smith3d648b32017-02-28 03:20:26 +00005269 else if (Triple.getOS() == llvm::Triple::OpenBSD)
5270 setABI("aapcs-linux");
Eric Christopher0e261882014-12-05 01:06:59 +00005271 else
5272 setABI("aapcs");
5273 break;
5274 }
5275 }
John McCall86353412010-08-21 22:46:04 +00005276
5277 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00005278 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005279
Renato Golin15b86152015-07-03 16:41:13 +00005280 // ARM has atomics up to 8 bytes
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005281 setAtomic();
Rafael Espindola5ab8e2e2015-07-02 15:14:10 +00005282
James Molloya7139222012-03-12 09:14:10 +00005283 // Do force alignment of members that follow zero length bitfields. If
Eric Christopher917e9522014-11-18 22:36:15 +00005284 // the alignment of the zero-length bitfield is greater than the member
5285 // that follows it, `bar', `bar' will be aligned as the type of the
James Molloya7139222012-03-12 09:14:10 +00005286 // zero length bitfield.
5287 UseZeroLengthBitfieldAlignment = true;
Saleem Abdulrasool9b5ba542016-04-10 03:19:47 +00005288
5289 if (Triple.getOS() == llvm::Triple::Linux ||
5290 Triple.getOS() == llvm::Triple::UnknownOS)
5291 this->MCountName =
5292 Opts.EABIVersion == "gnu" ? "\01__gnu_mcount_nc" : "\01mcount";
Eli Friedmanb5366062008-05-20 14:21:01 +00005293 }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00005294
Alp Toker4925ba72014-06-07 23:30:42 +00005295 StringRef getABI() const override { return ABI; }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00005296
Craig Topper3164f332014-03-11 03:39:26 +00005297 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00005298 ABI = Name;
5299
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00005300 // The defaults (above) are for AAPCS, check if we need to change them.
5301 //
5302 // FIXME: We need support for -meabi... we could just mangle it into the
5303 // name.
Tim Northover756447a2015-10-30 16:30:36 +00005304 if (Name == "apcs-gnu" || Name == "aapcs16") {
Tim Northover5627d392015-10-30 16:30:45 +00005305 setABIAPCS(Name == "aapcs16");
Rafael Espindolad6c2b722013-12-18 19:47:32 +00005306 return true;
5307 }
5308 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
5309 setABIAAPCS();
5310 return true;
5311 }
5312 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00005313 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00005314
Renato Golinf5c4dec2015-05-27 13:33:00 +00005315 // FIXME: This should be based on Arch attributes, not CPU names.
Eric Christopher8c47b422015-10-09 18:39:55 +00005316 bool
5317 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
5318 StringRef CPU,
5319 const std::vector<std::string> &FeaturesVec) const override {
5320
Mehdi Aminia0016ec2016-10-07 08:37:29 +00005321 std::vector<StringRef> TargetFeatures;
Bradley Smithb3501962015-11-16 11:16:36 +00005322 unsigned Arch = llvm::ARM::parseArch(getTriple().getArchName());
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005323
5324 // get default FPU features
Bradley Smithb3501962015-11-16 11:16:36 +00005325 unsigned FPUKind = llvm::ARM::getDefaultFPU(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005326 llvm::ARM::getFPUFeatures(FPUKind, TargetFeatures);
5327
5328 // get default Extension features
Bradley Smithb3501962015-11-16 11:16:36 +00005329 unsigned Extensions = llvm::ARM::getDefaultExtensions(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005330 llvm::ARM::getExtensionFeatures(Extensions, TargetFeatures);
5331
Mehdi Aminia0016ec2016-10-07 08:37:29 +00005332 for (auto Feature : TargetFeatures)
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005333 if (Feature[0] == '+')
Mehdi Aminia0016ec2016-10-07 08:37:29 +00005334 Features[Feature.drop_front(1)] = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005335
Eric Christopher007b0a02015-08-28 22:32:01 +00005336 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005337 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005338
Craig Topper3164f332014-03-11 03:39:26 +00005339 bool handleTargetFeatures(std::vector<std::string> &Features,
5340 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005341 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00005342 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00005343 Crypto = 0;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005344 DSP = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005345 Unaligned = 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005346 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005347 HWDiv = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005348
Ranjeet Singhac08e532015-06-24 23:39:25 +00005349 // This does not diagnose illegal cases like having both
5350 // "+vfpv2" and "+vfpv3" or having "+neon" and "+fp-only-sp".
5351 uint32_t HW_FP_remove = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005352 for (const auto &Feature : Features) {
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005353 if (Feature == "+soft-float") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00005354 SoftFloat = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005355 } else if (Feature == "+soft-float-abi") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00005356 SoftFloatABI = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005357 } else if (Feature == "+vfp2") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005358 FPU |= VFP2FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005359 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005360 } else if (Feature == "+vfp3") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005361 FPU |= VFP3FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005362 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005363 } else if (Feature == "+vfp4") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005364 FPU |= VFP4FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005365 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005366 } else if (Feature == "+fp-armv8") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00005367 FPU |= FPARMV8;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005368 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005369 } else if (Feature == "+neon") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005370 FPU |= NeonFPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005371 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005372 } else if (Feature == "+hwdiv") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005373 HWDiv |= HWDivThumb;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005374 } else if (Feature == "+hwdiv-arm") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005375 HWDiv |= HWDivARM;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005376 } else if (Feature == "+crc") {
Bernard Ogden18b57012013-10-29 09:47:51 +00005377 CRC = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005378 } else if (Feature == "+crypto") {
Tim Northover02e38602014-02-03 17:28:04 +00005379 Crypto = 1;
Artyom Skrobov05d85ae2015-10-23 17:19:02 +00005380 } else if (Feature == "+dsp") {
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005381 DSP = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005382 } else if (Feature == "+fp-only-sp") {
Matt Arsenault250024f2016-06-08 01:56:42 +00005383 HW_FP_remove |= HW_FP_DP;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005384 } else if (Feature == "+strict-align") {
5385 Unaligned = 0;
5386 } else if (Feature == "+fp16") {
5387 HW_FP |= HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005388 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00005389 }
Ranjeet Singhac08e532015-06-24 23:39:25 +00005390 HW_FP &= ~HW_FP_remove;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005391
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005392 switch (ArchVersion) {
5393 case 6:
5394 if (ArchProfile == llvm::ARM::PK_M)
5395 LDREX = 0;
5396 else if (ArchKind == llvm::ARM::AK_ARMV6K)
5397 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5398 else
5399 LDREX = LDREX_W;
5400 break;
5401 case 7:
5402 if (ArchProfile == llvm::ARM::PK_M)
5403 LDREX = LDREX_W | LDREX_H | LDREX_B ;
5404 else
5405 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5406 break;
5407 case 8:
5408 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5409 }
5410
Rafael Espindolaeb265472013-08-21 21:59:03 +00005411 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
5412 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
5413 return false;
5414 }
5415
5416 if (FPMath == FP_Neon)
5417 Features.push_back("+neonfp");
5418 else if (FPMath == FP_VFP)
5419 Features.push_back("-neonfp");
5420
Daniel Dunbar893d4752009-12-19 04:15:38 +00005421 // Remove front-end specific options which the backend handles differently.
Eric Christopher9e172d22015-05-12 01:26:21 +00005422 auto Feature =
5423 std::find(Features.begin(), Features.end(), "+soft-float-abi");
5424 if (Feature != Features.end())
5425 Features.erase(Feature);
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005426
Rafael Espindolaeb265472013-08-21 21:59:03 +00005427 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005428 }
5429
Craig Topper3164f332014-03-11 03:39:26 +00005430 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005431 return llvm::StringSwitch<bool>(Feature)
5432 .Case("arm", true)
Ben Langmuir587aeaf2015-08-07 01:59:56 +00005433 .Case("aarch32", true)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005434 .Case("softfloat", SoftFloat)
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005435 .Case("thumb", isThumb())
Amara Emerson8c3de542013-09-16 18:07:35 +00005436 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005437 .Case("hwdiv", HWDiv & HWDivThumb)
5438 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005439 .Default(false);
5440 }
Renato Golin15b86152015-07-03 16:41:13 +00005441
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005442 bool setCPU(const std::string &Name) override {
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005443 if (Name != "generic")
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00005444 setArchInfo(llvm::ARM::parseCPUArch(Name));
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005445
Renato Golin15b86152015-07-03 16:41:13 +00005446 if (ArchKind == llvm::ARM::AK_INVALID)
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005447 return false;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005448 setAtomic();
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005449 CPU = Name;
5450 return true;
5451 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005452
Craig Topper3164f332014-03-11 03:39:26 +00005453 bool setFPMath(StringRef Name) override;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005454
Craig Topper3164f332014-03-11 03:39:26 +00005455 void getTargetDefines(const LangOptions &Opts,
5456 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00005457 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005458 Builder.defineMacro("__arm");
5459 Builder.defineMacro("__arm__");
Weiming Zhaob0613132016-04-18 16:25:46 +00005460 // For bare-metal none-eabi.
5461 if (getTriple().getOS() == llvm::Triple::UnknownOS &&
5462 getTriple().getEnvironment() == llvm::Triple::EABI)
5463 Builder.defineMacro("__ELF__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00005464
Chris Lattnerecd49032009-03-02 22:27:17 +00005465 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005466 Builder.defineMacro("__REGISTER_PREFIX__", "");
Tim Northover5627d392015-10-30 16:30:45 +00005467
5468 // Unfortunately, __ARM_ARCH_7K__ is now more of an ABI descriptor. The CPU
5469 // happens to be Cortex-A7 though, so it should still get __ARM_ARCH_7A__.
Tim Northoverd88ecb32016-01-27 19:32:40 +00005470 if (getTriple().isWatchABI())
Tim Northover5627d392015-10-30 16:30:45 +00005471 Builder.defineMacro("__ARM_ARCH_7K__", "2");
5472
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005473 if (!CPUAttr.empty())
5474 Builder.defineMacro("__ARM_ARCH_" + CPUAttr + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005475
5476 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005477 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
Benjamin Kramerb42d9a52015-12-24 10:07:37 +00005478 Builder.defineMacro("__ARM_ARCH", Twine(ArchVersion));
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005479
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005480 if (ArchVersion >= 8) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005481 // ACLE 6.5.7 Crypto Extension
5482 if (Crypto)
5483 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
5484 // ACLE 6.5.8 CRC32 Extension
5485 if (CRC)
5486 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
5487 // ACLE 6.5.10 Numeric Maximum and Minimum
5488 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
5489 // ACLE 6.5.9 Directed Rounding
5490 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
James Molloy0ffb0932014-09-15 11:25:38 +00005491 }
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005492
5493 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
5494 // is not defined for the M-profile.
Bradley Smithf4affc12016-03-03 13:52:22 +00005495 // NOTE that the default profile is assumed to be 'A'
5496 if (CPUProfile.empty() || ArchProfile != llvm::ARM::PK_M)
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005497 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
5498
Bradley Smithf4affc12016-03-03 13:52:22 +00005499 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supports the original
5500 // Thumb ISA (including v6-M and v8-M Baseline). It is set to 2 if the
5501 // core supports the Thumb-2 ISA as found in the v6T2 architecture and all
5502 // v7 and v8 architectures excluding v8-M Baseline.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005503 if (supportsThumb2())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005504 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005505 else if (supportsThumb())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005506 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
5507
5508 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
5509 // instruction set such as ARM or Thumb.
5510 Builder.defineMacro("__ARM_32BIT_STATE", "1");
5511
5512 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
5513
5514 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005515 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005516 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00005517
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005518 // ACLE 6.4.3 Unaligned access supported in hardware
Eric Christopherb093d692015-10-09 18:39:59 +00005519 if (Unaligned)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005520 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Eric Christopherb093d692015-10-09 18:39:59 +00005521
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005522 // ACLE 6.4.4 LDREX/STREX
5523 if (LDREX)
5524 Builder.defineMacro("__ARM_FEATURE_LDREX", "0x" + llvm::utohexstr(LDREX));
5525
5526 // ACLE 6.4.5 CLZ
Eric Christopherb093d692015-10-09 18:39:59 +00005527 if (ArchVersion == 5 ||
5528 (ArchVersion == 6 && CPUProfile != "M") ||
5529 ArchVersion > 6)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005530 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
5531
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005532 // ACLE 6.5.1 Hardware Floating Point
5533 if (HW_FP)
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +00005534 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005535
Yi Konga44c4d72014-06-27 21:25:42 +00005536 // ACLE predefines.
5537 Builder.defineMacro("__ARM_ACLE", "200");
5538
Oliver Stannarddc2854c2015-09-03 12:40:58 +00005539 // FP16 support (we currently only support IEEE format).
5540 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
5541 Builder.defineMacro("__ARM_FP16_ARGS", "1");
5542
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005543 // ACLE 6.5.3 Fused multiply-accumulate (FMA)
Silviu Baranga632fdc52016-04-28 11:29:08 +00005544 if (ArchVersion >= 7 && (FPU & VFP4FPU))
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005545 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
5546
Mike Stump9d54bd72009-04-08 02:07:04 +00005547 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005548
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005549 // FIXME: It's more complicated than this and we don't really support
5550 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005551 // Windows on ARM does not "support" interworking
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005552 if (5 <= ArchVersion && ArchVersion <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005553 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005554
David Tweed8f676532012-10-25 13:33:01 +00005555 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00005556 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005557 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
Tim Northover862eaf82016-05-13 21:26:45 +00005558 if (!getTriple().isOSBinFormatMachO() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00005559 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005560 Builder.defineMacro("__ARM_PCS", "1");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005561 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005562
Tim Northover28fc0e12016-04-28 13:59:55 +00005563 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp" ||
5564 ABI == "aapcs16")
5565 Builder.defineMacro("__ARM_PCS_VFP", "1");
5566
Daniel Dunbar893d4752009-12-19 04:15:38 +00005567 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005568 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005569
Zijiao Ma56a83722016-08-17 02:13:33 +00005570 if (ArchKind == llvm::ARM::AK_XSCALE)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005571 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005572
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005573 if (isThumb()) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005574 Builder.defineMacro("__THUMBEL__");
5575 Builder.defineMacro("__thumb__");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005576 if (supportsThumb2())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005577 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005578 }
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005579
5580 // ACLE 6.4.9 32-bit SIMD instructions
5581 if (ArchVersion >= 6 && (CPUProfile != "M" || CPUAttr == "7EM"))
5582 Builder.defineMacro("__ARM_FEATURE_SIMD32", "1");
5583
5584 // ACLE 6.4.10 Hardware Integer Divide
Eric Christopherb093d692015-10-09 18:39:59 +00005585 if (((HWDiv & HWDivThumb) && isThumb()) ||
5586 ((HWDiv & HWDivARM) && !isThumb())) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005587 Builder.defineMacro("__ARM_FEATURE_IDIV", "1");
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005588 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005589 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005590
5591 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005592 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005593
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005594 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005595 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005596 if (FPU & VFP2FPU)
5597 Builder.defineMacro("__ARM_VFPV2__");
5598 if (FPU & VFP3FPU)
5599 Builder.defineMacro("__ARM_VFPV3__");
5600 if (FPU & VFP4FPU)
5601 Builder.defineMacro("__ARM_VFPV4__");
Tim Northoverc67803f2016-12-21 20:49:43 +00005602 if (FPU & FPARMV8)
5603 Builder.defineMacro("__ARM_FPV5__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005604 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00005605
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005606 // This only gets set when Neon instructions are actually available, unlike
5607 // the VFP define, hence the soft float and arch check. This is subtly
5608 // different from gcc, we follow the intent which was that it should be set
5609 // when Neon instructions are actually available.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005610 if ((FPU & NeonFPU) && !SoftFloat && ArchVersion >= 7) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005611 Builder.defineMacro("__ARM_NEON", "1");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005612 Builder.defineMacro("__ARM_NEON__");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005613 // current AArch32 NEON implementations do not support double-precision
5614 // floating-point even when it is present in VFP.
Eric Christopherb093d692015-10-09 18:39:59 +00005615 Builder.defineMacro("__ARM_NEON_FP",
5616 "0x" + llvm::utohexstr(HW_FP & ~HW_FP_DP));
Tim Northover5bb34ca2013-11-21 12:36:34 +00005617 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00005618
Bradley Smith0f28f0c2014-01-20 10:52:00 +00005619 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
5620 Opts.ShortWChar ? "2" : "4");
5621
5622 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5623 Opts.ShortEnums ? "1" : "4");
5624
Bradley Smithf4affc12016-03-03 13:52:22 +00005625 if (ArchVersion >= 6 && CPUAttr != "6M" && CPUAttr != "8M_BASE") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00005626 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5627 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5628 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5629 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
5630 }
Sergey Dmitrouk745f5302014-11-25 08:57:36 +00005631
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005632 // ACLE 6.4.7 DSP instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005633 if (DSP) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005634 Builder.defineMacro("__ARM_FEATURE_DSP", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005635 }
5636
5637 // ACLE 6.4.8 Saturation instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005638 bool SAT = false;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005639 if ((ArchVersion == 6 && CPUProfile != "M") || ArchVersion > 6 ) {
5640 Builder.defineMacro("__ARM_FEATURE_SAT", "1");
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005641 SAT = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005642 }
5643
5644 // ACLE 6.4.6 Q (saturation) flag
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005645 if (DSP || SAT)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005646 Builder.defineMacro("__ARM_FEATURE_QBIT", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005647
5648 if (Opts.UnsafeFPMath)
5649 Builder.defineMacro("__ARM_FP_FAST", "1");
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005650
5651 if (ArchKind == llvm::ARM::AK_ARMV8_1A)
5652 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
Chris Lattner17df24e2008-04-21 18:56:49 +00005653 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005654
Craig Topper6c03a542015-10-19 04:51:35 +00005655 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5656 return llvm::makeArrayRef(BuiltinInfo,
5657 clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner17df24e2008-04-21 18:56:49 +00005658 }
Craig Topper3164f332014-03-11 03:39:26 +00005659 bool isCLZForZeroUndef() const override { return false; }
5660 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northover5627d392015-10-30 16:30:45 +00005661 return IsAAPCS
5662 ? AAPCSABIBuiltinVaList
Tim Northoverd88ecb32016-01-27 19:32:40 +00005663 : (getTriple().isWatchABI() ? TargetInfo::CharPtrBuiltinVaList
5664 : TargetInfo::VoidPtrBuiltinVaList);
Chris Lattner17df24e2008-04-21 18:56:49 +00005665 }
Craig Topperf054e3a2015-10-19 03:52:27 +00005666 ArrayRef<const char *> getGCCRegNames() const override;
5667 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00005668 bool validateAsmConstraint(const char *&Name,
5669 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00005670 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00005671 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00005672 case 'l': // r0-r7
5673 case 'h': // r8-r15
JF Bastien750caef2016-02-19 06:54:45 +00005674 case 't': // VFP Floating point register single precision
5675 case 'w': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00005676 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00005677 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005678 case 'I':
5679 case 'J':
5680 case 'K':
5681 case 'L':
5682 case 'M':
5683 // FIXME
5684 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00005685 case 'Q': // A memory address that is a single base register.
5686 Info.setAllowsMemory();
5687 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005688 case 'U': // a memory reference...
5689 switch (Name[1]) {
5690 case 'q': // ...ARMV4 ldrsb
5691 case 'v': // ...VFP load/store (reg+constant offset)
5692 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00005693 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00005694 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00005695 case 'n': // valid address for Neon doubleword vector load/store
5696 case 'm': // valid address for Neon element and structure load/store
5697 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00005698 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005699 Info.setAllowsMemory();
5700 Name++;
5701 return true;
5702 }
Nate Begeman2908fa02008-04-22 05:03:19 +00005703 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005704 return false;
5705 }
Craig Topper3164f332014-03-11 03:39:26 +00005706 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005707 std::string R;
5708 switch (*Constraint) {
5709 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00005710 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005711 Constraint++;
5712 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00005713 case 'p': // 'p' should be translated to 'r' by default.
5714 R = std::string("r");
5715 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005716 default:
5717 return std::string(1, *Constraint);
5718 }
5719 return R;
5720 }
Akira Hatanaka987f1862014-08-22 06:05:21 +00005721 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005722 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005723 std::string &SuggestedModifier) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00005724 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00005725 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00005726
Bill Wendling9d1ee112012-10-25 23:28:48 +00005727 // Strip off constraint modifiers.
5728 while (Constraint[0] == '=' ||
5729 Constraint[0] == '+' ||
5730 Constraint[0] == '&')
5731 Constraint = Constraint.substr(1);
5732
5733 switch (Constraint[0]) {
5734 default: break;
5735 case 'r': {
5736 switch (Modifier) {
5737 default:
Tim Northover8f24b172013-12-08 15:24:55 +00005738 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00005739 case 'q':
5740 // A register of size 32 cannot fit a vector type.
5741 return false;
5742 }
5743 }
5744 }
5745
5746 return true;
5747 }
Craig Topper3164f332014-03-11 03:39:26 +00005748 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00005749 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00005750 return "";
5751 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005752
Craig Topper3164f332014-03-11 03:39:26 +00005753 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00005754 switch (CC) {
5755 case CC_AAPCS:
5756 case CC_AAPCS_VFP:
5757 case CC_Swift:
5758 return CCCR_OK;
5759 default:
5760 return CCCR_Warning;
5761 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005762 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00005763
Craig Topper3164f332014-03-11 03:39:26 +00005764 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00005765 if (RegNo == 0) return 0;
5766 if (RegNo == 1) return 1;
5767 return -1;
5768 }
Matthias Braund1e2fad2015-07-17 00:15:22 +00005769
5770 bool hasSjLjLowering() const override {
5771 return true;
5772 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005773};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005774
Rafael Espindolaeb265472013-08-21 21:59:03 +00005775bool ARMTargetInfo::setFPMath(StringRef Name) {
5776 if (Name == "neon") {
5777 FPMath = FP_Neon;
5778 return true;
5779 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
5780 Name == "vfp4") {
5781 FPMath = FP_VFP;
5782 return true;
5783 }
5784 return false;
5785}
5786
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005787const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005788 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005789 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005790 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
5791
5792 // Float registers
5793 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
5794 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
5795 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005796 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005797
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005798 // Double registers
5799 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
5800 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005801 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
5802 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005803
5804 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005805 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
5806 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005807};
5808
Craig Topperf054e3a2015-10-19 03:52:27 +00005809ArrayRef<const char *> ARMTargetInfo::getGCCRegNames() const {
5810 return llvm::makeArrayRef(GCCRegNames);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005811}
5812
5813const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005814 { { "a1" }, "r0" },
5815 { { "a2" }, "r1" },
5816 { { "a3" }, "r2" },
5817 { { "a4" }, "r3" },
5818 { { "v1" }, "r4" },
5819 { { "v2" }, "r5" },
5820 { { "v3" }, "r6" },
5821 { { "v4" }, "r7" },
5822 { { "v5" }, "r8" },
5823 { { "v6", "rfp" }, "r9" },
5824 { { "sl" }, "r10" },
5825 { { "fp" }, "r11" },
5826 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00005827 { { "r13" }, "sp" },
5828 { { "r14" }, "lr" },
5829 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005830 // The S, D and Q registers overlap, but aren't really aliases; we
5831 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005832};
5833
Craig Topperf054e3a2015-10-19 03:52:27 +00005834ArrayRef<TargetInfo::GCCRegAlias> ARMTargetInfo::getGCCRegAliases() const {
5835 return llvm::makeArrayRef(GCCRegAliases);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005836}
Chris Lattner5cc15e02010-03-03 19:03:45 +00005837
5838const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00005839#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005840 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005841#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5842 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00005843#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00005844
Craig Topper07d3b622015-08-07 05:14:44 +00005845#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005846 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005847#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005848 { #ID, TYPE, ATTRS, nullptr, LANG, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005849#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5850 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Albert Gutowski2a0621e2016-10-12 22:01:05 +00005851#define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANGS, FEATURE) \
5852 { #ID, TYPE, ATTRS, HEADER, LANGS, FEATURE },
Chris Lattner5cc15e02010-03-03 19:03:45 +00005853#include "clang/Basic/BuiltinsARM.def"
5854};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005855
5856class ARMleTargetInfo : public ARMTargetInfo {
5857public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005858 ARMleTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Matt Arsenaultf333de32016-09-07 07:08:02 +00005859 : ARMTargetInfo(Triple, Opts) {}
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005860 void getTargetDefines(const LangOptions &Opts,
5861 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005862 Builder.defineMacro("__ARMEL__");
5863 ARMTargetInfo::getTargetDefines(Opts, Builder);
5864 }
5865};
5866
5867class ARMbeTargetInfo : public ARMTargetInfo {
5868public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005869 ARMbeTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Matt Arsenaultf333de32016-09-07 07:08:02 +00005870 : ARMTargetInfo(Triple, Opts) {}
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005871 void getTargetDefines(const LangOptions &Opts,
5872 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005873 Builder.defineMacro("__ARMEB__");
5874 Builder.defineMacro("__ARM_BIG_ENDIAN");
5875 ARMTargetInfo::getTargetDefines(Opts, Builder);
5876 }
5877};
Chris Lattner17df24e2008-04-21 18:56:49 +00005878
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005879class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
5880 const llvm::Triple Triple;
5881public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005882 WindowsARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5883 : WindowsTargetInfo<ARMleTargetInfo>(Triple, Opts), Triple(Triple) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005884 WCharType = UnsignedShort;
5885 SizeType = UnsignedInt;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005886 }
5887 void getVisualStudioDefines(const LangOptions &Opts,
5888 MacroBuilder &Builder) const {
5889 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
5890
5891 // FIXME: this is invalid for WindowsCE
5892 Builder.defineMacro("_M_ARM_NT", "1");
5893 Builder.defineMacro("_M_ARMT", "_M_ARM");
5894 Builder.defineMacro("_M_THUMB", "_M_ARM");
5895
5896 assert((Triple.getArch() == llvm::Triple::arm ||
5897 Triple.getArch() == llvm::Triple::thumb) &&
5898 "invalid architecture for Windows ARM target info");
5899 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
5900 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
5901
5902 // TODO map the complete set of values
5903 // 31: VFPv3 40: VFPv4
5904 Builder.defineMacro("_M_ARM_FP", "31");
5905 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00005906 BuiltinVaListKind getBuiltinVaListKind() const override {
5907 return TargetInfo::CharPtrBuiltinVaList;
5908 }
Martell Malone7ccda3c2015-08-14 18:00:09 +00005909 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5910 switch (CC) {
5911 case CC_X86StdCall:
5912 case CC_X86ThisCall:
5913 case CC_X86FastCall:
5914 case CC_X86VectorCall:
5915 return CCCR_Ignore;
5916 case CC_C:
5917 return CCCR_OK;
5918 default:
5919 return CCCR_Warning;
5920 }
5921 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005922};
5923
5924// Windows ARM + Itanium C++ ABI Target
5925class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
5926public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005927 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple,
5928 const TargetOptions &Opts)
5929 : WindowsARMTargetInfo(Triple, Opts) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005930 TheCXXABI.set(TargetCXXABI::GenericARM);
5931 }
5932
5933 void getTargetDefines(const LangOptions &Opts,
5934 MacroBuilder &Builder) const override {
5935 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5936
5937 if (Opts.MSVCCompat)
5938 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5939 }
5940};
5941
5942// Windows ARM, MS (C++) ABI
5943class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
5944public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005945 MicrosoftARMleTargetInfo(const llvm::Triple &Triple,
5946 const TargetOptions &Opts)
5947 : WindowsARMTargetInfo(Triple, Opts) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005948 TheCXXABI.set(TargetCXXABI::Microsoft);
5949 }
5950
5951 void getTargetDefines(const LangOptions &Opts,
5952 MacroBuilder &Builder) const override {
5953 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5954 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5955 }
5956};
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005957
Yaron Keren321249c2015-07-15 13:32:23 +00005958// ARM MinGW target
5959class MinGWARMTargetInfo : public WindowsARMTargetInfo {
5960public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005961 MinGWARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5962 : WindowsARMTargetInfo(Triple, Opts) {
Yaron Keren321249c2015-07-15 13:32:23 +00005963 TheCXXABI.set(TargetCXXABI::GenericARM);
5964 }
5965
5966 void getTargetDefines(const LangOptions &Opts,
5967 MacroBuilder &Builder) const override {
5968 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5969 DefineStd(Builder, "WIN32", Opts);
5970 DefineStd(Builder, "WINNT", Opts);
5971 Builder.defineMacro("_ARM_");
5972 addMinGWDefines(Opts, Builder);
5973 }
5974};
5975
5976// ARM Cygwin target
5977class CygwinARMTargetInfo : public ARMleTargetInfo {
5978public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005979 CygwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5980 : ARMleTargetInfo(Triple, Opts) {
Yaron Keren321249c2015-07-15 13:32:23 +00005981 TLSSupported = false;
5982 WCharType = UnsignedShort;
5983 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00005984 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Yaron Keren321249c2015-07-15 13:32:23 +00005985 }
5986 void getTargetDefines(const LangOptions &Opts,
5987 MacroBuilder &Builder) const override {
5988 ARMleTargetInfo::getTargetDefines(Opts, Builder);
5989 Builder.defineMacro("_ARM_");
5990 Builder.defineMacro("__CYGWIN__");
5991 Builder.defineMacro("__CYGWIN32__");
Saleem Abdulrasool56027092017-02-07 19:00:06 +00005992 DefineStd(Builder, "unix", Opts);
Yaron Keren321249c2015-07-15 13:32:23 +00005993 if (Opts.CPlusPlus)
5994 Builder.defineMacro("_GNU_SOURCE");
5995 }
5996};
5997
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005998class DarwinARMTargetInfo : public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00005999protected:
Craig Topper3164f332014-03-11 03:39:26 +00006000 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
6001 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00006002 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00006003 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00006004
Torok Edwinb2b37c62009-06-30 17:10:35 +00006005public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006006 DarwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6007 : DarwinTargetInfo<ARMleTargetInfo>(Triple, Opts) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00006008 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00006009 // iOS always has 64-bit atomic instructions.
Eric Christopher917e9522014-11-18 22:36:15 +00006010 // FIXME: This should be based off of the target features in
6011 // ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00006012 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00006013
Tim Northoverd88ecb32016-01-27 19:32:40 +00006014 if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00006015 // Darwin on iOS uses a variant of the ARM C++ ABI.
6016 TheCXXABI.set(TargetCXXABI::WatchOS);
6017
6018 // The 32-bit ABI is silent on what ptrdiff_t should be, but given that
6019 // size_t is long, it's a bit weird for it to be int.
6020 PtrDiffType = SignedLong;
6021
6022 // BOOL should be a real boolean on the new ABI
6023 UseSignedCharForObjCBool = false;
6024 } else
6025 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00006026 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00006027};
Eli Friedmanf05b7722008-08-20 07:44:10 +00006028
Tim Northover573cbee2014-05-24 12:52:07 +00006029class AArch64TargetInfo : public TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00006030 virtual void setDataLayout() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00006031 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6032 static const char *const GCCRegNames[];
6033
James Molloy75f5f9e2014-04-16 15:33:48 +00006034 enum FPUModeEnum {
6035 FPUMode,
6036 NeonMode
6037 };
6038
6039 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00006040 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00006041 unsigned Crypto;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006042 unsigned Unaligned;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00006043 unsigned V8_1A;
James Molloy75f5f9e2014-04-16 15:33:48 +00006044
Tim Northovera2ee4332014-03-29 15:09:45 +00006045 static const Builtin::Info BuiltinInfo[];
6046
6047 std::string ABI;
6048
6049public:
Saleem Abdulrasool9b5ba542016-04-10 03:19:47 +00006050 AArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Tim Northovera2ee4332014-03-29 15:09:45 +00006051 : TargetInfo(Triple), ABI("aapcs") {
Brad Smith9aa2bf22017-02-21 23:13:09 +00006052 if (getTriple().getOS() == llvm::Triple::NetBSD ||
6053 getTriple().getOS() == llvm::Triple::OpenBSD) {
Tim Northover25e8a672014-05-24 12:51:25 +00006054 WCharType = SignedInt;
6055
6056 // NetBSD apparently prefers consistency across ARM targets to consistency
6057 // across 64-bit targets.
6058 Int64Type = SignedLongLong;
6059 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00006060 } else {
6061 WCharType = UnsignedInt;
6062 Int64Type = SignedLong;
6063 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00006064 }
6065
Tim Northovera2ee4332014-03-29 15:09:45 +00006066 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00006067 MaxVectorAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00006068 MaxAtomicInlineWidth = 128;
6069 MaxAtomicPromoteWidth = 128;
6070
Tim Northovera6a19f12015-02-06 01:25:07 +00006071 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 128;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00006072 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Tim Northovera2ee4332014-03-29 15:09:45 +00006073
Tim Northovera2ee4332014-03-29 15:09:45 +00006074 // {} in inline assembly are neon specifiers, not assembly variant
6075 // specifiers.
6076 NoAsmVariants = true;
6077
Tim Northover7ad87af2015-01-16 18:44:04 +00006078 // AAPCS gives rules for bitfields. 7.1.7 says: "The container type
6079 // contributes to the alignment of the containing aggregate in the same way
6080 // a plain (non bit-field) member of that type would, without exception for
6081 // zero-sized or anonymous bit-fields."
Tim Northover5627d392015-10-30 16:30:45 +00006082 assert(UseBitFieldTypeAlignment && "bitfields affect type alignment");
Tim Northover7ad87af2015-01-16 18:44:04 +00006083 UseZeroLengthBitfieldAlignment = true;
6084
Tim Northover573cbee2014-05-24 12:52:07 +00006085 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00006086 TheCXXABI.set(TargetCXXABI::GenericAArch64);
Saleem Abdulrasoolc066d9c2016-04-12 03:05:03 +00006087
Eric Christopherfb834a82017-02-28 17:22:05 +00006088 if (Triple.getOS() == llvm::Triple::Linux)
6089 this->MCountName = "\01_mcount";
6090 else if (Triple.getOS() == llvm::Triple::UnknownOS)
Saleem Abdulrasoolc066d9c2016-04-12 03:05:03 +00006091 this->MCountName = Opts.EABIVersion == "gnu" ? "\01_mcount" : "mcount";
Tim Northovera2ee4332014-03-29 15:09:45 +00006092 }
6093
Alp Toker4925ba72014-06-07 23:30:42 +00006094 StringRef getABI() const override { return ABI; }
David Blaikie1cbb9712014-11-14 19:09:44 +00006095 bool setABI(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006096 if (Name != "aapcs" && Name != "darwinpcs")
6097 return false;
6098
6099 ABI = Name;
6100 return true;
6101 }
6102
David Blaikie1cbb9712014-11-14 19:09:44 +00006103 bool setCPU(const std::string &Name) override {
Zijiao Ma33e95212016-07-28 06:24:48 +00006104 return Name == "generic" ||
6105 llvm::AArch64::parseCPUArch(Name) !=
6106 static_cast<unsigned>(llvm::AArch64::ArchKind::AK_INVALID);
Tim Northovera2ee4332014-03-29 15:09:45 +00006107 }
6108
Alexander Kornienko34eb2072015-04-11 02:00:23 +00006109 void getTargetDefines(const LangOptions &Opts,
6110 MacroBuilder &Builder) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006111 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00006112 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00006113
6114 // Target properties.
6115 Builder.defineMacro("_LP64");
6116 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00006117
6118 // ACLE predefines. Many can only have one possible value on v8 AArch64.
6119 Builder.defineMacro("__ARM_ACLE", "200");
6120 Builder.defineMacro("__ARM_ARCH", "8");
6121 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
6122
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006123 Builder.defineMacro("__ARM_64BIT_STATE", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00006124 Builder.defineMacro("__ARM_PCS_AAPCS64", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006125 Builder.defineMacro("__ARM_ARCH_ISA_A64", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00006126
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006127 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
6128 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
6129 Builder.defineMacro("__ARM_FEATURE_LDREX", "0xF");
6130 Builder.defineMacro("__ARM_FEATURE_IDIV", "1"); // As specified in ACLE
James Molloy0ffb0932014-09-15 11:25:38 +00006131 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006132 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
6133 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00006134
6135 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
6136
6137 // 0xe implies support for half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006138 Builder.defineMacro("__ARM_FP", "0xE");
Tim Northovera2ee4332014-03-29 15:09:45 +00006139
6140 // PCS specifies this for SysV variants, which is all we support. Other ABIs
6141 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006142 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
6143 Builder.defineMacro("__ARM_FP16_ARGS", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00006144
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00006145 if (Opts.UnsafeFPMath)
6146 Builder.defineMacro("__ARM_FP_FAST", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00006147
6148 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
6149
6150 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
6151 Opts.ShortEnums ? "1" : "4");
6152
James Molloy75f5f9e2014-04-16 15:33:48 +00006153 if (FPU == NeonMode) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006154 Builder.defineMacro("__ARM_NEON", "1");
James Molloy75f5f9e2014-04-16 15:33:48 +00006155 // 64-bit NEON supports half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006156 Builder.defineMacro("__ARM_NEON_FP", "0xE");
James Molloy75f5f9e2014-04-16 15:33:48 +00006157 }
Tim Northovera2ee4332014-03-29 15:09:45 +00006158
Bradley Smith418c5932014-05-02 15:17:51 +00006159 if (CRC)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006160 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
Bradley Smith418c5932014-05-02 15:17:51 +00006161
James Molloy75f5f9e2014-04-16 15:33:48 +00006162 if (Crypto)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006163 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
6164
6165 if (Unaligned)
6166 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Reid Klecknerd167d422015-05-06 15:31:46 +00006167
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00006168 if (V8_1A)
6169 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
6170
Reid Klecknerd167d422015-05-06 15:31:46 +00006171 // All of the __sync_(bool|val)_compare_and_swap_(1|2|4|8) builtins work.
6172 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
6173 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
6174 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
6175 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Tim Northovera2ee4332014-03-29 15:09:45 +00006176 }
6177
Craig Topper6c03a542015-10-19 04:51:35 +00006178 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6179 return llvm::makeArrayRef(BuiltinInfo,
6180 clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin);
Tim Northovera2ee4332014-03-29 15:09:45 +00006181 }
6182
David Blaikie1cbb9712014-11-14 19:09:44 +00006183 bool hasFeature(StringRef Feature) const override {
James Molloy75f5f9e2014-04-16 15:33:48 +00006184 return Feature == "aarch64" ||
6185 Feature == "arm64" ||
Ben Langmuir587aeaf2015-08-07 01:59:56 +00006186 Feature == "arm" ||
James Molloy75f5f9e2014-04-16 15:33:48 +00006187 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00006188 }
6189
James Molloy5e73df52014-04-16 15:06:20 +00006190 bool handleTargetFeatures(std::vector<std::string> &Features,
6191 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00006192 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00006193 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00006194 Crypto = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006195 Unaligned = 1;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00006196 V8_1A = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006197
Eric Christopher610fe112015-08-26 08:21:55 +00006198 for (const auto &Feature : Features) {
6199 if (Feature == "+neon")
James Molloy75f5f9e2014-04-16 15:33:48 +00006200 FPU = NeonMode;
Eric Christopher610fe112015-08-26 08:21:55 +00006201 if (Feature == "+crc")
Bradley Smith418c5932014-05-02 15:17:51 +00006202 CRC = 1;
Eric Christopher610fe112015-08-26 08:21:55 +00006203 if (Feature == "+crypto")
James Molloy75f5f9e2014-04-16 15:33:48 +00006204 Crypto = 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006205 if (Feature == "+strict-align")
6206 Unaligned = 0;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00006207 if (Feature == "+v8.1a")
6208 V8_1A = 1;
James Molloy75f5f9e2014-04-16 15:33:48 +00006209 }
6210
James Y Knightb214cbc2016-03-04 19:00:41 +00006211 setDataLayout();
James Molloy5e73df52014-04-16 15:06:20 +00006212
6213 return true;
6214 }
6215
John McCall477f2bb2016-03-03 06:39:32 +00006216 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
6217 switch (CC) {
6218 case CC_C:
6219 case CC_Swift:
Roman Levenstein35aa5ce2016-03-16 18:00:46 +00006220 case CC_PreserveMost:
6221 case CC_PreserveAll:
John McCall477f2bb2016-03-03 06:39:32 +00006222 return CCCR_OK;
6223 default:
6224 return CCCR_Warning;
6225 }
6226 }
6227
David Blaikie1cbb9712014-11-14 19:09:44 +00006228 bool isCLZForZeroUndef() const override { return false; }
Tim Northovera2ee4332014-03-29 15:09:45 +00006229
David Blaikie1cbb9712014-11-14 19:09:44 +00006230 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006231 return TargetInfo::AArch64ABIBuiltinVaList;
6232 }
6233
Craig Topperf054e3a2015-10-19 03:52:27 +00006234 ArrayRef<const char *> getGCCRegNames() const override;
6235 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00006236
Alexander Kornienko34eb2072015-04-11 02:00:23 +00006237 bool validateAsmConstraint(const char *&Name,
6238 TargetInfo::ConstraintInfo &Info) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006239 switch (*Name) {
6240 default:
6241 return false;
6242 case 'w': // Floating point and SIMD registers (V0-V31)
6243 Info.setAllowsRegister();
6244 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00006245 case 'I': // Constant that can be used with an ADD instruction
6246 case 'J': // Constant that can be used with a SUB instruction
6247 case 'K': // Constant that can be used with a 32-bit logical instruction
6248 case 'L': // Constant that can be used with a 64-bit logical instruction
6249 case 'M': // Constant that can be used as a 32-bit MOV immediate
6250 case 'N': // Constant that can be used as a 64-bit MOV immediate
6251 case 'Y': // Floating point constant zero
6252 case 'Z': // Integer constant zero
6253 return true;
6254 case 'Q': // A memory reference with base register and no offset
6255 Info.setAllowsMemory();
6256 return true;
6257 case 'S': // A symbolic address
6258 Info.setAllowsRegister();
6259 return true;
6260 case 'U':
Eric Christopher917e9522014-11-18 22:36:15 +00006261 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
6262 // Utf: A memory address suitable for ldp/stp in TF mode.
6263 // Usa: An absolute symbolic address.
6264 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
6265 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
Tim Northovera2ee4332014-03-29 15:09:45 +00006266 case 'z': // Zero register, wzr or xzr
6267 Info.setAllowsRegister();
6268 return true;
6269 case 'x': // Floating point and SIMD registers (V0-V15)
6270 Info.setAllowsRegister();
6271 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00006272 }
6273 return false;
6274 }
6275
Akira Hatanaka987f1862014-08-22 06:05:21 +00006276 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00006277 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00006278 std::string &SuggestedModifier) const override {
James Molloy8a157bf2014-07-25 10:19:47 +00006279 // Strip off constraint modifiers.
6280 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
6281 Constraint = Constraint.substr(1);
6282
6283 switch (Constraint[0]) {
6284 default:
6285 return true;
6286 case 'z':
6287 case 'r': {
6288 switch (Modifier) {
6289 case 'x':
6290 case 'w':
6291 // For now assume that the person knows what they're
6292 // doing with the modifier.
6293 return true;
6294 default:
6295 // By default an 'r' constraint will be in the 'x'
6296 // registers.
Akira Hatanaka987f1862014-08-22 06:05:21 +00006297 if (Size == 64)
6298 return true;
6299
6300 SuggestedModifier = "w";
6301 return false;
James Molloy8a157bf2014-07-25 10:19:47 +00006302 }
6303 }
6304 }
6305 }
6306
David Blaikie1cbb9712014-11-14 19:09:44 +00006307 const char *getClobbers() const override { return ""; }
Tim Northovera2ee4332014-03-29 15:09:45 +00006308
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00006309 int getEHDataRegisterNumber(unsigned RegNo) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006310 if (RegNo == 0)
6311 return 0;
6312 if (RegNo == 1)
6313 return 1;
6314 return -1;
6315 }
6316};
6317
Tim Northover573cbee2014-05-24 12:52:07 +00006318const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00006319 // 32-bit Integer registers
6320 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
6321 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
6322 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
6323
6324 // 64-bit Integer registers
6325 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
6326 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
6327 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
6328
6329 // 32-bit floating point regsisters
6330 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
6331 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
6332 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
6333
6334 // 64-bit floating point regsisters
6335 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
6336 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
6337 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
6338
6339 // Vector registers
6340 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
6341 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
6342 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
6343};
6344
Craig Topperf054e3a2015-10-19 03:52:27 +00006345ArrayRef<const char *> AArch64TargetInfo::getGCCRegNames() const {
6346 return llvm::makeArrayRef(GCCRegNames);
Tim Northovera2ee4332014-03-29 15:09:45 +00006347}
6348
Tim Northover573cbee2014-05-24 12:52:07 +00006349const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00006350 { { "w31" }, "wsp" },
6351 { { "x29" }, "fp" },
6352 { { "x30" }, "lr" },
6353 { { "x31" }, "sp" },
6354 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
6355 // don't want to substitute one of these for a different-sized one.
6356};
6357
Craig Topperf054e3a2015-10-19 03:52:27 +00006358ArrayRef<TargetInfo::GCCRegAlias> AArch64TargetInfo::getGCCRegAliases() const {
6359 return llvm::makeArrayRef(GCCRegAliases);
Tim Northovera2ee4332014-03-29 15:09:45 +00006360}
6361
Tim Northover573cbee2014-05-24 12:52:07 +00006362const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00006363#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006364 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00006365#include "clang/Basic/BuiltinsNEON.def"
6366
6367#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006368 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northover573cbee2014-05-24 12:52:07 +00006369#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00006370};
James Molloy5e73df52014-04-16 15:06:20 +00006371
Tim Northover573cbee2014-05-24 12:52:07 +00006372class AArch64leTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00006373 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00006374 if (getTriple().isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00006375 resetDataLayout("e-m:o-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006376 else
Chad Rosier4c077aa2016-07-07 20:02:25 +00006377 resetDataLayout("e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006378 }
6379
6380public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006381 AArch64leTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6382 : AArch64TargetInfo(Triple, Opts) {
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006383 }
James Molloy5e73df52014-04-16 15:06:20 +00006384 void getTargetDefines(const LangOptions &Opts,
6385 MacroBuilder &Builder) const override {
6386 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00006387 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00006388 }
6389};
6390
Tim Northover573cbee2014-05-24 12:52:07 +00006391class AArch64beTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00006392 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00006393 assert(!getTriple().isOSBinFormatMachO());
Chad Rosier4c077aa2016-07-07 20:02:25 +00006394 resetDataLayout("E-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006395 }
6396
6397public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006398 AArch64beTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6399 : AArch64TargetInfo(Triple, Opts) {}
James Molloy5e73df52014-04-16 15:06:20 +00006400 void getTargetDefines(const LangOptions &Opts,
6401 MacroBuilder &Builder) const override {
6402 Builder.defineMacro("__AARCH64EB__");
6403 Builder.defineMacro("__AARCH_BIG_ENDIAN");
6404 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00006405 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00006406 }
6407};
Tim Northovera2ee4332014-03-29 15:09:45 +00006408
Tim Northover573cbee2014-05-24 12:52:07 +00006409class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00006410protected:
6411 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
6412 MacroBuilder &Builder) const override {
6413 Builder.defineMacro("__AARCH64_SIMD__");
6414 Builder.defineMacro("__ARM64_ARCH_8__");
6415 Builder.defineMacro("__ARM_NEON__");
6416 Builder.defineMacro("__LITTLE_ENDIAN__");
6417 Builder.defineMacro("__REGISTER_PREFIX__", "");
6418 Builder.defineMacro("__arm64", "1");
6419 Builder.defineMacro("__arm64__", "1");
6420
6421 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
6422 }
6423
Tim Northovera2ee4332014-03-29 15:09:45 +00006424public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006425 DarwinAArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6426 : DarwinTargetInfo<AArch64leTargetInfo>(Triple, Opts) {
Tim Northovera2ee4332014-03-29 15:09:45 +00006427 Int64Type = SignedLongLong;
6428 WCharType = SignedInt;
6429 UseSignedCharForObjCBool = false;
6430
Tim Northovera6a19f12015-02-06 01:25:07 +00006431 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00006432 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Tim Northovera2ee4332014-03-29 15:09:45 +00006433
6434 TheCXXABI.set(TargetCXXABI::iOS64);
6435 }
6436
David Blaikie1cbb9712014-11-14 19:09:44 +00006437 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006438 return TargetInfo::CharPtrBuiltinVaList;
6439 }
6440};
Tim Northovera2ee4332014-03-29 15:09:45 +00006441
Tony Linthicum76329bf2011-12-12 21:14:55 +00006442// Hexagon abstract base class
6443class HexagonTargetInfo : public TargetInfo {
6444 static const Builtin::Info BuiltinInfo[];
6445 static const char * const GCCRegNames[];
6446 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6447 std::string CPU;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006448 bool HasHVX, HasHVXDouble;
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006449 bool UseLongCalls;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006450
Tony Linthicum76329bf2011-12-12 21:14:55 +00006451public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006452 HexagonTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6453 : TargetInfo(Triple) {
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00006454 // Specify the vector alignment explicitly. For v512x1, the calculated
6455 // alignment would be 512*alignment(i1), which is 512 bytes, instead of
6456 // the required minimum of 64 bytes.
James Y Knightb214cbc2016-03-04 19:00:41 +00006457 resetDataLayout("e-m:e-p:32:32:32-a:0-n16:32-"
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00006458 "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 +00006459 "v32:32:32-v64:64:64-v512:512:512-v1024:1024:1024-v2048:2048:2048");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006460 SizeType = UnsignedInt;
6461 PtrDiffType = SignedInt;
6462 IntPtrType = SignedInt;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006463
6464 // {} in inline assembly are packet specifiers, not assembly variant
6465 // specifiers.
6466 NoAsmVariants = true;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006467
6468 LargeArrayMinWidth = 64;
6469 LargeArrayAlign = 64;
6470 UseBitFieldTypeAlignment = true;
6471 ZeroLengthBitfieldBoundary = 32;
6472 HasHVX = HasHVXDouble = false;
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006473 UseLongCalls = false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006474 }
6475
Craig Topper6c03a542015-10-19 04:51:35 +00006476 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6477 return llvm::makeArrayRef(BuiltinInfo,
6478 clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006479 }
6480
Craig Topper3164f332014-03-11 03:39:26 +00006481 bool validateAsmConstraint(const char *&Name,
6482 TargetInfo::ConstraintInfo &Info) const override {
Krzysztof Parzyszeke0026e42016-05-18 14:56:14 +00006483 switch (*Name) {
6484 case 'v':
6485 case 'q':
6486 if (HasHVX) {
6487 Info.setAllowsRegister();
6488 return true;
6489 }
6490 break;
Krzysztof Parzyszek89fb4412016-05-20 13:50:32 +00006491 case 's':
6492 // Relocatable constant.
6493 return true;
Krzysztof Parzyszeke0026e42016-05-18 14:56:14 +00006494 }
6495 return false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006496 }
6497
Craig Topper3164f332014-03-11 03:39:26 +00006498 void getTargetDefines(const LangOptions &Opts,
6499 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006500
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006501 bool isCLZForZeroUndef() const override { return false; }
6502
Craig Topper3164f332014-03-11 03:39:26 +00006503 bool hasFeature(StringRef Feature) const override {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006504 return llvm::StringSwitch<bool>(Feature)
6505 .Case("hexagon", true)
6506 .Case("hvx", HasHVX)
6507 .Case("hvx-double", HasHVXDouble)
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006508 .Case("long-calls", UseLongCalls)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006509 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006510 }
Craig Topper3164f332014-03-11 03:39:26 +00006511
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006512 bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6513 StringRef CPU, const std::vector<std::string> &FeaturesVec)
6514 const override;
6515
6516 bool handleTargetFeatures(std::vector<std::string> &Features,
6517 DiagnosticsEngine &Diags) override;
6518
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006519 void setFeatureEnabled(llvm::StringMap<bool> &Features, StringRef Name,
6520 bool Enabled) const override;
6521
Craig Topper3164f332014-03-11 03:39:26 +00006522 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006523 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006524 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006525 ArrayRef<const char *> getGCCRegNames() const override;
6526 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00006527 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006528 return "";
6529 }
Sebastian Pop86500282012-01-13 20:37:10 +00006530
6531 static const char *getHexagonCPUSuffix(StringRef Name) {
6532 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00006533 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006534 .Case("hexagonv5", "5")
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006535 .Case("hexagonv55", "55")
6536 .Case("hexagonv60", "60")
Krzysztof Parzyszekff7f6672017-03-14 20:29:23 +00006537 .Case("hexagonv62", "62")
Craig Topperf1186c52014-05-08 06:41:40 +00006538 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00006539 }
6540
Craig Topper3164f332014-03-11 03:39:26 +00006541 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00006542 if (!getHexagonCPUSuffix(Name))
6543 return false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006544 CPU = Name;
6545 return true;
6546 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006547
6548 int getEHDataRegisterNumber(unsigned RegNo) const override {
6549 return RegNo < 2 ? RegNo : -1;
6550 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006551};
6552
6553void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006554 MacroBuilder &Builder) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006555 Builder.defineMacro("__qdsp6__", "1");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006556 Builder.defineMacro("__hexagon__", "1");
6557
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006558 if (CPU == "hexagonv4") {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006559 Builder.defineMacro("__HEXAGON_V4__");
6560 Builder.defineMacro("__HEXAGON_ARCH__", "4");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006561 if (Opts.HexagonQdsp6Compat) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006562 Builder.defineMacro("__QDSP6_V4__");
6563 Builder.defineMacro("__QDSP6_ARCH__", "4");
6564 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006565 } else if (CPU == "hexagonv5") {
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006566 Builder.defineMacro("__HEXAGON_V5__");
6567 Builder.defineMacro("__HEXAGON_ARCH__", "5");
6568 if(Opts.HexagonQdsp6Compat) {
6569 Builder.defineMacro("__QDSP6_V5__");
6570 Builder.defineMacro("__QDSP6_ARCH__", "5");
6571 }
Krzysztof Parzyszeka58ff512016-04-21 14:30:04 +00006572 } else if (CPU == "hexagonv55") {
6573 Builder.defineMacro("__HEXAGON_V55__");
6574 Builder.defineMacro("__HEXAGON_ARCH__", "55");
6575 Builder.defineMacro("__QDSP6_V55__");
6576 Builder.defineMacro("__QDSP6_ARCH__", "55");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006577 } else if (CPU == "hexagonv60") {
6578 Builder.defineMacro("__HEXAGON_V60__");
6579 Builder.defineMacro("__HEXAGON_ARCH__", "60");
6580 Builder.defineMacro("__QDSP6_V60__");
6581 Builder.defineMacro("__QDSP6_ARCH__", "60");
Krzysztof Parzyszekff7f6672017-03-14 20:29:23 +00006582 } else if (CPU == "hexagonv62") {
6583 Builder.defineMacro("__HEXAGON_V62__");
6584 Builder.defineMacro("__HEXAGON_ARCH__", "62");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006585 }
Krzysztof Parzyszek7f0756c2016-04-18 18:38:11 +00006586
6587 if (hasFeature("hvx")) {
6588 Builder.defineMacro("__HVX__");
6589 if (hasFeature("hvx-double"))
6590 Builder.defineMacro("__HVXDBL__");
6591 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006592}
6593
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006594bool HexagonTargetInfo::initFeatureMap(llvm::StringMap<bool> &Features,
6595 DiagnosticsEngine &Diags, StringRef CPU,
6596 const std::vector<std::string> &FeaturesVec) const {
6597 // Default for v60: -hvx, -hvx-double.
6598 Features["hvx"] = false;
6599 Features["hvx-double"] = false;
6600 Features["long-calls"] = false;
6601
6602 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
6603}
6604
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006605bool HexagonTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
6606 DiagnosticsEngine &Diags) {
6607 for (auto &F : Features) {
6608 if (F == "+hvx")
6609 HasHVX = true;
6610 else if (F == "-hvx")
6611 HasHVX = HasHVXDouble = false;
6612 else if (F == "+hvx-double")
6613 HasHVX = HasHVXDouble = true;
6614 else if (F == "-hvx-double")
6615 HasHVXDouble = false;
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006616
6617 if (F == "+long-calls")
6618 UseLongCalls = true;
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006619 else if (F == "-long-calls")
6620 UseLongCalls = false;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006621 }
6622 return true;
6623}
6624
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006625void HexagonTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
6626 StringRef Name, bool Enabled) const {
6627 if (Enabled) {
6628 if (Name == "hvx-double")
6629 Features["hvx"] = true;
6630 } else {
6631 if (Name == "hvx")
6632 Features["hvx-double"] = false;
6633 }
6634 Features[Name] = Enabled;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006635}
6636
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006637const char *const HexagonTargetInfo::GCCRegNames[] = {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006638 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6639 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6640 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6641 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
6642 "p0", "p1", "p2", "p3",
6643 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
6644};
6645
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006646ArrayRef<const char*> HexagonTargetInfo::getGCCRegNames() const {
Craig Topperf054e3a2015-10-19 03:52:27 +00006647 return llvm::makeArrayRef(GCCRegNames);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006648}
6649
Tony Linthicum76329bf2011-12-12 21:14:55 +00006650const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
6651 { { "sp" }, "r29" },
6652 { { "fp" }, "r30" },
6653 { { "lr" }, "r31" },
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006654};
Tony Linthicum76329bf2011-12-12 21:14:55 +00006655
Craig Topperf054e3a2015-10-19 03:52:27 +00006656ArrayRef<TargetInfo::GCCRegAlias> HexagonTargetInfo::getGCCRegAliases() const {
6657 return llvm::makeArrayRef(GCCRegAliases);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006658}
6659
6660
6661const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00006662#define BUILTIN(ID, TYPE, ATTRS) \
6663 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
6664#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
6665 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tony Linthicum76329bf2011-12-12 21:14:55 +00006666#include "clang/Basic/BuiltinsHexagon.def"
6667};
Tony Linthicum76329bf2011-12-12 21:14:55 +00006668
Jacques Pienaard964cc22016-03-28 21:02:54 +00006669class LanaiTargetInfo : public TargetInfo {
6670 // Class for Lanai (32-bit).
6671 // The CPU profiles supported by the Lanai backend
6672 enum CPUKind {
6673 CK_NONE,
6674 CK_V11,
6675 } CPU;
6676
6677 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6678 static const char *const GCCRegNames[];
6679
6680public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006681 LanaiTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6682 : TargetInfo(Triple) {
Jacques Pienaard964cc22016-03-28 21:02:54 +00006683 // Description string has to be kept in sync with backend.
6684 resetDataLayout("E" // Big endian
6685 "-m:e" // ELF name manging
6686 "-p:32:32" // 32 bit pointers, 32 bit aligned
6687 "-i64:64" // 64 bit integers, 64 bit aligned
6688 "-a:0:32" // 32 bit alignment of objects of aggregate type
6689 "-n32" // 32 bit native integer width
6690 "-S64" // 64 bit natural stack alignment
6691 );
6692
6693 // Setting RegParmMax equal to what mregparm was set to in the old
6694 // toolchain
6695 RegParmMax = 4;
6696
6697 // Set the default CPU to V11
6698 CPU = CK_V11;
6699
6700 // Temporary approach to make everything at least word-aligned and allow for
6701 // safely casting between pointers with different alignment requirements.
6702 // TODO: Remove this when there are no more cast align warnings on the
6703 // firmware.
6704 MinGlobalAlign = 32;
6705 }
6706
6707 void getTargetDefines(const LangOptions &Opts,
6708 MacroBuilder &Builder) const override {
6709 // Define __lanai__ when building for target lanai.
6710 Builder.defineMacro("__lanai__");
6711
6712 // Set define for the CPU specified.
6713 switch (CPU) {
6714 case CK_V11:
6715 Builder.defineMacro("__LANAI_V11__");
6716 break;
6717 case CK_NONE:
6718 llvm_unreachable("Unhandled target CPU");
6719 }
6720 }
6721
6722 bool setCPU(const std::string &Name) override {
6723 CPU = llvm::StringSwitch<CPUKind>(Name)
6724 .Case("v11", CK_V11)
6725 .Default(CK_NONE);
6726
6727 return CPU != CK_NONE;
6728 }
6729
6730 bool hasFeature(StringRef Feature) const override {
6731 return llvm::StringSwitch<bool>(Feature).Case("lanai", true).Default(false);
6732 }
6733
6734 ArrayRef<const char *> getGCCRegNames() const override;
6735
6736 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
6737
6738 BuiltinVaListKind getBuiltinVaListKind() const override {
6739 return TargetInfo::VoidPtrBuiltinVaList;
6740 }
6741
6742 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
6743
6744 bool validateAsmConstraint(const char *&Name,
6745 TargetInfo::ConstraintInfo &info) const override {
6746 return false;
6747 }
6748
6749 const char *getClobbers() const override { return ""; }
6750};
6751
6752const char *const LanaiTargetInfo::GCCRegNames[] = {
6753 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10",
6754 "r11", "r12", "r13", "r14", "r15", "r16", "r17", "r18", "r19", "r20", "r21",
6755 "r22", "r23", "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"};
6756
6757ArrayRef<const char *> LanaiTargetInfo::getGCCRegNames() const {
6758 return llvm::makeArrayRef(GCCRegNames);
6759}
6760
6761const TargetInfo::GCCRegAlias LanaiTargetInfo::GCCRegAliases[] = {
6762 {{"pc"}, "r2"},
6763 {{"sp"}, "r4"},
6764 {{"fp"}, "r5"},
6765 {{"rv"}, "r8"},
6766 {{"rr1"}, "r10"},
6767 {{"rr2"}, "r11"},
6768 {{"rca"}, "r15"},
6769};
6770
6771ArrayRef<TargetInfo::GCCRegAlias> LanaiTargetInfo::getGCCRegAliases() const {
6772 return llvm::makeArrayRef(GCCRegAliases);
6773}
6774
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006775// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
6776class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00006777 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6778 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006779 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00006780public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006781 SparcTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
James Y Knighta3518ad2016-01-27 01:04:51 +00006782 : TargetInfo(Triple), SoftFloat(false) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006783
Joerg Sonnenbergerd0be8dc2016-03-07 17:19:15 +00006784 int getEHDataRegisterNumber(unsigned RegNo) const override {
6785 if (RegNo == 0) return 24;
6786 if (RegNo == 1) return 25;
6787 return -1;
6788 }
6789
Craig Topper3164f332014-03-11 03:39:26 +00006790 bool handleTargetFeatures(std::vector<std::string> &Features,
6791 DiagnosticsEngine &Diags) override {
Jacob Baungard Hansen13a49372016-05-24 08:30:08 +00006792 // Check if software floating point is enabled
Eric Christopherfb481a42015-04-29 23:32:17 +00006793 auto Feature = std::find(Features.begin(), Features.end(), "+soft-float");
6794 if (Feature != Features.end()) {
6795 SoftFloat = true;
Eric Christopherfb481a42015-04-29 23:32:17 +00006796 }
Rafael Espindolaeb265472013-08-21 21:59:03 +00006797 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006798 }
Craig Topper3164f332014-03-11 03:39:26 +00006799 void getTargetDefines(const LangOptions &Opts,
6800 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006801 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006802 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006803
6804 if (SoftFloat)
6805 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00006806 }
Craig Topper3164f332014-03-11 03:39:26 +00006807
6808 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006809 return llvm::StringSwitch<bool>(Feature)
6810 .Case("softfloat", SoftFloat)
6811 .Case("sparc", true)
6812 .Default(false);
6813 }
Craig Topper3164f332014-03-11 03:39:26 +00006814
Chris Dewhurst0381cd72016-06-15 12:44:47 +00006815 bool hasSjLjLowering() const override {
6816 return true;
6817 }
6818
Craig Topper6c03a542015-10-19 04:51:35 +00006819 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006820 // FIXME: Implement!
Craig Topper6c03a542015-10-19 04:51:35 +00006821 return None;
Gabor Greif49991682008-02-21 16:29:08 +00006822 }
Craig Topper3164f332014-03-11 03:39:26 +00006823 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006824 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00006825 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006826 ArrayRef<const char *> getGCCRegNames() const override;
6827 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00006828 bool validateAsmConstraint(const char *&Name,
6829 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006830 // FIXME: Implement!
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00006831 switch (*Name) {
6832 case 'I': // Signed 13-bit constant
6833 case 'J': // Zero
6834 case 'K': // 32-bit constant with the low 12 bits clear
6835 case 'L': // A constant in the range supported by movcc (11-bit signed imm)
6836 case 'M': // A constant in the range supported by movrcc (19-bit signed imm)
6837 case 'N': // Same as 'K' but zext (required for SIMode)
6838 case 'O': // The constant 4096
6839 return true;
6840 }
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006841 return false;
Gabor Greif49991682008-02-21 16:29:08 +00006842 }
Craig Topper3164f332014-03-11 03:39:26 +00006843 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006844 // FIXME: Implement!
6845 return "";
Gabor Greif49991682008-02-21 16:29:08 +00006846 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006847
6848 // No Sparc V7 for now, the backend doesn't support it anyway.
6849 enum CPUKind {
6850 CK_GENERIC,
6851 CK_V8,
6852 CK_SUPERSPARC,
6853 CK_SPARCLITE,
6854 CK_F934,
6855 CK_HYPERSPARC,
6856 CK_SPARCLITE86X,
6857 CK_SPARCLET,
6858 CK_TSC701,
6859 CK_V9,
6860 CK_ULTRASPARC,
6861 CK_ULTRASPARC3,
6862 CK_NIAGARA,
6863 CK_NIAGARA2,
6864 CK_NIAGARA3,
Douglas Katzman6871afc2016-03-15 22:34:02 +00006865 CK_NIAGARA4,
Douglas Katzman87da5f42016-07-25 16:36:02 +00006866 CK_MYRIAD2100,
6867 CK_MYRIAD2150,
6868 CK_MYRIAD2450,
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006869 CK_LEON2,
6870 CK_LEON2_AT697E,
6871 CK_LEON2_AT697F,
6872 CK_LEON3,
6873 CK_LEON3_UT699,
6874 CK_LEON3_GR712RC,
6875 CK_LEON4,
6876 CK_LEON4_GR740
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006877 } CPU = CK_GENERIC;
6878
6879 enum CPUGeneration {
6880 CG_V8,
6881 CG_V9,
6882 };
6883
6884 CPUGeneration getCPUGeneration(CPUKind Kind) const {
6885 switch (Kind) {
6886 case CK_GENERIC:
6887 case CK_V8:
6888 case CK_SUPERSPARC:
6889 case CK_SPARCLITE:
6890 case CK_F934:
6891 case CK_HYPERSPARC:
6892 case CK_SPARCLITE86X:
6893 case CK_SPARCLET:
6894 case CK_TSC701:
Douglas Katzman87da5f42016-07-25 16:36:02 +00006895 case CK_MYRIAD2100:
6896 case CK_MYRIAD2150:
6897 case CK_MYRIAD2450:
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006898 case CK_LEON2:
6899 case CK_LEON2_AT697E:
6900 case CK_LEON2_AT697F:
6901 case CK_LEON3:
6902 case CK_LEON3_UT699:
6903 case CK_LEON3_GR712RC:
6904 case CK_LEON4:
6905 case CK_LEON4_GR740:
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006906 return CG_V8;
6907 case CK_V9:
6908 case CK_ULTRASPARC:
6909 case CK_ULTRASPARC3:
6910 case CK_NIAGARA:
6911 case CK_NIAGARA2:
6912 case CK_NIAGARA3:
6913 case CK_NIAGARA4:
6914 return CG_V9;
6915 }
Aaron Ballmana9a72852015-11-11 13:42:02 +00006916 llvm_unreachable("Unexpected CPU kind");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006917 }
6918
6919 CPUKind getCPUKind(StringRef Name) const {
6920 return llvm::StringSwitch<CPUKind>(Name)
6921 .Case("v8", CK_V8)
6922 .Case("supersparc", CK_SUPERSPARC)
6923 .Case("sparclite", CK_SPARCLITE)
6924 .Case("f934", CK_F934)
6925 .Case("hypersparc", CK_HYPERSPARC)
6926 .Case("sparclite86x", CK_SPARCLITE86X)
6927 .Case("sparclet", CK_SPARCLET)
6928 .Case("tsc701", CK_TSC701)
6929 .Case("v9", CK_V9)
6930 .Case("ultrasparc", CK_ULTRASPARC)
6931 .Case("ultrasparc3", CK_ULTRASPARC3)
6932 .Case("niagara", CK_NIAGARA)
6933 .Case("niagara2", CK_NIAGARA2)
6934 .Case("niagara3", CK_NIAGARA3)
6935 .Case("niagara4", CK_NIAGARA4)
Douglas Katzman87da5f42016-07-25 16:36:02 +00006936 .Case("ma2100", CK_MYRIAD2100)
6937 .Case("ma2150", CK_MYRIAD2150)
6938 .Case("ma2450", CK_MYRIAD2450)
6939 // FIXME: the myriad2[.n] spellings are obsolete,
6940 // but a grace period is needed to allow updating dependent builds.
6941 .Case("myriad2", CK_MYRIAD2100)
6942 .Case("myriad2.1", CK_MYRIAD2100)
6943 .Case("myriad2.2", CK_MYRIAD2150)
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006944 .Case("leon2", CK_LEON2)
6945 .Case("at697e", CK_LEON2_AT697E)
6946 .Case("at697f", CK_LEON2_AT697F)
6947 .Case("leon3", CK_LEON3)
6948 .Case("ut699", CK_LEON3_UT699)
6949 .Case("gr712rc", CK_LEON3_GR712RC)
6950 .Case("leon4", CK_LEON4)
6951 .Case("gr740", CK_LEON4_GR740)
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006952 .Default(CK_GENERIC);
6953 }
6954
6955 bool setCPU(const std::string &Name) override {
6956 CPU = getCPUKind(Name);
6957 return CPU != CK_GENERIC;
6958 }
Gabor Greif49991682008-02-21 16:29:08 +00006959};
6960
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006961const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00006962 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6963 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6964 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6965 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
6966};
6967
Craig Topperf054e3a2015-10-19 03:52:27 +00006968ArrayRef<const char *> SparcTargetInfo::getGCCRegNames() const {
6969 return llvm::makeArrayRef(GCCRegNames);
Chris Lattner9b415d62009-01-27 01:58:38 +00006970}
6971
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006972const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00006973 { { "g0" }, "r0" },
6974 { { "g1" }, "r1" },
6975 { { "g2" }, "r2" },
6976 { { "g3" }, "r3" },
6977 { { "g4" }, "r4" },
6978 { { "g5" }, "r5" },
6979 { { "g6" }, "r6" },
6980 { { "g7" }, "r7" },
6981 { { "o0" }, "r8" },
6982 { { "o1" }, "r9" },
6983 { { "o2" }, "r10" },
6984 { { "o3" }, "r11" },
6985 { { "o4" }, "r12" },
6986 { { "o5" }, "r13" },
6987 { { "o6", "sp" }, "r14" },
6988 { { "o7" }, "r15" },
6989 { { "l0" }, "r16" },
6990 { { "l1" }, "r17" },
6991 { { "l2" }, "r18" },
6992 { { "l3" }, "r19" },
6993 { { "l4" }, "r20" },
6994 { { "l5" }, "r21" },
6995 { { "l6" }, "r22" },
6996 { { "l7" }, "r23" },
6997 { { "i0" }, "r24" },
6998 { { "i1" }, "r25" },
6999 { { "i2" }, "r26" },
7000 { { "i3" }, "r27" },
7001 { { "i4" }, "r28" },
7002 { { "i5" }, "r29" },
7003 { { "i6", "fp" }, "r30" },
7004 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00007005};
7006
Craig Topperf054e3a2015-10-19 03:52:27 +00007007ArrayRef<TargetInfo::GCCRegAlias> SparcTargetInfo::getGCCRegAliases() const {
7008 return llvm::makeArrayRef(GCCRegAliases);
Chris Lattner9b415d62009-01-27 01:58:38 +00007009}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007010
7011// SPARC v8 is the 32-bit mode selected by Triple::sparc.
7012class SparcV8TargetInfo : public SparcTargetInfo {
7013public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007014 SparcV8TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7015 : SparcTargetInfo(Triple, Opts) {
James Y Knightb214cbc2016-03-04 19:00:41 +00007016 resetDataLayout("E-m:e-p:32:32-i64:64-f128:64-n32-S64");
Brad Smith73859112015-08-13 21:45:57 +00007017 // NetBSD / OpenBSD use long (same as llvm default); everyone else uses int.
7018 switch (getTriple().getOS()) {
7019 default:
James Y Knight4b4d19e2015-06-04 15:36:29 +00007020 SizeType = UnsignedInt;
7021 IntPtrType = SignedInt;
7022 PtrDiffType = SignedInt;
Brad Smith73859112015-08-13 21:45:57 +00007023 break;
7024 case llvm::Triple::NetBSD:
7025 case llvm::Triple::OpenBSD:
7026 SizeType = UnsignedLong;
7027 IntPtrType = SignedLong;
7028 PtrDiffType = SignedLong;
7029 break;
Brad Smith56495d52015-08-13 22:00:53 +00007030 }
Douglas Katzman13f4a912016-11-09 15:43:51 +00007031 // Up to 32 bits are lock-free atomic, but we're willing to do atomic ops
7032 // on up to 64 bits.
7033 MaxAtomicPromoteWidth = 64;
7034 MaxAtomicInlineWidth = 32;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007035 }
7036
Craig Topper3164f332014-03-11 03:39:26 +00007037 void getTargetDefines(const LangOptions &Opts,
7038 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007039 SparcTargetInfo::getTargetDefines(Opts, Builder);
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00007040 switch (getCPUGeneration(CPU)) {
7041 case CG_V8:
7042 Builder.defineMacro("__sparcv8");
7043 if (getTriple().getOS() != llvm::Triple::Solaris)
7044 Builder.defineMacro("__sparcv8__");
7045 break;
7046 case CG_V9:
7047 Builder.defineMacro("__sparcv9");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00007048 if (getTriple().getOS() != llvm::Triple::Solaris) {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00007049 Builder.defineMacro("__sparcv9__");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00007050 Builder.defineMacro("__sparc_v9__");
7051 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00007052 break;
7053 }
Douglas Katzman6871afc2016-03-15 22:34:02 +00007054 if (getTriple().getVendor() == llvm::Triple::Myriad) {
Douglas Katzman87da5f42016-07-25 16:36:02 +00007055 std::string MyriadArchValue, Myriad2Value;
7056 Builder.defineMacro("__sparc_v8__");
7057 Builder.defineMacro("__leon__");
Douglas Katzman6871afc2016-03-15 22:34:02 +00007058 switch (CPU) {
Douglas Katzman87da5f42016-07-25 16:36:02 +00007059 case CK_MYRIAD2150:
7060 MyriadArchValue = "__ma2150";
7061 Myriad2Value = "2";
Douglas Katzman6871afc2016-03-15 22:34:02 +00007062 break;
Douglas Katzman87da5f42016-07-25 16:36:02 +00007063 case CK_MYRIAD2450:
7064 MyriadArchValue = "__ma2450";
7065 Myriad2Value = "2";
Douglas Katzman6871afc2016-03-15 22:34:02 +00007066 break;
7067 default:
Douglas Katzman87da5f42016-07-25 16:36:02 +00007068 MyriadArchValue = "__ma2100";
7069 Myriad2Value = "1";
Douglas Katzman6871afc2016-03-15 22:34:02 +00007070 break;
7071 }
Douglas Katzman87da5f42016-07-25 16:36:02 +00007072 Builder.defineMacro(MyriadArchValue, "1");
7073 Builder.defineMacro(MyriadArchValue+"__", "1");
7074 Builder.defineMacro("__myriad2__", Myriad2Value);
7075 Builder.defineMacro("__myriad2", Myriad2Value);
Douglas Katzman6871afc2016-03-15 22:34:02 +00007076 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007077 }
Chris Dewhurst69fa1922016-05-04 09:33:30 +00007078
7079 bool hasSjLjLowering() const override {
7080 return true;
7081 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007082};
7083
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007084// SPARCV8el is the 32-bit little-endian mode selected by Triple::sparcel.
7085class SparcV8elTargetInfo : public SparcV8TargetInfo {
7086 public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007087 SparcV8elTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7088 : SparcV8TargetInfo(Triple, Opts) {
7089 resetDataLayout("e-m:e-p:32:32-i64:64-f128:64-n32-S64");
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007090 }
7091};
7092
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007093// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
7094class SparcV9TargetInfo : public SparcTargetInfo {
7095public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007096 SparcV9TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7097 : SparcTargetInfo(Triple, Opts) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007098 // FIXME: Support Sparc quad-precision long double?
James Y Knightb214cbc2016-03-04 19:00:41 +00007099 resetDataLayout("E-m:e-i64:64-n32:64-S128");
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00007100 // This is an LP64 platform.
7101 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00007102
7103 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00007104 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00007105 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00007106 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00007107 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00007108 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00007109
7110 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
7111 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
7112 LongDoubleWidth = 128;
7113 LongDoubleAlign = 128;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007114 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00007115 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007116 }
7117
Craig Topper3164f332014-03-11 03:39:26 +00007118 void getTargetDefines(const LangOptions &Opts,
7119 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007120 SparcTargetInfo::getTargetDefines(Opts, Builder);
7121 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00007122 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00007123 // Solaris doesn't need these variants, but the BSDs do.
7124 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00007125 Builder.defineMacro("__sparc64__");
7126 Builder.defineMacro("__sparc_v9__");
7127 Builder.defineMacro("__sparcv9__");
7128 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007129 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00007130
Craig Topper3164f332014-03-11 03:39:26 +00007131 bool setCPU(const std::string &Name) override {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00007132 if (!SparcTargetInfo::setCPU(Name))
7133 return false;
7134 return getCPUGeneration(CPU) == CG_V9;
Roman Divackyb1ae3d42014-02-25 18:35:30 +00007135 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007136};
7137
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007138class SystemZTargetInfo : public TargetInfo {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007139 static const Builtin::Info BuiltinInfo[];
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007140 static const char *const GCCRegNames[];
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007141 std::string CPU;
7142 bool HasTransactionalExecution;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007143 bool HasVector;
Ulrich Weigand47445072013-05-06 16:26:41 +00007144
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007145public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007146 SystemZTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Eric Christopherb093d692015-10-09 18:39:59 +00007147 : TargetInfo(Triple), CPU("z10"), HasTransactionalExecution(false),
7148 HasVector(false) {
Ulrich Weigand881497a2015-03-30 13:50:21 +00007149 IntMaxType = SignedLong;
7150 Int64Type = SignedLong;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007151 TLSSupported = true;
7152 IntWidth = IntAlign = 32;
7153 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
7154 PointerWidth = PointerAlign = 64;
7155 LongDoubleWidth = 128;
7156 LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007157 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Ulrich Weigandca3cb7f2015-04-21 17:29:35 +00007158 DefaultAlignForAttributeAligned = 64;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007159 MinGlobalAlign = 16;
James Y Knightb214cbc2016-03-04 19:00:41 +00007160 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 +00007161 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
7162 }
7163 void getTargetDefines(const LangOptions &Opts,
7164 MacroBuilder &Builder) const override {
7165 Builder.defineMacro("__s390__");
7166 Builder.defineMacro("__s390x__");
7167 Builder.defineMacro("__zarch__");
7168 Builder.defineMacro("__LONG_DOUBLE_128__");
Ulrich Weigandb038a522016-02-05 21:34:28 +00007169
Ulrich Weigand82a86cb2017-02-06 17:04:22 +00007170 const std::string ISARev = llvm::StringSwitch<std::string>(CPU)
7171 .Cases("arch8", "z10", "8")
7172 .Cases("arch9", "z196", "9")
7173 .Cases("arch10", "zEC12", "10")
7174 .Cases("arch11", "z13", "11")
7175 .Default("");
7176 if (!ISARev.empty())
7177 Builder.defineMacro("__ARCH__", ISARev);
7178
Ulrich Weigandb038a522016-02-05 21:34:28 +00007179 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
7180 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
7181 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
7182 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
7183
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007184 if (HasTransactionalExecution)
7185 Builder.defineMacro("__HTM__");
Ulrich Weigand82a86cb2017-02-06 17:04:22 +00007186 if (HasVector)
7187 Builder.defineMacro("__VX__");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00007188 if (Opts.ZVector)
7189 Builder.defineMacro("__VEC__", "10301");
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007190 }
Craig Topper6c03a542015-10-19 04:51:35 +00007191 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7192 return llvm::makeArrayRef(BuiltinInfo,
7193 clang::SystemZ::LastTSBuiltin-Builtin::FirstTSBuiltin);
Ulrich Weigand47445072013-05-06 16:26:41 +00007194 }
7195
Craig Topperf054e3a2015-10-19 03:52:27 +00007196 ArrayRef<const char *> getGCCRegNames() const override;
7197 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007198 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00007199 return None;
Ulrich Weigand47445072013-05-06 16:26:41 +00007200 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007201 bool validateAsmConstraint(const char *&Name,
7202 TargetInfo::ConstraintInfo &info) const override;
7203 const char *getClobbers() const override {
7204 // FIXME: Is this really right?
7205 return "";
7206 }
7207 BuiltinVaListKind getBuiltinVaListKind() const override {
7208 return TargetInfo::SystemZBuiltinVaList;
7209 }
7210 bool setCPU(const std::string &Name) override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007211 CPU = Name;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007212 bool CPUKnown = llvm::StringSwitch<bool>(Name)
7213 .Case("z10", true)
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007214 .Case("arch8", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007215 .Case("z196", true)
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007216 .Case("arch9", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007217 .Case("zEC12", true)
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007218 .Case("arch10", true)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007219 .Case("z13", true)
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007220 .Case("arch11", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007221 .Default(false);
7222
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007223 return CPUKnown;
7224 }
Eric Christopher8c47b422015-10-09 18:39:55 +00007225 bool
7226 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7227 StringRef CPU,
7228 const std::vector<std::string> &FeaturesVec) const override {
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007229 if (CPU == "zEC12" || CPU == "arch10")
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007230 Features["transactional-execution"] = true;
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007231 if (CPU == "z13" || CPU == "arch11") {
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007232 Features["transactional-execution"] = true;
7233 Features["vector"] = true;
7234 }
Eric Christopher007b0a02015-08-28 22:32:01 +00007235 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007236 }
7237
7238 bool handleTargetFeatures(std::vector<std::string> &Features,
7239 DiagnosticsEngine &Diags) override {
7240 HasTransactionalExecution = false;
Eric Christopher610fe112015-08-26 08:21:55 +00007241 for (const auto &Feature : Features) {
7242 if (Feature == "+transactional-execution")
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007243 HasTransactionalExecution = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007244 else if (Feature == "+vector")
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007245 HasVector = true;
7246 }
7247 // If we use the vector ABI, vector types are 64-bit aligned.
7248 if (HasVector) {
7249 MaxVectorAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00007250 resetDataLayout("E-m:e-i1:8:16-i8:8:16-i64:64-f128:64"
7251 "-v128:64-a:8:16-n32:64");
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007252 }
7253 return true;
7254 }
7255
7256 bool hasFeature(StringRef Feature) const override {
7257 return llvm::StringSwitch<bool>(Feature)
Ulrich Weigandcc673442015-04-01 14:15:35 +00007258 .Case("systemz", true)
7259 .Case("htm", HasTransactionalExecution)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007260 .Case("vx", HasVector)
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007261 .Default(false);
7262 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007263
Bryan Chane3f1ed52016-04-28 13:56:43 +00007264 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
7265 switch (CC) {
7266 case CC_C:
7267 case CC_Swift:
7268 return CCCR_OK;
7269 default:
7270 return CCCR_Warning;
7271 }
7272 }
7273
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007274 StringRef getABI() const override {
7275 if (HasVector)
7276 return "vector";
7277 return "";
7278 }
Ulrich Weigand47fd2532015-06-16 15:21:47 +00007279
7280 bool useFloat128ManglingForLongDouble() const override {
7281 return true;
7282 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007283};
7284
7285const Builtin::Info SystemZTargetInfo::BuiltinInfo[] = {
7286#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00007287 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Jonas Paulsson3ace74a2016-03-30 15:51:24 +00007288#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
7289 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007290#include "clang/Basic/BuiltinsSystemZ.def"
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007291};
7292
7293const char *const SystemZTargetInfo::GCCRegNames[] = {
7294 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
7295 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
7296 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
7297 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
7298};
7299
Craig Topperf054e3a2015-10-19 03:52:27 +00007300ArrayRef<const char *> SystemZTargetInfo::getGCCRegNames() const {
7301 return llvm::makeArrayRef(GCCRegNames);
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007302}
7303
7304bool SystemZTargetInfo::
7305validateAsmConstraint(const char *&Name,
7306 TargetInfo::ConstraintInfo &Info) const {
7307 switch (*Name) {
7308 default:
7309 return false;
7310
7311 case 'a': // Address register
7312 case 'd': // Data register (equivalent to 'r')
7313 case 'f': // Floating-point register
7314 Info.setAllowsRegister();
7315 return true;
7316
7317 case 'I': // Unsigned 8-bit constant
7318 case 'J': // Unsigned 12-bit constant
7319 case 'K': // Signed 16-bit constant
7320 case 'L': // Signed 20-bit displacement (on all targets we support)
7321 case 'M': // 0x7fffffff
7322 return true;
7323
7324 case 'Q': // Memory with base and unsigned 12-bit displacement
7325 case 'R': // Likewise, plus an index
7326 case 'S': // Memory with base and signed 20-bit displacement
7327 case 'T': // Likewise, plus an index
7328 Info.setAllowsMemory();
7329 return true;
7330 }
7331}
Ulrich Weigand47445072013-05-06 16:26:41 +00007332
Eric Christopherc48497a2015-09-18 21:26:24 +00007333class MSP430TargetInfo : public TargetInfo {
7334 static const char *const GCCRegNames[];
Anton Korobeynikova0f54372009-05-03 13:43:08 +00007335
Eric Christopherc48497a2015-09-18 21:26:24 +00007336public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007337 MSP430TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7338 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007339 TLSSupported = false;
7340 IntWidth = 16;
7341 IntAlign = 16;
7342 LongWidth = 32;
7343 LongLongWidth = 64;
7344 LongAlign = LongLongAlign = 16;
7345 PointerWidth = 16;
7346 PointerAlign = 16;
7347 SuitableAlign = 16;
7348 SizeType = UnsignedInt;
7349 IntMaxType = SignedLongLong;
7350 IntPtrType = SignedInt;
7351 PtrDiffType = SignedInt;
7352 SigAtomicType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00007353 resetDataLayout("e-m:e-p:16:16-i32:16:32-a:16-n8:16");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00007354 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007355 void getTargetDefines(const LangOptions &Opts,
7356 MacroBuilder &Builder) const override {
7357 Builder.defineMacro("MSP430");
7358 Builder.defineMacro("__MSP430__");
7359 // FIXME: defines for different 'flavours' of MCU
7360 }
Craig Topper6c03a542015-10-19 04:51:35 +00007361 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00007362 // FIXME: Implement.
Craig Topper6c03a542015-10-19 04:51:35 +00007363 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00007364 }
7365 bool hasFeature(StringRef Feature) const override {
7366 return Feature == "msp430";
7367 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007368 ArrayRef<const char *> getGCCRegNames() const override;
7369 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00007370 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00007371 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00007372 }
7373 bool validateAsmConstraint(const char *&Name,
7374 TargetInfo::ConstraintInfo &info) const override {
7375 // FIXME: implement
7376 switch (*Name) {
7377 case 'K': // the constant 1
7378 case 'L': // constant -1^20 .. 1^19
7379 case 'M': // constant 1-4:
Eli Friedmana9c3d712009-08-19 20:47:07 +00007380 return true;
7381 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007382 // No target constraints for now.
7383 return false;
7384 }
7385 const char *getClobbers() const override {
7386 // FIXME: Is this really right?
7387 return "";
7388 }
7389 BuiltinVaListKind getBuiltinVaListKind() const override {
7390 // FIXME: implement
7391 return TargetInfo::CharPtrBuiltinVaList;
7392 }
7393};
7394
7395const char *const MSP430TargetInfo::GCCRegNames[] = {
7396 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
7397 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"};
7398
Craig Topperf054e3a2015-10-19 03:52:27 +00007399ArrayRef<const char *> MSP430TargetInfo::getGCCRegNames() const {
7400 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00007401}
7402
7403// LLVM and Clang cannot be used directly to output native binaries for
7404// target, but is used to compile C code to llvm bitcode with correct
7405// type and alignment information.
7406//
7407// TCE uses the llvm bitcode as input and uses it for generating customized
7408// target processor and program binary. TCE co-design environment is
7409// publicly available in http://tce.cs.tut.fi
7410
7411static const unsigned TCEOpenCLAddrSpaceMap[] = {
7412 3, // opencl_global
7413 4, // opencl_local
7414 5, // opencl_constant
7415 // FIXME: generic has to be added to the target
7416 0, // opencl_generic
7417 0, // cuda_device
7418 0, // cuda_constant
7419 0 // cuda_shared
7420};
7421
7422class TCETargetInfo : public TargetInfo {
7423public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007424 TCETargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7425 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007426 TLSSupported = false;
7427 IntWidth = 32;
7428 LongWidth = LongLongWidth = 32;
7429 PointerWidth = 32;
7430 IntAlign = 32;
7431 LongAlign = LongLongAlign = 32;
7432 PointerAlign = 32;
7433 SuitableAlign = 32;
7434 SizeType = UnsignedInt;
7435 IntMaxType = SignedLong;
7436 IntPtrType = SignedInt;
7437 PtrDiffType = SignedInt;
7438 FloatWidth = 32;
7439 FloatAlign = 32;
7440 DoubleWidth = 32;
7441 DoubleAlign = 32;
7442 LongDoubleWidth = 32;
7443 LongDoubleAlign = 32;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007444 FloatFormat = &llvm::APFloat::IEEEsingle();
7445 DoubleFormat = &llvm::APFloat::IEEEsingle();
7446 LongDoubleFormat = &llvm::APFloat::IEEEsingle();
Pekka Jaaskelainen67354482016-11-16 15:22:31 +00007447 resetDataLayout("E-p:32:32:32-i1:8:8-i8:8:32-"
7448 "i16:16:32-i32:32:32-i64:32:32-"
7449 "f32:32:32-f64:32:32-v64:32:32-"
7450 "v128:32:32-v256:32:32-v512:32:32-"
7451 "v1024:32:32-a0:0:32-n32");
Eric Christopherc48497a2015-09-18 21:26:24 +00007452 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
7453 UseAddrSpaceMapMangling = true;
7454 }
7455
7456 void getTargetDefines(const LangOptions &Opts,
7457 MacroBuilder &Builder) const override {
7458 DefineStd(Builder, "tce", Opts);
7459 Builder.defineMacro("__TCE__");
7460 Builder.defineMacro("__TCE_V1__");
7461 }
7462 bool hasFeature(StringRef Feature) const override { return Feature == "tce"; }
7463
Craig Topper6c03a542015-10-19 04:51:35 +00007464 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007465 const char *getClobbers() const override { return ""; }
7466 BuiltinVaListKind getBuiltinVaListKind() const override {
7467 return TargetInfo::VoidPtrBuiltinVaList;
7468 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007469 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007470 bool validateAsmConstraint(const char *&Name,
7471 TargetInfo::ConstraintInfo &info) const override {
7472 return true;
7473 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007474 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7475 return None;
7476 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007477};
Eli Friedmana9c3d712009-08-19 20:47:07 +00007478
Pekka Jaaskelainen67354482016-11-16 15:22:31 +00007479class TCELETargetInfo : public TCETargetInfo {
7480public:
7481 TCELETargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7482 : TCETargetInfo(Triple, Opts) {
7483 BigEndian = false;
7484
7485 resetDataLayout("e-p:32:32:32-i1:8:8-i8:8:32-"
7486 "i16:16:32-i32:32:32-i64:32:32-"
7487 "f32:32:32-f64:32:32-v64:32:32-"
7488 "v128:32:32-v256:32:32-v512:32:32-"
7489 "v1024:32:32-a0:0:32-n32");
7490
7491 }
7492
7493 virtual void getTargetDefines(const LangOptions &Opts,
7494 MacroBuilder &Builder) const {
7495 DefineStd(Builder, "tcele", Opts);
7496 Builder.defineMacro("__TCE__");
7497 Builder.defineMacro("__TCE_V1__");
7498 Builder.defineMacro("__TCELE__");
7499 Builder.defineMacro("__TCELE_V1__");
7500 }
7501
7502};
7503
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007504class BPFTargetInfo : public TargetInfo {
7505public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007506 BPFTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7507 : TargetInfo(Triple) {
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007508 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
7509 SizeType = UnsignedLong;
7510 PtrDiffType = SignedLong;
7511 IntPtrType = SignedLong;
7512 IntMaxType = SignedLong;
7513 Int64Type = SignedLong;
7514 RegParmMax = 5;
7515 if (Triple.getArch() == llvm::Triple::bpfeb) {
James Y Knightb214cbc2016-03-04 19:00:41 +00007516 resetDataLayout("E-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007517 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00007518 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007519 }
7520 MaxAtomicPromoteWidth = 64;
7521 MaxAtomicInlineWidth = 64;
7522 TLSSupported = false;
7523 }
7524 void getTargetDefines(const LangOptions &Opts,
7525 MacroBuilder &Builder) const override {
7526 DefineStd(Builder, "bpf", Opts);
7527 Builder.defineMacro("__BPF__");
7528 }
7529 bool hasFeature(StringRef Feature) const override {
7530 return Feature == "bpf";
7531 }
7532
Craig Topper6c03a542015-10-19 04:51:35 +00007533 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007534 const char *getClobbers() const override {
7535 return "";
7536 }
7537 BuiltinVaListKind getBuiltinVaListKind() const override {
7538 return TargetInfo::VoidPtrBuiltinVaList;
7539 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007540 ArrayRef<const char *> getGCCRegNames() const override {
7541 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007542 }
7543 bool validateAsmConstraint(const char *&Name,
7544 TargetInfo::ConstraintInfo &info) const override {
7545 return true;
7546 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007547 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7548 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007549 }
7550};
7551
Daniel Sanders4672af62016-05-27 11:51:02 +00007552class MipsTargetInfo : public TargetInfo {
7553 void setDataLayout() {
Daniel Sanders55e40692016-06-03 10:11:01 +00007554 StringRef Layout;
7555
7556 if (ABI == "o32")
7557 Layout = "m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
7558 else if (ABI == "n32")
Daniel Sanders6a738832016-07-19 10:49:03 +00007559 Layout = "m:e-p:32:32-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Daniel Sanders55e40692016-06-03 10:11:01 +00007560 else if (ABI == "n64")
Daniel Sanders6a738832016-07-19 10:49:03 +00007561 Layout = "m:e-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Daniel Sanders55e40692016-06-03 10:11:01 +00007562 else
7563 llvm_unreachable("Invalid ABI");
7564
7565 if (BigEndian)
7566 resetDataLayout(("E-" + Layout).str());
7567 else
7568 resetDataLayout(("e-" + Layout).str());
Daniel Sanders4672af62016-05-27 11:51:02 +00007569 }
7570
Akira Hatanaka9064e362013-10-29 18:30:33 +00007571
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00007572 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007573 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00007574 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00007575 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007576 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00007577 bool IsSingleFloat;
Simon Dardisdf827a72017-02-21 16:01:00 +00007578 bool IsNoABICalls;
7579 bool CanUseBSDABICalls;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007580 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00007581 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007582 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007583 enum DspRevEnum {
7584 NoDSP, DSP1, DSP2
7585 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00007586 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007587
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007588protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00007589 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007590 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007591
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007592public:
Daniel Sanders4672af62016-05-27 11:51:02 +00007593 MipsTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007594 : TargetInfo(Triple), IsMips16(false), IsMicromips(false),
Simon Dardisdf827a72017-02-21 16:01:00 +00007595 IsNan2008(false), IsSingleFloat(false), IsNoABICalls(false),
7596 CanUseBSDABICalls(false), FloatABI(HardFloat), DspRev(NoDSP),
7597 HasMSA(false), HasFP64(false) {
Zoran Jovanovic26a12162015-02-18 15:21:35 +00007598 TheCXXABI.set(TargetCXXABI::GenericMIPS);
Daniel Sanders4672af62016-05-27 11:51:02 +00007599
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007600 setABI((getTriple().getArch() == llvm::Triple::mips ||
7601 getTriple().getArch() == llvm::Triple::mipsel)
7602 ? "o32"
7603 : "n64");
7604
7605 CPU = ABI == "o32" ? "mips32r2" : "mips64r2";
Simon Dardisdf827a72017-02-21 16:01:00 +00007606
7607 CanUseBSDABICalls = Triple.getOS() == llvm::Triple::FreeBSD ||
7608 Triple.getOS() == llvm::Triple::OpenBSD;
Zoran Jovanovic26a12162015-02-18 15:21:35 +00007609 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007610
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007611 bool isNaN2008Default() const {
7612 return CPU == "mips32r6" || CPU == "mips64r6";
7613 }
7614
7615 bool isFP64Default() const {
7616 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
7617 }
7618
Petar Jovanovicd55ae6b2015-02-26 18:19:22 +00007619 bool isNan2008() const override {
7620 return IsNan2008;
7621 }
7622
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007623 bool processorSupportsGPR64() const {
7624 return llvm::StringSwitch<bool>(CPU)
7625 .Case("mips3", true)
7626 .Case("mips4", true)
7627 .Case("mips5", true)
7628 .Case("mips64", true)
7629 .Case("mips64r2", true)
7630 .Case("mips64r3", true)
7631 .Case("mips64r5", true)
7632 .Case("mips64r6", true)
7633 .Case("octeon", true)
7634 .Default(false);
7635 return false;
7636 }
7637
Alp Toker4925ba72014-06-07 23:30:42 +00007638 StringRef getABI() const override { return ABI; }
Daniel Sanders4672af62016-05-27 11:51:02 +00007639 bool setABI(const std::string &Name) override {
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007640 if (Name == "o32") {
7641 setO32ABITypes();
7642 ABI = Name;
7643 return true;
Daniel Sanders4672af62016-05-27 11:51:02 +00007644 }
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007645
7646 if (Name == "n32") {
7647 setN32ABITypes();
7648 ABI = Name;
7649 return true;
7650 }
7651 if (Name == "n64") {
7652 setN64ABITypes();
7653 ABI = Name;
7654 return true;
Daniel Sanders4672af62016-05-27 11:51:02 +00007655 }
7656 return false;
7657 }
7658
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007659 void setO32ABITypes() {
7660 Int64Type = SignedLongLong;
7661 IntMaxType = Int64Type;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007662 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007663 LongDoubleWidth = LongDoubleAlign = 64;
7664 LongWidth = LongAlign = 32;
7665 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
7666 PointerWidth = PointerAlign = 32;
7667 PtrDiffType = SignedInt;
7668 SizeType = UnsignedInt;
7669 SuitableAlign = 64;
7670 }
7671
7672 void setN32N64ABITypes() {
7673 LongDoubleWidth = LongDoubleAlign = 128;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007674 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007675 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
7676 LongDoubleWidth = LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007677 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007678 }
7679 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
7680 SuitableAlign = 128;
7681 }
7682
Daniel Sanders4672af62016-05-27 11:51:02 +00007683 void setN64ABITypes() {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007684 setN32N64ABITypes();
Brad Smith8e55bd52017-03-06 23:48:31 +00007685 if (getTriple().getOS() == llvm::Triple::OpenBSD) {
7686 Int64Type = SignedLongLong;
7687 } else {
7688 Int64Type = SignedLong;
7689 }
Daniel Sanders4672af62016-05-27 11:51:02 +00007690 IntMaxType = Int64Type;
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007691 LongWidth = LongAlign = 64;
7692 PointerWidth = PointerAlign = 64;
7693 PtrDiffType = SignedLong;
7694 SizeType = UnsignedLong;
Daniel Sanders4672af62016-05-27 11:51:02 +00007695 }
7696
7697 void setN32ABITypes() {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007698 setN32N64ABITypes();
Daniel Sanders4672af62016-05-27 11:51:02 +00007699 Int64Type = SignedLongLong;
7700 IntMaxType = Int64Type;
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007701 LongWidth = LongAlign = 32;
7702 PointerWidth = PointerAlign = 32;
7703 PtrDiffType = SignedInt;
7704 SizeType = UnsignedInt;
Daniel Sanders4672af62016-05-27 11:51:02 +00007705 }
7706
Craig Topper3164f332014-03-11 03:39:26 +00007707 bool setCPU(const std::string &Name) override {
Eric Christopher0b26a612010-03-02 02:41:08 +00007708 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007709 return llvm::StringSwitch<bool>(Name)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007710 .Case("mips1", true)
7711 .Case("mips2", true)
Simon Atanasyan26610c52014-07-04 12:36:56 +00007712 .Case("mips3", true)
7713 .Case("mips4", true)
7714 .Case("mips5", true)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007715 .Case("mips32", true)
7716 .Case("mips32r2", true)
7717 .Case("mips32r3", true)
7718 .Case("mips32r5", true)
7719 .Case("mips32r6", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007720 .Case("mips64", true)
7721 .Case("mips64r2", true)
Simon Atanasyan162feb52015-02-20 23:37:40 +00007722 .Case("mips64r3", true)
7723 .Case("mips64r5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007724 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00007725 .Case("octeon", true)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007726 .Case("p5600", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007727 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00007728 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00007729 const std::string& getCPU() const { return CPU; }
Eric Christopher8c47b422015-10-09 18:39:55 +00007730 bool
7731 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7732 StringRef CPU,
7733 const std::vector<std::string> &FeaturesVec) const override {
Bhushan D. Attardebacb988732016-03-04 06:56:29 +00007734 if (CPU.empty())
7735 CPU = getCPU();
Simon Atanasyan4e16a422014-07-04 12:37:04 +00007736 if (CPU == "octeon")
7737 Features["mips64r2"] = Features["cnmips"] = true;
7738 else
7739 Features[CPU] = true;
Eric Christopher007b0a02015-08-28 22:32:01 +00007740 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Eric Christopher0b26a612010-03-02 02:41:08 +00007741 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007742
Craig Topper3164f332014-03-11 03:39:26 +00007743 void getTargetDefines(const LangOptions &Opts,
7744 MacroBuilder &Builder) const override {
Daniel Sanders4672af62016-05-27 11:51:02 +00007745 if (BigEndian) {
7746 DefineStd(Builder, "MIPSEB", Opts);
7747 Builder.defineMacro("_MIPSEB");
7748 } else {
7749 DefineStd(Builder, "MIPSEL", Opts);
7750 Builder.defineMacro("_MIPSEL");
7751 }
7752
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007753 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00007754 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007755 if (Opts.GNUMode)
7756 Builder.defineMacro("mips");
7757
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007758 if (ABI == "o32") {
Daniel Sanders4672af62016-05-27 11:51:02 +00007759 Builder.defineMacro("__mips", "32");
7760 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
7761 } else {
7762 Builder.defineMacro("__mips", "64");
7763 Builder.defineMacro("__mips64");
7764 Builder.defineMacro("__mips64__");
7765 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
7766 }
7767
7768 const std::string ISARev = llvm::StringSwitch<std::string>(getCPU())
7769 .Cases("mips32", "mips64", "1")
7770 .Cases("mips32r2", "mips64r2", "2")
7771 .Cases("mips32r3", "mips64r3", "3")
7772 .Cases("mips32r5", "mips64r5", "5")
7773 .Cases("mips32r6", "mips64r6", "6")
7774 .Default("");
7775 if (!ISARev.empty())
7776 Builder.defineMacro("__mips_isa_rev", ISARev);
7777
7778 if (ABI == "o32") {
7779 Builder.defineMacro("__mips_o32");
7780 Builder.defineMacro("_ABIO32", "1");
7781 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
Daniel Sanders07c86542016-05-27 14:30:23 +00007782 } else if (ABI == "n32") {
Daniel Sanders4672af62016-05-27 11:51:02 +00007783 Builder.defineMacro("__mips_n32");
7784 Builder.defineMacro("_ABIN32", "2");
7785 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
7786 } else if (ABI == "n64") {
7787 Builder.defineMacro("__mips_n64");
7788 Builder.defineMacro("_ABI64", "3");
7789 Builder.defineMacro("_MIPS_SIM", "_ABI64");
7790 } else
7791 llvm_unreachable("Invalid ABI.");
7792
Simon Dardisdf827a72017-02-21 16:01:00 +00007793 if (!IsNoABICalls) {
7794 Builder.defineMacro("__mips_abicalls");
7795 if (CanUseBSDABICalls)
7796 Builder.defineMacro("__ABICALLS__");
7797 }
7798
Simon Atanasyan683535b2012-08-29 19:14:58 +00007799 Builder.defineMacro("__REGISTER_PREFIX__", "");
7800
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007801 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007802 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00007803 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007804 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007805 case SoftFloat:
7806 Builder.defineMacro("__mips_soft_float", Twine(1));
7807 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00007808 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00007809
Simon Atanasyan16071912013-04-14 14:07:30 +00007810 if (IsSingleFloat)
7811 Builder.defineMacro("__mips_single_float", Twine(1));
7812
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007813 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
7814 Builder.defineMacro("_MIPS_FPSET",
7815 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
7816
Simon Atanasyan72244b62012-07-05 16:06:06 +00007817 if (IsMips16)
7818 Builder.defineMacro("__mips16", Twine(1));
7819
Simon Atanasyan60777612013-04-14 14:07:51 +00007820 if (IsMicromips)
7821 Builder.defineMacro("__mips_micromips", Twine(1));
7822
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007823 if (IsNan2008)
7824 Builder.defineMacro("__mips_nan2008", Twine(1));
7825
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007826 switch (DspRev) {
7827 default:
7828 break;
7829 case DSP1:
7830 Builder.defineMacro("__mips_dsp_rev", Twine(1));
7831 Builder.defineMacro("__mips_dsp", Twine(1));
7832 break;
7833 case DSP2:
7834 Builder.defineMacro("__mips_dsp_rev", Twine(2));
7835 Builder.defineMacro("__mips_dspr2", Twine(1));
7836 Builder.defineMacro("__mips_dsp", Twine(1));
7837 break;
7838 }
7839
Jack Carter44ff1e52013-08-12 17:20:29 +00007840 if (HasMSA)
7841 Builder.defineMacro("__mips_msa", Twine(1));
7842
Simon Atanasyan26f19672012-04-05 19:28:31 +00007843 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
7844 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
7845 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00007846
7847 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
7848 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Daniel Sanders5176f7e2015-12-22 12:59:30 +00007849
7850 // These shouldn't be defined for MIPS-I but there's no need to check
7851 // for that since MIPS-I isn't supported.
7852 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
7853 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
7854 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007855
7856 // 32-bit MIPS processors don't have the necessary lld/scd instructions
7857 // found in 64-bit processors. In the case of O32 on a 64-bit processor,
7858 // the instructions exist but using them violates the ABI since they
7859 // require 64-bit GPRs and O32 only supports 32-bit GPRs.
7860 if (ABI == "n32" || ABI == "n64")
Daniel Sanders4672af62016-05-27 11:51:02 +00007861 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007862 }
7863
Craig Topper6c03a542015-10-19 04:51:35 +00007864 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7865 return llvm::makeArrayRef(BuiltinInfo,
7866 clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin);
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007867 }
Craig Topper3164f332014-03-11 03:39:26 +00007868 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00007869 return llvm::StringSwitch<bool>(Feature)
7870 .Case("mips", true)
7871 .Case("fp64", HasFP64)
7872 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00007873 }
Craig Topper3164f332014-03-11 03:39:26 +00007874 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00007875 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007876 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007877 ArrayRef<const char *> getGCCRegNames() const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00007878 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00007879 // CPU register names
7880 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007881 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
7882 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
7883 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00007884 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
7885 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007886 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
7887 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
7888 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
7889 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00007890 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007891 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Hrvoje Varga14c42ee2016-03-29 12:46:16 +00007892 "$fcc5","$fcc6","$fcc7","$ac1hi","$ac1lo","$ac2hi","$ac2lo",
7893 "$ac3hi","$ac3lo",
Daniel Sanders8b59af12013-11-12 12:56:01 +00007894 // MSA register names
7895 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
7896 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
7897 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
7898 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
7899 // MSA control register names
7900 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
7901 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007902 };
Craig Topperf054e3a2015-10-19 03:52:27 +00007903 return llvm::makeArrayRef(GCCRegNames);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007904 }
Craig Topper3164f332014-03-11 03:39:26 +00007905 bool validateAsmConstraint(const char *&Name,
7906 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007907 switch (*Name) {
7908 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00007909 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007910 case 'r': // CPU registers.
7911 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00007912 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007913 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00007914 case 'c': // $25 for indirect jumps
7915 case 'l': // lo register
7916 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007917 Info.setAllowsRegister();
7918 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00007919 case 'I': // Signed 16-bit constant
7920 case 'J': // Integer 0
7921 case 'K': // Unsigned 16-bit constant
7922 case 'L': // Signed 32-bit constant, lower 16-bit zeros (for lui)
7923 case 'M': // Constants not loadable via lui, addiu, or ori
7924 case 'N': // Constant -1 to -65535
7925 case 'O': // A signed 15-bit constant
7926 case 'P': // A constant between 1 go 65535
7927 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00007928 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00007929 Info.setAllowsMemory();
7930 return true;
Daniel Sanders48fa39e2015-03-30 13:47:23 +00007931 case 'Z':
7932 if (Name[1] == 'C') { // An address usable by ll, and sc.
7933 Info.setAllowsMemory();
7934 Name++; // Skip over 'Z'.
7935 return true;
7936 }
7937 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007938 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007939 }
7940
Daniel Sanders48fa39e2015-03-30 13:47:23 +00007941 std::string convertConstraint(const char *&Constraint) const override {
7942 std::string R;
7943 switch (*Constraint) {
7944 case 'Z': // Two-character constraint; add "^" hint for later parsing.
7945 if (Constraint[1] == 'C') {
7946 R = std::string("^") + std::string(Constraint, 2);
7947 Constraint++;
7948 return R;
7949 }
7950 break;
7951 }
7952 return TargetInfo::convertConstraint(Constraint);
7953 }
7954
Craig Topper3164f332014-03-11 03:39:26 +00007955 const char *getClobbers() const override {
Toma Tabacucfab40f2015-01-12 14:41:30 +00007956 // In GCC, $1 is not widely used in generated code (it's used only in a few
7957 // specific situations), so there is no real need for users to add it to
7958 // the clobbers list if they want to use it in their inline assembly code.
7959 //
7960 // In LLVM, $1 is treated as a normal GPR and is always allocatable during
7961 // code generation, so using it in inline assembly without adding it to the
7962 // clobbers list can cause conflicts between the inline assembly code and
7963 // the surrounding generated code.
7964 //
7965 // Another problem is that LLVM is allowed to choose $1 for inline assembly
7966 // operands, which will conflict with the ".set at" assembler option (which
7967 // we use only for inline assembly, in order to maintain compatibility with
7968 // GCC) and will also conflict with the user's usage of $1.
7969 //
7970 // The easiest way to avoid these conflicts and keep $1 as an allocatable
7971 // register for generated code is to automatically clobber $1 for all inline
7972 // assembly code.
7973 //
7974 // FIXME: We should automatically clobber $1 only for inline assembly code
7975 // which actually uses it. This would allow LLVM to use $1 for inline
7976 // assembly operands if the user's assembly code doesn't use it.
Toma Tabacu99411952014-12-17 12:02:58 +00007977 return "~{$1}";
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007978 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007979
Craig Topper3164f332014-03-11 03:39:26 +00007980 bool handleTargetFeatures(std::vector<std::string> &Features,
7981 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00007982 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00007983 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007984 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00007985 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007986 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007987 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007988 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007989
Eric Christopher610fe112015-08-26 08:21:55 +00007990 for (const auto &Feature : Features) {
7991 if (Feature == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00007992 IsSingleFloat = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007993 else if (Feature == "+soft-float")
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007994 FloatABI = SoftFloat;
Eric Christopher610fe112015-08-26 08:21:55 +00007995 else if (Feature == "+mips16")
Simon Atanasyan72244b62012-07-05 16:06:06 +00007996 IsMips16 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007997 else if (Feature == "+micromips")
Simon Atanasyan60777612013-04-14 14:07:51 +00007998 IsMicromips = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007999 else if (Feature == "+dsp")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00008000 DspRev = std::max(DspRev, DSP1);
Eric Christopher610fe112015-08-26 08:21:55 +00008001 else if (Feature == "+dspr2")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00008002 DspRev = std::max(DspRev, DSP2);
Eric Christopher610fe112015-08-26 08:21:55 +00008003 else if (Feature == "+msa")
Jack Carter44ff1e52013-08-12 17:20:29 +00008004 HasMSA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00008005 else if (Feature == "+fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00008006 HasFP64 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00008007 else if (Feature == "-fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00008008 HasFP64 = false;
Eric Christopher610fe112015-08-26 08:21:55 +00008009 else if (Feature == "+nan2008")
Simon Atanasyan22127ce2013-09-24 09:09:16 +00008010 IsNan2008 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00008011 else if (Feature == "-nan2008")
Daniel Sanders9500d2d2014-07-09 13:56:23 +00008012 IsNan2008 = false;
Simon Dardisdf827a72017-02-21 16:01:00 +00008013 else if (Feature == "+noabicalls")
8014 IsNoABICalls = true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00008015 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00008016
James Y Knightb214cbc2016-03-04 19:00:41 +00008017 setDataLayout();
Akira Hatanaka9064e362013-10-29 18:30:33 +00008018
Rafael Espindolaeb265472013-08-21 21:59:03 +00008019 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00008020 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00008021
Craig Topper3164f332014-03-11 03:39:26 +00008022 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00008023 if (RegNo == 0) return 4;
8024 if (RegNo == 1) return 5;
8025 return -1;
8026 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00008027
8028 bool isCLZForZeroUndef() const override { return false; }
Daniel Sanders4672af62016-05-27 11:51:02 +00008029
8030 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8031 static const TargetInfo::GCCRegAlias O32RegAliases[] = {
8032 {{"at"}, "$1"}, {{"v0"}, "$2"}, {{"v1"}, "$3"},
8033 {{"a0"}, "$4"}, {{"a1"}, "$5"}, {{"a2"}, "$6"},
8034 {{"a3"}, "$7"}, {{"t0"}, "$8"}, {{"t1"}, "$9"},
8035 {{"t2"}, "$10"}, {{"t3"}, "$11"}, {{"t4"}, "$12"},
8036 {{"t5"}, "$13"}, {{"t6"}, "$14"}, {{"t7"}, "$15"},
8037 {{"s0"}, "$16"}, {{"s1"}, "$17"}, {{"s2"}, "$18"},
8038 {{"s3"}, "$19"}, {{"s4"}, "$20"}, {{"s5"}, "$21"},
8039 {{"s6"}, "$22"}, {{"s7"}, "$23"}, {{"t8"}, "$24"},
8040 {{"t9"}, "$25"}, {{"k0"}, "$26"}, {{"k1"}, "$27"},
8041 {{"gp"}, "$28"}, {{"sp", "$sp"}, "$29"}, {{"fp", "$fp"}, "$30"},
8042 {{"ra"}, "$31"}};
8043 static const TargetInfo::GCCRegAlias NewABIRegAliases[] = {
8044 {{"at"}, "$1"}, {{"v0"}, "$2"}, {{"v1"}, "$3"},
8045 {{"a0"}, "$4"}, {{"a1"}, "$5"}, {{"a2"}, "$6"},
8046 {{"a3"}, "$7"}, {{"a4"}, "$8"}, {{"a5"}, "$9"},
8047 {{"a6"}, "$10"}, {{"a7"}, "$11"}, {{"t0"}, "$12"},
8048 {{"t1"}, "$13"}, {{"t2"}, "$14"}, {{"t3"}, "$15"},
8049 {{"s0"}, "$16"}, {{"s1"}, "$17"}, {{"s2"}, "$18"},
8050 {{"s3"}, "$19"}, {{"s4"}, "$20"}, {{"s5"}, "$21"},
8051 {{"s6"}, "$22"}, {{"s7"}, "$23"}, {{"t8"}, "$24"},
8052 {{"t9"}, "$25"}, {{"k0"}, "$26"}, {{"k1"}, "$27"},
8053 {{"gp"}, "$28"}, {{"sp", "$sp"}, "$29"}, {{"fp", "$fp"}, "$30"},
8054 {{"ra"}, "$31"}};
Daniel Sanders26a56ad2016-06-06 09:07:08 +00008055 if (ABI == "o32")
Daniel Sanders4672af62016-05-27 11:51:02 +00008056 return llvm::makeArrayRef(O32RegAliases);
8057 return llvm::makeArrayRef(NewABIRegAliases);
8058 }
8059
8060 bool hasInt128Type() const override {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00008061 return ABI == "n32" || ABI == "n64";
Daniel Sanders4672af62016-05-27 11:51:02 +00008062 }
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00008063
8064 bool validateTarget(DiagnosticsEngine &Diags) const override {
8065 // FIXME: It's valid to use O32 on a 64-bit CPU but the backend can't handle
8066 // this yet. It's better to fail here than on the backend assertion.
8067 if (processorSupportsGPR64() && ABI == "o32") {
8068 Diags.Report(diag::err_target_unsupported_abi) << ABI << CPU;
8069 return false;
8070 }
8071
8072 // 64-bit ABI's require 64-bit CPU's.
8073 if (!processorSupportsGPR64() && (ABI == "n32" || ABI == "n64")) {
8074 Diags.Report(diag::err_target_unsupported_abi) << ABI << CPU;
8075 return false;
8076 }
8077
8078 // FIXME: It's valid to use O32 on a mips64/mips64el triple but the backend
8079 // can't handle this yet. It's better to fail here than on the
8080 // backend assertion.
8081 if ((getTriple().getArch() == llvm::Triple::mips64 ||
8082 getTriple().getArch() == llvm::Triple::mips64el) &&
8083 ABI == "o32") {
8084 Diags.Report(diag::err_target_unsupported_abi_for_triple)
8085 << ABI << getTriple().str();
8086 return false;
8087 }
8088
8089 // FIXME: It's valid to use N32/N64 on a mips/mipsel triple but the backend
8090 // can't handle this yet. It's better to fail here than on the
8091 // backend assertion.
8092 if ((getTriple().getArch() == llvm::Triple::mips ||
8093 getTriple().getArch() == llvm::Triple::mipsel) &&
8094 (ABI == "n32" || ABI == "n64")) {
8095 Diags.Report(diag::err_target_unsupported_abi_for_triple)
8096 << ABI << getTriple().str();
8097 return false;
8098 }
8099
8100 return true;
8101 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008102};
8103
Daniel Sanders4672af62016-05-27 11:51:02 +00008104const Builtin::Info MipsTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00008105#define BUILTIN(ID, TYPE, ATTRS) \
8106 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
8107#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
8108 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00008109#include "clang/Basic/BuiltinsMips.def"
8110};
8111
Ivan Krasindd7403e2011-08-24 20:22:22 +00008112class PNaClTargetInfo : public TargetInfo {
8113public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008114 PNaClTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8115 : TargetInfo(Triple) {
Ivan Krasindd7403e2011-08-24 20:22:22 +00008116 this->LongAlign = 32;
8117 this->LongWidth = 32;
8118 this->PointerAlign = 32;
8119 this->PointerWidth = 32;
8120 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00008121 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00008122 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00008123 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00008124 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00008125 this->SizeType = TargetInfo::UnsignedInt;
8126 this->PtrDiffType = TargetInfo::SignedInt;
8127 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00008128 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00008129 }
8130
Craig Toppere6f17d02014-03-11 04:07:52 +00008131 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00008132 Builder.defineMacro("__le32__");
8133 Builder.defineMacro("__pnacl__");
8134 }
Craig Topper3164f332014-03-11 03:39:26 +00008135 void getTargetDefines(const LangOptions &Opts,
8136 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00008137 getArchDefines(Opts, Builder);
8138 }
Craig Topper3164f332014-03-11 03:39:26 +00008139 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00008140 return Feature == "pnacl";
8141 }
Craig Topper6c03a542015-10-19 04:51:35 +00008142 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Craig Topper3164f332014-03-11 03:39:26 +00008143 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00008144 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00008145 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008146 ArrayRef<const char *> getGCCRegNames() const override;
8147 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00008148 bool validateAsmConstraint(const char *&Name,
8149 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00008150 return false;
8151 }
8152
Craig Topper3164f332014-03-11 03:39:26 +00008153 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00008154 return "";
8155 }
8156};
8157
Craig Topperf054e3a2015-10-19 03:52:27 +00008158ArrayRef<const char *> PNaClTargetInfo::getGCCRegNames() const {
8159 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00008160}
8161
Craig Topperf054e3a2015-10-19 03:52:27 +00008162ArrayRef<TargetInfo::GCCRegAlias> PNaClTargetInfo::getGCCRegAliases() const {
8163 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00008164}
Ivan Krasindd7403e2011-08-24 20:22:22 +00008165
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008166// We attempt to use PNaCl (le32) frontend and Mips32EL backend.
Daniel Sanders4672af62016-05-27 11:51:02 +00008167class NaClMips32TargetInfo : public MipsTargetInfo {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008168public:
Daniel Sanders4672af62016-05-27 11:51:02 +00008169 NaClMips32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8170 : MipsTargetInfo(Triple, Opts) {}
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008171
8172 BuiltinVaListKind getBuiltinVaListKind() const override {
8173 return TargetInfo::PNaClABIBuiltinVaList;
8174 }
8175};
8176
JF Bastien643817d2014-09-12 17:52:47 +00008177class Le64TargetInfo : public TargetInfo {
8178 static const Builtin::Info BuiltinInfo[];
8179
8180public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008181 Le64TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
8182 : TargetInfo(Triple) {
JF Bastien643817d2014-09-12 17:52:47 +00008183 NoAsmVariants = true;
8184 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
8185 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00008186 resetDataLayout("e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128");
JF Bastien643817d2014-09-12 17:52:47 +00008187 }
8188
8189 void getTargetDefines(const LangOptions &Opts,
8190 MacroBuilder &Builder) const override {
Saleem Abdulrasool56027092017-02-07 19:00:06 +00008191 DefineStd(Builder, "unix", Opts);
JF Bastien643817d2014-09-12 17:52:47 +00008192 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
8193 Builder.defineMacro("__ELF__");
8194 }
Craig Topper6c03a542015-10-19 04:51:35 +00008195 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
8196 return llvm::makeArrayRef(BuiltinInfo,
8197 clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin);
JF Bastien643817d2014-09-12 17:52:47 +00008198 }
8199 BuiltinVaListKind getBuiltinVaListKind() const override {
8200 return TargetInfo::PNaClABIBuiltinVaList;
8201 }
8202 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00008203 ArrayRef<const char *> getGCCRegNames() const override {
8204 return None;
JF Bastien643817d2014-09-12 17:52:47 +00008205 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008206 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8207 return None;
JF Bastien643817d2014-09-12 17:52:47 +00008208 }
8209 bool validateAsmConstraint(const char *&Name,
8210 TargetInfo::ConstraintInfo &Info) const override {
8211 return false;
8212 }
8213
8214 bool hasProtectedVisibility() const override { return false; }
JF Bastien643817d2014-09-12 17:52:47 +00008215};
Dan Gohmanc2853072015-09-03 22:51:53 +00008216
8217class WebAssemblyTargetInfo : public TargetInfo {
8218 static const Builtin::Info BuiltinInfo[];
8219
8220 enum SIMDEnum {
8221 NoSIMD,
8222 SIMD128,
8223 } SIMDLevel;
8224
8225public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008226 explicit WebAssemblyTargetInfo(const llvm::Triple &T, const TargetOptions &)
Dan Gohmanc2853072015-09-03 22:51:53 +00008227 : TargetInfo(T), SIMDLevel(NoSIMD) {
Dan Gohmanc2853072015-09-03 22:51:53 +00008228 NoAsmVariants = true;
8229 SuitableAlign = 128;
8230 LargeArrayMinWidth = 128;
8231 LargeArrayAlign = 128;
8232 SimdDefaultAlign = 128;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00008233 SigAtomicType = SignedLong;
Dan Gohman6db46402015-11-10 21:01:46 +00008234 LongDoubleWidth = LongDoubleAlign = 128;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00008235 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Derek Schuffacdc8e62016-09-01 22:38:37 +00008236 SizeType = UnsignedInt;
8237 PtrDiffType = SignedInt;
8238 IntPtrType = SignedInt;
Dan Gohmanc2853072015-09-03 22:51:53 +00008239 }
8240
8241protected:
8242 void getTargetDefines(const LangOptions &Opts,
8243 MacroBuilder &Builder) const override {
8244 defineCPUMacros(Builder, "wasm", /*Tuning=*/false);
8245 if (SIMDLevel >= SIMD128)
8246 Builder.defineMacro("__wasm_simd128__");
8247 }
8248
8249private:
Eric Christopher8c47b422015-10-09 18:39:55 +00008250 bool
8251 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
8252 StringRef CPU,
8253 const std::vector<std::string> &FeaturesVec) const override {
Dan Gohmanc2853072015-09-03 22:51:53 +00008254 if (CPU == "bleeding-edge")
8255 Features["simd128"] = true;
8256 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
8257 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00008258 bool hasFeature(StringRef Feature) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00008259 return llvm::StringSwitch<bool>(Feature)
8260 .Case("simd128", SIMDLevel >= SIMD128)
8261 .Default(false);
8262 }
8263 bool handleTargetFeatures(std::vector<std::string> &Features,
Hans Wennborg7eb54642015-09-10 17:07:54 +00008264 DiagnosticsEngine &Diags) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00008265 for (const auto &Feature : Features) {
8266 if (Feature == "+simd128") {
8267 SIMDLevel = std::max(SIMDLevel, SIMD128);
8268 continue;
8269 }
8270 if (Feature == "-simd128") {
8271 SIMDLevel = std::min(SIMDLevel, SIMDEnum(SIMD128 - 1));
8272 continue;
8273 }
8274
8275 Diags.Report(diag::err_opt_not_valid_with_opt) << Feature
8276 << "-target-feature";
8277 return false;
8278 }
8279 return true;
8280 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00008281 bool setCPU(const std::string &Name) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00008282 return llvm::StringSwitch<bool>(Name)
8283 .Case("mvp", true)
8284 .Case("bleeding-edge", true)
8285 .Case("generic", true)
8286 .Default(false);
8287 }
Craig Topper6c03a542015-10-19 04:51:35 +00008288 ArrayRef<Builtin::Info> getTargetBuiltins() const final {
8289 return llvm::makeArrayRef(BuiltinInfo,
8290 clang::WebAssembly::LastTSBuiltin - Builtin::FirstTSBuiltin);
Dan Gohmanc2853072015-09-03 22:51:53 +00008291 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00008292 BuiltinVaListKind getBuiltinVaListKind() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00008293 return VoidPtrBuiltinVaList;
8294 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008295 ArrayRef<const char *> getGCCRegNames() const final {
8296 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00008297 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008298 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const final {
8299 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00008300 }
8301 bool
8302 validateAsmConstraint(const char *&Name,
Hans Wennborg7eb54642015-09-10 17:07:54 +00008303 TargetInfo::ConstraintInfo &Info) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00008304 return false;
8305 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00008306 const char *getClobbers() const final { return ""; }
8307 bool isCLZForZeroUndef() const final { return false; }
8308 bool hasInt128Type() const final { return true; }
Dan Gohmanab0e31f2015-09-14 21:49:41 +00008309 IntType getIntTypeByWidth(unsigned BitWidth,
8310 bool IsSigned) const final {
8311 // WebAssembly prefers long long for explicitly 64-bit integers.
8312 return BitWidth == 64 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
8313 : TargetInfo::getIntTypeByWidth(BitWidth, IsSigned);
8314 }
8315 IntType getLeastIntTypeByWidth(unsigned BitWidth,
8316 bool IsSigned) const final {
8317 // WebAssembly uses long long for int_least64_t and int_fast64_t.
8318 return BitWidth == 64
8319 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
8320 : TargetInfo::getLeastIntTypeByWidth(BitWidth, IsSigned);
8321 }
Dan Gohmanc2853072015-09-03 22:51:53 +00008322};
8323
8324const Builtin::Info WebAssemblyTargetInfo::BuiltinInfo[] = {
8325#define BUILTIN(ID, TYPE, ATTRS) \
8326 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
8327#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
8328 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
8329#include "clang/Basic/BuiltinsWebAssembly.def"
8330};
8331
8332class WebAssembly32TargetInfo : public WebAssemblyTargetInfo {
8333public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008334 explicit WebAssembly32TargetInfo(const llvm::Triple &T,
8335 const TargetOptions &Opts)
8336 : WebAssemblyTargetInfo(T, Opts) {
Dan Gohmanf1c34e62015-09-14 21:56:37 +00008337 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
James Y Knightb214cbc2016-03-04 19:00:41 +00008338 resetDataLayout("e-m:e-p:32:32-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00008339 }
8340
8341protected:
8342 void getTargetDefines(const LangOptions &Opts,
8343 MacroBuilder &Builder) const override {
8344 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
8345 defineCPUMacros(Builder, "wasm32", /*Tuning=*/false);
8346 }
8347};
8348
8349class WebAssembly64TargetInfo : public WebAssemblyTargetInfo {
8350public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008351 explicit WebAssembly64TargetInfo(const llvm::Triple &T,
8352 const TargetOptions &Opts)
8353 : WebAssemblyTargetInfo(T, Opts) {
Dan Gohmanc2853072015-09-03 22:51:53 +00008354 LongAlign = LongWidth = 64;
8355 PointerAlign = PointerWidth = 64;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00008356 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Derek Schuffacdc8e62016-09-01 22:38:37 +00008357 SizeType = UnsignedLong;
8358 PtrDiffType = SignedLong;
8359 IntPtrType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00008360 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00008361 }
8362
8363protected:
8364 void getTargetDefines(const LangOptions &Opts,
8365 MacroBuilder &Builder) const override {
8366 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
8367 defineCPUMacros(Builder, "wasm64", /*Tuning=*/false);
8368 }
8369};
8370
JF Bastien643817d2014-09-12 17:52:47 +00008371const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
8372#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00008373 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
JF Bastien643817d2014-09-12 17:52:47 +00008374#include "clang/Basic/BuiltinsLe64.def"
8375};
8376
Eric Christopherc48497a2015-09-18 21:26:24 +00008377static const unsigned SPIRAddrSpaceMap[] = {
8378 1, // opencl_global
8379 3, // opencl_local
8380 2, // opencl_constant
8381 4, // opencl_generic
8382 0, // cuda_device
8383 0, // cuda_constant
8384 0 // cuda_shared
8385};
8386class SPIRTargetInfo : public TargetInfo {
8387public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008388 SPIRTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
8389 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00008390 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
8391 "SPIR target must use unknown OS");
8392 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
8393 "SPIR target must use unknown environment type");
Eric Christopherc48497a2015-09-18 21:26:24 +00008394 TLSSupported = false;
8395 LongWidth = LongAlign = 64;
8396 AddrSpaceMap = &SPIRAddrSpaceMap;
8397 UseAddrSpaceMapMangling = true;
8398 // Define available target features
8399 // These must be defined in sorted order!
8400 NoAsmVariants = true;
8401 }
8402 void getTargetDefines(const LangOptions &Opts,
8403 MacroBuilder &Builder) const override {
8404 DefineStd(Builder, "SPIR", Opts);
8405 }
8406 bool hasFeature(StringRef Feature) const override {
8407 return Feature == "spir";
8408 }
Craig Topper3164f332014-03-11 03:39:26 +00008409
Craig Topper6c03a542015-10-19 04:51:35 +00008410 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00008411 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00008412 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00008413 bool validateAsmConstraint(const char *&Name,
8414 TargetInfo::ConstraintInfo &info) const override {
8415 return true;
8416 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008417 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8418 return None;
8419 }
Eric Christopherc48497a2015-09-18 21:26:24 +00008420 BuiltinVaListKind getBuiltinVaListKind() const override {
8421 return TargetInfo::VoidPtrBuiltinVaList;
8422 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00008423
Eric Christopherc48497a2015-09-18 21:26:24 +00008424 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Nikolay Haustov8c6538b2016-06-30 09:06:33 +00008425 return (CC == CC_SpirFunction || CC == CC_OpenCLKernel) ? CCCR_OK
8426 : CCCR_Warning;
Eric Christopherc48497a2015-09-18 21:26:24 +00008427 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00008428
Eric Christopherc48497a2015-09-18 21:26:24 +00008429 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
8430 return CC_SpirFunction;
8431 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00008432
8433 void setSupportedOpenCLOpts() override {
8434 // Assume all OpenCL extensions and optional core features are supported
8435 // for SPIR since it is a generic target.
Yaxun Liu5b746652016-12-18 05:18:55 +00008436 getSupportedOpenCLOpts().supportAll();
Yaxun Liu39cf40f2016-05-16 17:06:34 +00008437 }
Eric Christopherc48497a2015-09-18 21:26:24 +00008438};
Guy Benyeib798fc92012-12-11 21:38:14 +00008439
Eric Christopherc48497a2015-09-18 21:26:24 +00008440class SPIR32TargetInfo : public SPIRTargetInfo {
8441public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008442 SPIR32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8443 : SPIRTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00008444 PointerWidth = PointerAlign = 32;
8445 SizeType = TargetInfo::UnsignedInt;
8446 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +00008447 resetDataLayout("e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
8448 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00008449 }
8450 void getTargetDefines(const LangOptions &Opts,
8451 MacroBuilder &Builder) const override {
8452 DefineStd(Builder, "SPIR32", Opts);
8453 }
8454};
Guy Benyeib798fc92012-12-11 21:38:14 +00008455
Eric Christopherc48497a2015-09-18 21:26:24 +00008456class SPIR64TargetInfo : public SPIRTargetInfo {
8457public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008458 SPIR64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8459 : SPIRTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00008460 PointerWidth = PointerAlign = 64;
8461 SizeType = TargetInfo::UnsignedLong;
8462 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00008463 resetDataLayout("e-i64:64-v16:16-v24:32-v32:32-v48:64-"
8464 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00008465 }
8466 void getTargetDefines(const LangOptions &Opts,
8467 MacroBuilder &Builder) const override {
8468 DefineStd(Builder, "SPIR64", Opts);
8469 }
8470};
Guy Benyeib798fc92012-12-11 21:38:14 +00008471
Robert Lytton0e076492013-08-13 09:43:10 +00008472class XCoreTargetInfo : public TargetInfo {
8473 static const Builtin::Info BuiltinInfo[];
8474public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008475 XCoreTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
8476 : TargetInfo(Triple) {
Robert Lytton0e076492013-08-13 09:43:10 +00008477 NoAsmVariants = true;
8478 LongLongAlign = 32;
8479 SuitableAlign = 32;
8480 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00008481 SizeType = UnsignedInt;
8482 PtrDiffType = SignedInt;
8483 IntPtrType = SignedInt;
8484 WCharType = UnsignedChar;
8485 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00008486 UseZeroLengthBitfieldAlignment = true;
James Y Knightb214cbc2016-03-04 19:00:41 +00008487 resetDataLayout("e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32"
8488 "-f64:32-a:0:32-n32");
Robert Lytton0e076492013-08-13 09:43:10 +00008489 }
Craig Topper3164f332014-03-11 03:39:26 +00008490 void getTargetDefines(const LangOptions &Opts,
8491 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008492 Builder.defineMacro("__XS1B__");
8493 }
Craig Topper6c03a542015-10-19 04:51:35 +00008494 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
8495 return llvm::makeArrayRef(BuiltinInfo,
8496 clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin);
Robert Lytton0e076492013-08-13 09:43:10 +00008497 }
Craig Topper3164f332014-03-11 03:39:26 +00008498 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008499 return TargetInfo::VoidPtrBuiltinVaList;
8500 }
Craig Topper3164f332014-03-11 03:39:26 +00008501 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008502 return "";
8503 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008504 ArrayRef<const char *> getGCCRegNames() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008505 static const char * const GCCRegNames[] = {
8506 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
8507 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
8508 };
Craig Topperf054e3a2015-10-19 03:52:27 +00008509 return llvm::makeArrayRef(GCCRegNames);
Robert Lytton0e076492013-08-13 09:43:10 +00008510 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008511 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8512 return None;
Robert Lytton0e076492013-08-13 09:43:10 +00008513 }
Craig Topper3164f332014-03-11 03:39:26 +00008514 bool validateAsmConstraint(const char *&Name,
8515 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008516 return false;
8517 }
Craig Topper3164f332014-03-11 03:39:26 +00008518 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00008519 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
8520 return (RegNo < 2)? RegNo : -1;
8521 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00008522 bool allowsLargerPreferedTypeAlignment() const override {
8523 return false;
8524 }
Robert Lytton0e076492013-08-13 09:43:10 +00008525};
8526
8527const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00008528#define BUILTIN(ID, TYPE, ATTRS) \
8529 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
8530#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
8531 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Robert Lytton0e076492013-08-13 09:43:10 +00008532#include "clang/Basic/BuiltinsXCore.def"
8533};
Robert Lytton0e076492013-08-13 09:43:10 +00008534
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008535// x86_32 Android target
8536class AndroidX86_32TargetInfo : public LinuxTargetInfo<X86_32TargetInfo> {
8537public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008538 AndroidX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8539 : LinuxTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008540 SuitableAlign = 32;
8541 LongDoubleWidth = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00008542 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008543 }
8544};
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008545
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008546// x86_64 Android target
8547class AndroidX86_64TargetInfo : public LinuxTargetInfo<X86_64TargetInfo> {
8548public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008549 AndroidX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8550 : LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Stephan Bergmann17c7f702016-12-14 11:57:17 +00008551 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008552 }
Chih-Hung Hsieh0b0eeaa2015-07-24 18:12:54 +00008553
8554 bool useFloat128ManglingForLongDouble() const override {
8555 return true;
8556 }
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008557};
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008558
8559// 32-bit RenderScript is armv7 with width and align of 'long' set to 8-bytes
8560class RenderScript32TargetInfo : public ARMleTargetInfo {
8561public:
8562 RenderScript32TargetInfo(const llvm::Triple &Triple,
8563 const TargetOptions &Opts)
8564 : ARMleTargetInfo(llvm::Triple("armv7", Triple.getVendorName(),
8565 Triple.getOSName(),
8566 Triple.getEnvironmentName()),
8567 Opts) {
Pirama Arumuga Nainarbb846a32016-07-27 19:01:51 +00008568 IsRenderScriptTarget = true;
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008569 LongWidth = LongAlign = 64;
8570 }
8571 void getTargetDefines(const LangOptions &Opts,
8572 MacroBuilder &Builder) const override {
8573 Builder.defineMacro("__RENDERSCRIPT__");
8574 ARMleTargetInfo::getTargetDefines(Opts, Builder);
8575 }
8576};
8577
8578// 64-bit RenderScript is aarch64
8579class RenderScript64TargetInfo : public AArch64leTargetInfo {
8580public:
8581 RenderScript64TargetInfo(const llvm::Triple &Triple,
8582 const TargetOptions &Opts)
8583 : AArch64leTargetInfo(llvm::Triple("aarch64", Triple.getVendorName(),
8584 Triple.getOSName(),
8585 Triple.getEnvironmentName()),
Pirama Arumuga Nainarbb846a32016-07-27 19:01:51 +00008586 Opts) {
8587 IsRenderScriptTarget = true;
8588 }
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008589
8590 void getTargetDefines(const LangOptions &Opts,
8591 MacroBuilder &Builder) const override {
8592 Builder.defineMacro("__RENDERSCRIPT__");
8593 AArch64leTargetInfo::getTargetDefines(Opts, Builder);
8594 }
8595};
8596
Dylan McKayecb6e7b2017-02-07 06:04:18 +00008597/// Information about a specific microcontroller.
8598struct MCUInfo {
8599 const char *Name;
8600 const char *DefineName;
8601};
8602
8603// This list should be kept up-to-date with AVRDevices.td in LLVM.
8604static ArrayRef<MCUInfo> AVRMcus = {
8605 { "at90s1200", "__AVR_AT90S1200__" },
Dylan McKay315edb02017-02-11 21:06:07 +00008606 { "attiny11", "__AVR_ATtiny11__" },
8607 { "attiny12", "__AVR_ATtiny12__" },
8608 { "attiny15", "__AVR_ATtiny15__" },
8609 { "attiny28", "__AVR_ATtiny28__" },
8610 { "at90s2313", "__AVR_AT90S2313__" },
8611 { "at90s2323", "__AVR_AT90S2323__" },
8612 { "at90s2333", "__AVR_AT90S2333__" },
8613 { "at90s2343", "__AVR_AT90S2343__" },
8614 { "attiny22", "__AVR_ATtiny22__" },
8615 { "attiny26", "__AVR_ATtiny26__" },
8616 { "at86rf401", "__AVR_AT86RF401__" },
8617 { "at90s4414", "__AVR_AT90S4414__" },
8618 { "at90s4433", "__AVR_AT90S4433__" },
8619 { "at90s4434", "__AVR_AT90S4434__" },
8620 { "at90s8515", "__AVR_AT90S8515__" },
8621 { "at90c8534", "__AVR_AT90c8534__" },
8622 { "at90s8535", "__AVR_AT90S8535__" },
8623 { "ata5272", "__AVR_ATA5272__" },
8624 { "attiny13", "__AVR_ATtiny13__" },
8625 { "attiny13a", "__AVR_ATtiny13A__" },
8626 { "attiny2313", "__AVR_ATtiny2313__" },
8627 { "attiny2313a", "__AVR_ATtiny2313A__" },
8628 { "attiny24", "__AVR_ATtiny24__" },
8629 { "attiny24a", "__AVR_ATtiny24A__" },
8630 { "attiny4313", "__AVR_ATtiny4313__" },
8631 { "attiny44", "__AVR_ATtiny44__" },
8632 { "attiny44a", "__AVR_ATtiny44A__" },
8633 { "attiny84", "__AVR_ATtiny84__" },
8634 { "attiny84a", "__AVR_ATtiny84A__" },
8635 { "attiny25", "__AVR_ATtiny25__" },
8636 { "attiny45", "__AVR_ATtiny45__" },
8637 { "attiny85", "__AVR_ATtiny85__" },
8638 { "attiny261", "__AVR_ATtiny261__" },
8639 { "attiny261a", "__AVR_ATtiny261A__" },
8640 { "attiny461", "__AVR_ATtiny461__" },
8641 { "attiny461a", "__AVR_ATtiny461A__" },
8642 { "attiny861", "__AVR_ATtiny861__" },
8643 { "attiny861a", "__AVR_ATtiny861A__" },
8644 { "attiny87", "__AVR_ATtiny87__" },
8645 { "attiny43u", "__AVR_ATtiny43U__" },
8646 { "attiny48", "__AVR_ATtiny48__" },
8647 { "attiny88", "__AVR_ATtiny88__" },
8648 { "attiny828", "__AVR_ATtiny828__" },
8649 { "at43usb355", "__AVR_AT43USB355__" },
8650 { "at76c711", "__AVR_AT76C711__" },
8651 { "atmega103", "__AVR_ATmega103__" },
8652 { "at43usb320", "__AVR_AT43USB320__" },
8653 { "attiny167", "__AVR_ATtiny167__" },
8654 { "at90usb82", "__AVR_AT90USB82__" },
8655 { "at90usb162", "__AVR_AT90USB162__" },
8656 { "ata5505", "__AVR_ATA5505__" },
8657 { "atmega8u2", "__AVR_ATmega8U2__" },
8658 { "atmega16u2", "__AVR_ATmega16U2__" },
8659 { "atmega32u2", "__AVR_ATmega32U2__" },
8660 { "attiny1634", "__AVR_ATtiny1634__" },
8661 { "atmega8", "__AVR_ATmega8__" },
8662 { "ata6289", "__AVR_ATA6289__" },
8663 { "atmega8a", "__AVR_ATmega8A__" },
8664 { "ata6285", "__AVR_ATA6285__" },
8665 { "ata6286", "__AVR_ATA6286__" },
8666 { "atmega48", "__AVR_ATmega48__" },
8667 { "atmega48a", "__AVR_ATmega48A__" },
8668 { "atmega48pa", "__AVR_ATmega48PA__" },
8669 { "atmega48p", "__AVR_ATmega48P__" },
8670 { "atmega88", "__AVR_ATmega88__" },
8671 { "atmega88a", "__AVR_ATmega88A__" },
8672 { "atmega88p", "__AVR_ATmega88P__" },
8673 { "atmega88pa", "__AVR_ATmega88PA__" },
8674 { "atmega8515", "__AVR_ATmega8515__" },
8675 { "atmega8535", "__AVR_ATmega8535__" },
8676 { "atmega8hva", "__AVR_ATmega8HVA__" },
8677 { "at90pwm1", "__AVR_AT90PWM1__" },
8678 { "at90pwm2", "__AVR_AT90PWM2__" },
8679 { "at90pwm2b", "__AVR_AT90PWM2B__" },
8680 { "at90pwm3", "__AVR_AT90PWM3__" },
8681 { "at90pwm3b", "__AVR_AT90PWM3B__" },
8682 { "at90pwm81", "__AVR_AT90PWM81__" },
8683 { "ata5790", "__AVR_ATA5790__" },
8684 { "ata5795", "__AVR_ATA5795__" },
8685 { "atmega16", "__AVR_ATmega16__" },
8686 { "atmega16a", "__AVR_ATmega16A__" },
8687 { "atmega161", "__AVR_ATmega161__" },
8688 { "atmega162", "__AVR_ATmega162__" },
8689 { "atmega163", "__AVR_ATmega163__" },
8690 { "atmega164a", "__AVR_ATmega164A__" },
8691 { "atmega164p", "__AVR_ATmega164P__" },
8692 { "atmega164pa", "__AVR_ATmega164PA__" },
8693 { "atmega165", "__AVR_ATmega165__" },
8694 { "atmega165a", "__AVR_ATmega165A__" },
8695 { "atmega165p", "__AVR_ATmega165P__" },
8696 { "atmega165pa", "__AVR_ATmega165PA__" },
8697 { "atmega168", "__AVR_ATmega168__" },
8698 { "atmega168a", "__AVR_ATmega168A__" },
8699 { "atmega168p", "__AVR_ATmega168P__" },
8700 { "atmega168pa", "__AVR_ATmega168PA__" },
8701 { "atmega169", "__AVR_ATmega169__" },
8702 { "atmega169a", "__AVR_ATmega169A__" },
8703 { "atmega169p", "__AVR_ATmega169P__" },
8704 { "atmega169pa", "__AVR_ATmega169PA__" },
8705 { "atmega32", "__AVR_ATmega32__" },
8706 { "atmega32a", "__AVR_ATmega32A__" },
8707 { "atmega323", "__AVR_ATmega323__" },
8708 { "atmega324a", "__AVR_ATmega324A__" },
8709 { "atmega324p", "__AVR_ATmega324P__" },
8710 { "atmega324pa", "__AVR_ATmega324PA__" },
8711 { "atmega325", "__AVR_ATmega325__" },
8712 { "atmega325a", "__AVR_ATmega325A__" },
8713 { "atmega325p", "__AVR_ATmega325P__" },
8714 { "atmega325pa", "__AVR_ATmega325PA__" },
8715 { "atmega3250", "__AVR_ATmega3250__" },
8716 { "atmega3250a", "__AVR_ATmega3250A__" },
8717 { "atmega3250p", "__AVR_ATmega3250P__" },
8718 { "atmega3250pa", "__AVR_ATmega3250PA__" },
8719 { "atmega328", "__AVR_ATmega328__" },
8720 { "atmega328p", "__AVR_ATmega328P__" },
8721 { "atmega329", "__AVR_ATmega329__" },
8722 { "atmega329a", "__AVR_ATmega329A__" },
8723 { "atmega329p", "__AVR_ATmega329P__" },
8724 { "atmega329pa", "__AVR_ATmega329PA__" },
8725 { "atmega3290", "__AVR_ATmega3290__" },
8726 { "atmega3290a", "__AVR_ATmega3290A__" },
8727 { "atmega3290p", "__AVR_ATmega3290P__" },
8728 { "atmega3290pa", "__AVR_ATmega3290PA__" },
8729 { "atmega406", "__AVR_ATmega406__" },
8730 { "atmega64", "__AVR_ATmega64__" },
8731 { "atmega64a", "__AVR_ATmega64A__" },
8732 { "atmega640", "__AVR_ATmega640__" },
8733 { "atmega644", "__AVR_ATmega644__" },
8734 { "atmega644a", "__AVR_ATmega644A__" },
8735 { "atmega644p", "__AVR_ATmega644P__" },
8736 { "atmega644pa", "__AVR_ATmega644PA__" },
8737 { "atmega645", "__AVR_ATmega645__" },
8738 { "atmega645a", "__AVR_ATmega645A__" },
8739 { "atmega645p", "__AVR_ATmega645P__" },
8740 { "atmega649", "__AVR_ATmega649__" },
8741 { "atmega649a", "__AVR_ATmega649A__" },
8742 { "atmega649p", "__AVR_ATmega649P__" },
8743 { "atmega6450", "__AVR_ATmega6450__" },
8744 { "atmega6450a", "__AVR_ATmega6450A__" },
8745 { "atmega6450p", "__AVR_ATmega6450P__" },
8746 { "atmega6490", "__AVR_ATmega6490__" },
8747 { "atmega6490a", "__AVR_ATmega6490A__" },
8748 { "atmega6490p", "__AVR_ATmega6490P__" },
8749 { "atmega64rfr2", "__AVR_ATmega64RFR2__" },
8750 { "atmega644rfr2", "__AVR_ATmega644RFR2__" },
8751 { "atmega16hva", "__AVR_ATmega16HVA__" },
8752 { "atmega16hva2", "__AVR_ATmega16HVA2__" },
8753 { "atmega16hvb", "__AVR_ATmega16HVB__" },
8754 { "atmega16hvbrevb", "__AVR_ATmega16HVBREVB__" },
8755 { "atmega32hvb", "__AVR_ATmega32HVB__" },
8756 { "atmega32hvbrevb", "__AVR_ATmega32HVBREVB__" },
8757 { "atmega64hve", "__AVR_ATmega64HVE__" },
8758 { "at90can32", "__AVR_AT90CAN32__" },
8759 { "at90can64", "__AVR_AT90CAN64__" },
8760 { "at90pwm161", "__AVR_AT90PWM161__" },
8761 { "at90pwm216", "__AVR_AT90PWM216__" },
8762 { "at90pwm316", "__AVR_AT90PWM316__" },
8763 { "atmega32c1", "__AVR_ATmega32C1__" },
8764 { "atmega64c1", "__AVR_ATmega64C1__" },
8765 { "atmega16m1", "__AVR_ATmega16M1__" },
8766 { "atmega32m1", "__AVR_ATmega32M1__" },
8767 { "atmega64m1", "__AVR_ATmega64M1__" },
8768 { "atmega16u4", "__AVR_ATmega16U4__" },
8769 { "atmega32u4", "__AVR_ATmega32U4__" },
8770 { "atmega32u6", "__AVR_ATmega32U6__" },
8771 { "at90usb646", "__AVR_AT90USB646__" },
8772 { "at90usb647", "__AVR_AT90USB647__" },
8773 { "at90scr100", "__AVR_AT90SCR100__" },
8774 { "at94k", "__AVR_AT94K__" },
8775 { "m3000", "__AVR_AT000__" },
8776 { "atmega128", "__AVR_ATmega128__" },
8777 { "atmega128a", "__AVR_ATmega128A__" },
8778 { "atmega1280", "__AVR_ATmega1280__" },
8779 { "atmega1281", "__AVR_ATmega1281__" },
8780 { "atmega1284", "__AVR_ATmega1284__" },
8781 { "atmega1284p", "__AVR_ATmega1284P__" },
8782 { "atmega128rfa1", "__AVR_ATmega128RFA1__" },
8783 { "atmega128rfr2", "__AVR_ATmega128RFR2__" },
8784 { "atmega1284rfr2", "__AVR_ATmega1284RFR2__" },
8785 { "at90can128", "__AVR_AT90CAN128__" },
8786 { "at90usb1286", "__AVR_AT90USB1286__" },
8787 { "at90usb1287", "__AVR_AT90USB1287__" },
8788 { "atmega2560", "__AVR_ATmega2560__" },
8789 { "atmega2561", "__AVR_ATmega2561__" },
8790 { "atmega256rfr2", "__AVR_ATmega256RFR2__" },
8791 { "atmega2564rfr2", "__AVR_ATmega2564RFR2__" },
8792 { "atxmega16a4", "__AVR_ATxmega16A4__" },
8793 { "atxmega16a4u", "__AVR_ATxmega16a4U__" },
8794 { "atxmega16c4", "__AVR_ATxmega16C4__" },
8795 { "atxmega16d4", "__AVR_ATxmega16D4__" },
8796 { "atxmega32a4", "__AVR_ATxmega32A4__" },
8797 { "atxmega32a4u", "__AVR_ATxmega32A4U__" },
8798 { "atxmega32c4", "__AVR_ATxmega32C4__" },
8799 { "atxmega32d4", "__AVR_ATxmega32D4__" },
8800 { "atxmega32e5", "__AVR_ATxmega32E5__" },
8801 { "atxmega16e5", "__AVR_ATxmega16E5__" },
8802 { "atxmega8e5", "__AVR_ATxmega8E5__" },
8803 { "atxmega32x1", "__AVR_ATxmega32X1__" },
8804 { "atxmega64a3", "__AVR_ATxmega64A3__" },
8805 { "atxmega64a3u", "__AVR_ATxmega64A3U__" },
8806 { "atxmega64a4u", "__AVR_ATxmega64A4U__" },
8807 { "atxmega64b1", "__AVR_ATxmega64B1__" },
8808 { "atxmega64b3", "__AVR_ATxmega64B3__" },
8809 { "atxmega64c3", "__AVR_ATxmega64C3__" },
8810 { "atxmega64d3", "__AVR_ATxmega64D3__" },
8811 { "atxmega64d4", "__AVR_ATxmega64D4__" },
8812 { "atxmega64a1", "__AVR_ATxmega64A1__" },
8813 { "atxmega64a1u", "__AVR_ATxmega64A1U__" },
8814 { "atxmega128a3", "__AVR_ATxmega128A3__" },
8815 { "atxmega128a3u", "__AVR_ATxmega128A3U__" },
8816 { "atxmega128b1", "__AVR_ATxmega128B1__" },
8817 { "atxmega128b3", "__AVR_ATxmega128B3__" },
8818 { "atxmega128c3", "__AVR_ATxmega128C3__" },
8819 { "atxmega128d3", "__AVR_ATxmega128D3__" },
8820 { "atxmega128d4", "__AVR_ATxmega128D4__" },
8821 { "atxmega192a3", "__AVR_ATxmega192A3__" },
8822 { "atxmega192a3u", "__AVR_ATxmega192A3U__" },
8823 { "atxmega192c3", "__AVR_ATxmega192C3__" },
8824 { "atxmega192d3", "__AVR_ATxmega192D3__" },
8825 { "atxmega256a3", "__AVR_ATxmega256A3__" },
8826 { "atxmega256a3u", "__AVR_ATxmega256A3U__" },
8827 { "atxmega256a3b", "__AVR_ATxmega256A3B__" },
8828 { "atxmega256a3bu", "__AVR_ATxmega256A3BU__" },
8829 { "atxmega256c3", "__AVR_ATxmega256C3__" },
8830 { "atxmega256d3", "__AVR_ATxmega256D3__" },
8831 { "atxmega384c3", "__AVR_ATxmega384C3__" },
8832 { "atxmega384d3", "__AVR_ATxmega384D3__" },
8833 { "atxmega128a1", "__AVR_ATxmega128A1__" },
8834 { "atxmega128a1u", "__AVR_ATxmega128A1U__" },
8835 { "atxmega128a4u", "__AVR_ATxmega128a4U__" },
8836 { "attiny4", "__AVR_ATtiny4__" },
8837 { "attiny5", "__AVR_ATtiny5__" },
8838 { "attiny9", "__AVR_ATtiny9__" },
8839 { "attiny10", "__AVR_ATtiny10__" },
8840 { "attiny20", "__AVR_ATtiny20__" },
8841 { "attiny40", "__AVR_ATtiny40__" },
8842 { "attiny102", "__AVR_ATtiny102__" },
8843 { "attiny104", "__AVR_ATtiny104__" },
Dylan McKayecb6e7b2017-02-07 06:04:18 +00008844};
Dylan McKay924fa3a2017-01-05 05:20:27 +00008845
8846// AVR Target
8847class AVRTargetInfo : public TargetInfo {
8848public:
8849 AVRTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
8850 : TargetInfo(Triple) {
8851 TLSSupported = false;
8852 PointerWidth = 16;
8853 PointerAlign = 8;
8854 IntWidth = 16;
8855 IntAlign = 8;
8856 LongWidth = 32;
8857 LongAlign = 8;
8858 LongLongWidth = 64;
8859 LongLongAlign = 8;
8860 SuitableAlign = 8;
8861 DefaultAlignForAttributeAligned = 8;
8862 HalfWidth = 16;
8863 HalfAlign = 8;
8864 FloatWidth = 32;
8865 FloatAlign = 8;
8866 DoubleWidth = 32;
8867 DoubleAlign = 8;
8868 DoubleFormat = &llvm::APFloat::IEEEsingle();
8869 LongDoubleWidth = 32;
8870 LongDoubleAlign = 8;
8871 LongDoubleFormat = &llvm::APFloat::IEEEsingle();
8872 SizeType = UnsignedInt;
8873 PtrDiffType = SignedInt;
8874 IntPtrType = SignedInt;
8875 Char16Type = UnsignedInt;
8876 WCharType = SignedInt;
8877 WIntType = SignedInt;
8878 Char32Type = UnsignedLong;
8879 SigAtomicType = SignedChar;
8880 resetDataLayout("e-p:16:16:16-i8:8:8-i16:16:16-i32:32:32-i64:64:64"
8881 "-f32:32:32-f64:64:64-n8");
8882 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008883
Dylan McKay924fa3a2017-01-05 05:20:27 +00008884 void getTargetDefines(const LangOptions &Opts,
8885 MacroBuilder &Builder) const override {
Dylan McKayecb6e7b2017-02-07 06:04:18 +00008886 Builder.defineMacro("AVR");
8887 Builder.defineMacro("__AVR");
Dylan McKay924fa3a2017-01-05 05:20:27 +00008888 Builder.defineMacro("__AVR__");
Dylan McKayecb6e7b2017-02-07 06:04:18 +00008889
8890 if (!this->CPU.empty()) {
8891 auto It = std::find_if(AVRMcus.begin(), AVRMcus.end(),
8892 [&](const MCUInfo &Info) { return Info.Name == this->CPU; });
8893
8894 if (It != AVRMcus.end())
8895 Builder.defineMacro(It->DefineName);
8896 }
Dylan McKay924fa3a2017-01-05 05:20:27 +00008897 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008898
Dylan McKay924fa3a2017-01-05 05:20:27 +00008899 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
8900 return None;
8901 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008902
Dylan McKay924fa3a2017-01-05 05:20:27 +00008903 BuiltinVaListKind getBuiltinVaListKind() const override {
8904 return TargetInfo::VoidPtrBuiltinVaList;
8905 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008906
Dylan McKay924fa3a2017-01-05 05:20:27 +00008907 const char *getClobbers() const override {
8908 return "";
8909 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008910
Dylan McKay924fa3a2017-01-05 05:20:27 +00008911 ArrayRef<const char *> getGCCRegNames() const override {
8912 static const char * const GCCRegNames[] = {
8913 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
8914 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
8915 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
Dylan McKay95aa2652017-01-05 07:17:46 +00008916 "r24", "r25", "X", "Y", "Z", "SP"
Dylan McKay924fa3a2017-01-05 05:20:27 +00008917 };
8918 return llvm::makeArrayRef(GCCRegNames);
8919 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008920
Dylan McKay924fa3a2017-01-05 05:20:27 +00008921 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8922 return None;
8923 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008924
Dylan McKay924fa3a2017-01-05 05:20:27 +00008925 ArrayRef<TargetInfo::AddlRegName> getGCCAddlRegNames() const override {
8926 static const TargetInfo::AddlRegName AddlRegNames[] = {
8927 { { "r26", "r27"}, 26 },
8928 { { "r28", "r29"}, 27 },
8929 { { "r30", "r31"}, 28 },
8930 { { "SPL", "SPH"}, 29 },
8931 };
8932 return llvm::makeArrayRef(AddlRegNames);
8933 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008934
Dylan McKay924fa3a2017-01-05 05:20:27 +00008935 bool validateAsmConstraint(const char *&Name,
8936 TargetInfo::ConstraintInfo &Info) const override {
Dylan McKayd31534c2017-02-06 09:01:59 +00008937 // There aren't any multi-character AVR specific constraints.
8938 if (StringRef(Name).size() > 1) return false;
8939
8940 switch (*Name) {
8941 default: return false;
8942 case 'a': // Simple upper registers
8943 case 'b': // Base pointer registers pairs
8944 case 'd': // Upper register
8945 case 'l': // Lower registers
8946 case 'e': // Pointer register pairs
8947 case 'q': // Stack pointer register
8948 case 'r': // Any register
8949 case 'w': // Special upper register pairs
8950 case 't': // Temporary register
8951 case 'x': case 'X': // Pointer register pair X
8952 case 'y': case 'Y': // Pointer register pair Y
8953 case 'z': case 'Z': // Pointer register pair Z
8954 Info.setAllowsRegister();
8955 return true;
8956 case 'I': // 6-bit positive integer constant
8957 Info.setRequiresImmediate(0, 63);
8958 return true;
8959 case 'J': // 6-bit negative integer constant
8960 Info.setRequiresImmediate(-63, 0);
8961 return true;
8962 case 'K': // Integer constant (Range: 2)
8963 Info.setRequiresImmediate(2);
8964 return true;
8965 case 'L': // Integer constant (Range: 0)
8966 Info.setRequiresImmediate(0);
8967 return true;
8968 case 'M': // 8-bit integer constant
8969 Info.setRequiresImmediate(0, 0xff);
8970 return true;
8971 case 'N': // Integer constant (Range: -1)
8972 Info.setRequiresImmediate(-1);
8973 return true;
8974 case 'O': // Integer constant (Range: 8, 16, 24)
8975 Info.setRequiresImmediate({8, 16, 24});
8976 return true;
8977 case 'P': // Integer constant (Range: 1)
8978 Info.setRequiresImmediate(1);
8979 return true;
8980 case 'R': // Integer constant (Range: -6 to 5)
8981 Info.setRequiresImmediate(-6, 5);
8982 return true;
8983 case 'G': // Floating point constant
8984 case 'Q': // A memory address based on Y or Z pointer with displacement.
8985 return true;
8986 }
8987
Dylan McKay924fa3a2017-01-05 05:20:27 +00008988 return false;
8989 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008990
Dylan McKay924fa3a2017-01-05 05:20:27 +00008991 IntType getIntTypeByWidth(unsigned BitWidth,
8992 bool IsSigned) const final {
8993 // AVR prefers int for 16-bit integers.
8994 return BitWidth == 16 ? (IsSigned ? SignedInt : UnsignedInt)
8995 : TargetInfo::getIntTypeByWidth(BitWidth, IsSigned);
8996 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008997
Dylan McKay924fa3a2017-01-05 05:20:27 +00008998 IntType getLeastIntTypeByWidth(unsigned BitWidth,
8999 bool IsSigned) const final {
9000 // AVR uses int for int_least16_t and int_fast16_t.
9001 return BitWidth == 16
9002 ? (IsSigned ? SignedInt : UnsignedInt)
9003 : TargetInfo::getLeastIntTypeByWidth(BitWidth, IsSigned);
9004 }
Dylan McKayecb6e7b2017-02-07 06:04:18 +00009005
9006 bool setCPU(const std::string &Name) override {
9007 bool IsFamily = llvm::StringSwitch<bool>(Name)
9008 .Case("avr1", true)
9009 .Case("avr2", true)
9010 .Case("avr25", true)
9011 .Case("avr3", true)
9012 .Case("avr31", true)
9013 .Case("avr35", true)
9014 .Case("avr4", true)
9015 .Case("avr5", true)
9016 .Case("avr51", true)
9017 .Case("avr6", true)
9018 .Case("avrxmega1", true)
9019 .Case("avrxmega2", true)
9020 .Case("avrxmega3", true)
9021 .Case("avrxmega4", true)
9022 .Case("avrxmega5", true)
9023 .Case("avrxmega6", true)
9024 .Case("avrxmega7", true)
9025 .Case("avrtiny", true)
9026 .Default(false);
9027
9028 if (IsFamily) this->CPU = Name;
9029
9030 bool IsMCU = std::find_if(AVRMcus.begin(), AVRMcus.end(),
9031 [&](const MCUInfo &Info) { return Info.Name == Name; }) != AVRMcus.end();
9032
9033 if (IsMCU) this->CPU = Name;
9034
9035 return IsFamily || IsMCU;
9036 }
9037
9038protected:
9039 std::string CPU;
Dylan McKay924fa3a2017-01-05 05:20:27 +00009040};
9041
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009042} // end anonymous namespace
9043
Chris Lattner5ba61f02006-10-14 07:39:34 +00009044//===----------------------------------------------------------------------===//
9045// Driver code
9046//===----------------------------------------------------------------------===//
9047
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009048static TargetInfo *AllocateTarget(const llvm::Triple &Triple,
9049 const TargetOptions &Opts) {
Daniel Dunbar52322032009-08-18 05:47:58 +00009050 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00009051
Daniel Dunbar52322032009-08-18 05:47:58 +00009052 switch (Triple.getArch()) {
9053 default:
Craig Topperf1186c52014-05-08 06:41:40 +00009054 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00009055
Tim Northover2a0783d2014-05-30 14:14:07 +00009056 case llvm::Triple::xcore:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009057 return new XCoreTargetInfo(Triple, Opts);
Tim Northover2a0783d2014-05-30 14:14:07 +00009058
9059 case llvm::Triple::hexagon:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009060 return new HexagonTargetInfo(Triple, Opts);
Tim Northover2a0783d2014-05-30 14:14:07 +00009061
Jacques Pienaard964cc22016-03-28 21:02:54 +00009062 case llvm::Triple::lanai:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009063 return new LanaiTargetInfo(Triple, Opts);
Jacques Pienaard964cc22016-03-28 21:02:54 +00009064
Tim Northover2a0783d2014-05-30 14:14:07 +00009065 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00009066 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009067 return new DarwinAArch64TargetInfo(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00009068
9069 switch (os) {
Ed Schoutenea9448e2015-10-15 15:07:07 +00009070 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009071 return new CloudABITargetInfo<AArch64leTargetInfo>(Triple, Opts);
Ed Maste6a9eda52014-11-13 16:55:42 +00009072 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009073 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Petr Hosek9834fcd2016-10-24 22:55:57 +00009074 case llvm::Triple::Fuchsia:
9075 return new FuchsiaTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00009076 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009077 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple, Opts);
James Molloy5e73df52014-04-16 15:06:20 +00009078 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009079 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Brad Smith9aa2bf22017-02-21 23:13:09 +00009080 case llvm::Triple::OpenBSD:
9081 return new OpenBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00009082 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009083 return new AArch64leTargetInfo(Triple, Opts);
James Molloy5e73df52014-04-16 15:06:20 +00009084 }
9085
Christian Pirker9b019ae2014-02-25 13:51:00 +00009086 case llvm::Triple::aarch64_be:
9087 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00009088 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009089 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Petr Hosek9834fcd2016-10-24 22:55:57 +00009090 case llvm::Triple::Fuchsia:
9091 return new FuchsiaTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00009092 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009093 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00009094 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009095 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00009096 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009097 return new AArch64beTargetInfo(Triple, Opts);
Tim Northover9bb857a2013-01-31 12:13:10 +00009098 }
9099
Daniel Dunbar52322032009-08-18 05:47:58 +00009100 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00009101 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00009102 if (Triple.isOSBinFormatMachO())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009103 return new DarwinARMTargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00009104
Daniel Dunbar52322032009-08-18 05:47:58 +00009105 switch (os) {
Ed Schoutenc6d1a732016-09-05 18:38:34 +00009106 case llvm::Triple::CloudABI:
9107 return new CloudABITargetInfo<ARMleTargetInfo>(Triple, Opts);
Rafael Espindolaad8fed52010-06-10 00:46:51 +00009108 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009109 return new LinuxTargetInfo<ARMleTargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009110 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009111 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009112 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009113 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00009114 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009115 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00009116 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009117 return new BitrigTargetInfo<ARMleTargetInfo>(Triple, Opts);
Douglas Gregor9fabd852011-07-01 22:41:14 +00009118 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009119 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00009120 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009121 return new NaClTargetInfo<ARMleTargetInfo>(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00009122 case llvm::Triple::Win32:
9123 switch (Triple.getEnvironment()) {
Yaron Keren321249c2015-07-15 13:32:23 +00009124 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009125 return new CygwinARMTargetInfo(Triple, Opts);
Yaron Keren321249c2015-07-15 13:32:23 +00009126 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009127 return new MinGWARMTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00009128 case llvm::Triple::Itanium:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009129 return new ItaniumWindowsARMleTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00009130 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00009131 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009132 return new MicrosoftARMleTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00009133 }
Daniel Dunbar52322032009-08-18 05:47:58 +00009134 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009135 return new ARMleTargetInfo(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009136 }
9137
9138 case llvm::Triple::armeb:
9139 case llvm::Triple::thumbeb:
9140 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009141 return new DarwinARMTargetInfo(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009142
9143 switch (os) {
9144 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009145 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009146 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009147 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009148 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009149 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009150 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009151 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009152 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009153 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009154 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009155 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009156 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009157 return new NaClTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009158 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009159 return new ARMbeTargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009160 }
Eli Friedmanb5366062008-05-20 14:21:01 +00009161
Dylan McKay924fa3a2017-01-05 05:20:27 +00009162 case llvm::Triple::avr:
9163 return new AVRTargetInfo(Triple, Opts);
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00009164 case llvm::Triple::bpfeb:
9165 case llvm::Triple::bpfel:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009166 return new BPFTargetInfo(Triple, Opts);
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00009167
Daniel Dunbar52322032009-08-18 05:47:58 +00009168 case llvm::Triple::msp430:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009169 return new MSP430TargetInfo(Triple, Opts);
Eli Friedmanb5366062008-05-20 14:21:01 +00009170
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00009171 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009172 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009173 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00009174 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009175 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00009176 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009177 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009178 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009179 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009180 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009181 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00009182 return new MipsTargetInfo(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009183 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00009184
9185 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009186 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009187 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00009188 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009189 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00009190 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009191 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009192 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009193 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009194 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00009195 case llvm::Triple::NaCl:
Daniel Sanders4672af62016-05-27 11:51:02 +00009196 return new NaClTargetInfo<NaClMips32TargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009197 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00009198 return new MipsTargetInfo(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009199 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00009200
Akira Hatanakabef17452011-09-20 19:21:49 +00009201 case llvm::Triple::mips64:
9202 switch (os) {
9203 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00009204 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009205 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00009206 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009207 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009208 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009209 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009210 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00009211 case llvm::Triple::OpenBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009212 return new OpenBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009213 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00009214 return new MipsTargetInfo(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009215 }
9216
9217 case llvm::Triple::mips64el:
9218 switch (os) {
9219 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00009220 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009221 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00009222 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009223 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009224 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009225 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009226 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00009227 case llvm::Triple::OpenBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009228 return new OpenBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009229 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00009230 return new MipsTargetInfo(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009231 }
9232
Ivan Krasindd7403e2011-08-24 20:22:22 +00009233 case llvm::Triple::le32:
9234 switch (os) {
Douglas Katzman78d7c542015-05-12 21:18:10 +00009235 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009236 return new NaClTargetInfo<PNaClTargetInfo>(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00009237 default:
9238 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00009239 }
9240
JF Bastien643817d2014-09-12 17:52:47 +00009241 case llvm::Triple::le64:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009242 return new Le64TargetInfo(Triple, Opts);
JF Bastien643817d2014-09-12 17:52:47 +00009243
Daniel Dunbar52322032009-08-18 05:47:58 +00009244 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00009245 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009246 return new DarwinPPC32TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009247 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00009248 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009249 return new LinuxTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009250 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009251 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009252 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009253 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00009254 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009255 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009256 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009257 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009258 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009259 return new PPC32TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009260 }
Daniel Dunbar52322032009-08-18 05:47:58 +00009261
9262 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00009263 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009264 return new DarwinPPC64TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009265 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00009266 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009267 return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009268 case llvm::Triple::Lv2:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009269 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009270 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009271 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009272 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009273 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009274 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009275 return new PPC64TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009276 }
Daniel Dunbar52322032009-08-18 05:47:58 +00009277
Bill Schmidt778d3872013-07-26 01:36:11 +00009278 case llvm::Triple::ppc64le:
9279 switch (os) {
9280 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009281 return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger22a2d992015-04-10 20:53:48 +00009282 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009283 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Bill Schmidt778d3872013-07-26 01:36:11 +00009284 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009285 return new PPC64TargetInfo(Triple, Opts);
Bill Schmidt778d3872013-07-26 01:36:11 +00009286 }
9287
Peter Collingbournec947aae2012-05-20 23:28:41 +00009288 case llvm::Triple::nvptx:
Justin Lebarb6626592017-01-05 16:53:21 +00009289 return new NVPTXTargetInfo(Triple, Opts, /*TargetPointerWidth=*/32);
Peter Collingbournec947aae2012-05-20 23:28:41 +00009290 case llvm::Triple::nvptx64:
Justin Lebarb6626592017-01-05 16:53:21 +00009291 return new NVPTXTargetInfo(Triple, Opts, /*TargetPointerWidth=*/64);
Peter Collingbournec947aae2012-05-20 23:28:41 +00009292
Tom Stellardd8e38a32015-01-06 20:34:47 +00009293 case llvm::Triple::amdgcn:
Eli Friedmand13b41e2012-10-12 23:32:00 +00009294 case llvm::Triple::r600:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009295 return new AMDGPUTargetInfo(Triple, Opts);
Eli Friedmand13b41e2012-10-12 23:32:00 +00009296
Daniel Dunbar52322032009-08-18 05:47:58 +00009297 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009298 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00009299 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009300 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009301 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009302 return new SolarisTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009303 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009304 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00009305 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009306 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009307 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009308 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009309 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009310 return new SparcV8TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009311 }
Daniel Dunbar52322032009-08-18 05:47:58 +00009312
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009313 // The 'sparcel' architecture copies all the above cases except for Solaris.
9314 case llvm::Triple::sparcel:
9315 switch (os) {
9316 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009317 return new LinuxTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009318 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009319 return new NetBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009320 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009321 return new OpenBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009322 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009323 return new RTEMSTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009324 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009325 return new SparcV8elTargetInfo(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009326 }
9327
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009328 case llvm::Triple::sparcv9:
9329 switch (os) {
9330 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009331 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009332 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009333 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009334 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009335 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009336 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009337 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009338 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009339 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009340 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009341 return new SparcV9TargetInfo(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009342 }
9343
Ulrich Weigand47445072013-05-06 16:26:41 +00009344 case llvm::Triple::systemz:
9345 switch (os) {
9346 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009347 return new LinuxTargetInfo<SystemZTargetInfo>(Triple, Opts);
Ulrich Weigand47445072013-05-06 16:26:41 +00009348 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009349 return new SystemZTargetInfo(Triple, Opts);
Ulrich Weigand47445072013-05-06 16:26:41 +00009350 }
9351
Eli Friedmana9c3d712009-08-19 20:47:07 +00009352 case llvm::Triple::tce:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009353 return new TCETargetInfo(Triple, Opts);
Eli Friedmana9c3d712009-08-19 20:47:07 +00009354
Pekka Jaaskelainen67354482016-11-16 15:22:31 +00009355 case llvm::Triple::tcele:
9356 return new TCELETargetInfo(Triple, Opts);
9357
Daniel Dunbar52322032009-08-18 05:47:58 +00009358 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00009359 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009360 return new DarwinI386TargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00009361
Daniel Dunbar52322032009-08-18 05:47:58 +00009362 switch (os) {
Ed Schouten7893e682015-06-13 21:33:49 +00009363 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009364 return new CloudABITargetInfo<X86_32TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009365 case llvm::Triple::Linux: {
9366 switch (Triple.getEnvironment()) {
9367 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009368 return new LinuxTargetInfo<X86_32TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009369 case llvm::Triple::Android:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009370 return new AndroidX86_32TargetInfo(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009371 }
9372 }
Daniel Dunbar52322032009-08-18 05:47:58 +00009373 case llvm::Triple::DragonFly:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009374 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009375 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009376 return new NetBSDI386TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009377 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009378 return new OpenBSDI386TargetInfo(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00009379 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009380 return new BitrigI386TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009381 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009382 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00009383 case llvm::Triple::KFreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009384 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009385 case llvm::Triple::Minix:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009386 return new MinixTargetInfo<X86_32TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009387 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009388 return new SolarisTargetInfo<X86_32TargetInfo>(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009389 case llvm::Triple::Win32: {
9390 switch (Triple.getEnvironment()) {
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009391 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009392 return new CygwinX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009393 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009394 return new MinGWX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00009395 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009396 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00009397 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009398 return new MicrosoftX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009399 }
9400 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00009401 case llvm::Triple::Haiku:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009402 return new HaikuX86_32TargetInfo(Triple, Opts);
Douglas Gregor9fabd852011-07-01 22:41:14 +00009403 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009404 return new RTEMSX86_32TargetInfo(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00009405 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009406 return new NaClTargetInfo<X86_32TargetInfo>(Triple, Opts);
Alexey Bataevc99b0492015-11-25 09:24:26 +00009407 case llvm::Triple::ELFIAMCU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009408 return new MCUX86_32TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009409 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009410 return new X86_32TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009411 }
9412
9413 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009414 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009415 return new DarwinX86_64TargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00009416
Daniel Dunbar52322032009-08-18 05:47:58 +00009417 switch (os) {
Ed Schoutenf33c6072015-03-11 08:42:46 +00009418 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009419 return new CloudABITargetInfo<X86_64TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009420 case llvm::Triple::Linux: {
9421 switch (Triple.getEnvironment()) {
9422 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009423 return new LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009424 case llvm::Triple::Android:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009425 return new AndroidX86_64TargetInfo(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009426 }
9427 }
Chris Lattner002ba6b2010-01-09 05:41:14 +00009428 case llvm::Triple::DragonFly:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009429 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009430 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009431 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009432 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009433 return new OpenBSDX86_64TargetInfo(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00009434 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009435 return new BitrigX86_64TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009436 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009437 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Petr Hosek9834fcd2016-10-24 22:55:57 +00009438 case llvm::Triple::Fuchsia:
9439 return new FuchsiaTargetInfo<X86_64TargetInfo>(Triple, Opts);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00009440 case llvm::Triple::KFreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009441 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009442 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009443 return new SolarisTargetInfo<X86_64TargetInfo>(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009444 case llvm::Triple::Win32: {
9445 switch (Triple.getEnvironment()) {
Yaron Kerend030d112015-07-22 17:38:19 +00009446 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009447 return new CygwinX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009448 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009449 return new MinGWX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009450 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00009451 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009452 return new MicrosoftX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009453 }
9454 }
Reid Kleckner330fb172016-05-11 16:19:05 +00009455 case llvm::Triple::Haiku:
9456 return new HaikuTargetInfo<X86_64TargetInfo>(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00009457 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009458 return new NaClTargetInfo<X86_64TargetInfo>(Triple, Opts);
Alex Rosenberg12207fa2015-01-27 14:47:44 +00009459 case llvm::Triple::PS4:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009460 return new PS4OSTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009461 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009462 return new X86_64TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009463 }
Guy Benyeib798fc92012-12-11 21:38:14 +00009464
Douglas Katzman78d7c542015-05-12 21:18:10 +00009465 case llvm::Triple::spir: {
9466 if (Triple.getOS() != llvm::Triple::UnknownOS ||
9467 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
9468 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009469 return new SPIR32TargetInfo(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00009470 }
9471 case llvm::Triple::spir64: {
9472 if (Triple.getOS() != llvm::Triple::UnknownOS ||
9473 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
9474 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009475 return new SPIR64TargetInfo(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00009476 }
Dan Gohmanc2853072015-09-03 22:51:53 +00009477 case llvm::Triple::wasm32:
Dan Gohman839f2152017-01-17 21:46:38 +00009478 if (Triple.getSubArch() != llvm::Triple::NoSubArch ||
9479 Triple.getVendor() != llvm::Triple::UnknownVendor ||
9480 Triple.getOS() != llvm::Triple::UnknownOS ||
9481 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment ||
9482 !(Triple.isOSBinFormatELF() || Triple.isOSBinFormatWasm()))
Dan Gohmanc2853072015-09-03 22:51:53 +00009483 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009484 return new WebAssemblyOSTargetInfo<WebAssembly32TargetInfo>(Triple, Opts);
Dan Gohmanc2853072015-09-03 22:51:53 +00009485 case llvm::Triple::wasm64:
Dan Gohman839f2152017-01-17 21:46:38 +00009486 if (Triple.getSubArch() != llvm::Triple::NoSubArch ||
9487 Triple.getVendor() != llvm::Triple::UnknownVendor ||
9488 Triple.getOS() != llvm::Triple::UnknownOS ||
9489 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment ||
9490 !(Triple.isOSBinFormatELF() || Triple.isOSBinFormatWasm()))
Dan Gohmanc2853072015-09-03 22:51:53 +00009491 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009492 return new WebAssemblyOSTargetInfo<WebAssembly64TargetInfo>(Triple, Opts);
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00009493
9494 case llvm::Triple::renderscript32:
9495 return new LinuxTargetInfo<RenderScript32TargetInfo>(Triple, Opts);
9496 case llvm::Triple::renderscript64:
9497 return new LinuxTargetInfo<RenderScript64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009498 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00009499}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009500
9501/// CreateTargetInfo - Return the target info object for the specified target
Eric Christophere4f73b32015-08-07 19:07:08 +00009502/// options.
Alp Toker80758082014-07-06 05:26:44 +00009503TargetInfo *
9504TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
Saleem Abdulrasool10a49722016-04-08 16:52:00 +00009505 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00009506 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009507
9508 // Construct the target
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009509 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple, *Opts));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009510 if (!Target) {
9511 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00009512 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009513 }
Alp Toker80758082014-07-06 05:26:44 +00009514 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009515
Daniel Dunbaracde99e2009-12-18 18:42:37 +00009516 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00009517 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
9518 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00009519 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00009520 }
9521
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009522 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00009523 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
9524 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00009525 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009526 }
9527
Rafael Espindolaeb265472013-08-21 21:59:03 +00009528 // Set the fp math unit.
9529 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
9530 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00009531 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00009532 }
9533
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009534 // Compute the default target features, we need the target to handle this
9535 // because features may have dependencies on one another.
9536 llvm::StringMap<bool> Features;
Eric Christopher007b0a02015-08-28 22:32:01 +00009537 if (!Target->initFeatureMap(Features, Diags, Opts->CPU,
9538 Opts->FeaturesAsWritten))
Eric Christopher6b454372015-08-25 13:45:24 +00009539 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009540
9541 // Add the features to the compile options.
Douglas Gregorf8715de2012-11-16 04:24:59 +00009542 Opts->Features.clear();
Aaron Ballmanb226d3d2015-08-12 13:38:59 +00009543 for (const auto &F : Features)
9544 Opts->Features.push_back((F.getValue() ? "+" : "-") + F.getKey().str());
9545
Eric Christopher3ff21b32013-10-16 21:26:26 +00009546 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00009547 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009548
Yaxun Liu39cf40f2016-05-16 17:06:34 +00009549 Target->setSupportedOpenCLOpts();
Alexey Bader0ea07532016-11-01 15:50:52 +00009550 Target->setOpenCLExtensionOpts();
Yaxun Liu39cf40f2016-05-16 17:06:34 +00009551
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00009552 if (!Target->validateTarget(Diags))
9553 return nullptr;
9554
Ahmed Charles9a16beb2014-03-07 19:33:25 +00009555 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009556}