blob: d7f1793e377ca96207cba9f362c06622d7bdf526 [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
Eric Christopher1e6fedb2017-03-25 19:26:04 +00001241 // our suppport post-dates this and it should work on all 64-bit ppc linux
1242 // platforms. It is guaranteed to work on all elfv2 platforms.
1243 if (getTriple().getOS() == llvm::Triple::Linux && PointerWidth == 64)
Eric Christopher2fd2eda2017-03-25 03:33:59 +00001244 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 (Enabled) {
Eric Christopherd26d8832017-04-15 06:15:00 +00001552 // If we're enabling any of the vsx based features then enable vsx and
1553 // altivec. We'll diagnose any problems later.
1554 bool FeatureHasVSX = llvm::StringSwitch<bool>(Name)
1555 .Case("vsx", true)
1556 .Case("direct-move", true)
1557 .Case("power8-vector", true)
1558 .Case("power9-vector", true)
1559 .Case("float128", true)
1560 .Default(false);
1561 if (FeatureHasVSX)
1562 Features["vsx"] = Features["altivec"] = true;
1563 if (Name == "power9-vector")
1564 Features["power8-vector"] = true;
1565 Features[Name] = true;
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001566 } else {
Eric Christopherd26d8832017-04-15 06:15:00 +00001567 // If we're disabling altivec or vsx go ahead and disable all of the vsx
1568 // features.
1569 if ((Name == "altivec") || (Name == "vsx"))
1570 Features["vsx"] = Features["direct-move"] = Features["power8-vector"] =
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001571 Features["float128"] = Features["power9-vector"] = false;
Eric Christopherd26d8832017-04-15 06:15:00 +00001572 if (Name == "power8-vector")
1573 Features["power9-vector"] = false;
1574 Features[Name] = false;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001575 }
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001576}
1577
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001578const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001579 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1580 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1581 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1582 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1583 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1584 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1585 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1586 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001587 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001588 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001589 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001590 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1591 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1592 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1593 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001594 "vrsave", "vscr",
1595 "spe_acc", "spefscr",
1596 "sfp"
1597};
Chris Lattner10a5b382007-01-29 05:24:35 +00001598
Craig Topperf054e3a2015-10-19 03:52:27 +00001599ArrayRef<const char*> PPCTargetInfo::getGCCRegNames() const {
1600 return llvm::makeArrayRef(GCCRegNames);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001601}
Chris Lattner5ba61f02006-10-14 07:39:34 +00001602
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001603const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1604 // While some of these aliases do map to different registers
1605 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001606 { { "0" }, "r0" },
1607 { { "1"}, "r1" },
1608 { { "2" }, "r2" },
1609 { { "3" }, "r3" },
1610 { { "4" }, "r4" },
1611 { { "5" }, "r5" },
1612 { { "6" }, "r6" },
1613 { { "7" }, "r7" },
1614 { { "8" }, "r8" },
1615 { { "9" }, "r9" },
1616 { { "10" }, "r10" },
1617 { { "11" }, "r11" },
1618 { { "12" }, "r12" },
1619 { { "13" }, "r13" },
1620 { { "14" }, "r14" },
1621 { { "15" }, "r15" },
1622 { { "16" }, "r16" },
1623 { { "17" }, "r17" },
1624 { { "18" }, "r18" },
1625 { { "19" }, "r19" },
1626 { { "20" }, "r20" },
1627 { { "21" }, "r21" },
1628 { { "22" }, "r22" },
1629 { { "23" }, "r23" },
1630 { { "24" }, "r24" },
1631 { { "25" }, "r25" },
1632 { { "26" }, "r26" },
1633 { { "27" }, "r27" },
1634 { { "28" }, "r28" },
1635 { { "29" }, "r29" },
1636 { { "30" }, "r30" },
1637 { { "31" }, "r31" },
1638 { { "fr0" }, "f0" },
1639 { { "fr1" }, "f1" },
1640 { { "fr2" }, "f2" },
1641 { { "fr3" }, "f3" },
1642 { { "fr4" }, "f4" },
1643 { { "fr5" }, "f5" },
1644 { { "fr6" }, "f6" },
1645 { { "fr7" }, "f7" },
1646 { { "fr8" }, "f8" },
1647 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +00001648 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001649 { { "fr11" }, "f11" },
1650 { { "fr12" }, "f12" },
1651 { { "fr13" }, "f13" },
1652 { { "fr14" }, "f14" },
1653 { { "fr15" }, "f15" },
1654 { { "fr16" }, "f16" },
1655 { { "fr17" }, "f17" },
1656 { { "fr18" }, "f18" },
1657 { { "fr19" }, "f19" },
1658 { { "fr20" }, "f20" },
1659 { { "fr21" }, "f21" },
1660 { { "fr22" }, "f22" },
1661 { { "fr23" }, "f23" },
1662 { { "fr24" }, "f24" },
1663 { { "fr25" }, "f25" },
1664 { { "fr26" }, "f26" },
1665 { { "fr27" }, "f27" },
1666 { { "fr28" }, "f28" },
1667 { { "fr29" }, "f29" },
1668 { { "fr30" }, "f30" },
1669 { { "fr31" }, "f31" },
1670 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001671};
1672
Craig Topperf054e3a2015-10-19 03:52:27 +00001673ArrayRef<TargetInfo::GCCRegAlias> PPCTargetInfo::getGCCRegAliases() const {
1674 return llvm::makeArrayRef(GCCRegAliases);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001675}
Chris Lattner02dffbd2006-10-14 07:50:21 +00001676
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001677class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001678public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001679 PPC32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1680 : PPCTargetInfo(Triple, Opts) {
James Y Knightb214cbc2016-03-04 19:00:41 +00001681 resetDataLayout("E-m:e-p:32:32-i64:64-n32");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001682
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001683 switch (getTriple().getOS()) {
Nico Weber3435ede2012-01-31 02:07:33 +00001684 case llvm::Triple::Linux:
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001685 case llvm::Triple::FreeBSD:
1686 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001687 SizeType = UnsignedInt;
Hal Finkel26908382012-03-02 20:54:36 +00001688 PtrDiffType = SignedInt;
1689 IntPtrType = SignedInt;
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001690 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +00001691 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001692 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001693 }
Roman Divacky816dcd12012-03-13 16:53:54 +00001694
Roman Divacky3ffe7462012-03-13 19:20:17 +00001695 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1696 LongDoubleWidth = LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00001697 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Roman Divacky3ffe7462012-03-13 19:20:17 +00001698 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001699
1700 // PPC32 supports atomics up to 4 bytes.
1701 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divacky965b0b72011-01-06 08:27:10 +00001702 }
1703
Craig Topper3164f332014-03-11 03:39:26 +00001704 BuiltinVaListKind getBuiltinVaListKind() const override {
Roman Divacky965b0b72011-01-06 08:27:10 +00001705 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Inge5d3fb222012-06-16 03:34:49 +00001706 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman873f65a2008-08-21 00:13:15 +00001707 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001708};
Chris Lattner5ba61f02006-10-14 07:39:34 +00001709
Bill Schmidt778d3872013-07-26 01:36:11 +00001710// Note: ABI differences may eventually require us to have a separate
1711// TargetInfo for little endian.
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001712class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001713public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001714 PPC64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1715 : PPCTargetInfo(Triple, Opts) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001716 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001717 IntMaxType = SignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001718 Int64Type = SignedLong;
Roman Divacky816dcd12012-03-13 16:53:54 +00001719
Eric Christopherf6ee1f32017-02-10 04:35:21 +00001720 if ((Triple.getArch() == llvm::Triple::ppc64le)) {
1721 resetDataLayout("e-m:e-i64:64-n32:64");
Eric Christopher4855ba82017-02-10 03:32:34 +00001722 ABI = "elfv2";
Eric Christopherf6ee1f32017-02-10 04:35:21 +00001723 } else {
1724 resetDataLayout("E-m:e-i64:64-n32:64");
Eric Christopher4855ba82017-02-10 03:32:34 +00001725 ABI = "elfv1";
Eric Christopherf6ee1f32017-02-10 04:35:21 +00001726 }
Eric Christopher4855ba82017-02-10 03:32:34 +00001727
Eric Christopherf6ee1f32017-02-10 04:35:21 +00001728 switch (getTriple().getOS()) {
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001729 case llvm::Triple::FreeBSD:
Roman Divacky3ffe7462012-03-13 19:20:17 +00001730 LongDoubleWidth = LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00001731 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001732 break;
Joerg Sonnenbergeraac82c42014-10-15 19:52:03 +00001733 case llvm::Triple::NetBSD:
1734 IntMaxType = SignedLongLong;
1735 Int64Type = SignedLongLong;
1736 break;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001737 default:
1738 break;
Ulrich Weigand8afad612014-07-28 13:17:52 +00001739 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001740
1741 // PPC64 supports atomics up to 8 bytes.
1742 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001743 }
Craig Topper3164f332014-03-11 03:39:26 +00001744 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001745 return TargetInfo::CharPtrBuiltinVaList;
Roman Divacky965b0b72011-01-06 08:27:10 +00001746 }
Eric Christophere6b7cf42015-07-10 18:25:52 +00001747 // PPC64 Linux-specific ABI options.
Ulrich Weigand8afad612014-07-28 13:17:52 +00001748 bool setABI(const std::string &Name) override {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001749 if (Name == "elfv1" || Name == "elfv1-qpx" || Name == "elfv2") {
Ulrich Weigand8afad612014-07-28 13:17:52 +00001750 ABI = Name;
1751 return true;
1752 }
1753 return false;
1754 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001755};
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001756
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001757class DarwinPPC32TargetInfo : public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001758public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001759 DarwinPPC32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1760 : DarwinTargetInfo<PPC32TargetInfo>(Triple, Opts) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001761 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +00001762 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Eric Christopher917e9522014-11-18 22:36:15 +00001763 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev68d773c2012-01-17 22:40:00 +00001764 LongLongAlign = 32;
James Y Knightb214cbc2016-03-04 19:00:41 +00001765 resetDataLayout("E-m:o-p:32:32-f64:32:64-n32");
Roman Divacky965b0b72011-01-06 08:27:10 +00001766 }
Craig Topper3164f332014-03-11 03:39:26 +00001767 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001768 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001769 }
1770};
1771
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001772class DarwinPPC64TargetInfo : public DarwinTargetInfo<PPC64TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001773public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001774 DarwinPPC64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1775 : DarwinTargetInfo<PPC64TargetInfo>(Triple, Opts) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001776 HasAlignMac68kSupport = true;
James Y Knightb214cbc2016-03-04 19:00:41 +00001777 resetDataLayout("E-m:o-i64:64-n32:64");
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001778 }
1779};
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001780
Eric Christopherc48497a2015-09-18 21:26:24 +00001781static const unsigned NVPTXAddrSpaceMap[] = {
Yaxun Liub34ec822017-04-11 17:24:23 +00001782 0, // Default
Eric Christopherc48497a2015-09-18 21:26:24 +00001783 1, // opencl_global
1784 3, // opencl_local
1785 4, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00001786 // FIXME: generic has to be added to the target
Eric Christopherc48497a2015-09-18 21:26:24 +00001787 0, // opencl_generic
1788 1, // cuda_device
1789 4, // cuda_constant
1790 3, // cuda_shared
1791};
1792
1793class NVPTXTargetInfo : public TargetInfo {
1794 static const char *const GCCRegNames[];
1795 static const Builtin::Info BuiltinInfo[];
Justin Lebar62907612016-07-06 21:21:39 +00001796 CudaArch GPU;
Justin Lebarb6626592017-01-05 16:53:21 +00001797 std::unique_ptr<TargetInfo> HostTarget;
Reid Klecknerbbc01782014-12-03 21:53:36 +00001798
Eric Christopherc48497a2015-09-18 21:26:24 +00001799public:
Justin Lebarb6626592017-01-05 16:53:21 +00001800 NVPTXTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts,
1801 unsigned TargetPointerWidth)
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001802 : TargetInfo(Triple) {
Justin Lebarb6626592017-01-05 16:53:21 +00001803 assert((TargetPointerWidth == 32 || TargetPointerWidth == 64) &&
1804 "NVPTX only supports 32- and 64-bit modes.");
1805
Eric Christopherc48497a2015-09-18 21:26:24 +00001806 TLSSupported = false;
Eric Christopherc48497a2015-09-18 21:26:24 +00001807 AddrSpaceMap = &NVPTXAddrSpaceMap;
1808 UseAddrSpaceMapMangling = true;
Justin Lebarb6626592017-01-05 16:53:21 +00001809
Eric Christopherc48497a2015-09-18 21:26:24 +00001810 // Define available target features
1811 // These must be defined in sorted order!
1812 NoAsmVariants = true;
Justin Lebar62907612016-07-06 21:21:39 +00001813 GPU = CudaArch::SM_20;
Justin Lebar76945b22016-04-29 23:05:19 +00001814
Justin Lebarb6626592017-01-05 16:53:21 +00001815 if (TargetPointerWidth == 32)
1816 resetDataLayout("e-p:32:32-i64:64-v16:16-v32:32-n16:32:64");
1817 else
1818 resetDataLayout("e-i64:64-v16:16-v32:32-n16:32:64");
1819
Justin Lebar76945b22016-04-29 23:05:19 +00001820 // If possible, get a TargetInfo for our host triple, so we can match its
1821 // types.
1822 llvm::Triple HostTriple(Opts.HostTriple);
Justin Lebarb6626592017-01-05 16:53:21 +00001823 if (!HostTriple.isNVPTX())
1824 HostTarget.reset(AllocateTarget(llvm::Triple(Opts.HostTriple), Opts));
1825
1826 // If no host target, make some guesses about the data layout and return.
Justin Lebar76945b22016-04-29 23:05:19 +00001827 if (!HostTarget) {
Justin Lebarb6626592017-01-05 16:53:21 +00001828 LongWidth = LongAlign = TargetPointerWidth;
1829 PointerWidth = PointerAlign = TargetPointerWidth;
1830 switch (TargetPointerWidth) {
1831 case 32:
1832 SizeType = TargetInfo::UnsignedInt;
1833 PtrDiffType = TargetInfo::SignedInt;
1834 IntPtrType = TargetInfo::SignedInt;
1835 break;
1836 case 64:
1837 SizeType = TargetInfo::UnsignedLong;
1838 PtrDiffType = TargetInfo::SignedLong;
1839 IntPtrType = TargetInfo::SignedLong;
1840 break;
1841 default:
1842 llvm_unreachable("TargetPointerWidth must be 32 or 64");
1843 }
Justin Lebar76945b22016-04-29 23:05:19 +00001844 return;
1845 }
1846
Justin Lebarb6626592017-01-05 16:53:21 +00001847 // Copy properties from host target.
Justin Lebar76945b22016-04-29 23:05:19 +00001848 PointerWidth = HostTarget->getPointerWidth(/* AddrSpace = */ 0);
1849 PointerAlign = HostTarget->getPointerAlign(/* AddrSpace = */ 0);
1850 BoolWidth = HostTarget->getBoolWidth();
1851 BoolAlign = HostTarget->getBoolAlign();
1852 IntWidth = HostTarget->getIntWidth();
1853 IntAlign = HostTarget->getIntAlign();
1854 HalfWidth = HostTarget->getHalfWidth();
1855 HalfAlign = HostTarget->getHalfAlign();
1856 FloatWidth = HostTarget->getFloatWidth();
1857 FloatAlign = HostTarget->getFloatAlign();
1858 DoubleWidth = HostTarget->getDoubleWidth();
1859 DoubleAlign = HostTarget->getDoubleAlign();
1860 LongWidth = HostTarget->getLongWidth();
1861 LongAlign = HostTarget->getLongAlign();
1862 LongLongWidth = HostTarget->getLongLongWidth();
1863 LongLongAlign = HostTarget->getLongLongAlign();
1864 MinGlobalAlign = HostTarget->getMinGlobalAlign();
Richard Smith59139022016-09-30 22:41:36 +00001865 NewAlign = HostTarget->getNewAlign();
Justin Lebar76945b22016-04-29 23:05:19 +00001866 DefaultAlignForAttributeAligned =
1867 HostTarget->getDefaultAlignForAttributeAligned();
1868 SizeType = HostTarget->getSizeType();
1869 IntMaxType = HostTarget->getIntMaxType();
1870 PtrDiffType = HostTarget->getPtrDiffType(/* AddrSpace = */ 0);
1871 IntPtrType = HostTarget->getIntPtrType();
1872 WCharType = HostTarget->getWCharType();
1873 WIntType = HostTarget->getWIntType();
1874 Char16Type = HostTarget->getChar16Type();
1875 Char32Type = HostTarget->getChar32Type();
1876 Int64Type = HostTarget->getInt64Type();
1877 SigAtomicType = HostTarget->getSigAtomicType();
1878 ProcessIDType = HostTarget->getProcessIDType();
1879
1880 UseBitFieldTypeAlignment = HostTarget->useBitFieldTypeAlignment();
1881 UseZeroLengthBitfieldAlignment =
1882 HostTarget->useZeroLengthBitfieldAlignment();
1883 UseExplicitBitFieldAlignment = HostTarget->useExplicitBitFieldAlignment();
1884 ZeroLengthBitfieldBoundary = HostTarget->getZeroLengthBitfieldBoundary();
1885
Justin Lebar5057f172016-09-09 20:35:43 +00001886 // This is a bit of a lie, but it controls __GCC_ATOMIC_XXX_LOCK_FREE, and
1887 // we need those macros to be identical on host and device, because (among
1888 // other things) they affect which standard library classes are defined, and
1889 // we need all classes to be defined on both the host and device.
1890 MaxAtomicInlineWidth = HostTarget->getMaxAtomicInlineWidth();
1891
Justin Lebar76945b22016-04-29 23:05:19 +00001892 // Properties intentionally not copied from host:
1893 // - LargeArrayMinWidth, LargeArrayAlign: Not visible across the
1894 // host/device boundary.
1895 // - SuitableAlign: Not visible across the host/device boundary, and may
1896 // correctly be different on host/device, e.g. if host has wider vector
1897 // types than device.
1898 // - LongDoubleWidth, LongDoubleAlign: nvptx's long double type is the same
1899 // as its double type, but that's not necessarily true on the host.
1900 // TODO: nvcc emits a warning when using long double on device; we should
1901 // do the same.
Eric Christopherc48497a2015-09-18 21:26:24 +00001902 }
1903 void getTargetDefines(const LangOptions &Opts,
1904 MacroBuilder &Builder) const override {
1905 Builder.defineMacro("__PTX__");
1906 Builder.defineMacro("__NVPTX__");
1907 if (Opts.CUDAIsDevice) {
1908 // Set __CUDA_ARCH__ for the GPU specified.
Justin Lebaref1aaac2016-07-06 21:21:14 +00001909 std::string CUDAArchCode = [this] {
1910 switch (GPU) {
Simon Pilgrim13dff572016-07-07 22:32:26 +00001911 case CudaArch::UNKNOWN:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001912 assert(false && "No GPU arch when compiling CUDA device code.");
1913 return "";
Justin Lebar62907612016-07-06 21:21:39 +00001914 case CudaArch::SM_20:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001915 return "200";
Justin Lebar62907612016-07-06 21:21:39 +00001916 case CudaArch::SM_21:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001917 return "210";
Justin Lebar62907612016-07-06 21:21:39 +00001918 case CudaArch::SM_30:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001919 return "300";
Justin Lebar62907612016-07-06 21:21:39 +00001920 case CudaArch::SM_32:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001921 return "320";
Justin Lebar62907612016-07-06 21:21:39 +00001922 case CudaArch::SM_35:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001923 return "350";
Justin Lebar62907612016-07-06 21:21:39 +00001924 case CudaArch::SM_37:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001925 return "370";
Justin Lebar62907612016-07-06 21:21:39 +00001926 case CudaArch::SM_50:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001927 return "500";
Justin Lebar62907612016-07-06 21:21:39 +00001928 case CudaArch::SM_52:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001929 return "520";
Justin Lebar62907612016-07-06 21:21:39 +00001930 case CudaArch::SM_53:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001931 return "530";
Justin Lebar62907612016-07-06 21:21:39 +00001932 case CudaArch::SM_60:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001933 return "600";
Justin Lebar62907612016-07-06 21:21:39 +00001934 case CudaArch::SM_61:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001935 return "610";
Justin Lebar62907612016-07-06 21:21:39 +00001936 case CudaArch::SM_62:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001937 return "620";
1938 }
Simon Pilgrim13dff572016-07-07 22:32:26 +00001939 llvm_unreachable("unhandled CudaArch");
Justin Lebaref1aaac2016-07-06 21:21:14 +00001940 }();
Eric Christopherc48497a2015-09-18 21:26:24 +00001941 Builder.defineMacro("__CUDA_ARCH__", CUDAArchCode);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001942 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001943 }
Craig Topper6c03a542015-10-19 04:51:35 +00001944 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
1945 return llvm::makeArrayRef(BuiltinInfo,
1946 clang::NVPTX::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eric Christopherc48497a2015-09-18 21:26:24 +00001947 }
Artem Belevichfda99052016-09-28 17:47:35 +00001948 bool
1949 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
1950 StringRef CPU,
1951 const std::vector<std::string> &FeaturesVec) const override {
1952 Features["satom"] = GPU >= CudaArch::SM_60;
1953 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
1954 }
1955
Eric Christopherc48497a2015-09-18 21:26:24 +00001956 bool hasFeature(StringRef Feature) const override {
Artem Belevichfda99052016-09-28 17:47:35 +00001957 return llvm::StringSwitch<bool>(Feature)
1958 .Cases("ptx", "nvptx", true)
1959 .Case("satom", GPU >= CudaArch::SM_60) // Atomics w/ scope.
1960 .Default(false);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001961 }
1962
Craig Topperf054e3a2015-10-19 03:52:27 +00001963 ArrayRef<const char *> getGCCRegNames() const override;
1964 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00001965 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00001966 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00001967 }
1968 bool validateAsmConstraint(const char *&Name,
1969 TargetInfo::ConstraintInfo &Info) const override {
1970 switch (*Name) {
1971 default:
1972 return false;
1973 case 'c':
1974 case 'h':
1975 case 'r':
1976 case 'l':
1977 case 'f':
1978 case 'd':
1979 Info.setAllowsRegister();
1980 return true;
Eli Bendersky13467172015-04-01 20:29:18 +00001981 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001982 }
1983 const char *getClobbers() const override {
1984 // FIXME: Is this really right?
1985 return "";
1986 }
1987 BuiltinVaListKind getBuiltinVaListKind() const override {
1988 // FIXME: implement
1989 return TargetInfo::CharPtrBuiltinVaList;
1990 }
1991 bool setCPU(const std::string &Name) override {
Justin Lebar62907612016-07-06 21:21:39 +00001992 GPU = StringToCudaArch(Name);
1993 return GPU != CudaArch::UNKNOWN;
Eric Christopherc48497a2015-09-18 21:26:24 +00001994 }
Jan Vesely9674bd42016-06-17 19:02:14 +00001995 void setSupportedOpenCLOpts() override {
1996 auto &Opts = getSupportedOpenCLOpts();
Yaxun Liu5b746652016-12-18 05:18:55 +00001997 Opts.support("cl_clang_storage_class_specifiers");
1998 Opts.support("cl_khr_gl_sharing");
1999 Opts.support("cl_khr_icd");
Jan Vesely9674bd42016-06-17 19:02:14 +00002000
Yaxun Liu5b746652016-12-18 05:18:55 +00002001 Opts.support("cl_khr_fp64");
2002 Opts.support("cl_khr_byte_addressable_store");
2003 Opts.support("cl_khr_global_int32_base_atomics");
2004 Opts.support("cl_khr_global_int32_extended_atomics");
2005 Opts.support("cl_khr_local_int32_base_atomics");
2006 Opts.support("cl_khr_local_int32_extended_atomics");
Jan Vesely9674bd42016-06-17 19:02:14 +00002007 }
Justin Lebar86c4e632017-01-05 16:53:38 +00002008
2009 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
2010 // CUDA compilations support all of the host's calling conventions.
2011 //
2012 // TODO: We should warn if you apply a non-default CC to anything other than
2013 // a host function.
2014 if (HostTarget)
2015 return HostTarget->checkCallingConvention(CC);
2016 return CCCR_Warning;
2017 }
Eric Christopherc48497a2015-09-18 21:26:24 +00002018};
2019
2020const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
2021#define BUILTIN(ID, TYPE, ATTRS) \
2022 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
2023#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
2024 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Artem Belevichfda99052016-09-28 17:47:35 +00002025#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
2026 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Eric Christopherc48497a2015-09-18 21:26:24 +00002027#include "clang/Basic/BuiltinsNVPTX.def"
2028};
2029
2030const char *const NVPTXTargetInfo::GCCRegNames[] = {"r0"};
2031
Craig Topperf054e3a2015-10-19 03:52:27 +00002032ArrayRef<const char *> NVPTXTargetInfo::getGCCRegNames() const {
2033 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00002034}
2035
Yaxun Liu3464f922017-03-25 03:46:25 +00002036static const LangAS::Map AMDGPUPrivateIsZeroMap = {
Yaxun Liub34ec822017-04-11 17:24:23 +00002037 4, // Default
Yaxun Liu3464f922017-03-25 03:46:25 +00002038 1, // opencl_global
2039 3, // opencl_local
2040 2, // opencl_constant
2041 4, // opencl_generic
2042 1, // cuda_device
2043 2, // cuda_constant
2044 3 // cuda_shared
2045};
2046static const LangAS::Map AMDGPUGenericIsZeroMap = {
Yaxun Liub34ec822017-04-11 17:24:23 +00002047 0, // Default
Yaxun Liu3464f922017-03-25 03:46:25 +00002048 1, // opencl_global
2049 3, // opencl_local
Yaxun Liub122ed92017-04-06 19:18:36 +00002050 2, // opencl_constant
Yaxun Liu3464f922017-03-25 03:46:25 +00002051 0, // opencl_generic
2052 1, // cuda_device
Yaxun Liub122ed92017-04-06 19:18:36 +00002053 2, // cuda_constant
Yaxun Liu3464f922017-03-25 03:46:25 +00002054 3 // cuda_shared
Eli Friedmand13b41e2012-10-12 23:32:00 +00002055};
2056
Tom Stellarda96344b2014-08-21 13:58:40 +00002057// If you edit the description strings, make sure you update
2058// getPointerWidthV().
2059
Craig Topper273dbc62015-10-18 05:29:26 +00002060static const char *const DataLayoutStringR600 =
Rafael Espindola29db13a2014-01-03 18:13:17 +00002061 "e-p:32:32-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 DataLayoutStringSIPrivateIsZero =
Matt Arsenault6dc455f2016-05-31 16:58:18 +00002065 "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 +00002066 "-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";
Tom Stellardc74b1e02013-03-04 17:40:53 +00002068
Yaxun Liu3464f922017-03-25 03:46:25 +00002069static const char *const DataLayoutStringSIGenericIsZero =
Yaxun Liub122ed92017-04-06 19:18:36 +00002070 "e-p:64:64-p1:64:64-p2:64:64-p3:32:32-p4:32:32-p5:32:32"
Yaxun Liu3464f922017-03-25 03:46:25 +00002071 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
Yaxun Liub34ec822017-04-11 17:24:23 +00002072 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64-A5";
Yaxun Liu3464f922017-03-25 03:46:25 +00002073
Matt Arsenault250024f2016-06-08 01:56:42 +00002074class AMDGPUTargetInfo final : public TargetInfo {
Matt Arsenault56f008d2014-06-24 20:45:01 +00002075 static const Builtin::Info BuiltinInfo[];
Tom Stellard7b1059b2015-04-14 14:36:56 +00002076 static const char * const GCCRegNames[];
Matt Arsenault56f008d2014-06-24 20:45:01 +00002077
Yaxun Liu3464f922017-03-25 03:46:25 +00002078 struct AddrSpace {
2079 unsigned Generic, Global, Local, Constant, Private;
2080 AddrSpace(bool IsGenericZero_ = false){
2081 if (IsGenericZero_) {
2082 Generic = 0;
2083 Global = 1;
2084 Local = 3;
Yaxun Liub122ed92017-04-06 19:18:36 +00002085 Constant = 2;
Yaxun Liu3464f922017-03-25 03:46:25 +00002086 Private = 5;
2087 } else {
2088 Generic = 4;
2089 Global = 1;
2090 Local = 3;
2091 Constant = 2;
2092 Private = 0;
2093 }
2094 }
2095 };
2096
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002097 /// \brief The GPU profiles supported by the AMDGPU target.
Tom Stellardc74b1e02013-03-04 17:40:53 +00002098 enum GPUKind {
2099 GK_NONE,
2100 GK_R600,
2101 GK_R600_DOUBLE_OPS,
2102 GK_R700,
2103 GK_R700_DOUBLE_OPS,
2104 GK_EVERGREEN,
2105 GK_EVERGREEN_DOUBLE_OPS,
2106 GK_NORTHERN_ISLANDS,
2107 GK_CAYMAN,
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002108 GK_GFX6,
2109 GK_GFX7,
Matt Arsenaulteb952fd2017-02-18 19:02:41 +00002110 GK_GFX8,
2111 GK_GFX9
Tom Stellardc74b1e02013-03-04 17:40:53 +00002112 } GPU;
2113
Jan Veselyeebeaea2015-05-04 19:53:36 +00002114 bool hasFP64:1;
2115 bool hasFMAF:1;
2116 bool hasLDEXPF:1;
Yaxun Liu354097b2017-03-25 11:34:41 +00002117 const AddrSpace AS;
Jan Veselya3abd6d2015-05-01 17:38:13 +00002118
Konstantin Zhuravlyove668b1c2017-04-14 05:33:57 +00002119 static bool hasFullSpeedFMAF32(StringRef GPUName) {
2120 return parseAMDGCNName(GPUName) >= GK_GFX9;
2121 }
2122
Matt Arsenault250024f2016-06-08 01:56:42 +00002123 static bool isAMDGCN(const llvm::Triple &TT) {
2124 return TT.getArch() == llvm::Triple::amdgcn;
2125 }
2126
Yaxun Liu3464f922017-03-25 03:46:25 +00002127 static bool isGenericZero(const llvm::Triple &TT) {
2128 return TT.getEnvironmentName() == "amdgiz" ||
2129 TT.getEnvironmentName() == "amdgizcl";
2130 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00002131public:
Yaxun Liu2c17e822016-08-09 19:43:38 +00002132 AMDGPUTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Matt Arsenault250024f2016-06-08 01:56:42 +00002133 : TargetInfo(Triple) ,
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002134 GPU(isAMDGCN(Triple) ? GK_GFX6 : GK_R600),
Matt Arsenault250024f2016-06-08 01:56:42 +00002135 hasFP64(false),
2136 hasFMAF(false),
Yaxun Liu2c17e822016-08-09 19:43:38 +00002137 hasLDEXPF(false),
Yaxun Liu3464f922017-03-25 03:46:25 +00002138 AS(isGenericZero(Triple)){
Matt Arsenault250024f2016-06-08 01:56:42 +00002139 if (getTriple().getArch() == llvm::Triple::amdgcn) {
Jan Veselya3abd6d2015-05-01 17:38:13 +00002140 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00002141 hasFMAF = true;
2142 hasLDEXPF = true;
Tom Stellardd99fb952015-01-28 15:38:44 +00002143 }
Yaxun Liu3464f922017-03-25 03:46:25 +00002144 auto IsGenericZero = isGenericZero(Triple);
Matt Arsenault250024f2016-06-08 01:56:42 +00002145 resetDataLayout(getTriple().getArch() == llvm::Triple::amdgcn ?
Yaxun Liu3464f922017-03-25 03:46:25 +00002146 (IsGenericZero ? DataLayoutStringSIGenericIsZero :
2147 DataLayoutStringSIPrivateIsZero)
2148 : DataLayoutStringR600);
Yaxun Liub34ec822017-04-11 17:24:23 +00002149 assert(DataLayout->getAllocaAddrSpace() == AS.Private);
Matt Arsenault250024f2016-06-08 01:56:42 +00002150
Yaxun Liu3464f922017-03-25 03:46:25 +00002151 AddrSpaceMap = IsGenericZero ? &AMDGPUGenericIsZeroMap :
2152 &AMDGPUPrivateIsZeroMap;
David Tweed31d09b02013-09-13 12:04:22 +00002153 UseAddrSpaceMapMangling = true;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002154 }
2155
Tom Stellarda96344b2014-08-21 13:58:40 +00002156 uint64_t getPointerWidthV(unsigned AddrSpace) const override {
2157 if (GPU <= GK_CAYMAN)
2158 return 32;
2159
Yaxun Liu3464f922017-03-25 03:46:25 +00002160 if (AddrSpace == AS.Private || AddrSpace == AS.Local) {
2161 return 32;
Tom Stellarda96344b2014-08-21 13:58:40 +00002162 }
Yaxun Liu3464f922017-03-25 03:46:25 +00002163 return 64;
Tom Stellarda96344b2014-08-21 13:58:40 +00002164 }
2165
Yaxun Liu26f75662016-08-19 05:17:25 +00002166 uint64_t getMaxPointerWidth() const override {
2167 return getTriple().getArch() == llvm::Triple::amdgcn ? 64 : 32;
2168 }
2169
Craig Topper3164f332014-03-11 03:39:26 +00002170 const char * getClobbers() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00002171 return "";
2172 }
2173
Craig Topperf054e3a2015-10-19 03:52:27 +00002174 ArrayRef<const char *> getGCCRegNames() const override;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002175
Craig Topperf054e3a2015-10-19 03:52:27 +00002176 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
2177 return None;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002178 }
2179
Craig Topper3164f332014-03-11 03:39:26 +00002180 bool validateAsmConstraint(const char *&Name,
Tom Stellardd097e942015-11-19 22:11:58 +00002181 TargetInfo::ConstraintInfo &Info) const override {
2182 switch (*Name) {
2183 default: break;
2184 case 'v': // vgpr
2185 case 's': // sgpr
2186 Info.setAllowsRegister();
2187 return true;
2188 }
2189 return false;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002190 }
2191
Matt Arsenault250024f2016-06-08 01:56:42 +00002192 bool initFeatureMap(llvm::StringMap<bool> &Features,
2193 DiagnosticsEngine &Diags, StringRef CPU,
2194 const std::vector<std::string> &FeatureVec) const override;
2195
Yaxun Liu2c17e822016-08-09 19:43:38 +00002196 void adjustTargetOptions(const CodeGenOptions &CGOpts,
2197 TargetOptions &TargetOpts) const override {
Yaxun Liu2c17e822016-08-09 19:43:38 +00002198 bool hasFP32Denormals = false;
2199 bool hasFP64Denormals = false;
2200 for (auto &I : TargetOpts.FeaturesAsWritten) {
2201 if (I == "+fp32-denormals" || I == "-fp32-denormals")
2202 hasFP32Denormals = true;
Matt Arsenault09cca092017-01-23 22:31:14 +00002203 if (I == "+fp64-fp16-denormals" || I == "-fp64-fp16-denormals")
Yaxun Liu2c17e822016-08-09 19:43:38 +00002204 hasFP64Denormals = true;
2205 }
2206 if (!hasFP32Denormals)
Konstantin Zhuravlyove668b1c2017-04-14 05:33:57 +00002207 TargetOpts.Features.push_back(
2208 (Twine(hasFullSpeedFMAF32(TargetOpts.CPU) &&
Yaxun Liud3e85b92016-09-13 17:37:09 +00002209 !CGOpts.FlushDenorm ? '+' : '-') + Twine("fp32-denormals")).str());
Matt Arsenault09cca092017-01-23 22:31:14 +00002210 // Always do not flush fp64 or fp16 denorms.
Yaxun Liu2c17e822016-08-09 19:43:38 +00002211 if (!hasFP64Denormals && hasFP64)
Matt Arsenault09cca092017-01-23 22:31:14 +00002212 TargetOpts.Features.push_back("+fp64-fp16-denormals");
Yaxun Liu2c17e822016-08-09 19:43:38 +00002213 }
2214
Craig Topper6c03a542015-10-19 04:51:35 +00002215 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
2216 return llvm::makeArrayRef(BuiltinInfo,
2217 clang::AMDGPU::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eli Friedmand13b41e2012-10-12 23:32:00 +00002218 }
2219
Craig Topper3164f332014-03-11 03:39:26 +00002220 void getTargetDefines(const LangOptions &Opts,
2221 MacroBuilder &Builder) const override {
Matt Arsenault5e020b22016-02-27 09:06:26 +00002222 if (getTriple().getArch() == llvm::Triple::amdgcn)
2223 Builder.defineMacro("__AMDGCN__");
2224 else
2225 Builder.defineMacro("__R600__");
2226
Jan Veselyeebeaea2015-05-04 19:53:36 +00002227 if (hasFMAF)
2228 Builder.defineMacro("__HAS_FMAF__");
2229 if (hasLDEXPF)
2230 Builder.defineMacro("__HAS_LDEXPF__");
Jan Vesely211ba782016-06-17 02:25:03 +00002231 if (hasFP64)
2232 Builder.defineMacro("__HAS_FP64__");
Eli Friedmand13b41e2012-10-12 23:32:00 +00002233 }
2234
Craig Topper3164f332014-03-11 03:39:26 +00002235 BuiltinVaListKind getBuiltinVaListKind() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00002236 return TargetInfo::CharPtrBuiltinVaList;
2237 }
2238
Matt Arsenault250024f2016-06-08 01:56:42 +00002239 static GPUKind parseR600Name(StringRef Name) {
2240 return llvm::StringSwitch<GPUKind>(Name)
Tom Stellardc74b1e02013-03-04 17:40:53 +00002241 .Case("r600" , GK_R600)
2242 .Case("rv610", GK_R600)
2243 .Case("rv620", GK_R600)
2244 .Case("rv630", GK_R600)
2245 .Case("rv635", GK_R600)
2246 .Case("rs780", GK_R600)
2247 .Case("rs880", GK_R600)
2248 .Case("rv670", GK_R600_DOUBLE_OPS)
2249 .Case("rv710", GK_R700)
2250 .Case("rv730", GK_R700)
2251 .Case("rv740", GK_R700_DOUBLE_OPS)
2252 .Case("rv770", GK_R700_DOUBLE_OPS)
2253 .Case("palm", GK_EVERGREEN)
2254 .Case("cedar", GK_EVERGREEN)
2255 .Case("sumo", GK_EVERGREEN)
2256 .Case("sumo2", GK_EVERGREEN)
2257 .Case("redwood", GK_EVERGREEN)
2258 .Case("juniper", GK_EVERGREEN)
2259 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
2260 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
2261 .Case("barts", GK_NORTHERN_ISLANDS)
2262 .Case("turks", GK_NORTHERN_ISLANDS)
2263 .Case("caicos", GK_NORTHERN_ISLANDS)
2264 .Case("cayman", GK_CAYMAN)
2265 .Case("aruba", GK_CAYMAN)
Matt Arsenault250024f2016-06-08 01:56:42 +00002266 .Default(GK_NONE);
2267 }
2268
2269 static GPUKind parseAMDGCNName(StringRef Name) {
2270 return llvm::StringSwitch<GPUKind>(Name)
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002271 .Case("tahiti", GK_GFX6)
2272 .Case("pitcairn", GK_GFX6)
2273 .Case("verde", GK_GFX6)
2274 .Case("oland", GK_GFX6)
2275 .Case("hainan", GK_GFX6)
2276 .Case("bonaire", GK_GFX7)
2277 .Case("kabini", GK_GFX7)
2278 .Case("kaveri", GK_GFX7)
2279 .Case("hawaii", GK_GFX7)
2280 .Case("mullins", GK_GFX7)
Yaxun Liue59a0bc2016-10-26 16:40:21 +00002281 .Case("gfx700", GK_GFX7)
2282 .Case("gfx701", GK_GFX7)
2283 .Case("gfx702", GK_GFX7)
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002284 .Case("tonga", GK_GFX8)
2285 .Case("iceland", GK_GFX8)
2286 .Case("carrizo", GK_GFX8)
2287 .Case("fiji", GK_GFX8)
2288 .Case("stoney", GK_GFX8)
2289 .Case("polaris10", GK_GFX8)
2290 .Case("polaris11", GK_GFX8)
Yaxun Liue59a0bc2016-10-26 16:40:21 +00002291 .Case("gfx800", GK_GFX8)
2292 .Case("gfx801", GK_GFX8)
2293 .Case("gfx802", GK_GFX8)
2294 .Case("gfx803", GK_GFX8)
2295 .Case("gfx804", GK_GFX8)
2296 .Case("gfx810", GK_GFX8)
Matt Arsenaulteb952fd2017-02-18 19:02:41 +00002297 .Case("gfx900", GK_GFX9)
2298 .Case("gfx901", GK_GFX9)
Tom Stellardc74b1e02013-03-04 17:40:53 +00002299 .Default(GK_NONE);
Matt Arsenault250024f2016-06-08 01:56:42 +00002300 }
Tom Stellardc74b1e02013-03-04 17:40:53 +00002301
Matt Arsenault250024f2016-06-08 01:56:42 +00002302 bool setCPU(const std::string &Name) override {
2303 if (getTriple().getArch() == llvm::Triple::amdgcn)
2304 GPU = parseAMDGCNName(Name);
2305 else
2306 GPU = parseR600Name(Name);
Tom Stellardc74b1e02013-03-04 17:40:53 +00002307
Matt Arsenault250024f2016-06-08 01:56:42 +00002308 return GPU != GK_NONE;
Tom Stellardc74b1e02013-03-04 17:40:53 +00002309 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002310
Jan Vesely211ba782016-06-17 02:25:03 +00002311 void setSupportedOpenCLOpts() override {
2312 auto &Opts = getSupportedOpenCLOpts();
Yaxun Liu5b746652016-12-18 05:18:55 +00002313 Opts.support("cl_clang_storage_class_specifiers");
2314 Opts.support("cl_khr_icd");
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002315
Jan Vesely211ba782016-06-17 02:25:03 +00002316 if (hasFP64)
Yaxun Liu5b746652016-12-18 05:18:55 +00002317 Opts.support("cl_khr_fp64");
Jan Vesely211ba782016-06-17 02:25:03 +00002318 if (GPU >= GK_EVERGREEN) {
Yaxun Liu5b746652016-12-18 05:18:55 +00002319 Opts.support("cl_khr_byte_addressable_store");
2320 Opts.support("cl_khr_global_int32_base_atomics");
2321 Opts.support("cl_khr_global_int32_extended_atomics");
2322 Opts.support("cl_khr_local_int32_base_atomics");
2323 Opts.support("cl_khr_local_int32_extended_atomics");
Jan Vesely211ba782016-06-17 02:25:03 +00002324 }
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002325 if (GPU >= GK_GFX6) {
Yaxun Liu5b746652016-12-18 05:18:55 +00002326 Opts.support("cl_khr_fp16");
2327 Opts.support("cl_khr_int64_base_atomics");
2328 Opts.support("cl_khr_int64_extended_atomics");
2329 Opts.support("cl_khr_mipmap_image");
2330 Opts.support("cl_khr_subgroups");
2331 Opts.support("cl_khr_3d_image_writes");
2332 Opts.support("cl_amd_media_ops");
2333 Opts.support("cl_amd_media_ops2");
Jan Vesely211ba782016-06-17 02:25:03 +00002334 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002335 }
Nikolay Haustov8c6538b2016-06-30 09:06:33 +00002336
Yaxun Liu99444cb2016-08-03 20:38:06 +00002337 LangAS::ID getOpenCLImageAddrSpace() const override {
2338 return LangAS::opencl_constant;
2339 }
2340
Konstantin Zhuravlyovd1ba16e2017-03-08 23:56:48 +00002341 /// \returns Target specific vtbl ptr address space.
2342 unsigned getVtblPtrAddressSpace() const override {
2343 // \todo: We currently have address spaces defined in AMDGPU Backend. It
2344 // would be nice if we could use it here instead of using bare numbers (same
2345 // applies to getDWARFAddressSpace).
2346 return 2; // constant.
2347 }
2348
2349 /// \returns If a target requires an address within a target specific address
2350 /// space \p AddressSpace to be converted in order to be used, then return the
2351 /// corresponding target specific DWARF address space.
2352 ///
2353 /// \returns Otherwise return None and no conversion will be emitted in the
2354 /// DWARF.
2355 Optional<unsigned> getDWARFAddressSpace(
2356 unsigned AddressSpace) const override {
Yaxun Liu3464f922017-03-25 03:46:25 +00002357 const unsigned DWARF_Private = 1;
2358 const unsigned DWARF_Local = 2;
2359 if (AddressSpace == AS.Private) {
2360 return DWARF_Private;
2361 } else if (AddressSpace == AS.Local) {
2362 return DWARF_Local;
2363 } else {
Konstantin Zhuravlyovd1ba16e2017-03-08 23:56:48 +00002364 return None;
2365 }
2366 }
2367
Nikolay Haustov8c6538b2016-06-30 09:06:33 +00002368 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
2369 switch (CC) {
2370 default:
2371 return CCCR_Warning;
2372 case CC_C:
2373 case CC_OpenCLKernel:
2374 return CCCR_OK;
2375 }
2376 }
Yaxun Liu402804b2016-12-15 08:09:08 +00002377
2378 // In amdgcn target the null pointer in global, constant, and generic
2379 // address space has value 0 but in private and local address space has
2380 // value ~0.
2381 uint64_t getNullPointerValue(unsigned AS) const override {
Matt Arsenaultbf5e3e42017-03-13 19:47:53 +00002382 return AS == LangAS::opencl_local ? ~0 : 0;
Yaxun Liu402804b2016-12-15 08:09:08 +00002383 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00002384};
2385
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002386const Builtin::Info AMDGPUTargetInfo::BuiltinInfo[] = {
Matt Arsenault56f008d2014-06-24 20:45:01 +00002387#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00002388 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Matt Arsenault250024f2016-06-08 01:56:42 +00002389#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
2390 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002391#include "clang/Basic/BuiltinsAMDGPU.def"
Matt Arsenault56f008d2014-06-24 20:45:01 +00002392};
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002393const char * const AMDGPUTargetInfo::GCCRegNames[] = {
Tom Stellard7b1059b2015-04-14 14:36:56 +00002394 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
2395 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
2396 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
2397 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
2398 "v32", "v33", "v34", "v35", "v36", "v37", "v38", "v39",
2399 "v40", "v41", "v42", "v43", "v44", "v45", "v46", "v47",
2400 "v48", "v49", "v50", "v51", "v52", "v53", "v54", "v55",
2401 "v56", "v57", "v58", "v59", "v60", "v61", "v62", "v63",
2402 "v64", "v65", "v66", "v67", "v68", "v69", "v70", "v71",
2403 "v72", "v73", "v74", "v75", "v76", "v77", "v78", "v79",
2404 "v80", "v81", "v82", "v83", "v84", "v85", "v86", "v87",
2405 "v88", "v89", "v90", "v91", "v92", "v93", "v94", "v95",
2406 "v96", "v97", "v98", "v99", "v100", "v101", "v102", "v103",
2407 "v104", "v105", "v106", "v107", "v108", "v109", "v110", "v111",
2408 "v112", "v113", "v114", "v115", "v116", "v117", "v118", "v119",
2409 "v120", "v121", "v122", "v123", "v124", "v125", "v126", "v127",
2410 "v128", "v129", "v130", "v131", "v132", "v133", "v134", "v135",
2411 "v136", "v137", "v138", "v139", "v140", "v141", "v142", "v143",
2412 "v144", "v145", "v146", "v147", "v148", "v149", "v150", "v151",
2413 "v152", "v153", "v154", "v155", "v156", "v157", "v158", "v159",
2414 "v160", "v161", "v162", "v163", "v164", "v165", "v166", "v167",
2415 "v168", "v169", "v170", "v171", "v172", "v173", "v174", "v175",
2416 "v176", "v177", "v178", "v179", "v180", "v181", "v182", "v183",
2417 "v184", "v185", "v186", "v187", "v188", "v189", "v190", "v191",
2418 "v192", "v193", "v194", "v195", "v196", "v197", "v198", "v199",
2419 "v200", "v201", "v202", "v203", "v204", "v205", "v206", "v207",
2420 "v208", "v209", "v210", "v211", "v212", "v213", "v214", "v215",
2421 "v216", "v217", "v218", "v219", "v220", "v221", "v222", "v223",
2422 "v224", "v225", "v226", "v227", "v228", "v229", "v230", "v231",
2423 "v232", "v233", "v234", "v235", "v236", "v237", "v238", "v239",
2424 "v240", "v241", "v242", "v243", "v244", "v245", "v246", "v247",
2425 "v248", "v249", "v250", "v251", "v252", "v253", "v254", "v255",
2426 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
2427 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
2428 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
2429 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
2430 "s32", "s33", "s34", "s35", "s36", "s37", "s38", "s39",
2431 "s40", "s41", "s42", "s43", "s44", "s45", "s46", "s47",
2432 "s48", "s49", "s50", "s51", "s52", "s53", "s54", "s55",
2433 "s56", "s57", "s58", "s59", "s60", "s61", "s62", "s63",
2434 "s64", "s65", "s66", "s67", "s68", "s69", "s70", "s71",
2435 "s72", "s73", "s74", "s75", "s76", "s77", "s78", "s79",
2436 "s80", "s81", "s82", "s83", "s84", "s85", "s86", "s87",
2437 "s88", "s89", "s90", "s91", "s92", "s93", "s94", "s95",
2438 "s96", "s97", "s98", "s99", "s100", "s101", "s102", "s103",
2439 "s104", "s105", "s106", "s107", "s108", "s109", "s110", "s111",
2440 "s112", "s113", "s114", "s115", "s116", "s117", "s118", "s119",
Etienne Bergerone8ae26f2016-03-24 18:29:24 +00002441 "s120", "s121", "s122", "s123", "s124", "s125", "s126", "s127",
Matt Arsenaultb015d622016-02-27 09:06:22 +00002442 "exec", "vcc", "scc", "m0", "flat_scratch", "exec_lo", "exec_hi",
2443 "vcc_lo", "vcc_hi", "flat_scratch_lo", "flat_scratch_hi"
Tom Stellard7b1059b2015-04-14 14:36:56 +00002444};
2445
Craig Topperf054e3a2015-10-19 03:52:27 +00002446ArrayRef<const char *> AMDGPUTargetInfo::getGCCRegNames() const {
2447 return llvm::makeArrayRef(GCCRegNames);
Tom Stellard7b1059b2015-04-14 14:36:56 +00002448}
Matt Arsenault56f008d2014-06-24 20:45:01 +00002449
Matt Arsenault250024f2016-06-08 01:56:42 +00002450bool AMDGPUTargetInfo::initFeatureMap(
2451 llvm::StringMap<bool> &Features,
2452 DiagnosticsEngine &Diags, StringRef CPU,
2453 const std::vector<std::string> &FeatureVec) const {
2454
2455 // XXX - What does the member GPU mean if device name string passed here?
2456 if (getTriple().getArch() == llvm::Triple::amdgcn) {
2457 if (CPU.empty())
2458 CPU = "tahiti";
2459
2460 switch (parseAMDGCNName(CPU)) {
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002461 case GK_GFX6:
2462 case GK_GFX7:
Matt Arsenault250024f2016-06-08 01:56:42 +00002463 break;
2464
Matt Arsenaulta0c6dca2017-02-22 20:55:59 +00002465 case GK_GFX9:
2466 Features["gfx9-insts"] = true;
2467 LLVM_FALLTHROUGH;
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002468 case GK_GFX8:
Matt Arsenault250024f2016-06-08 01:56:42 +00002469 Features["s-memrealtime"] = true;
2470 Features["16-bit-insts"] = true;
Yaxun Liu4d867992017-03-10 01:30:46 +00002471 Features["dpp"] = true;
Matt Arsenault250024f2016-06-08 01:56:42 +00002472 break;
2473
2474 case GK_NONE:
2475 return false;
2476 default:
2477 llvm_unreachable("unhandled subtarget");
2478 }
2479 } else {
2480 if (CPU.empty())
2481 CPU = "r600";
2482
2483 switch (parseR600Name(CPU)) {
2484 case GK_R600:
2485 case GK_R700:
2486 case GK_EVERGREEN:
2487 case GK_NORTHERN_ISLANDS:
2488 break;
2489 case GK_R600_DOUBLE_OPS:
2490 case GK_R700_DOUBLE_OPS:
2491 case GK_EVERGREEN_DOUBLE_OPS:
2492 case GK_CAYMAN:
2493 Features["fp64"] = true;
2494 break;
2495 case GK_NONE:
2496 return false;
2497 default:
2498 llvm_unreachable("unhandled subtarget");
2499 }
2500 }
2501
2502 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeatureVec);
2503}
2504
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00002505const Builtin::Info BuiltinInfoX86[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00002506#define BUILTIN(ID, TYPE, ATTRS) \
2507 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002508#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
Craig Topper07d3b622015-08-07 05:14:44 +00002509 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Albert Gutowski727ab8a2016-09-14 21:19:43 +00002510#define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANGS, FEATURE) \
2511 { #ID, TYPE, ATTRS, HEADER, LANGS, FEATURE },
Chris Lattner5abdec72009-06-14 01:05:48 +00002512#include "clang/Basic/BuiltinsX86.def"
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00002513
2514#define BUILTIN(ID, TYPE, ATTRS) \
2515 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Albert Gutowski0fd6e962016-10-12 17:28:44 +00002516#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
2517 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00002518#define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANGS, FEATURE) \
2519 { #ID, TYPE, ATTRS, HEADER, LANGS, FEATURE },
2520#include "clang/Basic/BuiltinsX86_64.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00002521};
Eli Friedmanb5366062008-05-20 14:21:01 +00002522
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00002523
Nuno Lopescfca1f02009-12-23 17:49:57 +00002524static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002525 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
2526 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00002527 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002528 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
2529 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
2530 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00002531 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00002532 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
2533 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Marina Yatsina41c45fa2016-02-03 11:32:08 +00002534 "xmm16", "xmm17", "xmm18", "xmm19", "xmm20", "xmm21", "xmm22", "xmm23",
2535 "xmm24", "xmm25", "xmm26", "xmm27", "xmm28", "xmm29", "xmm30", "xmm31",
2536 "ymm16", "ymm17", "ymm18", "ymm19", "ymm20", "ymm21", "ymm22", "ymm23",
2537 "ymm24", "ymm25", "ymm26", "ymm27", "ymm28", "ymm29", "ymm30", "ymm31",
2538 "zmm0", "zmm1", "zmm2", "zmm3", "zmm4", "zmm5", "zmm6", "zmm7",
2539 "zmm8", "zmm9", "zmm10", "zmm11", "zmm12", "zmm13", "zmm14", "zmm15",
2540 "zmm16", "zmm17", "zmm18", "zmm19", "zmm20", "zmm21", "zmm22", "zmm23",
2541 "zmm24", "zmm25", "zmm26", "zmm27", "zmm28", "zmm29", "zmm30", "zmm31",
Michael Zuckerman15604b92016-10-31 14:16:57 +00002542 "k0", "k1", "k2", "k3", "k4", "k5", "k6", "k7",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002543};
2544
Eric Christophercdd36352011-06-21 00:05:20 +00002545const TargetInfo::AddlRegName AddlRegNames[] = {
2546 { { "al", "ah", "eax", "rax" }, 0 },
2547 { { "bl", "bh", "ebx", "rbx" }, 3 },
2548 { { "cl", "ch", "ecx", "rcx" }, 2 },
2549 { { "dl", "dh", "edx", "rdx" }, 1 },
2550 { { "esi", "rsi" }, 4 },
2551 { { "edi", "rdi" }, 5 },
2552 { { "esp", "rsp" }, 7 },
2553 { { "ebp", "rbp" }, 6 },
Alexey Bataeva7ab1b42015-09-04 03:42:23 +00002554 { { "r8d", "r8w", "r8b" }, 38 },
2555 { { "r9d", "r9w", "r9b" }, 39 },
2556 { { "r10d", "r10w", "r10b" }, 40 },
2557 { { "r11d", "r11w", "r11b" }, 41 },
2558 { { "r12d", "r12w", "r12b" }, 42 },
2559 { { "r13d", "r13w", "r13b" }, 43 },
2560 { { "r14d", "r14w", "r14b" }, 44 },
2561 { { "r15d", "r15w", "r15b" }, 45 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00002562};
2563
2564// X86 target abstract base class; x86-32 and x86-64 are very close, so
2565// most of the implementation can be shared.
2566class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00002567 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002568 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Craig Topper543f3bd2015-10-14 23:47:57 +00002569 } SSELevel = NoSSE;
Eli Friedman33465822011-07-08 23:31:17 +00002570 enum MMX3DNowEnum {
2571 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
Craig Topper543f3bd2015-10-14 23:47:57 +00002572 } MMX3DNowLevel = NoMMX3DNow;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002573 enum XOPEnum {
2574 NoXOP,
2575 SSE4A,
2576 FMA4,
2577 XOP
Craig Topper543f3bd2015-10-14 23:47:57 +00002578 } XOPLevel = NoXOP;
Anders Carlssone437c682010-01-27 03:47:49 +00002579
Craig Topper543f3bd2015-10-14 23:47:57 +00002580 bool HasAES = false;
2581 bool HasPCLMUL = false;
2582 bool HasLZCNT = false;
2583 bool HasRDRND = false;
2584 bool HasFSGSBASE = false;
2585 bool HasBMI = false;
2586 bool HasBMI2 = false;
2587 bool HasPOPCNT = false;
2588 bool HasRTM = false;
2589 bool HasPRFCHW = false;
2590 bool HasRDSEED = false;
2591 bool HasADX = false;
2592 bool HasTBM = false;
2593 bool HasFMA = false;
2594 bool HasF16C = false;
2595 bool HasAVX512CD = false;
2596 bool HasAVX512ER = false;
2597 bool HasAVX512PF = false;
2598 bool HasAVX512DQ = false;
2599 bool HasAVX512BW = false;
2600 bool HasAVX512VL = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002601 bool HasAVX512VBMI = false;
2602 bool HasAVX512IFMA = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002603 bool HasSHA = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002604 bool HasMPX = false;
2605 bool HasSGX = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002606 bool HasCX16 = false;
Craig Toppere33f51f2015-10-16 06:22:36 +00002607 bool HasFXSR = false;
Craig Topperda9fe562015-10-15 05:23:38 +00002608 bool HasXSAVE = false;
2609 bool HasXSAVEOPT = false;
2610 bool HasXSAVEC = false;
2611 bool HasXSAVES = false;
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00002612 bool HasMWAITX = false;
Craig Topper45742262017-02-09 06:10:14 +00002613 bool HasCLZERO = false;
Asaf Badouha9d1e182015-12-31 14:14:07 +00002614 bool HasPKU = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002615 bool HasCLFLUSHOPT = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002616 bool HasCLWB = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002617 bool HasMOVBE = false;
2618 bool HasPREFETCHWT1 = false;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00002619
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002620 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
2621 ///
2622 /// Each enumeration represents a particular CPU supported by Clang. These
2623 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
2624 enum CPUKind {
2625 CK_Generic,
2626
2627 /// \name i386
2628 /// i386-generation processors.
2629 //@{
2630 CK_i386,
2631 //@}
2632
2633 /// \name i486
2634 /// i486-generation processors.
2635 //@{
2636 CK_i486,
2637 CK_WinChipC6,
2638 CK_WinChip2,
2639 CK_C3,
2640 //@}
2641
2642 /// \name i586
2643 /// i586-generation processors, P5 microarchitecture based.
2644 //@{
2645 CK_i586,
2646 CK_Pentium,
2647 CK_PentiumMMX,
2648 //@}
2649
2650 /// \name i686
2651 /// i686-generation processors, P6 / Pentium M microarchitecture based.
2652 //@{
2653 CK_i686,
2654 CK_PentiumPro,
2655 CK_Pentium2,
2656 CK_Pentium3,
2657 CK_Pentium3M,
2658 CK_PentiumM,
2659 CK_C3_2,
2660
2661 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
2662 /// Clang however has some logic to suport this.
2663 // FIXME: Warn, deprecate, and potentially remove this.
2664 CK_Yonah,
2665 //@}
2666
2667 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00002668 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002669 //@{
2670 CK_Pentium4,
2671 CK_Pentium4M,
2672 CK_Prescott,
2673 CK_Nocona,
2674 //@}
2675
2676 /// \name Core
2677 /// Core microarchitecture based processors.
2678 //@{
2679 CK_Core2,
2680
2681 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
2682 /// codename which GCC no longer accepts as an option to -march, but Clang
2683 /// has some logic for recognizing it.
2684 // FIXME: Warn, deprecate, and potentially remove this.
2685 CK_Penryn,
2686 //@}
2687
2688 /// \name Atom
2689 /// Atom processors
2690 //@{
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002691 CK_Bonnell,
Preston Gurda3c58c02013-09-13 19:27:17 +00002692 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002693 //@}
2694
2695 /// \name Nehalem
2696 /// Nehalem microarchitecture based processors.
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002697 CK_Nehalem,
2698
2699 /// \name Westmere
2700 /// Westmere microarchitecture based processors.
2701 CK_Westmere,
2702
2703 /// \name Sandy Bridge
2704 /// Sandy Bridge microarchitecture based processors.
2705 CK_SandyBridge,
2706
2707 /// \name Ivy Bridge
2708 /// Ivy Bridge microarchitecture based processors.
2709 CK_IvyBridge,
2710
2711 /// \name Haswell
2712 /// Haswell microarchitecture based processors.
2713 CK_Haswell,
2714
2715 /// \name Broadwell
2716 /// Broadwell microarchitecture based processors.
Robert Khasanov50e6f582014-09-19 09:53:48 +00002717 CK_Broadwell,
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002718
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002719 /// \name Skylake Client
2720 /// Skylake client microarchitecture based processors.
2721 CK_SkylakeClient,
2722
2723 /// \name Skylake Server
2724 /// Skylake server microarchitecture based processors.
2725 CK_SkylakeServer,
2726
2727 /// \name Cannonlake Client
2728 /// Cannonlake client microarchitecture based processors.
2729 CK_Cannonlake,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002730
Craig Topper449314e2013-08-20 07:09:39 +00002731 /// \name Knights Landing
2732 /// Knights Landing processor.
2733 CK_KNL,
2734
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002735 /// \name Lakemont
2736 /// Lakemont microarchitecture based processors.
2737 CK_Lakemont,
2738
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002739 /// \name K6
2740 /// K6 architecture processors.
2741 //@{
2742 CK_K6,
2743 CK_K6_2,
2744 CK_K6_3,
2745 //@}
2746
2747 /// \name K7
2748 /// K7 architecture processors.
2749 //@{
2750 CK_Athlon,
2751 CK_AthlonThunderbird,
2752 CK_Athlon4,
2753 CK_AthlonXP,
2754 CK_AthlonMP,
2755 //@}
2756
2757 /// \name K8
2758 /// K8 architecture processors.
2759 //@{
2760 CK_Athlon64,
2761 CK_Athlon64SSE3,
2762 CK_AthlonFX,
2763 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00002764 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002765 CK_Opteron,
2766 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00002767 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002768 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002769
Benjamin Kramer569f2152012-01-10 11:50:18 +00002770 /// \name Bobcat
2771 /// Bobcat architecture processors.
2772 //@{
2773 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002774 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002775 //@}
2776
2777 /// \name Bulldozer
2778 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002779 //@{
2780 CK_BDVER1,
2781 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002782 CK_BDVER3,
Benjamin Kramer56c58222014-05-02 15:47:51 +00002783 CK_BDVER4,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002784 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002785
Craig Topperc45744a2017-01-10 06:02:12 +00002786 /// \name zen
2787 /// Zen architecture processors.
2788 //@{
2789 CK_ZNVER1,
2790 //@}
2791
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002792 /// This specification is deprecated and will be removed in the future.
2793 /// Users should prefer \see CK_K8.
2794 // FIXME: Warn on this when the CPU is set to it.
Saleem Abdulrasoolcb29c1a2014-11-17 18:40:15 +00002795 //@{
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002796 CK_x86_64,
2797 //@}
2798
2799 /// \name Geode
2800 /// Geode processors.
2801 //@{
2802 CK_Geode
2803 //@}
Craig Topper543f3bd2015-10-14 23:47:57 +00002804 } CPU = CK_Generic;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002805
Eric Christopherc50738f2015-08-27 00:05:50 +00002806 CPUKind getCPUKind(StringRef CPU) const {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002807 return llvm::StringSwitch<CPUKind>(CPU)
2808 .Case("i386", CK_i386)
2809 .Case("i486", CK_i486)
2810 .Case("winchip-c6", CK_WinChipC6)
2811 .Case("winchip2", CK_WinChip2)
2812 .Case("c3", CK_C3)
2813 .Case("i586", CK_i586)
2814 .Case("pentium", CK_Pentium)
2815 .Case("pentium-mmx", CK_PentiumMMX)
2816 .Case("i686", CK_i686)
2817 .Case("pentiumpro", CK_PentiumPro)
2818 .Case("pentium2", CK_Pentium2)
2819 .Case("pentium3", CK_Pentium3)
2820 .Case("pentium3m", CK_Pentium3M)
2821 .Case("pentium-m", CK_PentiumM)
2822 .Case("c3-2", CK_C3_2)
2823 .Case("yonah", CK_Yonah)
2824 .Case("pentium4", CK_Pentium4)
2825 .Case("pentium4m", CK_Pentium4M)
2826 .Case("prescott", CK_Prescott)
2827 .Case("nocona", CK_Nocona)
2828 .Case("core2", CK_Core2)
2829 .Case("penryn", CK_Penryn)
2830 .Case("bonnell", CK_Bonnell)
2831 .Case("atom", CK_Bonnell) // Legacy name.
2832 .Case("silvermont", CK_Silvermont)
2833 .Case("slm", CK_Silvermont) // Legacy name.
2834 .Case("nehalem", CK_Nehalem)
2835 .Case("corei7", CK_Nehalem) // Legacy name.
2836 .Case("westmere", CK_Westmere)
2837 .Case("sandybridge", CK_SandyBridge)
2838 .Case("corei7-avx", CK_SandyBridge) // Legacy name.
2839 .Case("ivybridge", CK_IvyBridge)
2840 .Case("core-avx-i", CK_IvyBridge) // Legacy name.
2841 .Case("haswell", CK_Haswell)
2842 .Case("core-avx2", CK_Haswell) // Legacy name.
2843 .Case("broadwell", CK_Broadwell)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002844 .Case("skylake", CK_SkylakeClient)
2845 .Case("skylake-avx512", CK_SkylakeServer)
2846 .Case("skx", CK_SkylakeServer) // Legacy name.
2847 .Case("cannonlake", CK_Cannonlake)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002848 .Case("knl", CK_KNL)
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002849 .Case("lakemont", CK_Lakemont)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002850 .Case("k6", CK_K6)
2851 .Case("k6-2", CK_K6_2)
2852 .Case("k6-3", CK_K6_3)
2853 .Case("athlon", CK_Athlon)
2854 .Case("athlon-tbird", CK_AthlonThunderbird)
2855 .Case("athlon-4", CK_Athlon4)
2856 .Case("athlon-xp", CK_AthlonXP)
2857 .Case("athlon-mp", CK_AthlonMP)
2858 .Case("athlon64", CK_Athlon64)
2859 .Case("athlon64-sse3", CK_Athlon64SSE3)
2860 .Case("athlon-fx", CK_AthlonFX)
2861 .Case("k8", CK_K8)
2862 .Case("k8-sse3", CK_K8SSE3)
2863 .Case("opteron", CK_Opteron)
2864 .Case("opteron-sse3", CK_OpteronSSE3)
2865 .Case("barcelona", CK_AMDFAM10)
2866 .Case("amdfam10", CK_AMDFAM10)
2867 .Case("btver1", CK_BTVER1)
2868 .Case("btver2", CK_BTVER2)
2869 .Case("bdver1", CK_BDVER1)
2870 .Case("bdver2", CK_BDVER2)
2871 .Case("bdver3", CK_BDVER3)
2872 .Case("bdver4", CK_BDVER4)
Craig Topperc45744a2017-01-10 06:02:12 +00002873 .Case("znver1", CK_ZNVER1)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002874 .Case("x86-64", CK_x86_64)
2875 .Case("geode", CK_Geode)
2876 .Default(CK_Generic);
2877 }
2878
Rafael Espindolaeb265472013-08-21 21:59:03 +00002879 enum FPMathKind {
2880 FP_Default,
2881 FP_SSE,
2882 FP_387
Craig Topper543f3bd2015-10-14 23:47:57 +00002883 } FPMath = FP_Default;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002884
Eli Friedman3fd920a2008-08-20 02:34:37 +00002885public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00002886 X86TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
2887 : TargetInfo(Triple) {
Stephan Bergmann17c7f702016-12-14 11:57:17 +00002888 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended();
Chris Lattner1f5ad112006-10-14 18:32:12 +00002889 }
Craig Topper3164f332014-03-11 03:39:26 +00002890 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00002891 // X87 evaluates with 80 bits "long double" precision.
2892 return SSELevel == NoSSE ? 2 : 0;
2893 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002894 ArrayRef<const char *> getGCCRegNames() const override {
2895 return llvm::makeArrayRef(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00002896 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002897 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
2898 return None;
Eric Christophercdd36352011-06-21 00:05:20 +00002899 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002900 ArrayRef<TargetInfo::AddlRegName> getGCCAddlRegNames() const override {
2901 return llvm::makeArrayRef(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00002902 }
Eric Christopherd9832702015-06-29 21:00:05 +00002903 bool validateCpuSupports(StringRef Name) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002904 bool validateAsmConstraint(const char *&Name,
Eric Christopher917e9522014-11-18 22:36:15 +00002905 TargetInfo::ConstraintInfo &info) const override;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002906
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00002907 bool validateGlobalRegisterVariable(StringRef RegName,
2908 unsigned RegSize,
2909 bool &HasSizeMismatch) const override {
2910 // esp and ebp are the only 32-bit registers the x86 backend can currently
2911 // handle.
2912 if (RegName.equals("esp") || RegName.equals("ebp")) {
2913 // Check that the register size is 32-bit.
2914 HasSizeMismatch = RegSize != 32;
2915 return true;
2916 }
2917
2918 return false;
2919 }
2920
Akira Hatanaka974131e2014-09-18 18:17:18 +00002921 bool validateOutputSize(StringRef Constraint, unsigned Size) const override;
2922
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002923 bool validateInputSize(StringRef Constraint, unsigned Size) const override;
2924
Akira Hatanaka974131e2014-09-18 18:17:18 +00002925 virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const;
2926
Craig Topper3164f332014-03-11 03:39:26 +00002927 std::string convertConstraint(const char *&Constraint) const override;
2928 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002929 return "~{dirflag},~{fpsr},~{flags}";
2930 }
Marina Yatsinac42fd032016-12-26 12:23:42 +00002931
2932 StringRef getConstraintRegister(const StringRef &Constraint,
2933 const StringRef &Expression) const override {
2934 StringRef::iterator I, E;
2935 for (I = Constraint.begin(), E = Constraint.end(); I != E; ++I) {
2936 if (isalpha(*I))
2937 break;
2938 }
2939 if (I == E)
2940 return "";
2941 switch (*I) {
2942 // For the register constraints, return the matching register name
2943 case 'a':
2944 return "ax";
2945 case 'b':
2946 return "bx";
2947 case 'c':
2948 return "cx";
2949 case 'd':
2950 return "dx";
2951 case 'S':
2952 return "si";
2953 case 'D':
2954 return "di";
2955 // In case the constraint is 'r' we need to return Expression
2956 case 'r':
2957 return Expression;
2958 default:
2959 // Default value if there is no constraint for the register
2960 return "";
2961 }
2962 return "";
2963 }
2964
Craig Topper3164f332014-03-11 03:39:26 +00002965 void getTargetDefines(const LangOptions &Opts,
2966 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00002967 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
2968 bool Enabled);
2969 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
2970 bool Enabled);
2971 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
2972 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002973 void setFeatureEnabled(llvm::StringMap<bool> &Features,
2974 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00002975 setFeatureEnabledImpl(Features, Name, Enabled);
2976 }
2977 // This exists purely to cut down on the number of virtual calls in
Eric Christopheref1e2952015-08-28 02:13:58 +00002978 // initFeatureMap which calls this repeatedly.
Craig Topper86d79ef2013-09-17 04:51:29 +00002979 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2980 StringRef Name, bool Enabled);
Eric Christopher8c47b422015-10-09 18:39:55 +00002981 bool
2982 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
2983 StringRef CPU,
2984 const std::vector<std::string> &FeaturesVec) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002985 bool hasFeature(StringRef Feature) const override;
2986 bool handleTargetFeatures(std::vector<std::string> &Features,
2987 DiagnosticsEngine &Diags) override;
Alp Toker4925ba72014-06-07 23:30:42 +00002988 StringRef getABI() const override {
Ahmed Bougacha0b938282015-06-22 21:31:43 +00002989 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX512F)
2990 return "avx512";
Craig Topperd945d502015-10-20 00:00:17 +00002991 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002992 return "avx";
Craig Topperd945d502015-10-20 00:00:17 +00002993 if (getTriple().getArch() == llvm::Triple::x86 &&
Derek Schuffc7dd7222012-10-11 15:52:22 +00002994 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002995 return "no-mmx";
2996 return "";
Eli Friedman33465822011-07-08 23:31:17 +00002997 }
Craig Topper3164f332014-03-11 03:39:26 +00002998 bool setCPU(const std::string &Name) override {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002999 CPU = getCPUKind(Name);
Chandler Carruth212334f2011-09-28 08:55:37 +00003000
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00003001 // Perform any per-CPU checks necessary to determine if this CPU is
3002 // acceptable.
3003 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
3004 // invalid without explaining *why*.
3005 switch (CPU) {
3006 case CK_Generic:
3007 // No processor selected!
3008 return false;
3009
3010 case CK_i386:
3011 case CK_i486:
3012 case CK_WinChipC6:
3013 case CK_WinChip2:
3014 case CK_C3:
3015 case CK_i586:
3016 case CK_Pentium:
3017 case CK_PentiumMMX:
3018 case CK_i686:
3019 case CK_PentiumPro:
3020 case CK_Pentium2:
3021 case CK_Pentium3:
3022 case CK_Pentium3M:
3023 case CK_PentiumM:
3024 case CK_Yonah:
3025 case CK_C3_2:
3026 case CK_Pentium4:
3027 case CK_Pentium4M:
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003028 case CK_Lakemont:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00003029 case CK_Prescott:
3030 case CK_K6:
3031 case CK_K6_2:
3032 case CK_K6_3:
3033 case CK_Athlon:
3034 case CK_AthlonThunderbird:
3035 case CK_Athlon4:
3036 case CK_AthlonXP:
3037 case CK_AthlonMP:
3038 case CK_Geode:
3039 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00003040 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00003041 return false;
3042
3043 // Fallthrough
3044 case CK_Nocona:
3045 case CK_Core2:
3046 case CK_Penryn:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003047 case CK_Bonnell:
Preston Gurda3c58c02013-09-13 19:27:17 +00003048 case CK_Silvermont:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003049 case CK_Nehalem:
3050 case CK_Westmere:
3051 case CK_SandyBridge:
3052 case CK_IvyBridge:
3053 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00003054 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003055 case CK_SkylakeClient:
3056 case CK_SkylakeServer:
3057 case CK_Cannonlake:
Craig Topper449314e2013-08-20 07:09:39 +00003058 case CK_KNL:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00003059 case CK_Athlon64:
3060 case CK_Athlon64SSE3:
3061 case CK_AthlonFX:
3062 case CK_K8:
3063 case CK_K8SSE3:
3064 case CK_Opteron:
3065 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00003066 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00003067 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003068 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003069 case CK_BDVER1:
3070 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003071 case CK_BDVER3:
Benjamin Kramer56c58222014-05-02 15:47:51 +00003072 case CK_BDVER4:
Craig Topperc45744a2017-01-10 06:02:12 +00003073 case CK_ZNVER1:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00003074 case CK_x86_64:
3075 return true;
3076 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00003077 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003078 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003079
Craig Topper3164f332014-03-11 03:39:26 +00003080 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00003081
Craig Topper3164f332014-03-11 03:39:26 +00003082 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00003083 // Most of the non-ARM calling conventions are i386 conventions.
3084 switch (CC) {
3085 case CC_X86ThisCall:
3086 case CC_X86FastCall:
3087 case CC_X86StdCall:
3088 case CC_X86VectorCall:
Erich Keane757d3172016-11-02 18:29:35 +00003089 case CC_X86RegCall:
John McCall477f2bb2016-03-03 06:39:32 +00003090 case CC_C:
3091 case CC_Swift:
3092 case CC_X86Pascal:
3093 case CC_IntelOclBicc:
3094 return CCCR_OK;
3095 default:
3096 return CCCR_Warning;
3097 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003098 }
3099
Craig Topper3164f332014-03-11 03:39:26 +00003100 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00003101 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003102 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00003103
3104 bool hasSjLjLowering() const override {
3105 return true;
3106 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00003107
3108 void setSupportedOpenCLOpts() override {
Yaxun Liu5b746652016-12-18 05:18:55 +00003109 getSupportedOpenCLOpts().supportAll();
Yaxun Liu39cf40f2016-05-16 17:06:34 +00003110 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00003111};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00003112
Rafael Espindolaeb265472013-08-21 21:59:03 +00003113bool X86TargetInfo::setFPMath(StringRef Name) {
3114 if (Name == "387") {
3115 FPMath = FP_387;
3116 return true;
3117 }
3118 if (Name == "sse") {
3119 FPMath = FP_SSE;
3120 return true;
3121 }
3122 return false;
3123}
3124
Eric Christopher007b0a02015-08-28 22:32:01 +00003125bool X86TargetInfo::initFeatureMap(
3126 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
Eric Christopher8c47b422015-10-09 18:39:55 +00003127 const std::vector<std::string> &FeaturesVec) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003128 // FIXME: This *really* should not be here.
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003129 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00003130 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00003131 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003132
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003133 const CPUKind Kind = getCPUKind(CPU);
Andrey Turetskiy5f1cf5f2016-03-23 11:15:10 +00003134
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003135 // Enable X87 for all X86 processors but Lakemont.
3136 if (Kind != CK_Lakemont)
3137 setFeatureEnabledImpl(Features, "x87", true);
3138
3139 switch (Kind) {
Chandler Carruth212334f2011-09-28 08:55:37 +00003140 case CK_Generic:
3141 case CK_i386:
3142 case CK_i486:
3143 case CK_i586:
3144 case CK_Pentium:
3145 case CK_i686:
3146 case CK_PentiumPro:
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003147 case CK_Lakemont:
Chandler Carruth212334f2011-09-28 08:55:37 +00003148 break;
3149 case CK_PentiumMMX:
3150 case CK_Pentium2:
Craig Topperdb4dc082014-11-06 05:52:19 +00003151 case CK_K6:
3152 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00003153 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003154 break;
3155 case CK_Pentium3:
3156 case CK_Pentium3M:
Craig Topperdb4dc082014-11-06 05:52:19 +00003157 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00003158 setFeatureEnabledImpl(Features, "sse", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003159 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003160 break;
3161 case CK_PentiumM:
3162 case CK_Pentium4:
3163 case CK_Pentium4M:
3164 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00003165 setFeatureEnabledImpl(Features, "sse2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003166 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003167 break;
3168 case CK_Yonah:
3169 case CK_Prescott:
3170 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00003171 setFeatureEnabledImpl(Features, "sse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003172 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003173 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003174 break;
3175 case CK_Core2:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003176 case CK_Bonnell:
Craig Topper86d79ef2013-09-17 04:51:29 +00003177 setFeatureEnabledImpl(Features, "ssse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003178 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003179 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003180 break;
3181 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00003182 setFeatureEnabledImpl(Features, "sse4.1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003183 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003184 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003185 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003186 case CK_Cannonlake:
3187 setFeatureEnabledImpl(Features, "avx512ifma", true);
3188 setFeatureEnabledImpl(Features, "avx512vbmi", true);
3189 setFeatureEnabledImpl(Features, "sha", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003190 LLVM_FALLTHROUGH;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003191 case CK_SkylakeServer:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003192 setFeatureEnabledImpl(Features, "avx512f", true);
3193 setFeatureEnabledImpl(Features, "avx512cd", true);
3194 setFeatureEnabledImpl(Features, "avx512dq", true);
3195 setFeatureEnabledImpl(Features, "avx512bw", true);
3196 setFeatureEnabledImpl(Features, "avx512vl", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003197 setFeatureEnabledImpl(Features, "pku", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003198 setFeatureEnabledImpl(Features, "clwb", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003199 LLVM_FALLTHROUGH;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003200 case CK_SkylakeClient:
Craig Topperda9fe562015-10-15 05:23:38 +00003201 setFeatureEnabledImpl(Features, "xsavec", true);
3202 setFeatureEnabledImpl(Features, "xsaves", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003203 setFeatureEnabledImpl(Features, "mpx", true);
3204 setFeatureEnabledImpl(Features, "sgx", true);
3205 setFeatureEnabledImpl(Features, "clflushopt", true);
Eric Christopherfc6ffed2017-03-28 23:03:19 +00003206 setFeatureEnabledImpl(Features, "rtm", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003207 LLVM_FALLTHROUGH;
Craig Topperdb4dc082014-11-06 05:52:19 +00003208 case CK_Broadwell:
3209 setFeatureEnabledImpl(Features, "rdseed", true);
3210 setFeatureEnabledImpl(Features, "adx", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003211 LLVM_FALLTHROUGH;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003212 case CK_Haswell:
Craig Topperdb4dc082014-11-06 05:52:19 +00003213 setFeatureEnabledImpl(Features, "avx2", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003214 setFeatureEnabledImpl(Features, "lzcnt", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003215 setFeatureEnabledImpl(Features, "bmi", true);
3216 setFeatureEnabledImpl(Features, "bmi2", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003217 setFeatureEnabledImpl(Features, "fma", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003218 setFeatureEnabledImpl(Features, "movbe", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003219 LLVM_FALLTHROUGH;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003220 case CK_IvyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00003221 setFeatureEnabledImpl(Features, "rdrnd", true);
3222 setFeatureEnabledImpl(Features, "f16c", true);
3223 setFeatureEnabledImpl(Features, "fsgsbase", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003224 LLVM_FALLTHROUGH;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003225 case CK_SandyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00003226 setFeatureEnabledImpl(Features, "avx", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003227 setFeatureEnabledImpl(Features, "xsave", true);
3228 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003229 LLVM_FALLTHROUGH;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003230 case CK_Westmere:
Craig Topperdb4dc082014-11-06 05:52:19 +00003231 case CK_Silvermont:
3232 setFeatureEnabledImpl(Features, "aes", true);
3233 setFeatureEnabledImpl(Features, "pclmul", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003234 LLVM_FALLTHROUGH;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003235 case CK_Nehalem:
Craig Topperdb4dc082014-11-06 05:52:19 +00003236 setFeatureEnabledImpl(Features, "sse4.2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003237 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00003238 setFeatureEnabledImpl(Features, "cx16", true);
3239 break;
3240 case CK_KNL:
3241 setFeatureEnabledImpl(Features, "avx512f", true);
3242 setFeatureEnabledImpl(Features, "avx512cd", true);
3243 setFeatureEnabledImpl(Features, "avx512er", true);
3244 setFeatureEnabledImpl(Features, "avx512pf", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003245 setFeatureEnabledImpl(Features, "prefetchwt1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003246 setFeatureEnabledImpl(Features, "fxsr", true);
Robert Khasanov50e6f582014-09-19 09:53:48 +00003247 setFeatureEnabledImpl(Features, "rdseed", true);
3248 setFeatureEnabledImpl(Features, "adx", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00003249 setFeatureEnabledImpl(Features, "lzcnt", true);
3250 setFeatureEnabledImpl(Features, "bmi", true);
3251 setFeatureEnabledImpl(Features, "bmi2", true);
3252 setFeatureEnabledImpl(Features, "rtm", true);
3253 setFeatureEnabledImpl(Features, "fma", true);
3254 setFeatureEnabledImpl(Features, "rdrnd", true);
3255 setFeatureEnabledImpl(Features, "f16c", true);
3256 setFeatureEnabledImpl(Features, "fsgsbase", true);
3257 setFeatureEnabledImpl(Features, "aes", true);
3258 setFeatureEnabledImpl(Features, "pclmul", true);
3259 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003260 setFeatureEnabledImpl(Features, "xsaveopt", true);
3261 setFeatureEnabledImpl(Features, "xsave", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003262 setFeatureEnabledImpl(Features, "movbe", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003263 break;
3264 case CK_K6_2:
3265 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00003266 case CK_WinChip2:
3267 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00003268 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003269 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00003270 case CK_Athlon:
3271 case CK_AthlonThunderbird:
3272 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00003273 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00003274 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003275 case CK_Athlon4:
3276 case CK_AthlonXP:
3277 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00003278 setFeatureEnabledImpl(Features, "sse", 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;
3282 case CK_K8:
3283 case CK_Opteron:
3284 case CK_Athlon64:
3285 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00003286 setFeatureEnabledImpl(Features, "sse2", true);
3287 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003288 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003289 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00003290 case CK_AMDFAM10:
3291 setFeatureEnabledImpl(Features, "sse4a", true);
3292 setFeatureEnabledImpl(Features, "lzcnt", true);
3293 setFeatureEnabledImpl(Features, "popcnt", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003294 LLVM_FALLTHROUGH;
Chandler Carruth212334f2011-09-28 08:55:37 +00003295 case CK_K8SSE3:
3296 case CK_OpteronSSE3:
3297 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00003298 setFeatureEnabledImpl(Features, "sse3", true);
3299 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003300 setFeatureEnabledImpl(Features, "fxsr", true);
Roman Divackyce253d82011-10-30 13:47:56 +00003301 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00003302 case CK_BTVER2:
3303 setFeatureEnabledImpl(Features, "avx", true);
3304 setFeatureEnabledImpl(Features, "aes", true);
3305 setFeatureEnabledImpl(Features, "pclmul", true);
3306 setFeatureEnabledImpl(Features, "bmi", true);
3307 setFeatureEnabledImpl(Features, "f16c", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003308 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003309 LLVM_FALLTHROUGH;
Benjamin Kramer569f2152012-01-10 11:50:18 +00003310 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00003311 setFeatureEnabledImpl(Features, "ssse3", true);
3312 setFeatureEnabledImpl(Features, "sse4a", true);
3313 setFeatureEnabledImpl(Features, "lzcnt", true);
3314 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00003315 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003316 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003317 setFeatureEnabledImpl(Features, "fxsr", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003318 break;
Craig Topperc45744a2017-01-10 06:02:12 +00003319 case CK_ZNVER1:
3320 setFeatureEnabledImpl(Features, "adx", true);
3321 setFeatureEnabledImpl(Features, "aes", true);
3322 setFeatureEnabledImpl(Features, "avx2", true);
3323 setFeatureEnabledImpl(Features, "bmi", true);
3324 setFeatureEnabledImpl(Features, "bmi2", true);
3325 setFeatureEnabledImpl(Features, "clflushopt", true);
Craig Topper45742262017-02-09 06:10:14 +00003326 setFeatureEnabledImpl(Features, "clzero", true);
Craig Topperc45744a2017-01-10 06:02:12 +00003327 setFeatureEnabledImpl(Features, "cx16", true);
3328 setFeatureEnabledImpl(Features, "f16c", true);
3329 setFeatureEnabledImpl(Features, "fma", true);
3330 setFeatureEnabledImpl(Features, "fsgsbase", true);
3331 setFeatureEnabledImpl(Features, "fxsr", true);
3332 setFeatureEnabledImpl(Features, "lzcnt", true);
3333 setFeatureEnabledImpl(Features, "mwaitx", true);
3334 setFeatureEnabledImpl(Features, "movbe", true);
3335 setFeatureEnabledImpl(Features, "pclmul", true);
3336 setFeatureEnabledImpl(Features, "popcnt", true);
3337 setFeatureEnabledImpl(Features, "prfchw", true);
3338 setFeatureEnabledImpl(Features, "rdrnd", true);
3339 setFeatureEnabledImpl(Features, "rdseed", true);
3340 setFeatureEnabledImpl(Features, "sha", true);
3341 setFeatureEnabledImpl(Features, "sse4a", true);
3342 setFeatureEnabledImpl(Features, "xsave", true);
3343 setFeatureEnabledImpl(Features, "xsavec", true);
3344 setFeatureEnabledImpl(Features, "xsaveopt", true);
3345 setFeatureEnabledImpl(Features, "xsaves", true);
3346 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003347 case CK_BDVER4:
3348 setFeatureEnabledImpl(Features, "avx2", true);
3349 setFeatureEnabledImpl(Features, "bmi2", true);
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003350 setFeatureEnabledImpl(Features, "mwaitx", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003351 LLVM_FALLTHROUGH;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003352 case CK_BDVER3:
Craig Topper8c7f2512014-11-03 06:51:41 +00003353 setFeatureEnabledImpl(Features, "fsgsbase", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003354 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003355 LLVM_FALLTHROUGH;
Craig Topper8c7f2512014-11-03 06:51:41 +00003356 case CK_BDVER2:
Andrea Di Biagio9760a442014-11-06 12:08:57 +00003357 setFeatureEnabledImpl(Features, "bmi", true);
3358 setFeatureEnabledImpl(Features, "fma", true);
3359 setFeatureEnabledImpl(Features, "f16c", true);
3360 setFeatureEnabledImpl(Features, "tbm", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003361 LLVM_FALLTHROUGH;
Andrea Di Biagio9760a442014-11-06 12:08:57 +00003362 case CK_BDVER1:
3363 // xop implies avx, sse4a and fma4.
Craig Topper86d79ef2013-09-17 04:51:29 +00003364 setFeatureEnabledImpl(Features, "xop", true);
3365 setFeatureEnabledImpl(Features, "lzcnt", true);
3366 setFeatureEnabledImpl(Features, "aes", true);
3367 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00003368 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003369 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003370 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003371 setFeatureEnabledImpl(Features, "xsave", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003372 break;
Eli Friedman33465822011-07-08 23:31:17 +00003373 }
Eric Christopherbbd746d2015-10-08 20:10:14 +00003374 if (!TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec))
3375 return false;
3376
3377 // Can't do this earlier because we need to be able to explicitly enable
3378 // or disable these features and the things that they depend upon.
3379
3380 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
3381 auto I = Features.find("sse4.2");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003382 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00003383 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-popcnt") ==
3384 FeaturesVec.end())
3385 Features["popcnt"] = true;
3386
3387 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
3388 I = Features.find("3dnow");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003389 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00003390 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-prfchw") ==
3391 FeaturesVec.end())
3392 Features["prfchw"] = true;
3393
Eric Christophera7260af2015-10-08 20:10:18 +00003394 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
3395 // then enable MMX.
3396 I = Features.find("sse");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003397 if (I != Features.end() && I->getValue() &&
Eric Christophera7260af2015-10-08 20:10:18 +00003398 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-mmx") ==
3399 FeaturesVec.end())
3400 Features["mmx"] = true;
3401
Eric Christopherbbd746d2015-10-08 20:10:14 +00003402 return true;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003403}
3404
Rafael Espindolae62e2792013-08-20 13:44:29 +00003405void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00003406 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003407 if (Enabled) {
3408 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003409 case AVX512F:
3410 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003411 case AVX2:
3412 Features["avx2"] = true;
3413 case AVX:
3414 Features["avx"] = true;
Craig Topperda9fe562015-10-15 05:23:38 +00003415 Features["xsave"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003416 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00003417 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003418 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00003419 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003420 case SSSE3:
3421 Features["ssse3"] = true;
3422 case SSE3:
3423 Features["sse3"] = true;
3424 case SSE2:
3425 Features["sse2"] = true;
3426 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00003427 Features["sse"] = true;
3428 case NoSSE:
3429 break;
3430 }
3431 return;
3432 }
3433
3434 switch (Level) {
3435 case NoSSE:
3436 case SSE1:
3437 Features["sse"] = false;
3438 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00003439 Features["sse2"] = Features["pclmul"] = Features["aes"] =
3440 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003441 case SSE3:
3442 Features["sse3"] = false;
3443 setXOPLevel(Features, NoXOP, false);
3444 case SSSE3:
3445 Features["ssse3"] = false;
3446 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00003447 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003448 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00003449 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003450 case AVX:
Craig Topperda9fe562015-10-15 05:23:38 +00003451 Features["fma"] = Features["avx"] = Features["f16c"] = Features["xsave"] =
3452 Features["xsaveopt"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00003453 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003454 case AVX2:
3455 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00003456 case AVX512F:
Eric Christopher917e9522014-11-18 22:36:15 +00003457 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
Craig Toppera31a5da2014-12-27 06:59:37 +00003458 Features["avx512pf"] = Features["avx512dq"] = Features["avx512bw"] =
Craig Topperb4f83a02016-02-29 06:51:38 +00003459 Features["avx512vl"] = Features["avx512vbmi"] =
3460 Features["avx512ifma"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003461 }
3462}
3463
3464void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00003465 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003466 if (Enabled) {
3467 switch (Level) {
3468 case AMD3DNowAthlon:
3469 Features["3dnowa"] = true;
3470 case AMD3DNow:
3471 Features["3dnow"] = true;
3472 case MMX:
3473 Features["mmx"] = true;
3474 case NoMMX3DNow:
3475 break;
3476 }
3477 return;
3478 }
3479
3480 switch (Level) {
3481 case NoMMX3DNow:
3482 case MMX:
3483 Features["mmx"] = false;
3484 case AMD3DNow:
3485 Features["3dnow"] = false;
3486 case AMD3DNowAthlon:
3487 Features["3dnowa"] = false;
3488 }
3489}
3490
3491void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00003492 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003493 if (Enabled) {
3494 switch (Level) {
3495 case XOP:
3496 Features["xop"] = true;
3497 case FMA4:
3498 Features["fma4"] = true;
3499 setSSELevel(Features, AVX, true);
3500 case SSE4A:
3501 Features["sse4a"] = true;
3502 setSSELevel(Features, SSE3, true);
3503 case NoXOP:
3504 break;
3505 }
3506 return;
3507 }
3508
3509 switch (Level) {
3510 case NoXOP:
3511 case SSE4A:
3512 Features["sse4a"] = false;
3513 case FMA4:
3514 Features["fma4"] = false;
3515 case XOP:
3516 Features["xop"] = false;
3517 }
3518}
3519
Craig Topper86d79ef2013-09-17 04:51:29 +00003520void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
3521 StringRef Name, bool Enabled) {
Eric Christopher298ac302015-07-01 00:08:32 +00003522 // This is a bit of a hack to deal with the sse4 target feature when used
3523 // as part of the target attribute. We handle sse4 correctly everywhere
3524 // else. See below for more information on how we handle the sse4 options.
3525 if (Name != "sse4")
3526 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00003527
Craig Topper29561122013-09-19 01:13:07 +00003528 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003529 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003530 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003531 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003532 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003533 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003534 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003535 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003536 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003537 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003538 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003539 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003540 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003541 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003542 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003543 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003544 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003545 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003546 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003547 if (Enabled)
3548 setSSELevel(Features, SSE2, Enabled);
3549 } else if (Name == "pclmul") {
3550 if (Enabled)
3551 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003552 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003553 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003554 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003555 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003556 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003557 setSSELevel(Features, AVX512F, Enabled);
Craig Topperb4f83a02016-02-29 06:51:38 +00003558 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf" ||
3559 Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl" ||
3560 Name == "avx512vbmi" || Name == "avx512ifma") {
Craig Topper679b53a2013-08-21 05:29:10 +00003561 if (Enabled)
3562 setSSELevel(Features, AVX512F, Enabled);
Craig Topper6c7ecc52016-11-09 04:51:03 +00003563 // Enable BWI instruction if VBMI is being enabled.
3564 if (Name == "avx512vbmi" && Enabled)
3565 Features["avx512bw"] = true;
3566 // Also disable VBMI if BWI is being disabled.
3567 if (Name == "avx512bw" && !Enabled)
3568 Features["avx512vbmi"] = false;
Craig Topper679b53a2013-08-21 05:29:10 +00003569 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003570 if (Enabled)
3571 setSSELevel(Features, AVX, Enabled);
3572 } else if (Name == "fma4") {
3573 setXOPLevel(Features, FMA4, Enabled);
3574 } else if (Name == "xop") {
3575 setXOPLevel(Features, XOP, Enabled);
3576 } else if (Name == "sse4a") {
3577 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00003578 } else if (Name == "f16c") {
3579 if (Enabled)
3580 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00003581 } else if (Name == "sha") {
3582 if (Enabled)
3583 setSSELevel(Features, SSE2, Enabled);
Eric Christopher298ac302015-07-01 00:08:32 +00003584 } else if (Name == "sse4") {
3585 // We can get here via the __target__ attribute since that's not controlled
3586 // via the -msse4/-mno-sse4 command line alias. Handle this the same way
3587 // here - turn on the sse4.2 if enabled, turn off the sse4.1 level if
3588 // disabled.
3589 if (Enabled)
3590 setSSELevel(Features, SSE42, Enabled);
3591 else
3592 setSSELevel(Features, SSE41, Enabled);
Craig Topperda9fe562015-10-15 05:23:38 +00003593 } else if (Name == "xsave") {
Craig Topper840927e2016-02-29 06:51:34 +00003594 if (!Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003595 Features["xsaveopt"] = false;
3596 } else if (Name == "xsaveopt" || Name == "xsavec" || Name == "xsaves") {
Craig Topper840927e2016-02-29 06:51:34 +00003597 if (Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003598 Features["xsave"] = true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003599 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003600}
3601
Eric Christopher3ff21b32013-10-16 21:26:26 +00003602/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003603/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00003604bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00003605 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00003606 for (const auto &Feature : Features) {
3607 if (Feature[0] != '+')
Daniel Dunbar979586e2009-11-11 09:38:56 +00003608 continue;
3609
Eric Christopher610fe112015-08-26 08:21:55 +00003610 if (Feature == "+aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00003611 HasAES = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003612 } else if (Feature == "+pclmul") {
Craig Topper3f122a72012-05-31 05:18:48 +00003613 HasPCLMUL = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003614 } else if (Feature == "+lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00003615 HasLZCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003616 } else if (Feature == "+rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00003617 HasRDRND = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003618 } else if (Feature == "+fsgsbase") {
Craig Topper8c7f2512014-11-03 06:51:41 +00003619 HasFSGSBASE = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003620 } else if (Feature == "+bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00003621 HasBMI = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003622 } else if (Feature == "+bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00003623 HasBMI2 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003624 } else if (Feature == "+popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00003625 HasPOPCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003626 } else if (Feature == "+rtm") {
Michael Liao625a8752012-11-10 05:17:46 +00003627 HasRTM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003628 } else if (Feature == "+prfchw") {
Michael Liao74f4eaf2013-03-26 17:52:08 +00003629 HasPRFCHW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003630 } else if (Feature == "+rdseed") {
Michael Liaoffaae352013-03-29 05:17:55 +00003631 HasRDSEED = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003632 } else if (Feature == "+adx") {
Robert Khasanov50e6f582014-09-19 09:53:48 +00003633 HasADX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003634 } else if (Feature == "+tbm") {
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003635 HasTBM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003636 } else if (Feature == "+fma") {
Craig Topperbba778b2012-06-03 21:46:30 +00003637 HasFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003638 } else if (Feature == "+f16c") {
Manman Rena45358c2012-10-11 00:59:55 +00003639 HasF16C = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003640 } else if (Feature == "+avx512cd") {
Craig Topper679b53a2013-08-21 05:29:10 +00003641 HasAVX512CD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003642 } else if (Feature == "+avx512er") {
Craig Topper679b53a2013-08-21 05:29:10 +00003643 HasAVX512ER = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003644 } else if (Feature == "+avx512pf") {
Craig Topper679b53a2013-08-21 05:29:10 +00003645 HasAVX512PF = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003646 } else if (Feature == "+avx512dq") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003647 HasAVX512DQ = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003648 } else if (Feature == "+avx512bw") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003649 HasAVX512BW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003650 } else if (Feature == "+avx512vl") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003651 HasAVX512VL = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003652 } else if (Feature == "+avx512vbmi") {
3653 HasAVX512VBMI = true;
3654 } else if (Feature == "+avx512ifma") {
3655 HasAVX512IFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003656 } else if (Feature == "+sha") {
Ben Langmuir58078d02013-09-19 13:22:04 +00003657 HasSHA = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003658 } else if (Feature == "+mpx") {
3659 HasMPX = true;
3660 } else if (Feature == "+movbe") {
3661 HasMOVBE = true;
3662 } else if (Feature == "+sgx") {
3663 HasSGX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003664 } else if (Feature == "+cx16") {
Nick Lewycky50e8f482013-10-05 20:14:27 +00003665 HasCX16 = true;
Craig Toppere33f51f2015-10-16 06:22:36 +00003666 } else if (Feature == "+fxsr") {
3667 HasFXSR = true;
Craig Topperda9fe562015-10-15 05:23:38 +00003668 } else if (Feature == "+xsave") {
3669 HasXSAVE = true;
3670 } else if (Feature == "+xsaveopt") {
3671 HasXSAVEOPT = true;
3672 } else if (Feature == "+xsavec") {
3673 HasXSAVEC = true;
3674 } else if (Feature == "+xsaves") {
3675 HasXSAVES = true;
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003676 } else if (Feature == "+mwaitx") {
3677 HasMWAITX = true;
Asaf Badouha9d1e182015-12-31 14:14:07 +00003678 } else if (Feature == "+pku") {
3679 HasPKU = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003680 } else if (Feature == "+clflushopt") {
3681 HasCLFLUSHOPT = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003682 } else if (Feature == "+clwb") {
3683 HasCLWB = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003684 } else if (Feature == "+prefetchwt1") {
3685 HasPREFETCHWT1 = true;
Craig Topper45742262017-02-09 06:10:14 +00003686 } else if (Feature == "+clzero") {
3687 HasCLZERO = true;
Nick Lewycky50e8f482013-10-05 20:14:27 +00003688 }
3689
Benjamin Kramer27402c62012-03-05 15:10:44 +00003690 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003691 .Case("+avx512f", AVX512F)
3692 .Case("+avx2", AVX2)
3693 .Case("+avx", AVX)
3694 .Case("+sse4.2", SSE42)
3695 .Case("+sse4.1", SSE41)
3696 .Case("+ssse3", SSSE3)
3697 .Case("+sse3", SSE3)
3698 .Case("+sse2", SSE2)
3699 .Case("+sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00003700 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003701 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003702
Eli Friedman33465822011-07-08 23:31:17 +00003703 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00003704 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003705 .Case("+3dnowa", AMD3DNowAthlon)
3706 .Case("+3dnow", AMD3DNow)
3707 .Case("+mmx", MMX)
Eli Friedman33465822011-07-08 23:31:17 +00003708 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00003709 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003710
3711 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003712 .Case("+xop", XOP)
3713 .Case("+fma4", FMA4)
3714 .Case("+sse4a", SSE4A)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003715 .Default(NoXOP);
3716 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003717 }
Eli Friedman33465822011-07-08 23:31:17 +00003718
Rafael Espindolaeb265472013-08-21 21:59:03 +00003719 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
3720 // matches the selected sse level.
Craig Topperd945d502015-10-20 00:00:17 +00003721 if ((FPMath == FP_SSE && SSELevel < SSE1) ||
3722 (FPMath == FP_387 && SSELevel >= SSE1)) {
3723 Diags.Report(diag::err_target_unsupported_fpmath) <<
3724 (FPMath == FP_SSE ? "sse" : "387");
Rafael Espindolaeb265472013-08-21 21:59:03 +00003725 return false;
3726 }
3727
Alexey Bataev00396512015-07-02 03:40:19 +00003728 SimdDefaultAlign =
Ahmed Bougacha68bf64e2015-08-27 22:24:56 +00003729 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Rafael Espindolaeb265472013-08-21 21:59:03 +00003730 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00003731}
Chris Lattnerecd49032009-03-02 22:27:17 +00003732
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003733/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
3734/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00003735void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003736 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00003737 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00003738 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003739 Builder.defineMacro("__amd64__");
3740 Builder.defineMacro("__amd64");
3741 Builder.defineMacro("__x86_64");
3742 Builder.defineMacro("__x86_64__");
Bob Wilsona2acb1e2014-08-08 23:46:28 +00003743 if (getTriple().getArchName() == "x86_64h") {
3744 Builder.defineMacro("__x86_64h");
3745 Builder.defineMacro("__x86_64h__");
3746 }
Chris Lattnerecd49032009-03-02 22:27:17 +00003747 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003748 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00003749 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003750
Chris Lattnerecd49032009-03-02 22:27:17 +00003751 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003752 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
3753 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00003754 switch (CPU) {
3755 case CK_Generic:
3756 break;
3757 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003758 // The rest are coming from the i386 define above.
3759 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003760 break;
3761 case CK_i486:
3762 case CK_WinChipC6:
3763 case CK_WinChip2:
3764 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003765 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00003766 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003767 case CK_PentiumMMX:
3768 Builder.defineMacro("__pentium_mmx__");
3769 Builder.defineMacro("__tune_pentium_mmx__");
3770 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003771 case CK_i586:
3772 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003773 defineCPUMacros(Builder, "i586");
3774 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00003775 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003776 case CK_Pentium3:
3777 case CK_Pentium3M:
3778 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003779 Builder.defineMacro("__tune_pentium3__");
3780 // Fallthrough
3781 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00003782 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003783 Builder.defineMacro("__tune_pentium2__");
3784 // Fallthrough
3785 case CK_PentiumPro:
3786 Builder.defineMacro("__tune_i686__");
3787 Builder.defineMacro("__tune_pentiumpro__");
3788 // Fallthrough
3789 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003790 Builder.defineMacro("__i686");
3791 Builder.defineMacro("__i686__");
3792 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
3793 Builder.defineMacro("__pentiumpro");
3794 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003795 break;
3796 case CK_Pentium4:
3797 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003798 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00003799 break;
3800 case CK_Yonah:
3801 case CK_Prescott:
3802 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003803 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00003804 break;
3805 case CK_Core2:
3806 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003807 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00003808 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003809 case CK_Bonnell:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003810 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00003811 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00003812 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00003813 defineCPUMacros(Builder, "slm");
3814 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003815 case CK_Nehalem:
3816 case CK_Westmere:
3817 case CK_SandyBridge:
3818 case CK_IvyBridge:
3819 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00003820 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003821 case CK_SkylakeClient:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003822 // FIXME: Historically, we defined this legacy name, it would be nice to
3823 // remove it at some point. We've never exposed fine-grained names for
3824 // recent primary x86 CPUs, and we should keep it that way.
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003825 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00003826 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003827 case CK_SkylakeServer:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003828 defineCPUMacros(Builder, "skx");
3829 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003830 case CK_Cannonlake:
3831 break;
Craig Topper449314e2013-08-20 07:09:39 +00003832 case CK_KNL:
3833 defineCPUMacros(Builder, "knl");
3834 break;
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003835 case CK_Lakemont:
3836 Builder.defineMacro("__tune_lakemont__");
3837 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003838 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003839 Builder.defineMacro("__k6_2__");
3840 Builder.defineMacro("__tune_k6_2__");
3841 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003842 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003843 if (CPU != CK_K6_2) { // In case of fallthrough
3844 // FIXME: GCC may be enabling these in cases where some other k6
3845 // architecture is specified but -m3dnow is explicitly provided. The
3846 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003847 Builder.defineMacro("__k6_3__");
3848 Builder.defineMacro("__tune_k6_3__");
3849 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003850 // Fallthrough
3851 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003852 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00003853 break;
3854 case CK_Athlon:
3855 case CK_AthlonThunderbird:
3856 case CK_Athlon4:
3857 case CK_AthlonXP:
3858 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003859 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003860 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003861 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003862 Builder.defineMacro("__tune_athlon_sse__");
3863 }
Chandler Carruth212334f2011-09-28 08:55:37 +00003864 break;
3865 case CK_K8:
3866 case CK_K8SSE3:
3867 case CK_x86_64:
3868 case CK_Opteron:
3869 case CK_OpteronSSE3:
3870 case CK_Athlon64:
3871 case CK_Athlon64SSE3:
3872 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003873 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00003874 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00003875 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003876 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00003877 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00003878 case CK_BTVER1:
3879 defineCPUMacros(Builder, "btver1");
3880 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003881 case CK_BTVER2:
3882 defineCPUMacros(Builder, "btver2");
3883 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003884 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003885 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003886 break;
3887 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003888 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003889 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003890 case CK_BDVER3:
3891 defineCPUMacros(Builder, "bdver3");
3892 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003893 case CK_BDVER4:
3894 defineCPUMacros(Builder, "bdver4");
3895 break;
Craig Topperc45744a2017-01-10 06:02:12 +00003896 case CK_ZNVER1:
3897 defineCPUMacros(Builder, "znver1");
3898 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003899 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003900 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00003901 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003902 }
Chris Lattner96e43572009-03-02 22:40:39 +00003903
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003904 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003905 Builder.defineMacro("__REGISTER_PREFIX__", "");
3906
Chris Lattner6df41af2009-04-19 17:32:33 +00003907 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
3908 // functions in glibc header files that use FP Stack inline asm which the
3909 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003910 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003911
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003912 if (HasAES)
3913 Builder.defineMacro("__AES__");
3914
Craig Topper3f122a72012-05-31 05:18:48 +00003915 if (HasPCLMUL)
3916 Builder.defineMacro("__PCLMUL__");
3917
Craig Topper22967d42011-12-25 05:06:45 +00003918 if (HasLZCNT)
3919 Builder.defineMacro("__LZCNT__");
3920
Benjamin Kramer1e250392012-07-07 09:39:18 +00003921 if (HasRDRND)
3922 Builder.defineMacro("__RDRND__");
3923
Craig Topper8c7f2512014-11-03 06:51:41 +00003924 if (HasFSGSBASE)
3925 Builder.defineMacro("__FSGSBASE__");
3926
Craig Topper22967d42011-12-25 05:06:45 +00003927 if (HasBMI)
3928 Builder.defineMacro("__BMI__");
3929
3930 if (HasBMI2)
3931 Builder.defineMacro("__BMI2__");
3932
Craig Topper1de83482011-12-29 16:10:46 +00003933 if (HasPOPCNT)
3934 Builder.defineMacro("__POPCNT__");
3935
Michael Liao625a8752012-11-10 05:17:46 +00003936 if (HasRTM)
3937 Builder.defineMacro("__RTM__");
3938
Michael Liao74f4eaf2013-03-26 17:52:08 +00003939 if (HasPRFCHW)
3940 Builder.defineMacro("__PRFCHW__");
3941
Michael Liaoffaae352013-03-29 05:17:55 +00003942 if (HasRDSEED)
3943 Builder.defineMacro("__RDSEED__");
3944
Robert Khasanov50e6f582014-09-19 09:53:48 +00003945 if (HasADX)
3946 Builder.defineMacro("__ADX__");
3947
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003948 if (HasTBM)
3949 Builder.defineMacro("__TBM__");
3950
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003951 if (HasMWAITX)
3952 Builder.defineMacro("__MWAITX__");
3953
Rafael Espindolae62e2792013-08-20 13:44:29 +00003954 switch (XOPLevel) {
3955 case XOP:
3956 Builder.defineMacro("__XOP__");
3957 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00003958 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00003959 case SSE4A:
3960 Builder.defineMacro("__SSE4A__");
3961 case NoXOP:
3962 break;
3963 }
Craig Topperffdb46c2011-12-30 07:33:42 +00003964
Craig Topperbba778b2012-06-03 21:46:30 +00003965 if (HasFMA)
3966 Builder.defineMacro("__FMA__");
3967
Manman Rena45358c2012-10-11 00:59:55 +00003968 if (HasF16C)
3969 Builder.defineMacro("__F16C__");
3970
Craig Topper679b53a2013-08-21 05:29:10 +00003971 if (HasAVX512CD)
3972 Builder.defineMacro("__AVX512CD__");
3973 if (HasAVX512ER)
3974 Builder.defineMacro("__AVX512ER__");
3975 if (HasAVX512PF)
3976 Builder.defineMacro("__AVX512PF__");
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003977 if (HasAVX512DQ)
3978 Builder.defineMacro("__AVX512DQ__");
3979 if (HasAVX512BW)
3980 Builder.defineMacro("__AVX512BW__");
3981 if (HasAVX512VL)
3982 Builder.defineMacro("__AVX512VL__");
Craig Topperb4f83a02016-02-29 06:51:38 +00003983 if (HasAVX512VBMI)
3984 Builder.defineMacro("__AVX512VBMI__");
3985 if (HasAVX512IFMA)
3986 Builder.defineMacro("__AVX512IFMA__");
Craig Topper679b53a2013-08-21 05:29:10 +00003987
Ben Langmuir58078d02013-09-19 13:22:04 +00003988 if (HasSHA)
3989 Builder.defineMacro("__SHA__");
3990
Craig Toppere33f51f2015-10-16 06:22:36 +00003991 if (HasFXSR)
3992 Builder.defineMacro("__FXSR__");
Craig Topperda9fe562015-10-15 05:23:38 +00003993 if (HasXSAVE)
3994 Builder.defineMacro("__XSAVE__");
3995 if (HasXSAVEOPT)
3996 Builder.defineMacro("__XSAVEOPT__");
3997 if (HasXSAVEC)
3998 Builder.defineMacro("__XSAVEC__");
3999 if (HasXSAVES)
4000 Builder.defineMacro("__XSAVES__");
Asaf Badouha9d1e182015-12-31 14:14:07 +00004001 if (HasPKU)
4002 Builder.defineMacro("__PKU__");
Nick Lewycky50e8f482013-10-05 20:14:27 +00004003 if (HasCX16)
4004 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
Craig Topper78b47872017-02-08 06:48:58 +00004005 if (HasCLFLUSHOPT)
4006 Builder.defineMacro("__CLFLUSHOPT__");
Craig Topper8c708cf2017-02-08 07:36:58 +00004007 if (HasCLWB)
4008 Builder.defineMacro("__CLWB__");
Craig Topperb16cb822017-02-08 07:56:42 +00004009 if (HasMPX)
4010 Builder.defineMacro("__MPX__");
Craig Topper204ecff2017-02-08 08:23:17 +00004011 if (HasSGX)
4012 Builder.defineMacro("__SGX__");
Craig Topperd2bf7b02017-02-08 08:23:40 +00004013 if (HasPREFETCHWT1)
4014 Builder.defineMacro("__PREFETCHWT1__");
Craig Topper45742262017-02-09 06:10:14 +00004015 if (HasCLZERO)
4016 Builder.defineMacro("__CLZERO__");
Nick Lewycky50e8f482013-10-05 20:14:27 +00004017
Chris Lattner96e43572009-03-02 22:40:39 +00004018 // Each case falls through to the previous one here.
4019 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00004020 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00004021 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00004022 case AVX2:
4023 Builder.defineMacro("__AVX2__");
4024 case AVX:
4025 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00004026 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004027 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00004028 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004029 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00004030 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004031 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00004032 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004033 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00004034 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004035 Builder.defineMacro("__SSE2__");
4036 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00004037 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004038 Builder.defineMacro("__SSE__");
4039 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00004040 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00004041 break;
4042 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004043
Derek Schuffc7dd7222012-10-11 15:52:22 +00004044 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004045 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00004046 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00004047 case AVX2:
4048 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004049 case SSE42:
4050 case SSE41:
4051 case SSSE3:
4052 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004053 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004054 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004055 break;
4056 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004057 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004058 break;
4059 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004060 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004061 }
4062 }
4063
Anders Carlssone437c682010-01-27 03:47:49 +00004064 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00004065 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00004066 case AMD3DNowAthlon:
4067 Builder.defineMacro("__3dNOW_A__");
4068 case AMD3DNow:
4069 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00004070 case MMX:
4071 Builder.defineMacro("__MMX__");
4072 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00004073 break;
4074 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00004075
4076 if (CPU >= CK_i486) {
4077 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
4078 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
4079 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
4080 }
4081 if (CPU >= CK_i586)
4082 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00004083}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004084
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004085bool X86TargetInfo::hasFeature(StringRef Feature) const {
4086 return llvm::StringSwitch<bool>(Feature)
4087 .Case("aes", HasAES)
4088 .Case("avx", SSELevel >= AVX)
4089 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00004090 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00004091 .Case("avx512cd", HasAVX512CD)
4092 .Case("avx512er", HasAVX512ER)
4093 .Case("avx512pf", HasAVX512PF)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00004094 .Case("avx512dq", HasAVX512DQ)
4095 .Case("avx512bw", HasAVX512BW)
4096 .Case("avx512vl", HasAVX512VL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00004097 .Case("avx512vbmi", HasAVX512VBMI)
4098 .Case("avx512ifma", HasAVX512IFMA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004099 .Case("bmi", HasBMI)
4100 .Case("bmi2", HasBMI2)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00004101 .Case("clflushopt", HasCLFLUSHOPT)
4102 .Case("clwb", HasCLWB)
Craig Topper45742262017-02-09 06:10:14 +00004103 .Case("clzero", HasCLZERO)
Nick Lewycky50e8f482013-10-05 20:14:27 +00004104 .Case("cx16", HasCX16)
4105 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00004106 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00004107 .Case("fma4", XOPLevel >= FMA4)
Craig Topper8c7f2512014-11-03 06:51:41 +00004108 .Case("fsgsbase", HasFSGSBASE)
Craig Toppere33f51f2015-10-16 06:22:36 +00004109 .Case("fxsr", HasFXSR)
Craig Topper8dbc5842014-11-03 07:05:26 +00004110 .Case("lzcnt", HasLZCNT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004111 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
4112 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
4113 .Case("mmx", MMX3DNowLevel >= MMX)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00004114 .Case("movbe", HasMOVBE)
4115 .Case("mpx", HasMPX)
Craig Topper3f122a72012-05-31 05:18:48 +00004116 .Case("pclmul", HasPCLMUL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00004117 .Case("pku", HasPKU)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004118 .Case("popcnt", HasPOPCNT)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00004119 .Case("prefetchwt1", HasPREFETCHWT1)
Michael Liao74f4eaf2013-03-26 17:52:08 +00004120 .Case("prfchw", HasPRFCHW)
Craig Topper8dbc5842014-11-03 07:05:26 +00004121 .Case("rdrnd", HasRDRND)
Michael Liaoffaae352013-03-29 05:17:55 +00004122 .Case("rdseed", HasRDSEED)
Craig Topper8dbc5842014-11-03 07:05:26 +00004123 .Case("rtm", HasRTM)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00004124 .Case("sgx", HasSGX)
Ben Langmuir58078d02013-09-19 13:22:04 +00004125 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004126 .Case("sse", SSELevel >= SSE1)
4127 .Case("sse2", SSELevel >= SSE2)
4128 .Case("sse3", SSELevel >= SSE3)
4129 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00004130 .Case("sse4.1", SSELevel >= SSE41)
4131 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00004132 .Case("sse4a", XOPLevel >= SSE4A)
Craig Topper8dbc5842014-11-03 07:05:26 +00004133 .Case("tbm", HasTBM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004134 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00004135 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
4136 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00004137 .Case("xop", XOPLevel >= XOP)
Craig Topperda9fe562015-10-15 05:23:38 +00004138 .Case("xsave", HasXSAVE)
4139 .Case("xsavec", HasXSAVEC)
4140 .Case("xsaves", HasXSAVES)
4141 .Case("xsaveopt", HasXSAVEOPT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004142 .Default(false);
4143}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004144
Eric Christopherd9832702015-06-29 21:00:05 +00004145// We can't use a generic validation scheme for the features accepted here
4146// versus subtarget features accepted in the target attribute because the
4147// bitfield structure that's initialized in the runtime only supports the
4148// below currently rather than the full range of subtarget features. (See
4149// X86TargetInfo::hasFeature for a somewhat comprehensive list).
4150bool X86TargetInfo::validateCpuSupports(StringRef FeatureStr) const {
4151 return llvm::StringSwitch<bool>(FeatureStr)
4152 .Case("cmov", true)
4153 .Case("mmx", true)
4154 .Case("popcnt", true)
4155 .Case("sse", true)
4156 .Case("sse2", true)
4157 .Case("sse3", true)
Benjamin Kramerf4c520d2016-05-20 15:21:08 +00004158 .Case("ssse3", true)
Eric Christopherd9832702015-06-29 21:00:05 +00004159 .Case("sse4.1", true)
4160 .Case("sse4.2", true)
4161 .Case("avx", true)
4162 .Case("avx2", true)
4163 .Case("sse4a", true)
4164 .Case("fma4", true)
4165 .Case("xop", true)
4166 .Case("fma", true)
4167 .Case("avx512f", true)
4168 .Case("bmi", true)
4169 .Case("bmi2", true)
Benjamin Kramerf4c520d2016-05-20 15:21:08 +00004170 .Case("aes", true)
4171 .Case("pclmul", true)
4172 .Case("avx512vl", true)
4173 .Case("avx512bw", true)
4174 .Case("avx512dq", true)
4175 .Case("avx512cd", true)
4176 .Case("avx512er", true)
4177 .Case("avx512pf", true)
4178 .Case("avx512vbmi", true)
4179 .Case("avx512ifma", true)
Eric Christopherd9832702015-06-29 21:00:05 +00004180 .Default(false);
4181}
4182
Eli Friedman3fd920a2008-08-20 02:34:37 +00004183bool
Anders Carlsson58436352009-02-28 17:11:49 +00004184X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00004185 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00004186 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004187 default: return false;
Alexey Bataev91e58602015-07-20 12:08:00 +00004188 // Constant constraints.
4189 case 'e': // 32-bit signed integer constant for use with sign-extending x86_64
4190 // instructions.
4191 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
4192 // x86_64 instructions.
4193 case 's':
4194 Info.setRequiresImmediate();
4195 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00004196 case 'I':
4197 Info.setRequiresImmediate(0, 31);
4198 return true;
4199 case 'J':
4200 Info.setRequiresImmediate(0, 63);
4201 return true;
4202 case 'K':
4203 Info.setRequiresImmediate(-128, 127);
4204 return true;
4205 case 'L':
Alexey Bataev91e58602015-07-20 12:08:00 +00004206 Info.setRequiresImmediate({ int(0xff), int(0xffff), int(0xffffffff) });
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00004207 return true;
4208 case 'M':
4209 Info.setRequiresImmediate(0, 3);
4210 return true;
4211 case 'N':
4212 Info.setRequiresImmediate(0, 255);
4213 return true;
4214 case 'O':
4215 Info.setRequiresImmediate(0, 127);
4216 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00004217 // Register constraints.
4218 case 'Y': // 'Y' is the first character for several 2-character constraints.
4219 // Shift the pointer to the second character of the constraint.
4220 Name++;
4221 switch (*Name) {
4222 default:
4223 return false;
4224 case '0': // First SSE register.
4225 case 't': // Any SSE register, when SSE2 is enabled.
4226 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
4227 case 'm': // Any MMX register, when inter-unit moves enabled.
Michael Zuckerman849a6a52016-10-31 17:23:52 +00004228 case 'k': // AVX512 arch mask registers: k1-k7.
Alexey Bataev91e58602015-07-20 12:08:00 +00004229 Info.setAllowsRegister();
4230 return true;
4231 }
4232 case 'f': // Any x87 floating point stack register.
Akira Hatanaka88ef7282014-07-18 23:30:30 +00004233 // Constraint 'f' cannot be used for output operands.
4234 if (Info.ConstraintStr[0] == '=')
4235 return false;
Akira Hatanaka88ef7282014-07-18 23:30:30 +00004236 Info.setAllowsRegister();
4237 return true;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004238 case 'a': // eax.
4239 case 'b': // ebx.
4240 case 'c': // ecx.
4241 case 'd': // edx.
4242 case 'S': // esi.
4243 case 'D': // edi.
4244 case 'A': // edx:eax.
Alexey Bataev91e58602015-07-20 12:08:00 +00004245 case 't': // Top of floating point stack.
4246 case 'u': // Second from top of floating point stack.
Eli Friedman3fd920a2008-08-20 02:34:37 +00004247 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00004248 case 'y': // Any MMX register.
Michael Zuckerman62f516f2016-11-01 13:16:44 +00004249 case 'v': // Any {X,Y,Z}MM register (Arch & context dependent)
Anders Carlsson5f7ee682008-10-06 19:17:39 +00004250 case 'x': // Any SSE register.
Michael Zuckerman849a6a52016-10-31 17:23:52 +00004251 case 'k': // Any AVX512 mask register (same as Yk, additionaly allows k0
4252 // for intermideate k reg operations).
Eli Friedman3fd920a2008-08-20 02:34:37 +00004253 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00004254 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
4255 case 'l': // "Index" registers: any general register that can be used as an
4256 // index in a base+index memory access.
4257 Info.setAllowsRegister();
4258 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00004259 // Floating point constant constraints.
Dale Johannesen46742a42010-08-24 22:33:12 +00004260 case 'C': // SSE floating point constant.
4261 case 'G': // x87 floating point constant.
Eli Friedman3fd920a2008-08-20 02:34:37 +00004262 return true;
4263 }
4264}
4265
Akira Hatanaka974131e2014-09-18 18:17:18 +00004266bool X86TargetInfo::validateOutputSize(StringRef Constraint,
4267 unsigned Size) const {
4268 // Strip off constraint modifiers.
4269 while (Constraint[0] == '=' ||
4270 Constraint[0] == '+' ||
4271 Constraint[0] == '&')
4272 Constraint = Constraint.substr(1);
4273
4274 return validateOperandSize(Constraint, Size);
4275}
4276
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004277bool X86TargetInfo::validateInputSize(StringRef Constraint,
4278 unsigned Size) const {
Akira Hatanaka974131e2014-09-18 18:17:18 +00004279 return validateOperandSize(Constraint, Size);
4280}
4281
4282bool X86TargetInfo::validateOperandSize(StringRef Constraint,
4283 unsigned Size) const {
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004284 switch (Constraint[0]) {
4285 default: break;
Michael Zuckerman849a6a52016-10-31 17:23:52 +00004286 case 'k':
4287 // Registers k0-k7 (AVX512) size limit is 64 bit.
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004288 case 'y':
4289 return Size <= 64;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004290 case 'f':
4291 case 't':
4292 case 'u':
4293 return Size <= 128;
Michael Zuckerman62f516f2016-11-01 13:16:44 +00004294 case 'v':
Hans Wennborg3c619a42014-09-18 20:24:04 +00004295 case 'x':
Alexey Bataev91e58602015-07-20 12:08:00 +00004296 if (SSELevel >= AVX512F)
4297 // 512-bit zmm registers can be used if target supports AVX512F.
4298 return Size <= 512U;
4299 else if (SSELevel >= AVX)
4300 // 256-bit ymm registers can be used if target supports AVX.
4301 return Size <= 256U;
4302 return Size <= 128U;
4303 case 'Y':
4304 // 'Y' is the first character for several 2-character constraints.
4305 switch (Constraint[1]) {
4306 default: break;
4307 case 'm':
4308 // 'Ym' is synonymous with 'y'.
Michael Zuckerman849a6a52016-10-31 17:23:52 +00004309 case 'k':
Alexey Bataev91e58602015-07-20 12:08:00 +00004310 return Size <= 64;
4311 case 'i':
4312 case 't':
4313 // 'Yi' and 'Yt' are synonymous with 'x' when SSE2 is enabled.
4314 if (SSELevel >= AVX512F)
4315 return Size <= 512U;
4316 else if (SSELevel >= AVX)
4317 return Size <= 256U;
4318 return SSELevel >= SSE2 && Size <= 128U;
4319 }
4320
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004321 }
4322
4323 return true;
4324}
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00004325
Eli Friedman3fd920a2008-08-20 02:34:37 +00004326std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004327X86TargetInfo::convertConstraint(const char *&Constraint) const {
4328 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004329 case 'a': return std::string("{ax}");
4330 case 'b': return std::string("{bx}");
4331 case 'c': return std::string("{cx}");
4332 case 'd': return std::string("{dx}");
4333 case 'S': return std::string("{si}");
4334 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00004335 case 'p': // address
4336 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00004337 case 't': // top of floating point stack.
4338 return std::string("{st}");
4339 case 'u': // second from top of floating point stack.
4340 return std::string("{st(1)}"); // second from top of floating point stack.
Michael Zuckerman849a6a52016-10-31 17:23:52 +00004341 case 'Y':
4342 switch (Constraint[1]) {
4343 default:
4344 // Break from inner switch and fall through (copy single char),
4345 // continue parsing after copying the current constraint into
4346 // the return string.
4347 break;
4348 case 'k':
4349 // "^" hints llvm that this is a 2 letter constraint.
4350 // "Constraint++" is used to promote the string iterator
4351 // to the next constraint.
4352 return std::string("^") + std::string(Constraint++, 2);
4353 }
4354 LLVM_FALLTHROUGH;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004355 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004356 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00004357 }
4358}
Chris Lattner5ba61f02006-10-14 07:39:34 +00004359
Eli Friedman3fd920a2008-08-20 02:34:37 +00004360// X86-32 generic target
4361class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00004362public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004363 X86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4364 : X86TargetInfo(Triple, Opts) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004365 DoubleAlign = LongLongAlign = 32;
4366 LongDoubleWidth = 96;
4367 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00004368 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00004369 resetDataLayout("e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128");
Eli Friedman32ca82a2009-03-29 20:31:09 +00004370 SizeType = UnsignedInt;
4371 PtrDiffType = SignedInt;
4372 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00004373 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00004374
4375 // Use fpret for all types.
4376 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
4377 (1 << TargetInfo::Double) |
4378 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004379
4380 // x86-32 has atomics up to 8 bytes
4381 // FIXME: Check that we actually have cmpxchg8b before setting
4382 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
4383 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004384 }
Craig Topper3164f332014-03-11 03:39:26 +00004385 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004386 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004387 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004388
Craig Topper3164f332014-03-11 03:39:26 +00004389 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00004390 if (RegNo == 0) return 0;
4391 if (RegNo == 1) return 2;
4392 return -1;
4393 }
Akira Hatanaka974131e2014-09-18 18:17:18 +00004394 bool validateOperandSize(StringRef Constraint,
4395 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00004396 switch (Constraint[0]) {
4397 default: break;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004398 case 'R':
4399 case 'q':
4400 case 'Q':
Bill Wendling887b4852012-11-12 06:42:51 +00004401 case 'a':
4402 case 'b':
4403 case 'c':
4404 case 'd':
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004405 case 'S':
4406 case 'D':
Bill Wendling3c7fed82012-11-12 18:52:32 +00004407 return Size <= 32;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004408 case 'A':
4409 return Size <= 64;
Bill Wendling887b4852012-11-12 06:42:51 +00004410 }
4411
Akira Hatanaka974131e2014-09-18 18:17:18 +00004412 return X86TargetInfo::validateOperandSize(Constraint, Size);
Bill Wendling887b4852012-11-12 06:42:51 +00004413 }
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00004414 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
4415 return llvm::makeArrayRef(BuiltinInfoX86, clang::X86::LastX86CommonBuiltin -
4416 Builtin::FirstTSBuiltin + 1);
4417 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004418};
Eli Friedman3fd920a2008-08-20 02:34:37 +00004419
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004420class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
4421public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004422 NetBSDI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4423 : NetBSDTargetInfo<X86_32TargetInfo>(Triple, Opts) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004424
Craig Topper3164f332014-03-11 03:39:26 +00004425 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00004426 unsigned Major, Minor, Micro;
4427 getTriple().getOSVersion(Major, Minor, Micro);
4428 // New NetBSD uses the default rounding mode.
4429 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
4430 return X86_32TargetInfo::getFloatEvalMethod();
4431 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004432 return 1;
4433 }
4434};
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004435
Eli Friedmane3aa4542009-07-05 18:47:56 +00004436class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
4437public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004438 OpenBSDI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4439 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00004440 SizeType = UnsignedLong;
4441 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004442 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00004443 }
4444};
Eli Friedmane3aa4542009-07-05 18:47:56 +00004445
Eli Friedman9fa28852012-08-08 23:57:20 +00004446class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
4447public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004448 BitrigI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4449 : BitrigTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman9fa28852012-08-08 23:57:20 +00004450 SizeType = UnsignedLong;
4451 IntPtrType = SignedLong;
4452 PtrDiffType = SignedLong;
4453 }
4454};
Eli Friedman9fa28852012-08-08 23:57:20 +00004455
Torok Edwinb2b37c62009-06-30 17:10:35 +00004456class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004457public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004458 DarwinI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4459 : DarwinTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004460 LongDoubleWidth = 128;
4461 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004462 SuitableAlign = 128;
Tim Northover5627d392015-10-30 16:30:45 +00004463 MaxVectorAlign = 256;
4464 // The watchOS simulator uses the builtin bool type for Objective-C.
4465 llvm::Triple T = llvm::Triple(Triple);
4466 if (T.isWatchOS())
4467 UseSignedCharForObjCBool = false;
Eli Friedman32ca82a2009-03-29 20:31:09 +00004468 SizeType = UnsignedLong;
4469 IntPtrType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00004470 resetDataLayout("e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128");
Daniel Dunbarbd606522010-05-27 00:35:16 +00004471 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00004472 }
4473
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004474 bool handleTargetFeatures(std::vector<std::string> &Features,
4475 DiagnosticsEngine &Diags) override {
4476 if (!DarwinTargetInfo<X86_32TargetInfo>::handleTargetFeatures(Features,
4477 Diags))
4478 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004479 // We now know the features we have: we can decide how to align vectors.
4480 MaxVectorAlign =
4481 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004482 return true;
4483 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004484};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004485
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004486// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004487class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004488public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004489 WindowsX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4490 : WindowsTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Chris Lattner46be2e12009-06-24 17:12:15 +00004491 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00004492 DoubleAlign = LongLongAlign = 64;
Reid Kleckner7510c092015-04-01 16:45:06 +00004493 bool IsWinCOFF =
4494 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
James Y Knightb214cbc2016-03-04 19:00:41 +00004495 resetDataLayout(IsWinCOFF
4496 ? "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
4497 : "e-m:e-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32");
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004498 }
Craig Topper3164f332014-03-11 03:39:26 +00004499 void getTargetDefines(const LangOptions &Opts,
4500 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004501 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
4502 }
4503};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004504
4505// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004506class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004507public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004508 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple,
4509 const TargetOptions &Opts)
4510 : WindowsX86_32TargetInfo(Triple, Opts) {
Eli Friedman015d6282011-03-22 21:25:11 +00004511 LongDoubleWidth = LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00004512 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004513 }
Craig Topper3164f332014-03-11 03:39:26 +00004514 void getTargetDefines(const LangOptions &Opts,
4515 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004516 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
4517 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
4518 // The value of the following reflects processor type.
4519 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
4520 // We lost the original triple, so we use the default.
4521 Builder.defineMacro("_M_IX86", "600");
4522 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004523};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004524
David Majnemerae1ed0e2015-05-28 04:36:18 +00004525static void addCygMingDefines(const LangOptions &Opts, MacroBuilder &Builder) {
Eric Christopherb093d692015-10-09 18:39:59 +00004526 // Mingw and cygwin define __declspec(a) to __attribute__((a)). Clang
4527 // supports __declspec natively under -fms-extensions, but we define a no-op
4528 // __declspec macro anyway for pre-processor compatibility.
Reid Kleckner47606832014-04-21 20:58:00 +00004529 if (Opts.MicrosoftExt)
4530 Builder.defineMacro("__declspec", "__declspec");
4531 else
4532 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
4533
4534 if (!Opts.MicrosoftExt) {
4535 // Provide macros for all the calling convention keywords. Provide both
4536 // single and double underscore prefixed variants. These are available on
4537 // x64 as well as x86, even though they have no effect.
4538 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
4539 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00004540 std::string GCCSpelling = "__attribute__((__";
4541 GCCSpelling += CC;
4542 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00004543 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
4544 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
4545 }
4546 }
4547}
4548
David Majnemerae1ed0e2015-05-28 04:36:18 +00004549static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
4550 Builder.defineMacro("__MSVCRT__");
4551 Builder.defineMacro("__MINGW32__");
4552 addCygMingDefines(Opts, Builder);
4553}
4554
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004555// x86-32 MinGW target
4556class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
4557public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004558 MinGWX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4559 : WindowsX86_32TargetInfo(Triple, Opts) {}
Craig Topper3164f332014-03-11 03:39:26 +00004560 void getTargetDefines(const LangOptions &Opts,
4561 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004562 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004563 DefineStd(Builder, "WIN32", Opts);
4564 DefineStd(Builder, "WINNT", Opts);
4565 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00004566 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004567 }
4568};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004569
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004570// x86-32 Cygwin target
4571class CygwinX86_32TargetInfo : public X86_32TargetInfo {
4572public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004573 CygwinX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4574 : X86_32TargetInfo(Triple, Opts) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004575 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004576 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00004577 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 +00004578 }
Craig Topper3164f332014-03-11 03:39:26 +00004579 void getTargetDefines(const LangOptions &Opts,
4580 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004581 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00004582 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004583 Builder.defineMacro("__CYGWIN__");
4584 Builder.defineMacro("__CYGWIN32__");
David Majnemerae1ed0e2015-05-28 04:36:18 +00004585 addCygMingDefines(Opts, Builder);
Saleem Abdulrasool56027092017-02-07 19:00:06 +00004586 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00004587 if (Opts.CPlusPlus)
4588 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00004589 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004590};
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004591
Chris Lattnerb986aba2010-04-11 19:29:39 +00004592// x86-32 Haiku target
Reid Kleckner330fb172016-05-11 16:19:05 +00004593class HaikuX86_32TargetInfo : public HaikuTargetInfo<X86_32TargetInfo> {
Chris Lattnerb986aba2010-04-11 19:29:39 +00004594public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004595 HaikuX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Reid Kleckner330fb172016-05-11 16:19:05 +00004596 : HaikuTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman04831922010-08-22 01:00:03 +00004597 }
Craig Topper3164f332014-03-11 03:39:26 +00004598 void getTargetDefines(const LangOptions &Opts,
4599 MacroBuilder &Builder) const override {
Reid Kleckner330fb172016-05-11 16:19:05 +00004600 HaikuTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
Chris Lattnerb986aba2010-04-11 19:29:39 +00004601 Builder.defineMacro("__INTEL__");
Chris Lattnerb986aba2010-04-11 19:29:39 +00004602 }
4603};
Chris Lattnerb986aba2010-04-11 19:29:39 +00004604
Alexey Bataevc99b0492015-11-25 09:24:26 +00004605// X86-32 MCU target
4606class MCUX86_32TargetInfo : public X86_32TargetInfo {
4607public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004608 MCUX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4609 : X86_32TargetInfo(Triple, Opts) {
Alexey Bataevc99b0492015-11-25 09:24:26 +00004610 LongDoubleWidth = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00004611 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
James Y Knightb214cbc2016-03-04 19:00:41 +00004612 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 +00004613 WIntType = UnsignedInt;
Alexey Bataevc99b0492015-11-25 09:24:26 +00004614 }
4615
4616 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
4617 // On MCU we support only C calling convention.
4618 return CC == CC_C ? CCCR_OK : CCCR_Warning;
4619 }
4620
4621 void getTargetDefines(const LangOptions &Opts,
4622 MacroBuilder &Builder) const override {
4623 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4624 Builder.defineMacro("__iamcu");
4625 Builder.defineMacro("__iamcu__");
4626 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00004627
4628 bool allowsLargerPreferedTypeAlignment() const override {
4629 return false;
4630 }
Alexey Bataevc99b0492015-11-25 09:24:26 +00004631};
4632
Douglas Gregor9fabd852011-07-01 22:41:14 +00004633// RTEMS Target
4634template<typename Target>
4635class RTEMSTargetInfo : public OSTargetInfo<Target> {
4636protected:
Craig Topper3164f332014-03-11 03:39:26 +00004637 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4638 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004639 // RTEMS defines; list based off of gcc output
4640
Douglas Gregor9fabd852011-07-01 22:41:14 +00004641 Builder.defineMacro("__rtems__");
4642 Builder.defineMacro("__ELF__");
4643 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004644
Douglas Gregor9fabd852011-07-01 22:41:14 +00004645public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004646 RTEMSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4647 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004648 switch (Triple.getArch()) {
4649 default:
4650 case llvm::Triple::x86:
4651 // this->MCountName = ".mcount";
4652 break;
4653 case llvm::Triple::mips:
4654 case llvm::Triple::mipsel:
4655 case llvm::Triple::ppc:
4656 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00004657 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004658 // this->MCountName = "_mcount";
4659 break;
4660 case llvm::Triple::arm:
4661 // this->MCountName = "__mcount";
4662 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004663 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004664 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00004665};
4666
Douglas Gregor9fabd852011-07-01 22:41:14 +00004667// x86-32 RTEMS target
4668class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
4669public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004670 RTEMSX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4671 : X86_32TargetInfo(Triple, Opts) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004672 SizeType = UnsignedLong;
4673 IntPtrType = SignedLong;
4674 PtrDiffType = SignedLong;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004675 }
Craig Topper3164f332014-03-11 03:39:26 +00004676 void getTargetDefines(const LangOptions &Opts,
4677 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004678 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4679 Builder.defineMacro("__INTEL__");
4680 Builder.defineMacro("__rtems__");
4681 }
4682};
Douglas Gregor9fabd852011-07-01 22:41:14 +00004683
Eli Friedman3fd920a2008-08-20 02:34:37 +00004684// x86-64 generic target
4685class X86_64TargetInfo : public X86TargetInfo {
4686public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004687 X86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4688 : X86TargetInfo(Triple, Opts) {
David Blaikie40f842d2014-07-10 18:46:15 +00004689 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
David Majnemer8fa8c382015-03-17 23:55:00 +00004690 bool IsWinCOFF =
4691 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Zinovy Nis1db95732014-07-10 15:27:19 +00004692 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00004693 LongDoubleWidth = 128;
4694 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00004695 LargeArrayMinWidth = 128;
4696 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004697 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00004698 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
4699 PtrDiffType = IsX32 ? SignedInt : SignedLong;
4700 IntPtrType = IsX32 ? SignedInt : SignedLong;
4701 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00004702 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00004703 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00004704
Eric Christopher917e9522014-11-18 22:36:15 +00004705 // Pointers are 32-bit in x32.
Eric Christopherf6ee1f32017-02-10 04:35:21 +00004706 resetDataLayout(IsX32
4707 ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128"
4708 : IsWinCOFF ? "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
4709 : "e-m:e-i64:64-f80:128-n8:16:32:64-S128");
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00004710
4711 // Use fpret only for long double.
4712 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004713
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00004714 // Use fp2ret for _Complex long double.
4715 ComplexLongDoubleUsesFP2Ret = true;
4716
Charles Davisc7d5c942015-09-17 20:55:33 +00004717 // Make __builtin_ms_va_list available.
4718 HasBuiltinMSVaList = true;
4719
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004720 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004721 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00004722 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00004723 }
Craig Topper3164f332014-03-11 03:39:26 +00004724 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004725 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00004726 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004727
Craig Topper3164f332014-03-11 03:39:26 +00004728 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00004729 if (RegNo == 0) return 0;
4730 if (RegNo == 1) return 1;
4731 return -1;
4732 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004733
Craig Topper3164f332014-03-11 03:39:26 +00004734 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00004735 switch (CC) {
4736 case CC_C:
4737 case CC_Swift:
4738 case CC_X86VectorCall:
4739 case CC_IntelOclBicc:
4740 case CC_X86_64Win64:
Roman Levenstein35aa5ce2016-03-16 18:00:46 +00004741 case CC_PreserveMost:
4742 case CC_PreserveAll:
Erich Keane757d3172016-11-02 18:29:35 +00004743 case CC_X86RegCall:
John McCall477f2bb2016-03-03 06:39:32 +00004744 return CCCR_OK;
4745 default:
4746 return CCCR_Warning;
4747 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004748 }
4749
Craig Topper3164f332014-03-11 03:39:26 +00004750 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00004751 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004752 }
4753
Pavel Chupinfd223e12014-08-04 12:39:43 +00004754 // for x32 we need it here explicitly
4755 bool hasInt128Type() const override { return true; }
Reid Klecknerf27e7522016-02-01 18:58:24 +00004756 unsigned getUnwindWordWidth() const override { return 64; }
4757 unsigned getRegisterWidth() const override { return 64; }
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00004758
4759 bool validateGlobalRegisterVariable(StringRef RegName,
4760 unsigned RegSize,
4761 bool &HasSizeMismatch) const override {
4762 // rsp and rbp are the only 64-bit registers the x86 backend can currently
4763 // handle.
4764 if (RegName.equals("rsp") || RegName.equals("rbp")) {
4765 // Check that the register size is 64-bit.
4766 HasSizeMismatch = RegSize != 64;
4767 return true;
4768 }
4769
4770 // Check if the register is a 32-bit register the backend can handle.
4771 return X86TargetInfo::validateGlobalRegisterVariable(RegName, RegSize,
4772 HasSizeMismatch);
4773 }
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00004774 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
4775 return llvm::makeArrayRef(BuiltinInfoX86,
4776 X86::LastTSBuiltin - Builtin::FirstTSBuiltin);
4777 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004778};
Eli Friedman3fd920a2008-08-20 02:34:37 +00004779
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004780// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004781class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004782public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004783 WindowsX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4784 : WindowsTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004785 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00004786 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004787 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004788 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004789 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00004790 SizeType = UnsignedLongLong;
4791 PtrDiffType = SignedLongLong;
4792 IntPtrType = SignedLongLong;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004793 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004794
Craig Topper3164f332014-03-11 03:39:26 +00004795 void getTargetDefines(const LangOptions &Opts,
4796 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004797 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004798 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004799 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004800
Craig Topper3164f332014-03-11 03:39:26 +00004801 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004802 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00004803 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004804
Craig Topper3164f332014-03-11 03:39:26 +00004805 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004806 switch (CC) {
4807 case CC_X86StdCall:
4808 case CC_X86ThisCall:
4809 case CC_X86FastCall:
4810 return CCCR_Ignore;
4811 case CC_C:
4812 case CC_X86VectorCall:
4813 case CC_IntelOclBicc:
4814 case CC_X86_64SysV:
Arnold Schwaighofer4fc955e2016-10-12 18:59:24 +00004815 case CC_Swift:
Erich Keane757d3172016-11-02 18:29:35 +00004816 case CC_X86RegCall:
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004817 return CCCR_OK;
4818 default:
4819 return CCCR_Warning;
4820 }
Charles Davisb5a214e2013-08-30 04:39:01 +00004821 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004822};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004823
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004824// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004825class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004826public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004827 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple,
4828 const TargetOptions &Opts)
4829 : WindowsX86_64TargetInfo(Triple, Opts) {
Eli Friedman015d6282011-03-22 21:25:11 +00004830 LongDoubleWidth = LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00004831 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004832 }
Craig Topper3164f332014-03-11 03:39:26 +00004833 void getTargetDefines(const LangOptions &Opts,
4834 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004835 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
4836 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
David Majnemerb856e8f2015-07-26 23:17:29 +00004837 Builder.defineMacro("_M_X64", "100");
4838 Builder.defineMacro("_M_AMD64", "100");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004839 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004840};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004841
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004842// x86-64 MinGW target
4843class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
4844public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004845 MinGWX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4846 : WindowsX86_64TargetInfo(Triple, Opts) {
Reid Kleckner11a17192015-10-28 22:29:52 +00004847 // Mingw64 rounds long double size and alignment up to 16 bytes, but sticks
4848 // with x86 FP ops. Weird.
4849 LongDoubleWidth = LongDoubleAlign = 128;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00004850 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended();
Reid Kleckner11a17192015-10-28 22:29:52 +00004851 }
4852
Craig Topper3164f332014-03-11 03:39:26 +00004853 void getTargetDefines(const LangOptions &Opts,
4854 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004855 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004856 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004857 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00004858 addMinGWDefines(Opts, Builder);
Reid Klecknere070b992014-11-14 02:01:10 +00004859
4860 // GCC defines this macro when it is using __gxx_personality_seh0.
4861 if (!Opts.SjLjExceptions)
4862 Builder.defineMacro("__SEH__");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004863 }
4864};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004865
Yaron Kerend030d112015-07-22 17:38:19 +00004866// x86-64 Cygwin target
4867class CygwinX86_64TargetInfo : public X86_64TargetInfo {
4868public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004869 CygwinX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4870 : X86_64TargetInfo(Triple, Opts) {
Yaron Kerend030d112015-07-22 17:38:19 +00004871 TLSSupported = false;
4872 WCharType = UnsignedShort;
4873 }
4874 void getTargetDefines(const LangOptions &Opts,
4875 MacroBuilder &Builder) const override {
4876 X86_64TargetInfo::getTargetDefines(Opts, Builder);
4877 Builder.defineMacro("__x86_64__");
4878 Builder.defineMacro("__CYGWIN__");
4879 Builder.defineMacro("__CYGWIN64__");
4880 addCygMingDefines(Opts, Builder);
Saleem Abdulrasool56027092017-02-07 19:00:06 +00004881 DefineStd(Builder, "unix", Opts);
Yaron Kerend030d112015-07-22 17:38:19 +00004882 if (Opts.CPlusPlus)
4883 Builder.defineMacro("_GNU_SOURCE");
4884
4885 // GCC defines this macro when it is using __gxx_personality_seh0.
4886 if (!Opts.SjLjExceptions)
4887 Builder.defineMacro("__SEH__");
4888 }
4889};
4890
Eli Friedman2857ccb2009-07-01 03:36:11 +00004891class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
4892public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004893 DarwinX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4894 : DarwinTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00004895 Int64Type = SignedLongLong;
Tim Northovera2ee4332014-03-29 15:09:45 +00004896 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
4897 llvm::Triple T = llvm::Triple(Triple);
Bob Wilson946c04c2014-10-19 02:19:27 +00004898 if (T.isiOS())
Tim Northovera2ee4332014-03-29 15:09:45 +00004899 UseSignedCharForObjCBool = false;
James Y Knightb214cbc2016-03-04 19:00:41 +00004900 resetDataLayout("e-m:o-i64:64-f80:128-n8:16:32:64-S128");
Eli Friedman2857ccb2009-07-01 03:36:11 +00004901 }
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004902
4903 bool handleTargetFeatures(std::vector<std::string> &Features,
4904 DiagnosticsEngine &Diags) override {
4905 if (!DarwinTargetInfo<X86_64TargetInfo>::handleTargetFeatures(Features,
4906 Diags))
4907 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004908 // We now know the features we have: we can decide how to align vectors.
4909 MaxVectorAlign =
4910 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004911 return true;
4912 }
Eli Friedman2857ccb2009-07-01 03:36:11 +00004913};
Eli Friedman2857ccb2009-07-01 03:36:11 +00004914
Eli Friedman245f2292009-07-05 22:31:18 +00004915class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
4916public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004917 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4918 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Eli Friedman245f2292009-07-05 22:31:18 +00004919 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004920 Int64Type = SignedLongLong;
4921 }
4922};
Eli Friedman245f2292009-07-05 22:31:18 +00004923
Eli Friedman9fa28852012-08-08 23:57:20 +00004924class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
4925public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004926 BitrigX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4927 : BitrigTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004928 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004929 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00004930 }
4931};
Tim Northover9bb857a2013-01-31 12:13:10 +00004932
Eli Friedmanf05b7722008-08-20 07:44:10 +00004933class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004934 // Possible FPU choices.
4935 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004936 VFP2FPU = (1 << 0),
4937 VFP3FPU = (1 << 1),
4938 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00004939 NeonFPU = (1 << 3),
4940 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004941 };
4942
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004943 // Possible HWDiv features.
4944 enum HWDivMode {
4945 HWDivThumb = (1 << 0),
4946 HWDivARM = (1 << 1)
4947 };
4948
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004949 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004950 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004951 }
4952
4953 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4954 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004955
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004956 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004957
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004958 StringRef CPUProfile;
4959 StringRef CPUAttr;
4960
Rafael Espindolaeb265472013-08-21 21:59:03 +00004961 enum {
4962 FP_Default,
4963 FP_VFP,
4964 FP_Neon
4965 } FPMath;
4966
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004967 unsigned ArchISA;
Renato Goline84b0002015-10-08 16:43:26 +00004968 unsigned ArchKind = llvm::ARM::AK_ARMV4T;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004969 unsigned ArchProfile;
4970 unsigned ArchVersion;
4971
Bernard Ogdenda13af32013-10-24 18:32:51 +00004972 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004973
Logan Chien57086ce2012-10-10 06:56:20 +00004974 unsigned IsAAPCS : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004975 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004976
4977 // Initialized via features.
4978 unsigned SoftFloat : 1;
4979 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004980
Bernard Ogden18b57012013-10-29 09:47:51 +00004981 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00004982 unsigned Crypto : 1;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004983 unsigned DSP : 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004984 unsigned Unaligned : 1;
4985
4986 enum {
4987 LDREX_B = (1 << 0), /// byte (8-bit)
4988 LDREX_H = (1 << 1), /// half (16-bit)
4989 LDREX_W = (1 << 2), /// word (32-bit)
4990 LDREX_D = (1 << 3), /// double (64-bit)
4991 };
4992
4993 uint32_t LDREX;
Bernard Ogden18b57012013-10-29 09:47:51 +00004994
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004995 // ACLE 6.5.1 Hardware floating point
4996 enum {
4997 HW_FP_HP = (1 << 1), /// half (16-bit)
4998 HW_FP_SP = (1 << 2), /// single (32-bit)
4999 HW_FP_DP = (1 << 3), /// double (64-bit)
5000 };
5001 uint32_t HW_FP;
5002
Chris Lattner5cc15e02010-03-03 19:03:45 +00005003 static const Builtin::Info BuiltinInfo[];
5004
Rafael Espindolad6c2b722013-12-18 19:47:32 +00005005 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00005006 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00005007
5008 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00005009 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00005010
Renato Golin0201a9e2016-09-22 19:28:20 +00005011 // size_t is unsigned long on MachO-derived environments, NetBSD,
5012 // OpenBSD and Bitrig.
Renato Golin9ba39232015-02-27 16:35:48 +00005013 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD ||
Renato Golin0201a9e2016-09-22 19:28:20 +00005014 T.getOS() == llvm::Triple::OpenBSD ||
Renato Golin9ba39232015-02-27 16:35:48 +00005015 T.getOS() == llvm::Triple::Bitrig)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00005016 SizeType = UnsignedLong;
5017 else
5018 SizeType = UnsignedInt;
5019
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00005020 switch (T.getOS()) {
5021 case llvm::Triple::NetBSD:
Renato Golin0201a9e2016-09-22 19:28:20 +00005022 case llvm::Triple::OpenBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00005023 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00005024 break;
5025 case llvm::Triple::Win32:
5026 WCharType = UnsignedShort;
5027 break;
5028 case llvm::Triple::Linux:
5029 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00005030 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
5031 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00005032 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00005033 }
5034
5035 UseBitFieldTypeAlignment = true;
5036
5037 ZeroLengthBitfieldBoundary = 0;
5038
Tim Northover147cd2f2014-10-14 22:12:21 +00005039 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
5040 // so set preferred for small types to 32.
5041 if (T.isOSBinFormatMachO()) {
James Y Knightb214cbc2016-03-04 19:00:41 +00005042 resetDataLayout(BigEndian
5043 ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
5044 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Tim Northover147cd2f2014-10-14 22:12:21 +00005045 } else if (T.isOSWindows()) {
Tim Northover147cd2f2014-10-14 22:12:21 +00005046 assert(!BigEndian && "Windows on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00005047 resetDataLayout("e"
5048 "-m:w"
5049 "-p:32:32"
5050 "-i64:64"
5051 "-v128:64:128"
5052 "-a:0:32"
5053 "-n32"
5054 "-S64");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00005055 } else if (T.isOSNaCl()) {
5056 assert(!BigEndian && "NaCl on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00005057 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00005058 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00005059 resetDataLayout(BigEndian
5060 ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
5061 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00005062 }
5063
5064 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00005065 }
5066
Tim Northover5627d392015-10-30 16:30:45 +00005067 void setABIAPCS(bool IsAAPCS16) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00005068 const llvm::Triple &T = getTriple();
5069
Rafael Espindolaafa854c2013-12-18 20:24:51 +00005070 IsAAPCS = false;
5071
Tim Northover5627d392015-10-30 16:30:45 +00005072 if (IsAAPCS16)
5073 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
5074 else
5075 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00005076
Rafael Espindolad6c2b722013-12-18 19:47:32 +00005077 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00005078 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00005079 SizeType = UnsignedInt;
5080 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00005081 SizeType = UnsignedLong;
5082
5083 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
5084 WCharType = SignedInt;
5085
5086 // Do not respect the alignment of bit-field types when laying out
5087 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
5088 UseBitFieldTypeAlignment = false;
5089
5090 /// gcc forces the alignment to 4 bytes, regardless of the type of the
5091 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
5092 /// gcc.
5093 ZeroLengthBitfieldBoundary = 32;
5094
Tim Northover5627d392015-10-30 16:30:45 +00005095 if (T.isOSBinFormatMachO() && IsAAPCS16) {
5096 assert(!BigEndian && "AAPCS16 does not support big-endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00005097 resetDataLayout("e-m:o-p:32:32-i64:64-a:0:32-n32-S128");
Tim Northover5627d392015-10-30 16:30:45 +00005098 } else if (T.isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00005099 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00005100 BigEndian
5101 ? "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 +00005102 : "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 +00005103 else
James Y Knightb214cbc2016-03-04 19:00:41 +00005104 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00005105 BigEndian
5106 ? "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 +00005107 : "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 +00005108
5109 // FIXME: Override "preferred align" for double and long long.
5110 }
5111
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005112 void setArchInfo() {
5113 StringRef ArchName = getTriple().getArchName();
5114
Renato Goline84b0002015-10-08 16:43:26 +00005115 ArchISA = llvm::ARM::parseArchISA(ArchName);
5116 CPU = llvm::ARM::getDefaultCPU(ArchName);
5117 unsigned AK = llvm::ARM::parseArch(ArchName);
5118 if (AK != llvm::ARM::AK_INVALID)
5119 ArchKind = AK;
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005120 setArchInfo(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005121 }
5122
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005123 void setArchInfo(unsigned Kind) {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005124 StringRef SubArch;
5125
5126 // cache TargetParser info
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005127 ArchKind = Kind;
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00005128 SubArch = llvm::ARM::getSubArch(ArchKind);
5129 ArchProfile = llvm::ARM::parseArchProfile(SubArch);
5130 ArchVersion = llvm::ARM::parseArchVersion(SubArch);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005131
5132 // cache CPU related strings
5133 CPUAttr = getCPUAttr();
5134 CPUProfile = getCPUProfile();
5135 }
5136
5137 void setAtomic() {
Eric Christopherb093d692015-10-09 18:39:59 +00005138 // when triple does not specify a sub arch,
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005139 // then we are not using inline atomics
Renato Goline84b0002015-10-08 16:43:26 +00005140 bool ShouldUseInlineAtomic =
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005141 (ArchISA == llvm::ARM::IK_ARM && ArchVersion >= 6) ||
5142 (ArchISA == llvm::ARM::IK_THUMB && ArchVersion >= 7);
Eric Christopherb093d692015-10-09 18:39:59 +00005143 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005144 if (ArchProfile == llvm::ARM::PK_M) {
5145 MaxAtomicPromoteWidth = 32;
5146 if (ShouldUseInlineAtomic)
5147 MaxAtomicInlineWidth = 32;
5148 }
5149 else {
5150 MaxAtomicPromoteWidth = 64;
5151 if (ShouldUseInlineAtomic)
5152 MaxAtomicInlineWidth = 64;
Eric Christopherb093d692015-10-09 18:39:59 +00005153 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005154 }
5155
5156 bool isThumb() const {
5157 return (ArchISA == llvm::ARM::IK_THUMB);
5158 }
5159
5160 bool supportsThumb() const {
5161 return CPUAttr.count('T') || ArchVersion >= 6;
5162 }
5163
5164 bool supportsThumb2() const {
Bradley Smithf4affc12016-03-03 13:52:22 +00005165 return CPUAttr.equals("6T2") ||
5166 (ArchVersion >= 7 && !CPUAttr.equals("8M_BASE"));
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005167 }
5168
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005169 StringRef getCPUAttr() const {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005170 // For most sub-arches, the build attribute CPU name is enough.
5171 // For Cortex variants, it's slightly different.
5172 switch(ArchKind) {
5173 default:
Chandler Carruthd96f37a2015-08-30 07:51:18 +00005174 return llvm::ARM::getCPUAttr(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005175 case llvm::ARM::AK_ARMV6M:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005176 return "6M";
Tim Northover525c73c2015-07-21 21:47:33 +00005177 case llvm::ARM::AK_ARMV7S:
5178 return "7S";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005179 case llvm::ARM::AK_ARMV7A:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005180 return "7A";
5181 case llvm::ARM::AK_ARMV7R:
5182 return "7R";
5183 case llvm::ARM::AK_ARMV7M:
5184 return "7M";
5185 case llvm::ARM::AK_ARMV7EM:
5186 return "7EM";
George Burgess IVfc970562017-02-09 23:30:10 +00005187 case llvm::ARM::AK_ARMV7VE:
5188 return "7VE";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005189 case llvm::ARM::AK_ARMV8A:
5190 return "8A";
5191 case llvm::ARM::AK_ARMV8_1A:
5192 return "8_1A";
Oliver Stannard3086c042016-02-11 16:05:52 +00005193 case llvm::ARM::AK_ARMV8_2A:
5194 return "8_2A";
Bradley Smithf4affc12016-03-03 13:52:22 +00005195 case llvm::ARM::AK_ARMV8MBaseline:
5196 return "8M_BASE";
5197 case llvm::ARM::AK_ARMV8MMainline:
5198 return "8M_MAIN";
Javed Absar00b74442016-10-07 12:08:41 +00005199 case llvm::ARM::AK_ARMV8R:
5200 return "8R";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005201 }
5202 }
5203
5204 StringRef getCPUProfile() const {
5205 switch(ArchProfile) {
5206 case llvm::ARM::PK_A:
5207 return "A";
5208 case llvm::ARM::PK_R:
5209 return "R";
5210 case llvm::ARM::PK_M:
5211 return "M";
5212 default:
5213 return "";
5214 }
5215 }
5216
Chris Lattner17df24e2008-04-21 18:56:49 +00005217public:
Matt Arsenaultf333de32016-09-07 07:08:02 +00005218 ARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005219 : TargetInfo(Triple), FPMath(FP_Default), IsAAPCS(true), LDREX(0),
5220 HW_FP(0) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005221
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00005222 switch (getTriple().getOS()) {
5223 case llvm::Triple::NetBSD:
Renato Golin0201a9e2016-09-22 19:28:20 +00005224 case llvm::Triple::OpenBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00005225 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00005226 break;
5227 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00005228 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00005229 break;
5230 }
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00005231
Renato Goline84b0002015-10-08 16:43:26 +00005232 // Cache arch related info.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005233 setArchInfo();
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00005234
Chris Lattner1a8f3942010-04-23 16:29:58 +00005235 // {} in inline assembly are neon specifiers, not assembly variant
5236 // specifiers.
5237 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005238
Eric Christopher0e261882014-12-05 01:06:59 +00005239 // FIXME: This duplicates code from the driver that sets the -target-abi
5240 // option - this code is used if -target-abi isn't passed and should
5241 // be unified in some way.
5242 if (Triple.isOSBinFormatMachO()) {
5243 // The backend is hardwired to assume AAPCS for M-class processors, ensure
5244 // the frontend matches that.
5245 if (Triple.getEnvironment() == llvm::Triple::EABI ||
5246 Triple.getOS() == llvm::Triple::UnknownOS ||
Zijiao Ma56a83722016-08-17 02:13:33 +00005247 ArchProfile == llvm::ARM::PK_M) {
Eric Christopher0e261882014-12-05 01:06:59 +00005248 setABI("aapcs");
Tim Northoverd88ecb32016-01-27 19:32:40 +00005249 } else if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00005250 setABI("aapcs16");
Eric Christopher0e261882014-12-05 01:06:59 +00005251 } else {
5252 setABI("apcs-gnu");
5253 }
5254 } else if (Triple.isOSWindows()) {
5255 // FIXME: this is invalid for WindowsCE
5256 setABI("aapcs");
5257 } else {
5258 // Select the default based on the platform.
5259 switch (Triple.getEnvironment()) {
5260 case llvm::Triple::Android:
5261 case llvm::Triple::GNUEABI:
5262 case llvm::Triple::GNUEABIHF:
Rafael Espindola0fa66802016-06-24 21:35:06 +00005263 case llvm::Triple::MuslEABI:
5264 case llvm::Triple::MuslEABIHF:
Eric Christopher0e261882014-12-05 01:06:59 +00005265 setABI("aapcs-linux");
5266 break;
5267 case llvm::Triple::EABIHF:
5268 case llvm::Triple::EABI:
5269 setABI("aapcs");
5270 break;
Eric Christopher560cc4f2014-12-18 02:08:55 +00005271 case llvm::Triple::GNU:
Renato Goline84b0002015-10-08 16:43:26 +00005272 setABI("apcs-gnu");
5273 break;
Eric Christopher0e261882014-12-05 01:06:59 +00005274 default:
5275 if (Triple.getOS() == llvm::Triple::NetBSD)
5276 setABI("apcs-gnu");
Brad Smith3d648b32017-02-28 03:20:26 +00005277 else if (Triple.getOS() == llvm::Triple::OpenBSD)
5278 setABI("aapcs-linux");
Eric Christopher0e261882014-12-05 01:06:59 +00005279 else
5280 setABI("aapcs");
5281 break;
5282 }
5283 }
John McCall86353412010-08-21 22:46:04 +00005284
5285 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00005286 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005287
Renato Golin15b86152015-07-03 16:41:13 +00005288 // ARM has atomics up to 8 bytes
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005289 setAtomic();
Rafael Espindola5ab8e2e2015-07-02 15:14:10 +00005290
James Molloya7139222012-03-12 09:14:10 +00005291 // Do force alignment of members that follow zero length bitfields. If
Eric Christopher917e9522014-11-18 22:36:15 +00005292 // the alignment of the zero-length bitfield is greater than the member
5293 // that follows it, `bar', `bar' will be aligned as the type of the
James Molloya7139222012-03-12 09:14:10 +00005294 // zero length bitfield.
5295 UseZeroLengthBitfieldAlignment = true;
Saleem Abdulrasool9b5ba542016-04-10 03:19:47 +00005296
5297 if (Triple.getOS() == llvm::Triple::Linux ||
5298 Triple.getOS() == llvm::Triple::UnknownOS)
5299 this->MCountName =
5300 Opts.EABIVersion == "gnu" ? "\01__gnu_mcount_nc" : "\01mcount";
Eli Friedmanb5366062008-05-20 14:21:01 +00005301 }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00005302
Alp Toker4925ba72014-06-07 23:30:42 +00005303 StringRef getABI() const override { return ABI; }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00005304
Craig Topper3164f332014-03-11 03:39:26 +00005305 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00005306 ABI = Name;
5307
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00005308 // The defaults (above) are for AAPCS, check if we need to change them.
5309 //
5310 // FIXME: We need support for -meabi... we could just mangle it into the
5311 // name.
Tim Northover756447a2015-10-30 16:30:36 +00005312 if (Name == "apcs-gnu" || Name == "aapcs16") {
Tim Northover5627d392015-10-30 16:30:45 +00005313 setABIAPCS(Name == "aapcs16");
Rafael Espindolad6c2b722013-12-18 19:47:32 +00005314 return true;
5315 }
5316 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
5317 setABIAAPCS();
5318 return true;
5319 }
5320 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00005321 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00005322
Renato Golinf5c4dec2015-05-27 13:33:00 +00005323 // FIXME: This should be based on Arch attributes, not CPU names.
Eric Christopher8c47b422015-10-09 18:39:55 +00005324 bool
5325 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
5326 StringRef CPU,
5327 const std::vector<std::string> &FeaturesVec) const override {
5328
Mehdi Aminia0016ec2016-10-07 08:37:29 +00005329 std::vector<StringRef> TargetFeatures;
Bradley Smithb3501962015-11-16 11:16:36 +00005330 unsigned Arch = llvm::ARM::parseArch(getTriple().getArchName());
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005331
5332 // get default FPU features
Bradley Smithb3501962015-11-16 11:16:36 +00005333 unsigned FPUKind = llvm::ARM::getDefaultFPU(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005334 llvm::ARM::getFPUFeatures(FPUKind, TargetFeatures);
5335
5336 // get default Extension features
Bradley Smithb3501962015-11-16 11:16:36 +00005337 unsigned Extensions = llvm::ARM::getDefaultExtensions(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005338 llvm::ARM::getExtensionFeatures(Extensions, TargetFeatures);
5339
Mehdi Aminia0016ec2016-10-07 08:37:29 +00005340 for (auto Feature : TargetFeatures)
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005341 if (Feature[0] == '+')
Mehdi Aminia0016ec2016-10-07 08:37:29 +00005342 Features[Feature.drop_front(1)] = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005343
Eric Christopher007b0a02015-08-28 22:32:01 +00005344 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005345 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005346
Craig Topper3164f332014-03-11 03:39:26 +00005347 bool handleTargetFeatures(std::vector<std::string> &Features,
5348 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005349 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00005350 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00005351 Crypto = 0;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005352 DSP = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005353 Unaligned = 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005354 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005355 HWDiv = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005356
Ranjeet Singhac08e532015-06-24 23:39:25 +00005357 // This does not diagnose illegal cases like having both
5358 // "+vfpv2" and "+vfpv3" or having "+neon" and "+fp-only-sp".
5359 uint32_t HW_FP_remove = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005360 for (const auto &Feature : Features) {
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005361 if (Feature == "+soft-float") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00005362 SoftFloat = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005363 } else if (Feature == "+soft-float-abi") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00005364 SoftFloatABI = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005365 } else if (Feature == "+vfp2") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005366 FPU |= VFP2FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005367 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005368 } else if (Feature == "+vfp3") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005369 FPU |= VFP3FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005370 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005371 } else if (Feature == "+vfp4") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005372 FPU |= VFP4FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005373 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005374 } else if (Feature == "+fp-armv8") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00005375 FPU |= FPARMV8;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005376 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005377 } else if (Feature == "+neon") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005378 FPU |= NeonFPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005379 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005380 } else if (Feature == "+hwdiv") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005381 HWDiv |= HWDivThumb;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005382 } else if (Feature == "+hwdiv-arm") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005383 HWDiv |= HWDivARM;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005384 } else if (Feature == "+crc") {
Bernard Ogden18b57012013-10-29 09:47:51 +00005385 CRC = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005386 } else if (Feature == "+crypto") {
Tim Northover02e38602014-02-03 17:28:04 +00005387 Crypto = 1;
Artyom Skrobov05d85ae2015-10-23 17:19:02 +00005388 } else if (Feature == "+dsp") {
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005389 DSP = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005390 } else if (Feature == "+fp-only-sp") {
Matt Arsenault250024f2016-06-08 01:56:42 +00005391 HW_FP_remove |= HW_FP_DP;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005392 } else if (Feature == "+strict-align") {
5393 Unaligned = 0;
5394 } else if (Feature == "+fp16") {
5395 HW_FP |= HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005396 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00005397 }
Ranjeet Singhac08e532015-06-24 23:39:25 +00005398 HW_FP &= ~HW_FP_remove;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005399
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005400 switch (ArchVersion) {
5401 case 6:
5402 if (ArchProfile == llvm::ARM::PK_M)
5403 LDREX = 0;
5404 else if (ArchKind == llvm::ARM::AK_ARMV6K)
5405 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5406 else
5407 LDREX = LDREX_W;
5408 break;
5409 case 7:
5410 if (ArchProfile == llvm::ARM::PK_M)
5411 LDREX = LDREX_W | LDREX_H | LDREX_B ;
5412 else
5413 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5414 break;
5415 case 8:
5416 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5417 }
5418
Rafael Espindolaeb265472013-08-21 21:59:03 +00005419 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
5420 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
5421 return false;
5422 }
5423
5424 if (FPMath == FP_Neon)
5425 Features.push_back("+neonfp");
5426 else if (FPMath == FP_VFP)
5427 Features.push_back("-neonfp");
5428
Daniel Dunbar893d4752009-12-19 04:15:38 +00005429 // Remove front-end specific options which the backend handles differently.
Eric Christopher9e172d22015-05-12 01:26:21 +00005430 auto Feature =
5431 std::find(Features.begin(), Features.end(), "+soft-float-abi");
5432 if (Feature != Features.end())
5433 Features.erase(Feature);
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005434
Rafael Espindolaeb265472013-08-21 21:59:03 +00005435 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005436 }
5437
Craig Topper3164f332014-03-11 03:39:26 +00005438 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005439 return llvm::StringSwitch<bool>(Feature)
5440 .Case("arm", true)
Ben Langmuir587aeaf2015-08-07 01:59:56 +00005441 .Case("aarch32", true)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005442 .Case("softfloat", SoftFloat)
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005443 .Case("thumb", isThumb())
Amara Emerson8c3de542013-09-16 18:07:35 +00005444 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005445 .Case("hwdiv", HWDiv & HWDivThumb)
5446 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005447 .Default(false);
5448 }
Renato Golin15b86152015-07-03 16:41:13 +00005449
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005450 bool setCPU(const std::string &Name) override {
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005451 if (Name != "generic")
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00005452 setArchInfo(llvm::ARM::parseCPUArch(Name));
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005453
Renato Golin15b86152015-07-03 16:41:13 +00005454 if (ArchKind == llvm::ARM::AK_INVALID)
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005455 return false;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005456 setAtomic();
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005457 CPU = Name;
5458 return true;
5459 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005460
Craig Topper3164f332014-03-11 03:39:26 +00005461 bool setFPMath(StringRef Name) override;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005462
Craig Topper3164f332014-03-11 03:39:26 +00005463 void getTargetDefines(const LangOptions &Opts,
5464 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00005465 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005466 Builder.defineMacro("__arm");
5467 Builder.defineMacro("__arm__");
Weiming Zhaob0613132016-04-18 16:25:46 +00005468 // For bare-metal none-eabi.
5469 if (getTriple().getOS() == llvm::Triple::UnknownOS &&
Oliver Stannard233310f2017-04-18 13:12:36 +00005470 (getTriple().getEnvironment() == llvm::Triple::EABI ||
5471 getTriple().getEnvironment() == llvm::Triple::EABIHF))
Weiming Zhaob0613132016-04-18 16:25:46 +00005472 Builder.defineMacro("__ELF__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00005473
Oliver Stannard233310f2017-04-18 13:12:36 +00005474
Chris Lattnerecd49032009-03-02 22:27:17 +00005475 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005476 Builder.defineMacro("__REGISTER_PREFIX__", "");
Tim Northover5627d392015-10-30 16:30:45 +00005477
5478 // Unfortunately, __ARM_ARCH_7K__ is now more of an ABI descriptor. The CPU
5479 // happens to be Cortex-A7 though, so it should still get __ARM_ARCH_7A__.
Tim Northoverd88ecb32016-01-27 19:32:40 +00005480 if (getTriple().isWatchABI())
Tim Northover5627d392015-10-30 16:30:45 +00005481 Builder.defineMacro("__ARM_ARCH_7K__", "2");
5482
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005483 if (!CPUAttr.empty())
5484 Builder.defineMacro("__ARM_ARCH_" + CPUAttr + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005485
5486 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005487 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
Benjamin Kramerb42d9a52015-12-24 10:07:37 +00005488 Builder.defineMacro("__ARM_ARCH", Twine(ArchVersion));
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005489
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005490 if (ArchVersion >= 8) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005491 // ACLE 6.5.7 Crypto Extension
5492 if (Crypto)
5493 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
5494 // ACLE 6.5.8 CRC32 Extension
5495 if (CRC)
5496 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
5497 // ACLE 6.5.10 Numeric Maximum and Minimum
5498 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
5499 // ACLE 6.5.9 Directed Rounding
5500 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
James Molloy0ffb0932014-09-15 11:25:38 +00005501 }
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005502
5503 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
5504 // is not defined for the M-profile.
Bradley Smithf4affc12016-03-03 13:52:22 +00005505 // NOTE that the default profile is assumed to be 'A'
5506 if (CPUProfile.empty() || ArchProfile != llvm::ARM::PK_M)
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005507 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
5508
Bradley Smithf4affc12016-03-03 13:52:22 +00005509 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supports the original
5510 // Thumb ISA (including v6-M and v8-M Baseline). It is set to 2 if the
5511 // core supports the Thumb-2 ISA as found in the v6T2 architecture and all
5512 // v7 and v8 architectures excluding v8-M Baseline.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005513 if (supportsThumb2())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005514 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005515 else if (supportsThumb())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005516 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
5517
5518 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
5519 // instruction set such as ARM or Thumb.
5520 Builder.defineMacro("__ARM_32BIT_STATE", "1");
5521
5522 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
5523
5524 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005525 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005526 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00005527
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005528 // ACLE 6.4.3 Unaligned access supported in hardware
Eric Christopherb093d692015-10-09 18:39:59 +00005529 if (Unaligned)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005530 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Eric Christopherb093d692015-10-09 18:39:59 +00005531
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005532 // ACLE 6.4.4 LDREX/STREX
5533 if (LDREX)
5534 Builder.defineMacro("__ARM_FEATURE_LDREX", "0x" + llvm::utohexstr(LDREX));
5535
5536 // ACLE 6.4.5 CLZ
Eric Christopherb093d692015-10-09 18:39:59 +00005537 if (ArchVersion == 5 ||
5538 (ArchVersion == 6 && CPUProfile != "M") ||
5539 ArchVersion > 6)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005540 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
5541
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005542 // ACLE 6.5.1 Hardware Floating Point
5543 if (HW_FP)
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +00005544 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005545
Yi Konga44c4d72014-06-27 21:25:42 +00005546 // ACLE predefines.
5547 Builder.defineMacro("__ARM_ACLE", "200");
5548
Oliver Stannarddc2854c2015-09-03 12:40:58 +00005549 // FP16 support (we currently only support IEEE format).
5550 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
5551 Builder.defineMacro("__ARM_FP16_ARGS", "1");
5552
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005553 // ACLE 6.5.3 Fused multiply-accumulate (FMA)
Silviu Baranga632fdc52016-04-28 11:29:08 +00005554 if (ArchVersion >= 7 && (FPU & VFP4FPU))
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005555 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
5556
Mike Stump9d54bd72009-04-08 02:07:04 +00005557 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005558
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005559 // FIXME: It's more complicated than this and we don't really support
5560 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005561 // Windows on ARM does not "support" interworking
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005562 if (5 <= ArchVersion && ArchVersion <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005563 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005564
David Tweed8f676532012-10-25 13:33:01 +00005565 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00005566 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005567 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
Tim Northover862eaf82016-05-13 21:26:45 +00005568 if (!getTriple().isOSBinFormatMachO() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00005569 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005570 Builder.defineMacro("__ARM_PCS", "1");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005571 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005572
Tim Northover28fc0e12016-04-28 13:59:55 +00005573 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp" ||
5574 ABI == "aapcs16")
5575 Builder.defineMacro("__ARM_PCS_VFP", "1");
5576
Daniel Dunbar893d4752009-12-19 04:15:38 +00005577 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005578 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005579
Zijiao Ma56a83722016-08-17 02:13:33 +00005580 if (ArchKind == llvm::ARM::AK_XSCALE)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005581 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005582
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005583 if (isThumb()) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005584 Builder.defineMacro("__THUMBEL__");
5585 Builder.defineMacro("__thumb__");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005586 if (supportsThumb2())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005587 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005588 }
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005589
5590 // ACLE 6.4.9 32-bit SIMD instructions
5591 if (ArchVersion >= 6 && (CPUProfile != "M" || CPUAttr == "7EM"))
5592 Builder.defineMacro("__ARM_FEATURE_SIMD32", "1");
5593
5594 // ACLE 6.4.10 Hardware Integer Divide
Eric Christopherb093d692015-10-09 18:39:59 +00005595 if (((HWDiv & HWDivThumb) && isThumb()) ||
5596 ((HWDiv & HWDivARM) && !isThumb())) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005597 Builder.defineMacro("__ARM_FEATURE_IDIV", "1");
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005598 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005599 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005600
5601 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005602 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005603
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005604 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005605 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005606 if (FPU & VFP2FPU)
5607 Builder.defineMacro("__ARM_VFPV2__");
5608 if (FPU & VFP3FPU)
5609 Builder.defineMacro("__ARM_VFPV3__");
5610 if (FPU & VFP4FPU)
5611 Builder.defineMacro("__ARM_VFPV4__");
Tim Northoverc67803f2016-12-21 20:49:43 +00005612 if (FPU & FPARMV8)
5613 Builder.defineMacro("__ARM_FPV5__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005614 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00005615
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005616 // This only gets set when Neon instructions are actually available, unlike
5617 // the VFP define, hence the soft float and arch check. This is subtly
5618 // different from gcc, we follow the intent which was that it should be set
5619 // when Neon instructions are actually available.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005620 if ((FPU & NeonFPU) && !SoftFloat && ArchVersion >= 7) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005621 Builder.defineMacro("__ARM_NEON", "1");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005622 Builder.defineMacro("__ARM_NEON__");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005623 // current AArch32 NEON implementations do not support double-precision
5624 // floating-point even when it is present in VFP.
Eric Christopherb093d692015-10-09 18:39:59 +00005625 Builder.defineMacro("__ARM_NEON_FP",
5626 "0x" + llvm::utohexstr(HW_FP & ~HW_FP_DP));
Tim Northover5bb34ca2013-11-21 12:36:34 +00005627 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00005628
Bradley Smith0f28f0c2014-01-20 10:52:00 +00005629 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
5630 Opts.ShortWChar ? "2" : "4");
5631
5632 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5633 Opts.ShortEnums ? "1" : "4");
5634
Bradley Smithf4affc12016-03-03 13:52:22 +00005635 if (ArchVersion >= 6 && CPUAttr != "6M" && CPUAttr != "8M_BASE") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00005636 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5637 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5638 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5639 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
5640 }
Sergey Dmitrouk745f5302014-11-25 08:57:36 +00005641
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005642 // ACLE 6.4.7 DSP instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005643 if (DSP) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005644 Builder.defineMacro("__ARM_FEATURE_DSP", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005645 }
5646
5647 // ACLE 6.4.8 Saturation instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005648 bool SAT = false;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005649 if ((ArchVersion == 6 && CPUProfile != "M") || ArchVersion > 6 ) {
5650 Builder.defineMacro("__ARM_FEATURE_SAT", "1");
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005651 SAT = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005652 }
5653
5654 // ACLE 6.4.6 Q (saturation) flag
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005655 if (DSP || SAT)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005656 Builder.defineMacro("__ARM_FEATURE_QBIT", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005657
5658 if (Opts.UnsafeFPMath)
5659 Builder.defineMacro("__ARM_FP_FAST", "1");
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005660
5661 if (ArchKind == llvm::ARM::AK_ARMV8_1A)
5662 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
Chris Lattner17df24e2008-04-21 18:56:49 +00005663 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005664
Craig Topper6c03a542015-10-19 04:51:35 +00005665 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5666 return llvm::makeArrayRef(BuiltinInfo,
5667 clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner17df24e2008-04-21 18:56:49 +00005668 }
Craig Topper3164f332014-03-11 03:39:26 +00005669 bool isCLZForZeroUndef() const override { return false; }
5670 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northover5627d392015-10-30 16:30:45 +00005671 return IsAAPCS
5672 ? AAPCSABIBuiltinVaList
Tim Northoverd88ecb32016-01-27 19:32:40 +00005673 : (getTriple().isWatchABI() ? TargetInfo::CharPtrBuiltinVaList
5674 : TargetInfo::VoidPtrBuiltinVaList);
Chris Lattner17df24e2008-04-21 18:56:49 +00005675 }
Craig Topperf054e3a2015-10-19 03:52:27 +00005676 ArrayRef<const char *> getGCCRegNames() const override;
5677 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00005678 bool validateAsmConstraint(const char *&Name,
5679 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00005680 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00005681 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00005682 case 'l': // r0-r7
5683 case 'h': // r8-r15
JF Bastien750caef2016-02-19 06:54:45 +00005684 case 't': // VFP Floating point register single precision
5685 case 'w': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00005686 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00005687 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005688 case 'I':
5689 case 'J':
5690 case 'K':
5691 case 'L':
5692 case 'M':
5693 // FIXME
5694 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00005695 case 'Q': // A memory address that is a single base register.
5696 Info.setAllowsMemory();
5697 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005698 case 'U': // a memory reference...
5699 switch (Name[1]) {
5700 case 'q': // ...ARMV4 ldrsb
5701 case 'v': // ...VFP load/store (reg+constant offset)
5702 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00005703 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00005704 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00005705 case 'n': // valid address for Neon doubleword vector load/store
5706 case 'm': // valid address for Neon element and structure load/store
5707 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00005708 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005709 Info.setAllowsMemory();
5710 Name++;
5711 return true;
5712 }
Nate Begeman2908fa02008-04-22 05:03:19 +00005713 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005714 return false;
5715 }
Craig Topper3164f332014-03-11 03:39:26 +00005716 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005717 std::string R;
5718 switch (*Constraint) {
5719 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00005720 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005721 Constraint++;
5722 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00005723 case 'p': // 'p' should be translated to 'r' by default.
5724 R = std::string("r");
5725 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005726 default:
5727 return std::string(1, *Constraint);
5728 }
5729 return R;
5730 }
Akira Hatanaka987f1862014-08-22 06:05:21 +00005731 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005732 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005733 std::string &SuggestedModifier) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00005734 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00005735 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00005736
Bill Wendling9d1ee112012-10-25 23:28:48 +00005737 // Strip off constraint modifiers.
5738 while (Constraint[0] == '=' ||
5739 Constraint[0] == '+' ||
5740 Constraint[0] == '&')
5741 Constraint = Constraint.substr(1);
5742
5743 switch (Constraint[0]) {
5744 default: break;
5745 case 'r': {
5746 switch (Modifier) {
5747 default:
Tim Northover8f24b172013-12-08 15:24:55 +00005748 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00005749 case 'q':
5750 // A register of size 32 cannot fit a vector type.
5751 return false;
5752 }
5753 }
5754 }
5755
5756 return true;
5757 }
Craig Topper3164f332014-03-11 03:39:26 +00005758 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00005759 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00005760 return "";
5761 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005762
Craig Topper3164f332014-03-11 03:39:26 +00005763 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00005764 switch (CC) {
5765 case CC_AAPCS:
5766 case CC_AAPCS_VFP:
5767 case CC_Swift:
5768 return CCCR_OK;
5769 default:
5770 return CCCR_Warning;
5771 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005772 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00005773
Craig Topper3164f332014-03-11 03:39:26 +00005774 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00005775 if (RegNo == 0) return 0;
5776 if (RegNo == 1) return 1;
5777 return -1;
5778 }
Matthias Braund1e2fad2015-07-17 00:15:22 +00005779
5780 bool hasSjLjLowering() const override {
5781 return true;
5782 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005783};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005784
Rafael Espindolaeb265472013-08-21 21:59:03 +00005785bool ARMTargetInfo::setFPMath(StringRef Name) {
5786 if (Name == "neon") {
5787 FPMath = FP_Neon;
5788 return true;
5789 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
5790 Name == "vfp4") {
5791 FPMath = FP_VFP;
5792 return true;
5793 }
5794 return false;
5795}
5796
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005797const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005798 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005799 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005800 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
5801
5802 // Float registers
5803 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
5804 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
5805 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005806 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005807
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005808 // Double registers
5809 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
5810 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005811 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
5812 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005813
5814 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005815 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
5816 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005817};
5818
Craig Topperf054e3a2015-10-19 03:52:27 +00005819ArrayRef<const char *> ARMTargetInfo::getGCCRegNames() const {
5820 return llvm::makeArrayRef(GCCRegNames);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005821}
5822
5823const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005824 { { "a1" }, "r0" },
5825 { { "a2" }, "r1" },
5826 { { "a3" }, "r2" },
5827 { { "a4" }, "r3" },
5828 { { "v1" }, "r4" },
5829 { { "v2" }, "r5" },
5830 { { "v3" }, "r6" },
5831 { { "v4" }, "r7" },
5832 { { "v5" }, "r8" },
5833 { { "v6", "rfp" }, "r9" },
5834 { { "sl" }, "r10" },
5835 { { "fp" }, "r11" },
5836 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00005837 { { "r13" }, "sp" },
5838 { { "r14" }, "lr" },
5839 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005840 // The S, D and Q registers overlap, but aren't really aliases; we
5841 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005842};
5843
Craig Topperf054e3a2015-10-19 03:52:27 +00005844ArrayRef<TargetInfo::GCCRegAlias> ARMTargetInfo::getGCCRegAliases() const {
5845 return llvm::makeArrayRef(GCCRegAliases);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005846}
Chris Lattner5cc15e02010-03-03 19:03:45 +00005847
5848const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00005849#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005850 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005851#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5852 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00005853#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00005854
Craig Topper07d3b622015-08-07 05:14:44 +00005855#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005856 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005857#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005858 { #ID, TYPE, ATTRS, nullptr, LANG, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005859#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5860 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Albert Gutowski2a0621e2016-10-12 22:01:05 +00005861#define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANGS, FEATURE) \
5862 { #ID, TYPE, ATTRS, HEADER, LANGS, FEATURE },
Chris Lattner5cc15e02010-03-03 19:03:45 +00005863#include "clang/Basic/BuiltinsARM.def"
5864};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005865
5866class ARMleTargetInfo : public ARMTargetInfo {
5867public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005868 ARMleTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Matt Arsenaultf333de32016-09-07 07:08:02 +00005869 : ARMTargetInfo(Triple, Opts) {}
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005870 void getTargetDefines(const LangOptions &Opts,
5871 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005872 Builder.defineMacro("__ARMEL__");
5873 ARMTargetInfo::getTargetDefines(Opts, Builder);
5874 }
5875};
5876
5877class ARMbeTargetInfo : public ARMTargetInfo {
5878public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005879 ARMbeTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Matt Arsenaultf333de32016-09-07 07:08:02 +00005880 : ARMTargetInfo(Triple, Opts) {}
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005881 void getTargetDefines(const LangOptions &Opts,
5882 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005883 Builder.defineMacro("__ARMEB__");
5884 Builder.defineMacro("__ARM_BIG_ENDIAN");
5885 ARMTargetInfo::getTargetDefines(Opts, Builder);
5886 }
5887};
Chris Lattner17df24e2008-04-21 18:56:49 +00005888
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005889class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
5890 const llvm::Triple Triple;
5891public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005892 WindowsARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5893 : WindowsTargetInfo<ARMleTargetInfo>(Triple, Opts), Triple(Triple) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005894 WCharType = UnsignedShort;
5895 SizeType = UnsignedInt;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005896 }
5897 void getVisualStudioDefines(const LangOptions &Opts,
5898 MacroBuilder &Builder) const {
5899 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
5900
5901 // FIXME: this is invalid for WindowsCE
5902 Builder.defineMacro("_M_ARM_NT", "1");
5903 Builder.defineMacro("_M_ARMT", "_M_ARM");
5904 Builder.defineMacro("_M_THUMB", "_M_ARM");
5905
5906 assert((Triple.getArch() == llvm::Triple::arm ||
5907 Triple.getArch() == llvm::Triple::thumb) &&
5908 "invalid architecture for Windows ARM target info");
5909 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
5910 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
5911
5912 // TODO map the complete set of values
5913 // 31: VFPv3 40: VFPv4
5914 Builder.defineMacro("_M_ARM_FP", "31");
5915 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00005916 BuiltinVaListKind getBuiltinVaListKind() const override {
5917 return TargetInfo::CharPtrBuiltinVaList;
5918 }
Martell Malone7ccda3c2015-08-14 18:00:09 +00005919 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5920 switch (CC) {
5921 case CC_X86StdCall:
5922 case CC_X86ThisCall:
5923 case CC_X86FastCall:
5924 case CC_X86VectorCall:
5925 return CCCR_Ignore;
5926 case CC_C:
5927 return CCCR_OK;
5928 default:
5929 return CCCR_Warning;
5930 }
5931 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005932};
5933
5934// Windows ARM + Itanium C++ ABI Target
5935class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
5936public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005937 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple,
5938 const TargetOptions &Opts)
5939 : WindowsARMTargetInfo(Triple, Opts) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005940 TheCXXABI.set(TargetCXXABI::GenericARM);
5941 }
5942
5943 void getTargetDefines(const LangOptions &Opts,
5944 MacroBuilder &Builder) const override {
5945 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5946
5947 if (Opts.MSVCCompat)
5948 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5949 }
5950};
5951
5952// Windows ARM, MS (C++) ABI
5953class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
5954public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005955 MicrosoftARMleTargetInfo(const llvm::Triple &Triple,
5956 const TargetOptions &Opts)
5957 : WindowsARMTargetInfo(Triple, Opts) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005958 TheCXXABI.set(TargetCXXABI::Microsoft);
5959 }
5960
5961 void getTargetDefines(const LangOptions &Opts,
5962 MacroBuilder &Builder) const override {
5963 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5964 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5965 }
5966};
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005967
Yaron Keren321249c2015-07-15 13:32:23 +00005968// ARM MinGW target
5969class MinGWARMTargetInfo : public WindowsARMTargetInfo {
5970public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005971 MinGWARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5972 : WindowsARMTargetInfo(Triple, Opts) {
Yaron Keren321249c2015-07-15 13:32:23 +00005973 TheCXXABI.set(TargetCXXABI::GenericARM);
5974 }
5975
5976 void getTargetDefines(const LangOptions &Opts,
5977 MacroBuilder &Builder) const override {
5978 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5979 DefineStd(Builder, "WIN32", Opts);
5980 DefineStd(Builder, "WINNT", Opts);
5981 Builder.defineMacro("_ARM_");
5982 addMinGWDefines(Opts, Builder);
5983 }
5984};
5985
5986// ARM Cygwin target
5987class CygwinARMTargetInfo : public ARMleTargetInfo {
5988public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005989 CygwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5990 : ARMleTargetInfo(Triple, Opts) {
Yaron Keren321249c2015-07-15 13:32:23 +00005991 TLSSupported = false;
5992 WCharType = UnsignedShort;
5993 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00005994 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Yaron Keren321249c2015-07-15 13:32:23 +00005995 }
5996 void getTargetDefines(const LangOptions &Opts,
5997 MacroBuilder &Builder) const override {
5998 ARMleTargetInfo::getTargetDefines(Opts, Builder);
5999 Builder.defineMacro("_ARM_");
6000 Builder.defineMacro("__CYGWIN__");
6001 Builder.defineMacro("__CYGWIN32__");
Saleem Abdulrasool56027092017-02-07 19:00:06 +00006002 DefineStd(Builder, "unix", Opts);
Yaron Keren321249c2015-07-15 13:32:23 +00006003 if (Opts.CPlusPlus)
6004 Builder.defineMacro("_GNU_SOURCE");
6005 }
6006};
6007
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006008class DarwinARMTargetInfo : public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00006009protected:
Craig Topper3164f332014-03-11 03:39:26 +00006010 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
6011 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00006012 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00006013 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00006014
Torok Edwinb2b37c62009-06-30 17:10:35 +00006015public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006016 DarwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6017 : DarwinTargetInfo<ARMleTargetInfo>(Triple, Opts) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00006018 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00006019 // iOS always has 64-bit atomic instructions.
Eric Christopher917e9522014-11-18 22:36:15 +00006020 // FIXME: This should be based off of the target features in
6021 // ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00006022 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00006023
Tim Northoverd88ecb32016-01-27 19:32:40 +00006024 if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00006025 // Darwin on iOS uses a variant of the ARM C++ ABI.
6026 TheCXXABI.set(TargetCXXABI::WatchOS);
6027
6028 // The 32-bit ABI is silent on what ptrdiff_t should be, but given that
6029 // size_t is long, it's a bit weird for it to be int.
6030 PtrDiffType = SignedLong;
6031
6032 // BOOL should be a real boolean on the new ABI
6033 UseSignedCharForObjCBool = false;
6034 } else
6035 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00006036 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00006037};
Eli Friedmanf05b7722008-08-20 07:44:10 +00006038
Tim Northover573cbee2014-05-24 12:52:07 +00006039class AArch64TargetInfo : public TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00006040 virtual void setDataLayout() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00006041 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6042 static const char *const GCCRegNames[];
6043
James Molloy75f5f9e2014-04-16 15:33:48 +00006044 enum FPUModeEnum {
6045 FPUMode,
6046 NeonMode
6047 };
6048
6049 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00006050 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00006051 unsigned Crypto;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006052 unsigned Unaligned;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00006053 unsigned V8_1A;
James Molloy75f5f9e2014-04-16 15:33:48 +00006054
Tim Northovera2ee4332014-03-29 15:09:45 +00006055 static const Builtin::Info BuiltinInfo[];
6056
6057 std::string ABI;
6058
6059public:
Saleem Abdulrasool9b5ba542016-04-10 03:19:47 +00006060 AArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Tim Northovera2ee4332014-03-29 15:09:45 +00006061 : TargetInfo(Triple), ABI("aapcs") {
Brad Smith9aa2bf22017-02-21 23:13:09 +00006062 if (getTriple().getOS() == llvm::Triple::NetBSD ||
6063 getTriple().getOS() == llvm::Triple::OpenBSD) {
Tim Northover25e8a672014-05-24 12:51:25 +00006064 WCharType = SignedInt;
6065
6066 // NetBSD apparently prefers consistency across ARM targets to consistency
6067 // across 64-bit targets.
6068 Int64Type = SignedLongLong;
6069 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00006070 } else {
6071 WCharType = UnsignedInt;
6072 Int64Type = SignedLong;
6073 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00006074 }
6075
Tim Northovera2ee4332014-03-29 15:09:45 +00006076 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00006077 MaxVectorAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00006078 MaxAtomicInlineWidth = 128;
6079 MaxAtomicPromoteWidth = 128;
6080
Tim Northovera6a19f12015-02-06 01:25:07 +00006081 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 128;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00006082 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Tim Northovera2ee4332014-03-29 15:09:45 +00006083
Tim Northovera2ee4332014-03-29 15:09:45 +00006084 // {} in inline assembly are neon specifiers, not assembly variant
6085 // specifiers.
6086 NoAsmVariants = true;
6087
Tim Northover7ad87af2015-01-16 18:44:04 +00006088 // AAPCS gives rules for bitfields. 7.1.7 says: "The container type
6089 // contributes to the alignment of the containing aggregate in the same way
6090 // a plain (non bit-field) member of that type would, without exception for
6091 // zero-sized or anonymous bit-fields."
Tim Northover5627d392015-10-30 16:30:45 +00006092 assert(UseBitFieldTypeAlignment && "bitfields affect type alignment");
Tim Northover7ad87af2015-01-16 18:44:04 +00006093 UseZeroLengthBitfieldAlignment = true;
6094
Tim Northover573cbee2014-05-24 12:52:07 +00006095 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00006096 TheCXXABI.set(TargetCXXABI::GenericAArch64);
Saleem Abdulrasoolc066d9c2016-04-12 03:05:03 +00006097
Eric Christopherfb834a82017-02-28 17:22:05 +00006098 if (Triple.getOS() == llvm::Triple::Linux)
6099 this->MCountName = "\01_mcount";
6100 else if (Triple.getOS() == llvm::Triple::UnknownOS)
Saleem Abdulrasoolc066d9c2016-04-12 03:05:03 +00006101 this->MCountName = Opts.EABIVersion == "gnu" ? "\01_mcount" : "mcount";
Tim Northovera2ee4332014-03-29 15:09:45 +00006102 }
6103
Alp Toker4925ba72014-06-07 23:30:42 +00006104 StringRef getABI() const override { return ABI; }
David Blaikie1cbb9712014-11-14 19:09:44 +00006105 bool setABI(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006106 if (Name != "aapcs" && Name != "darwinpcs")
6107 return false;
6108
6109 ABI = Name;
6110 return true;
6111 }
6112
David Blaikie1cbb9712014-11-14 19:09:44 +00006113 bool setCPU(const std::string &Name) override {
Zijiao Ma33e95212016-07-28 06:24:48 +00006114 return Name == "generic" ||
6115 llvm::AArch64::parseCPUArch(Name) !=
6116 static_cast<unsigned>(llvm::AArch64::ArchKind::AK_INVALID);
Tim Northovera2ee4332014-03-29 15:09:45 +00006117 }
6118
Alexander Kornienko34eb2072015-04-11 02:00:23 +00006119 void getTargetDefines(const LangOptions &Opts,
6120 MacroBuilder &Builder) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006121 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00006122 Builder.defineMacro("__aarch64__");
Oliver Stannard233310f2017-04-18 13:12:36 +00006123 // For bare-metal none-eabi.
6124 if (getTriple().getOS() == llvm::Triple::UnknownOS &&
6125 (getTriple().getEnvironment() == llvm::Triple::EABI ||
6126 getTriple().getEnvironment() == llvm::Triple::EABIHF))
6127 Builder.defineMacro("__ELF__");
Tim Northovera2ee4332014-03-29 15:09:45 +00006128
6129 // Target properties.
6130 Builder.defineMacro("_LP64");
6131 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00006132
6133 // ACLE predefines. Many can only have one possible value on v8 AArch64.
6134 Builder.defineMacro("__ARM_ACLE", "200");
6135 Builder.defineMacro("__ARM_ARCH", "8");
6136 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
6137
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006138 Builder.defineMacro("__ARM_64BIT_STATE", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00006139 Builder.defineMacro("__ARM_PCS_AAPCS64", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006140 Builder.defineMacro("__ARM_ARCH_ISA_A64", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00006141
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006142 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
6143 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
6144 Builder.defineMacro("__ARM_FEATURE_LDREX", "0xF");
6145 Builder.defineMacro("__ARM_FEATURE_IDIV", "1"); // As specified in ACLE
James Molloy0ffb0932014-09-15 11:25:38 +00006146 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006147 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
6148 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00006149
6150 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
6151
6152 // 0xe implies support for half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006153 Builder.defineMacro("__ARM_FP", "0xE");
Tim Northovera2ee4332014-03-29 15:09:45 +00006154
6155 // PCS specifies this for SysV variants, which is all we support. Other ABIs
6156 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006157 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
6158 Builder.defineMacro("__ARM_FP16_ARGS", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00006159
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00006160 if (Opts.UnsafeFPMath)
6161 Builder.defineMacro("__ARM_FP_FAST", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00006162
6163 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
6164
6165 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
6166 Opts.ShortEnums ? "1" : "4");
6167
James Molloy75f5f9e2014-04-16 15:33:48 +00006168 if (FPU == NeonMode) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006169 Builder.defineMacro("__ARM_NEON", "1");
James Molloy75f5f9e2014-04-16 15:33:48 +00006170 // 64-bit NEON supports half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006171 Builder.defineMacro("__ARM_NEON_FP", "0xE");
James Molloy75f5f9e2014-04-16 15:33:48 +00006172 }
Tim Northovera2ee4332014-03-29 15:09:45 +00006173
Bradley Smith418c5932014-05-02 15:17:51 +00006174 if (CRC)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006175 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
Bradley Smith418c5932014-05-02 15:17:51 +00006176
James Molloy75f5f9e2014-04-16 15:33:48 +00006177 if (Crypto)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006178 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
6179
6180 if (Unaligned)
6181 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Reid Klecknerd167d422015-05-06 15:31:46 +00006182
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00006183 if (V8_1A)
6184 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
6185
Reid Klecknerd167d422015-05-06 15:31:46 +00006186 // All of the __sync_(bool|val)_compare_and_swap_(1|2|4|8) builtins work.
6187 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
6188 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
6189 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
6190 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Tim Northovera2ee4332014-03-29 15:09:45 +00006191 }
6192
Craig Topper6c03a542015-10-19 04:51:35 +00006193 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6194 return llvm::makeArrayRef(BuiltinInfo,
6195 clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin);
Tim Northovera2ee4332014-03-29 15:09:45 +00006196 }
6197
David Blaikie1cbb9712014-11-14 19:09:44 +00006198 bool hasFeature(StringRef Feature) const override {
James Molloy75f5f9e2014-04-16 15:33:48 +00006199 return Feature == "aarch64" ||
6200 Feature == "arm64" ||
Ben Langmuir587aeaf2015-08-07 01:59:56 +00006201 Feature == "arm" ||
James Molloy75f5f9e2014-04-16 15:33:48 +00006202 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00006203 }
6204
James Molloy5e73df52014-04-16 15:06:20 +00006205 bool handleTargetFeatures(std::vector<std::string> &Features,
6206 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00006207 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00006208 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00006209 Crypto = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006210 Unaligned = 1;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00006211 V8_1A = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006212
Eric Christopher610fe112015-08-26 08:21:55 +00006213 for (const auto &Feature : Features) {
6214 if (Feature == "+neon")
James Molloy75f5f9e2014-04-16 15:33:48 +00006215 FPU = NeonMode;
Eric Christopher610fe112015-08-26 08:21:55 +00006216 if (Feature == "+crc")
Bradley Smith418c5932014-05-02 15:17:51 +00006217 CRC = 1;
Eric Christopher610fe112015-08-26 08:21:55 +00006218 if (Feature == "+crypto")
James Molloy75f5f9e2014-04-16 15:33:48 +00006219 Crypto = 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006220 if (Feature == "+strict-align")
6221 Unaligned = 0;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00006222 if (Feature == "+v8.1a")
6223 V8_1A = 1;
James Molloy75f5f9e2014-04-16 15:33:48 +00006224 }
6225
James Y Knightb214cbc2016-03-04 19:00:41 +00006226 setDataLayout();
James Molloy5e73df52014-04-16 15:06:20 +00006227
6228 return true;
6229 }
6230
John McCall477f2bb2016-03-03 06:39:32 +00006231 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
6232 switch (CC) {
6233 case CC_C:
6234 case CC_Swift:
Roman Levenstein35aa5ce2016-03-16 18:00:46 +00006235 case CC_PreserveMost:
6236 case CC_PreserveAll:
John McCall477f2bb2016-03-03 06:39:32 +00006237 return CCCR_OK;
6238 default:
6239 return CCCR_Warning;
6240 }
6241 }
6242
David Blaikie1cbb9712014-11-14 19:09:44 +00006243 bool isCLZForZeroUndef() const override { return false; }
Tim Northovera2ee4332014-03-29 15:09:45 +00006244
David Blaikie1cbb9712014-11-14 19:09:44 +00006245 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006246 return TargetInfo::AArch64ABIBuiltinVaList;
6247 }
6248
Craig Topperf054e3a2015-10-19 03:52:27 +00006249 ArrayRef<const char *> getGCCRegNames() const override;
6250 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00006251
Alexander Kornienko34eb2072015-04-11 02:00:23 +00006252 bool validateAsmConstraint(const char *&Name,
6253 TargetInfo::ConstraintInfo &Info) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006254 switch (*Name) {
6255 default:
6256 return false;
6257 case 'w': // Floating point and SIMD registers (V0-V31)
6258 Info.setAllowsRegister();
6259 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00006260 case 'I': // Constant that can be used with an ADD instruction
6261 case 'J': // Constant that can be used with a SUB instruction
6262 case 'K': // Constant that can be used with a 32-bit logical instruction
6263 case 'L': // Constant that can be used with a 64-bit logical instruction
6264 case 'M': // Constant that can be used as a 32-bit MOV immediate
6265 case 'N': // Constant that can be used as a 64-bit MOV immediate
6266 case 'Y': // Floating point constant zero
6267 case 'Z': // Integer constant zero
6268 return true;
6269 case 'Q': // A memory reference with base register and no offset
6270 Info.setAllowsMemory();
6271 return true;
6272 case 'S': // A symbolic address
6273 Info.setAllowsRegister();
6274 return true;
6275 case 'U':
Eric Christopher917e9522014-11-18 22:36:15 +00006276 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
6277 // Utf: A memory address suitable for ldp/stp in TF mode.
6278 // Usa: An absolute symbolic address.
6279 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
6280 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
Tim Northovera2ee4332014-03-29 15:09:45 +00006281 case 'z': // Zero register, wzr or xzr
6282 Info.setAllowsRegister();
6283 return true;
6284 case 'x': // Floating point and SIMD registers (V0-V15)
6285 Info.setAllowsRegister();
6286 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00006287 }
6288 return false;
6289 }
6290
Akira Hatanaka987f1862014-08-22 06:05:21 +00006291 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00006292 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00006293 std::string &SuggestedModifier) const override {
James Molloy8a157bf2014-07-25 10:19:47 +00006294 // Strip off constraint modifiers.
6295 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
6296 Constraint = Constraint.substr(1);
6297
6298 switch (Constraint[0]) {
6299 default:
6300 return true;
6301 case 'z':
6302 case 'r': {
6303 switch (Modifier) {
6304 case 'x':
6305 case 'w':
6306 // For now assume that the person knows what they're
6307 // doing with the modifier.
6308 return true;
6309 default:
6310 // By default an 'r' constraint will be in the 'x'
6311 // registers.
Akira Hatanaka987f1862014-08-22 06:05:21 +00006312 if (Size == 64)
6313 return true;
6314
6315 SuggestedModifier = "w";
6316 return false;
James Molloy8a157bf2014-07-25 10:19:47 +00006317 }
6318 }
6319 }
6320 }
6321
David Blaikie1cbb9712014-11-14 19:09:44 +00006322 const char *getClobbers() const override { return ""; }
Tim Northovera2ee4332014-03-29 15:09:45 +00006323
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00006324 int getEHDataRegisterNumber(unsigned RegNo) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006325 if (RegNo == 0)
6326 return 0;
6327 if (RegNo == 1)
6328 return 1;
6329 return -1;
6330 }
6331};
6332
Tim Northover573cbee2014-05-24 12:52:07 +00006333const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00006334 // 32-bit Integer registers
6335 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
6336 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
6337 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
6338
6339 // 64-bit Integer registers
6340 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
6341 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
6342 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
6343
6344 // 32-bit floating point regsisters
6345 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
6346 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
6347 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
6348
6349 // 64-bit floating point regsisters
6350 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
6351 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
6352 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
6353
6354 // Vector registers
6355 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
6356 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
6357 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
6358};
6359
Craig Topperf054e3a2015-10-19 03:52:27 +00006360ArrayRef<const char *> AArch64TargetInfo::getGCCRegNames() const {
6361 return llvm::makeArrayRef(GCCRegNames);
Tim Northovera2ee4332014-03-29 15:09:45 +00006362}
6363
Tim Northover573cbee2014-05-24 12:52:07 +00006364const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00006365 { { "w31" }, "wsp" },
6366 { { "x29" }, "fp" },
6367 { { "x30" }, "lr" },
6368 { { "x31" }, "sp" },
6369 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
6370 // don't want to substitute one of these for a different-sized one.
6371};
6372
Craig Topperf054e3a2015-10-19 03:52:27 +00006373ArrayRef<TargetInfo::GCCRegAlias> AArch64TargetInfo::getGCCRegAliases() const {
6374 return llvm::makeArrayRef(GCCRegAliases);
Tim Northovera2ee4332014-03-29 15:09:45 +00006375}
6376
Tim Northover573cbee2014-05-24 12:52:07 +00006377const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00006378#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006379 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00006380#include "clang/Basic/BuiltinsNEON.def"
6381
6382#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006383 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northover573cbee2014-05-24 12:52:07 +00006384#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00006385};
James Molloy5e73df52014-04-16 15:06:20 +00006386
Tim Northover573cbee2014-05-24 12:52:07 +00006387class AArch64leTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00006388 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00006389 if (getTriple().isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00006390 resetDataLayout("e-m:o-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006391 else
Chad Rosier4c077aa2016-07-07 20:02:25 +00006392 resetDataLayout("e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006393 }
6394
6395public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006396 AArch64leTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6397 : AArch64TargetInfo(Triple, Opts) {
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006398 }
James Molloy5e73df52014-04-16 15:06:20 +00006399 void getTargetDefines(const LangOptions &Opts,
6400 MacroBuilder &Builder) const override {
6401 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00006402 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00006403 }
6404};
6405
Tim Northover573cbee2014-05-24 12:52:07 +00006406class AArch64beTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00006407 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00006408 assert(!getTriple().isOSBinFormatMachO());
Chad Rosier4c077aa2016-07-07 20:02:25 +00006409 resetDataLayout("E-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006410 }
6411
6412public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006413 AArch64beTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6414 : AArch64TargetInfo(Triple, Opts) {}
James Molloy5e73df52014-04-16 15:06:20 +00006415 void getTargetDefines(const LangOptions &Opts,
6416 MacroBuilder &Builder) const override {
6417 Builder.defineMacro("__AARCH64EB__");
6418 Builder.defineMacro("__AARCH_BIG_ENDIAN");
6419 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00006420 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00006421 }
6422};
Tim Northovera2ee4332014-03-29 15:09:45 +00006423
Tim Northover573cbee2014-05-24 12:52:07 +00006424class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00006425protected:
6426 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
6427 MacroBuilder &Builder) const override {
6428 Builder.defineMacro("__AARCH64_SIMD__");
6429 Builder.defineMacro("__ARM64_ARCH_8__");
6430 Builder.defineMacro("__ARM_NEON__");
6431 Builder.defineMacro("__LITTLE_ENDIAN__");
6432 Builder.defineMacro("__REGISTER_PREFIX__", "");
6433 Builder.defineMacro("__arm64", "1");
6434 Builder.defineMacro("__arm64__", "1");
6435
6436 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
6437 }
6438
Tim Northovera2ee4332014-03-29 15:09:45 +00006439public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006440 DarwinAArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6441 : DarwinTargetInfo<AArch64leTargetInfo>(Triple, Opts) {
Tim Northovera2ee4332014-03-29 15:09:45 +00006442 Int64Type = SignedLongLong;
6443 WCharType = SignedInt;
6444 UseSignedCharForObjCBool = false;
6445
Tim Northovera6a19f12015-02-06 01:25:07 +00006446 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00006447 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Tim Northovera2ee4332014-03-29 15:09:45 +00006448
6449 TheCXXABI.set(TargetCXXABI::iOS64);
6450 }
6451
David Blaikie1cbb9712014-11-14 19:09:44 +00006452 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006453 return TargetInfo::CharPtrBuiltinVaList;
6454 }
6455};
Tim Northovera2ee4332014-03-29 15:09:45 +00006456
Tony Linthicum76329bf2011-12-12 21:14:55 +00006457// Hexagon abstract base class
6458class HexagonTargetInfo : public TargetInfo {
6459 static const Builtin::Info BuiltinInfo[];
6460 static const char * const GCCRegNames[];
6461 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6462 std::string CPU;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006463 bool HasHVX, HasHVXDouble;
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006464 bool UseLongCalls;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006465
Tony Linthicum76329bf2011-12-12 21:14:55 +00006466public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006467 HexagonTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6468 : TargetInfo(Triple) {
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00006469 // Specify the vector alignment explicitly. For v512x1, the calculated
6470 // alignment would be 512*alignment(i1), which is 512 bytes, instead of
6471 // the required minimum of 64 bytes.
James Y Knightb214cbc2016-03-04 19:00:41 +00006472 resetDataLayout("e-m:e-p:32:32:32-a:0-n16:32-"
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00006473 "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 +00006474 "v32:32:32-v64:64:64-v512:512:512-v1024:1024:1024-v2048:2048:2048");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006475 SizeType = UnsignedInt;
6476 PtrDiffType = SignedInt;
6477 IntPtrType = SignedInt;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006478
6479 // {} in inline assembly are packet specifiers, not assembly variant
6480 // specifiers.
6481 NoAsmVariants = true;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006482
6483 LargeArrayMinWidth = 64;
6484 LargeArrayAlign = 64;
6485 UseBitFieldTypeAlignment = true;
6486 ZeroLengthBitfieldBoundary = 32;
6487 HasHVX = HasHVXDouble = false;
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006488 UseLongCalls = false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006489 }
6490
Craig Topper6c03a542015-10-19 04:51:35 +00006491 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6492 return llvm::makeArrayRef(BuiltinInfo,
6493 clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006494 }
6495
Craig Topper3164f332014-03-11 03:39:26 +00006496 bool validateAsmConstraint(const char *&Name,
6497 TargetInfo::ConstraintInfo &Info) const override {
Krzysztof Parzyszeke0026e42016-05-18 14:56:14 +00006498 switch (*Name) {
6499 case 'v':
6500 case 'q':
6501 if (HasHVX) {
6502 Info.setAllowsRegister();
6503 return true;
6504 }
6505 break;
Krzysztof Parzyszek89fb4412016-05-20 13:50:32 +00006506 case 's':
6507 // Relocatable constant.
6508 return true;
Krzysztof Parzyszeke0026e42016-05-18 14:56:14 +00006509 }
6510 return false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006511 }
6512
Craig Topper3164f332014-03-11 03:39:26 +00006513 void getTargetDefines(const LangOptions &Opts,
6514 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006515
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006516 bool isCLZForZeroUndef() const override { return false; }
6517
Craig Topper3164f332014-03-11 03:39:26 +00006518 bool hasFeature(StringRef Feature) const override {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006519 return llvm::StringSwitch<bool>(Feature)
6520 .Case("hexagon", true)
6521 .Case("hvx", HasHVX)
6522 .Case("hvx-double", HasHVXDouble)
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006523 .Case("long-calls", UseLongCalls)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006524 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006525 }
Craig Topper3164f332014-03-11 03:39:26 +00006526
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006527 bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6528 StringRef CPU, const std::vector<std::string> &FeaturesVec)
6529 const override;
6530
6531 bool handleTargetFeatures(std::vector<std::string> &Features,
6532 DiagnosticsEngine &Diags) override;
6533
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006534 void setFeatureEnabled(llvm::StringMap<bool> &Features, StringRef Name,
6535 bool Enabled) const override;
6536
Craig Topper3164f332014-03-11 03:39:26 +00006537 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006538 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006539 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006540 ArrayRef<const char *> getGCCRegNames() const override;
6541 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00006542 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006543 return "";
6544 }
Sebastian Pop86500282012-01-13 20:37:10 +00006545
6546 static const char *getHexagonCPUSuffix(StringRef Name) {
6547 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00006548 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006549 .Case("hexagonv5", "5")
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006550 .Case("hexagonv55", "55")
6551 .Case("hexagonv60", "60")
Krzysztof Parzyszekff7f6672017-03-14 20:29:23 +00006552 .Case("hexagonv62", "62")
Craig Topperf1186c52014-05-08 06:41:40 +00006553 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00006554 }
6555
Craig Topper3164f332014-03-11 03:39:26 +00006556 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00006557 if (!getHexagonCPUSuffix(Name))
6558 return false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006559 CPU = Name;
6560 return true;
6561 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006562
6563 int getEHDataRegisterNumber(unsigned RegNo) const override {
6564 return RegNo < 2 ? RegNo : -1;
6565 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006566};
6567
6568void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006569 MacroBuilder &Builder) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006570 Builder.defineMacro("__qdsp6__", "1");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006571 Builder.defineMacro("__hexagon__", "1");
6572
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006573 if (CPU == "hexagonv4") {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006574 Builder.defineMacro("__HEXAGON_V4__");
6575 Builder.defineMacro("__HEXAGON_ARCH__", "4");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006576 if (Opts.HexagonQdsp6Compat) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006577 Builder.defineMacro("__QDSP6_V4__");
6578 Builder.defineMacro("__QDSP6_ARCH__", "4");
6579 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006580 } else if (CPU == "hexagonv5") {
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006581 Builder.defineMacro("__HEXAGON_V5__");
6582 Builder.defineMacro("__HEXAGON_ARCH__", "5");
6583 if(Opts.HexagonQdsp6Compat) {
6584 Builder.defineMacro("__QDSP6_V5__");
6585 Builder.defineMacro("__QDSP6_ARCH__", "5");
6586 }
Krzysztof Parzyszeka58ff512016-04-21 14:30:04 +00006587 } else if (CPU == "hexagonv55") {
6588 Builder.defineMacro("__HEXAGON_V55__");
6589 Builder.defineMacro("__HEXAGON_ARCH__", "55");
6590 Builder.defineMacro("__QDSP6_V55__");
6591 Builder.defineMacro("__QDSP6_ARCH__", "55");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006592 } else if (CPU == "hexagonv60") {
6593 Builder.defineMacro("__HEXAGON_V60__");
6594 Builder.defineMacro("__HEXAGON_ARCH__", "60");
6595 Builder.defineMacro("__QDSP6_V60__");
6596 Builder.defineMacro("__QDSP6_ARCH__", "60");
Krzysztof Parzyszekff7f6672017-03-14 20:29:23 +00006597 } else if (CPU == "hexagonv62") {
6598 Builder.defineMacro("__HEXAGON_V62__");
6599 Builder.defineMacro("__HEXAGON_ARCH__", "62");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006600 }
Krzysztof Parzyszek7f0756c2016-04-18 18:38:11 +00006601
6602 if (hasFeature("hvx")) {
6603 Builder.defineMacro("__HVX__");
6604 if (hasFeature("hvx-double"))
6605 Builder.defineMacro("__HVXDBL__");
6606 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006607}
6608
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006609bool HexagonTargetInfo::initFeatureMap(llvm::StringMap<bool> &Features,
6610 DiagnosticsEngine &Diags, StringRef CPU,
6611 const std::vector<std::string> &FeaturesVec) const {
6612 // Default for v60: -hvx, -hvx-double.
6613 Features["hvx"] = false;
6614 Features["hvx-double"] = false;
6615 Features["long-calls"] = false;
6616
6617 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
6618}
6619
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006620bool HexagonTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
6621 DiagnosticsEngine &Diags) {
6622 for (auto &F : Features) {
6623 if (F == "+hvx")
6624 HasHVX = true;
6625 else if (F == "-hvx")
6626 HasHVX = HasHVXDouble = false;
6627 else if (F == "+hvx-double")
6628 HasHVX = HasHVXDouble = true;
6629 else if (F == "-hvx-double")
6630 HasHVXDouble = false;
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006631
6632 if (F == "+long-calls")
6633 UseLongCalls = true;
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006634 else if (F == "-long-calls")
6635 UseLongCalls = false;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006636 }
6637 return true;
6638}
6639
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006640void HexagonTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
6641 StringRef Name, bool Enabled) const {
6642 if (Enabled) {
6643 if (Name == "hvx-double")
6644 Features["hvx"] = true;
6645 } else {
6646 if (Name == "hvx")
6647 Features["hvx-double"] = false;
6648 }
6649 Features[Name] = Enabled;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006650}
6651
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006652const char *const HexagonTargetInfo::GCCRegNames[] = {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006653 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6654 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6655 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6656 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
6657 "p0", "p1", "p2", "p3",
6658 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
6659};
6660
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006661ArrayRef<const char*> HexagonTargetInfo::getGCCRegNames() const {
Craig Topperf054e3a2015-10-19 03:52:27 +00006662 return llvm::makeArrayRef(GCCRegNames);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006663}
6664
Tony Linthicum76329bf2011-12-12 21:14:55 +00006665const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
6666 { { "sp" }, "r29" },
6667 { { "fp" }, "r30" },
6668 { { "lr" }, "r31" },
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006669};
Tony Linthicum76329bf2011-12-12 21:14:55 +00006670
Craig Topperf054e3a2015-10-19 03:52:27 +00006671ArrayRef<TargetInfo::GCCRegAlias> HexagonTargetInfo::getGCCRegAliases() const {
6672 return llvm::makeArrayRef(GCCRegAliases);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006673}
6674
6675
6676const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00006677#define BUILTIN(ID, TYPE, ATTRS) \
6678 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
6679#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
6680 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tony Linthicum76329bf2011-12-12 21:14:55 +00006681#include "clang/Basic/BuiltinsHexagon.def"
6682};
Tony Linthicum76329bf2011-12-12 21:14:55 +00006683
Jacques Pienaard964cc22016-03-28 21:02:54 +00006684class LanaiTargetInfo : public TargetInfo {
6685 // Class for Lanai (32-bit).
6686 // The CPU profiles supported by the Lanai backend
6687 enum CPUKind {
6688 CK_NONE,
6689 CK_V11,
6690 } CPU;
6691
6692 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6693 static const char *const GCCRegNames[];
6694
6695public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006696 LanaiTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6697 : TargetInfo(Triple) {
Jacques Pienaard964cc22016-03-28 21:02:54 +00006698 // Description string has to be kept in sync with backend.
6699 resetDataLayout("E" // Big endian
6700 "-m:e" // ELF name manging
6701 "-p:32:32" // 32 bit pointers, 32 bit aligned
6702 "-i64:64" // 64 bit integers, 64 bit aligned
6703 "-a:0:32" // 32 bit alignment of objects of aggregate type
6704 "-n32" // 32 bit native integer width
6705 "-S64" // 64 bit natural stack alignment
6706 );
6707
6708 // Setting RegParmMax equal to what mregparm was set to in the old
6709 // toolchain
6710 RegParmMax = 4;
6711
6712 // Set the default CPU to V11
6713 CPU = CK_V11;
6714
6715 // Temporary approach to make everything at least word-aligned and allow for
6716 // safely casting between pointers with different alignment requirements.
6717 // TODO: Remove this when there are no more cast align warnings on the
6718 // firmware.
6719 MinGlobalAlign = 32;
6720 }
6721
6722 void getTargetDefines(const LangOptions &Opts,
6723 MacroBuilder &Builder) const override {
6724 // Define __lanai__ when building for target lanai.
6725 Builder.defineMacro("__lanai__");
6726
6727 // Set define for the CPU specified.
6728 switch (CPU) {
6729 case CK_V11:
6730 Builder.defineMacro("__LANAI_V11__");
6731 break;
6732 case CK_NONE:
6733 llvm_unreachable("Unhandled target CPU");
6734 }
6735 }
6736
6737 bool setCPU(const std::string &Name) override {
6738 CPU = llvm::StringSwitch<CPUKind>(Name)
6739 .Case("v11", CK_V11)
6740 .Default(CK_NONE);
6741
6742 return CPU != CK_NONE;
6743 }
6744
6745 bool hasFeature(StringRef Feature) const override {
6746 return llvm::StringSwitch<bool>(Feature).Case("lanai", true).Default(false);
6747 }
6748
6749 ArrayRef<const char *> getGCCRegNames() const override;
6750
6751 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
6752
6753 BuiltinVaListKind getBuiltinVaListKind() const override {
6754 return TargetInfo::VoidPtrBuiltinVaList;
6755 }
6756
6757 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
6758
6759 bool validateAsmConstraint(const char *&Name,
6760 TargetInfo::ConstraintInfo &info) const override {
6761 return false;
6762 }
6763
6764 const char *getClobbers() const override { return ""; }
6765};
6766
6767const char *const LanaiTargetInfo::GCCRegNames[] = {
6768 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10",
6769 "r11", "r12", "r13", "r14", "r15", "r16", "r17", "r18", "r19", "r20", "r21",
6770 "r22", "r23", "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"};
6771
6772ArrayRef<const char *> LanaiTargetInfo::getGCCRegNames() const {
6773 return llvm::makeArrayRef(GCCRegNames);
6774}
6775
6776const TargetInfo::GCCRegAlias LanaiTargetInfo::GCCRegAliases[] = {
6777 {{"pc"}, "r2"},
6778 {{"sp"}, "r4"},
6779 {{"fp"}, "r5"},
6780 {{"rv"}, "r8"},
6781 {{"rr1"}, "r10"},
6782 {{"rr2"}, "r11"},
6783 {{"rca"}, "r15"},
6784};
6785
6786ArrayRef<TargetInfo::GCCRegAlias> LanaiTargetInfo::getGCCRegAliases() const {
6787 return llvm::makeArrayRef(GCCRegAliases);
6788}
6789
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006790// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
6791class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00006792 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6793 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006794 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00006795public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006796 SparcTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
James Y Knighta3518ad2016-01-27 01:04:51 +00006797 : TargetInfo(Triple), SoftFloat(false) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006798
Joerg Sonnenbergerd0be8dc2016-03-07 17:19:15 +00006799 int getEHDataRegisterNumber(unsigned RegNo) const override {
6800 if (RegNo == 0) return 24;
6801 if (RegNo == 1) return 25;
6802 return -1;
6803 }
6804
Craig Topper3164f332014-03-11 03:39:26 +00006805 bool handleTargetFeatures(std::vector<std::string> &Features,
6806 DiagnosticsEngine &Diags) override {
Jacob Baungard Hansen13a49372016-05-24 08:30:08 +00006807 // Check if software floating point is enabled
Eric Christopherfb481a42015-04-29 23:32:17 +00006808 auto Feature = std::find(Features.begin(), Features.end(), "+soft-float");
6809 if (Feature != Features.end()) {
6810 SoftFloat = true;
Eric Christopherfb481a42015-04-29 23:32:17 +00006811 }
Rafael Espindolaeb265472013-08-21 21:59:03 +00006812 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006813 }
Craig Topper3164f332014-03-11 03:39:26 +00006814 void getTargetDefines(const LangOptions &Opts,
6815 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006816 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006817 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006818
6819 if (SoftFloat)
6820 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00006821 }
Craig Topper3164f332014-03-11 03:39:26 +00006822
6823 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006824 return llvm::StringSwitch<bool>(Feature)
6825 .Case("softfloat", SoftFloat)
6826 .Case("sparc", true)
6827 .Default(false);
6828 }
Craig Topper3164f332014-03-11 03:39:26 +00006829
Chris Dewhurst0381cd72016-06-15 12:44:47 +00006830 bool hasSjLjLowering() const override {
6831 return true;
6832 }
6833
Craig Topper6c03a542015-10-19 04:51:35 +00006834 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006835 // FIXME: Implement!
Craig Topper6c03a542015-10-19 04:51:35 +00006836 return None;
Gabor Greif49991682008-02-21 16:29:08 +00006837 }
Craig Topper3164f332014-03-11 03:39:26 +00006838 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006839 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00006840 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006841 ArrayRef<const char *> getGCCRegNames() const override;
6842 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00006843 bool validateAsmConstraint(const char *&Name,
6844 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006845 // FIXME: Implement!
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00006846 switch (*Name) {
6847 case 'I': // Signed 13-bit constant
6848 case 'J': // Zero
6849 case 'K': // 32-bit constant with the low 12 bits clear
6850 case 'L': // A constant in the range supported by movcc (11-bit signed imm)
6851 case 'M': // A constant in the range supported by movrcc (19-bit signed imm)
6852 case 'N': // Same as 'K' but zext (required for SIMode)
6853 case 'O': // The constant 4096
6854 return true;
6855 }
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006856 return false;
Gabor Greif49991682008-02-21 16:29:08 +00006857 }
Craig Topper3164f332014-03-11 03:39:26 +00006858 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006859 // FIXME: Implement!
6860 return "";
Gabor Greif49991682008-02-21 16:29:08 +00006861 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006862
6863 // No Sparc V7 for now, the backend doesn't support it anyway.
6864 enum CPUKind {
6865 CK_GENERIC,
6866 CK_V8,
6867 CK_SUPERSPARC,
6868 CK_SPARCLITE,
6869 CK_F934,
6870 CK_HYPERSPARC,
6871 CK_SPARCLITE86X,
6872 CK_SPARCLET,
6873 CK_TSC701,
6874 CK_V9,
6875 CK_ULTRASPARC,
6876 CK_ULTRASPARC3,
6877 CK_NIAGARA,
6878 CK_NIAGARA2,
6879 CK_NIAGARA3,
Douglas Katzman6871afc2016-03-15 22:34:02 +00006880 CK_NIAGARA4,
Douglas Katzman87da5f42016-07-25 16:36:02 +00006881 CK_MYRIAD2100,
6882 CK_MYRIAD2150,
6883 CK_MYRIAD2450,
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006884 CK_LEON2,
6885 CK_LEON2_AT697E,
6886 CK_LEON2_AT697F,
6887 CK_LEON3,
6888 CK_LEON3_UT699,
6889 CK_LEON3_GR712RC,
6890 CK_LEON4,
6891 CK_LEON4_GR740
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006892 } CPU = CK_GENERIC;
6893
6894 enum CPUGeneration {
6895 CG_V8,
6896 CG_V9,
6897 };
6898
6899 CPUGeneration getCPUGeneration(CPUKind Kind) const {
6900 switch (Kind) {
6901 case CK_GENERIC:
6902 case CK_V8:
6903 case CK_SUPERSPARC:
6904 case CK_SPARCLITE:
6905 case CK_F934:
6906 case CK_HYPERSPARC:
6907 case CK_SPARCLITE86X:
6908 case CK_SPARCLET:
6909 case CK_TSC701:
Douglas Katzman87da5f42016-07-25 16:36:02 +00006910 case CK_MYRIAD2100:
6911 case CK_MYRIAD2150:
6912 case CK_MYRIAD2450:
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006913 case CK_LEON2:
6914 case CK_LEON2_AT697E:
6915 case CK_LEON2_AT697F:
6916 case CK_LEON3:
6917 case CK_LEON3_UT699:
6918 case CK_LEON3_GR712RC:
6919 case CK_LEON4:
6920 case CK_LEON4_GR740:
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006921 return CG_V8;
6922 case CK_V9:
6923 case CK_ULTRASPARC:
6924 case CK_ULTRASPARC3:
6925 case CK_NIAGARA:
6926 case CK_NIAGARA2:
6927 case CK_NIAGARA3:
6928 case CK_NIAGARA4:
6929 return CG_V9;
6930 }
Aaron Ballmana9a72852015-11-11 13:42:02 +00006931 llvm_unreachable("Unexpected CPU kind");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006932 }
6933
6934 CPUKind getCPUKind(StringRef Name) const {
6935 return llvm::StringSwitch<CPUKind>(Name)
6936 .Case("v8", CK_V8)
6937 .Case("supersparc", CK_SUPERSPARC)
6938 .Case("sparclite", CK_SPARCLITE)
6939 .Case("f934", CK_F934)
6940 .Case("hypersparc", CK_HYPERSPARC)
6941 .Case("sparclite86x", CK_SPARCLITE86X)
6942 .Case("sparclet", CK_SPARCLET)
6943 .Case("tsc701", CK_TSC701)
6944 .Case("v9", CK_V9)
6945 .Case("ultrasparc", CK_ULTRASPARC)
6946 .Case("ultrasparc3", CK_ULTRASPARC3)
6947 .Case("niagara", CK_NIAGARA)
6948 .Case("niagara2", CK_NIAGARA2)
6949 .Case("niagara3", CK_NIAGARA3)
6950 .Case("niagara4", CK_NIAGARA4)
Douglas Katzman87da5f42016-07-25 16:36:02 +00006951 .Case("ma2100", CK_MYRIAD2100)
6952 .Case("ma2150", CK_MYRIAD2150)
6953 .Case("ma2450", CK_MYRIAD2450)
6954 // FIXME: the myriad2[.n] spellings are obsolete,
6955 // but a grace period is needed to allow updating dependent builds.
6956 .Case("myriad2", CK_MYRIAD2100)
6957 .Case("myriad2.1", CK_MYRIAD2100)
6958 .Case("myriad2.2", CK_MYRIAD2150)
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006959 .Case("leon2", CK_LEON2)
6960 .Case("at697e", CK_LEON2_AT697E)
6961 .Case("at697f", CK_LEON2_AT697F)
6962 .Case("leon3", CK_LEON3)
6963 .Case("ut699", CK_LEON3_UT699)
6964 .Case("gr712rc", CK_LEON3_GR712RC)
6965 .Case("leon4", CK_LEON4)
6966 .Case("gr740", CK_LEON4_GR740)
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006967 .Default(CK_GENERIC);
6968 }
6969
6970 bool setCPU(const std::string &Name) override {
6971 CPU = getCPUKind(Name);
6972 return CPU != CK_GENERIC;
6973 }
Gabor Greif49991682008-02-21 16:29:08 +00006974};
6975
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006976const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00006977 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6978 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6979 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6980 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
6981};
6982
Craig Topperf054e3a2015-10-19 03:52:27 +00006983ArrayRef<const char *> SparcTargetInfo::getGCCRegNames() const {
6984 return llvm::makeArrayRef(GCCRegNames);
Chris Lattner9b415d62009-01-27 01:58:38 +00006985}
6986
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006987const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00006988 { { "g0" }, "r0" },
6989 { { "g1" }, "r1" },
6990 { { "g2" }, "r2" },
6991 { { "g3" }, "r3" },
6992 { { "g4" }, "r4" },
6993 { { "g5" }, "r5" },
6994 { { "g6" }, "r6" },
6995 { { "g7" }, "r7" },
6996 { { "o0" }, "r8" },
6997 { { "o1" }, "r9" },
6998 { { "o2" }, "r10" },
6999 { { "o3" }, "r11" },
7000 { { "o4" }, "r12" },
7001 { { "o5" }, "r13" },
7002 { { "o6", "sp" }, "r14" },
7003 { { "o7" }, "r15" },
7004 { { "l0" }, "r16" },
7005 { { "l1" }, "r17" },
7006 { { "l2" }, "r18" },
7007 { { "l3" }, "r19" },
7008 { { "l4" }, "r20" },
7009 { { "l5" }, "r21" },
7010 { { "l6" }, "r22" },
7011 { { "l7" }, "r23" },
7012 { { "i0" }, "r24" },
7013 { { "i1" }, "r25" },
7014 { { "i2" }, "r26" },
7015 { { "i3" }, "r27" },
7016 { { "i4" }, "r28" },
7017 { { "i5" }, "r29" },
7018 { { "i6", "fp" }, "r30" },
7019 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00007020};
7021
Craig Topperf054e3a2015-10-19 03:52:27 +00007022ArrayRef<TargetInfo::GCCRegAlias> SparcTargetInfo::getGCCRegAliases() const {
7023 return llvm::makeArrayRef(GCCRegAliases);
Chris Lattner9b415d62009-01-27 01:58:38 +00007024}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007025
7026// SPARC v8 is the 32-bit mode selected by Triple::sparc.
7027class SparcV8TargetInfo : public SparcTargetInfo {
7028public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007029 SparcV8TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7030 : SparcTargetInfo(Triple, Opts) {
James Y Knightb214cbc2016-03-04 19:00:41 +00007031 resetDataLayout("E-m:e-p:32:32-i64:64-f128:64-n32-S64");
Brad Smith73859112015-08-13 21:45:57 +00007032 // NetBSD / OpenBSD use long (same as llvm default); everyone else uses int.
7033 switch (getTriple().getOS()) {
7034 default:
James Y Knight4b4d19e2015-06-04 15:36:29 +00007035 SizeType = UnsignedInt;
7036 IntPtrType = SignedInt;
7037 PtrDiffType = SignedInt;
Brad Smith73859112015-08-13 21:45:57 +00007038 break;
7039 case llvm::Triple::NetBSD:
7040 case llvm::Triple::OpenBSD:
7041 SizeType = UnsignedLong;
7042 IntPtrType = SignedLong;
7043 PtrDiffType = SignedLong;
7044 break;
Brad Smith56495d52015-08-13 22:00:53 +00007045 }
Douglas Katzman13f4a912016-11-09 15:43:51 +00007046 // Up to 32 bits are lock-free atomic, but we're willing to do atomic ops
7047 // on up to 64 bits.
7048 MaxAtomicPromoteWidth = 64;
7049 MaxAtomicInlineWidth = 32;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007050 }
7051
Craig Topper3164f332014-03-11 03:39:26 +00007052 void getTargetDefines(const LangOptions &Opts,
7053 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007054 SparcTargetInfo::getTargetDefines(Opts, Builder);
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00007055 switch (getCPUGeneration(CPU)) {
7056 case CG_V8:
7057 Builder.defineMacro("__sparcv8");
7058 if (getTriple().getOS() != llvm::Triple::Solaris)
7059 Builder.defineMacro("__sparcv8__");
7060 break;
7061 case CG_V9:
7062 Builder.defineMacro("__sparcv9");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00007063 if (getTriple().getOS() != llvm::Triple::Solaris) {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00007064 Builder.defineMacro("__sparcv9__");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00007065 Builder.defineMacro("__sparc_v9__");
7066 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00007067 break;
7068 }
Douglas Katzman6871afc2016-03-15 22:34:02 +00007069 if (getTriple().getVendor() == llvm::Triple::Myriad) {
Douglas Katzman87da5f42016-07-25 16:36:02 +00007070 std::string MyriadArchValue, Myriad2Value;
7071 Builder.defineMacro("__sparc_v8__");
7072 Builder.defineMacro("__leon__");
Douglas Katzman6871afc2016-03-15 22:34:02 +00007073 switch (CPU) {
Douglas Katzman87da5f42016-07-25 16:36:02 +00007074 case CK_MYRIAD2150:
7075 MyriadArchValue = "__ma2150";
7076 Myriad2Value = "2";
Douglas Katzman6871afc2016-03-15 22:34:02 +00007077 break;
Douglas Katzman87da5f42016-07-25 16:36:02 +00007078 case CK_MYRIAD2450:
7079 MyriadArchValue = "__ma2450";
7080 Myriad2Value = "2";
Douglas Katzman6871afc2016-03-15 22:34:02 +00007081 break;
7082 default:
Douglas Katzman87da5f42016-07-25 16:36:02 +00007083 MyriadArchValue = "__ma2100";
7084 Myriad2Value = "1";
Douglas Katzman6871afc2016-03-15 22:34:02 +00007085 break;
7086 }
Douglas Katzman87da5f42016-07-25 16:36:02 +00007087 Builder.defineMacro(MyriadArchValue, "1");
7088 Builder.defineMacro(MyriadArchValue+"__", "1");
7089 Builder.defineMacro("__myriad2__", Myriad2Value);
7090 Builder.defineMacro("__myriad2", Myriad2Value);
Douglas Katzman6871afc2016-03-15 22:34:02 +00007091 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007092 }
Chris Dewhurst69fa1922016-05-04 09:33:30 +00007093
7094 bool hasSjLjLowering() const override {
7095 return true;
7096 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007097};
7098
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007099// SPARCV8el is the 32-bit little-endian mode selected by Triple::sparcel.
7100class SparcV8elTargetInfo : public SparcV8TargetInfo {
7101 public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007102 SparcV8elTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7103 : SparcV8TargetInfo(Triple, Opts) {
7104 resetDataLayout("e-m:e-p:32:32-i64:64-f128:64-n32-S64");
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007105 }
7106};
7107
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007108// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
7109class SparcV9TargetInfo : public SparcTargetInfo {
7110public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007111 SparcV9TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7112 : SparcTargetInfo(Triple, Opts) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007113 // FIXME: Support Sparc quad-precision long double?
James Y Knightb214cbc2016-03-04 19:00:41 +00007114 resetDataLayout("E-m:e-i64:64-n32:64-S128");
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00007115 // This is an LP64 platform.
7116 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00007117
7118 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00007119 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00007120 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00007121 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00007122 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00007123 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00007124
7125 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
7126 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
7127 LongDoubleWidth = 128;
7128 LongDoubleAlign = 128;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007129 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00007130 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007131 }
7132
Craig Topper3164f332014-03-11 03:39:26 +00007133 void getTargetDefines(const LangOptions &Opts,
7134 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007135 SparcTargetInfo::getTargetDefines(Opts, Builder);
7136 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00007137 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00007138 // Solaris doesn't need these variants, but the BSDs do.
7139 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00007140 Builder.defineMacro("__sparc64__");
7141 Builder.defineMacro("__sparc_v9__");
7142 Builder.defineMacro("__sparcv9__");
7143 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007144 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00007145
Craig Topper3164f332014-03-11 03:39:26 +00007146 bool setCPU(const std::string &Name) override {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00007147 if (!SparcTargetInfo::setCPU(Name))
7148 return false;
7149 return getCPUGeneration(CPU) == CG_V9;
Roman Divackyb1ae3d42014-02-25 18:35:30 +00007150 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007151};
7152
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007153class SystemZTargetInfo : public TargetInfo {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007154 static const Builtin::Info BuiltinInfo[];
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007155 static const char *const GCCRegNames[];
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007156 std::string CPU;
7157 bool HasTransactionalExecution;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007158 bool HasVector;
Ulrich Weigand47445072013-05-06 16:26:41 +00007159
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007160public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007161 SystemZTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Eric Christopherb093d692015-10-09 18:39:59 +00007162 : TargetInfo(Triple), CPU("z10"), HasTransactionalExecution(false),
7163 HasVector(false) {
Ulrich Weigand881497a2015-03-30 13:50:21 +00007164 IntMaxType = SignedLong;
7165 Int64Type = SignedLong;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007166 TLSSupported = true;
7167 IntWidth = IntAlign = 32;
7168 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
7169 PointerWidth = PointerAlign = 64;
7170 LongDoubleWidth = 128;
7171 LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007172 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Ulrich Weigandca3cb7f2015-04-21 17:29:35 +00007173 DefaultAlignForAttributeAligned = 64;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007174 MinGlobalAlign = 16;
James Y Knightb214cbc2016-03-04 19:00:41 +00007175 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 +00007176 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
7177 }
7178 void getTargetDefines(const LangOptions &Opts,
7179 MacroBuilder &Builder) const override {
7180 Builder.defineMacro("__s390__");
7181 Builder.defineMacro("__s390x__");
7182 Builder.defineMacro("__zarch__");
7183 Builder.defineMacro("__LONG_DOUBLE_128__");
Ulrich Weigandb038a522016-02-05 21:34:28 +00007184
Ulrich Weigand82a86cb2017-02-06 17:04:22 +00007185 const std::string ISARev = llvm::StringSwitch<std::string>(CPU)
7186 .Cases("arch8", "z10", "8")
7187 .Cases("arch9", "z196", "9")
7188 .Cases("arch10", "zEC12", "10")
7189 .Cases("arch11", "z13", "11")
7190 .Default("");
7191 if (!ISARev.empty())
7192 Builder.defineMacro("__ARCH__", ISARev);
7193
Ulrich Weigandb038a522016-02-05 21:34:28 +00007194 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
7195 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
7196 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
7197 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
7198
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007199 if (HasTransactionalExecution)
7200 Builder.defineMacro("__HTM__");
Ulrich Weigand82a86cb2017-02-06 17:04:22 +00007201 if (HasVector)
7202 Builder.defineMacro("__VX__");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00007203 if (Opts.ZVector)
7204 Builder.defineMacro("__VEC__", "10301");
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007205 }
Craig Topper6c03a542015-10-19 04:51:35 +00007206 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7207 return llvm::makeArrayRef(BuiltinInfo,
7208 clang::SystemZ::LastTSBuiltin-Builtin::FirstTSBuiltin);
Ulrich Weigand47445072013-05-06 16:26:41 +00007209 }
7210
Craig Topperf054e3a2015-10-19 03:52:27 +00007211 ArrayRef<const char *> getGCCRegNames() const override;
7212 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007213 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00007214 return None;
Ulrich Weigand47445072013-05-06 16:26:41 +00007215 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007216 bool validateAsmConstraint(const char *&Name,
7217 TargetInfo::ConstraintInfo &info) const override;
7218 const char *getClobbers() const override {
7219 // FIXME: Is this really right?
7220 return "";
7221 }
7222 BuiltinVaListKind getBuiltinVaListKind() const override {
7223 return TargetInfo::SystemZBuiltinVaList;
7224 }
7225 bool setCPU(const std::string &Name) override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007226 CPU = Name;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007227 bool CPUKnown = llvm::StringSwitch<bool>(Name)
7228 .Case("z10", true)
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007229 .Case("arch8", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007230 .Case("z196", true)
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007231 .Case("arch9", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007232 .Case("zEC12", true)
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007233 .Case("arch10", true)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007234 .Case("z13", true)
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007235 .Case("arch11", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007236 .Default(false);
7237
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007238 return CPUKnown;
7239 }
Eric Christopher8c47b422015-10-09 18:39:55 +00007240 bool
7241 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7242 StringRef CPU,
7243 const std::vector<std::string> &FeaturesVec) const override {
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007244 if (CPU == "zEC12" || CPU == "arch10")
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007245 Features["transactional-execution"] = true;
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007246 if (CPU == "z13" || CPU == "arch11") {
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007247 Features["transactional-execution"] = true;
7248 Features["vector"] = true;
7249 }
Eric Christopher007b0a02015-08-28 22:32:01 +00007250 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007251 }
7252
7253 bool handleTargetFeatures(std::vector<std::string> &Features,
7254 DiagnosticsEngine &Diags) override {
7255 HasTransactionalExecution = false;
Eric Christopher610fe112015-08-26 08:21:55 +00007256 for (const auto &Feature : Features) {
7257 if (Feature == "+transactional-execution")
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007258 HasTransactionalExecution = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007259 else if (Feature == "+vector")
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007260 HasVector = true;
7261 }
7262 // If we use the vector ABI, vector types are 64-bit aligned.
7263 if (HasVector) {
7264 MaxVectorAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00007265 resetDataLayout("E-m:e-i1:8:16-i8:8:16-i64:64-f128:64"
7266 "-v128:64-a:8:16-n32:64");
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007267 }
7268 return true;
7269 }
7270
7271 bool hasFeature(StringRef Feature) const override {
7272 return llvm::StringSwitch<bool>(Feature)
Ulrich Weigandcc673442015-04-01 14:15:35 +00007273 .Case("systemz", true)
7274 .Case("htm", HasTransactionalExecution)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007275 .Case("vx", HasVector)
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007276 .Default(false);
7277 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007278
Bryan Chane3f1ed52016-04-28 13:56:43 +00007279 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
7280 switch (CC) {
7281 case CC_C:
7282 case CC_Swift:
7283 return CCCR_OK;
7284 default:
7285 return CCCR_Warning;
7286 }
7287 }
7288
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007289 StringRef getABI() const override {
7290 if (HasVector)
7291 return "vector";
7292 return "";
7293 }
Ulrich Weigand47fd2532015-06-16 15:21:47 +00007294
7295 bool useFloat128ManglingForLongDouble() const override {
7296 return true;
7297 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007298};
7299
7300const Builtin::Info SystemZTargetInfo::BuiltinInfo[] = {
7301#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00007302 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Jonas Paulsson3ace74a2016-03-30 15:51:24 +00007303#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
7304 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007305#include "clang/Basic/BuiltinsSystemZ.def"
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007306};
7307
7308const char *const SystemZTargetInfo::GCCRegNames[] = {
7309 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
7310 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
7311 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
7312 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
7313};
7314
Craig Topperf054e3a2015-10-19 03:52:27 +00007315ArrayRef<const char *> SystemZTargetInfo::getGCCRegNames() const {
7316 return llvm::makeArrayRef(GCCRegNames);
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007317}
7318
7319bool SystemZTargetInfo::
7320validateAsmConstraint(const char *&Name,
7321 TargetInfo::ConstraintInfo &Info) const {
7322 switch (*Name) {
7323 default:
7324 return false;
7325
7326 case 'a': // Address register
7327 case 'd': // Data register (equivalent to 'r')
7328 case 'f': // Floating-point register
7329 Info.setAllowsRegister();
7330 return true;
7331
7332 case 'I': // Unsigned 8-bit constant
7333 case 'J': // Unsigned 12-bit constant
7334 case 'K': // Signed 16-bit constant
7335 case 'L': // Signed 20-bit displacement (on all targets we support)
7336 case 'M': // 0x7fffffff
7337 return true;
7338
7339 case 'Q': // Memory with base and unsigned 12-bit displacement
7340 case 'R': // Likewise, plus an index
7341 case 'S': // Memory with base and signed 20-bit displacement
7342 case 'T': // Likewise, plus an index
7343 Info.setAllowsMemory();
7344 return true;
7345 }
7346}
Ulrich Weigand47445072013-05-06 16:26:41 +00007347
Eric Christopherc48497a2015-09-18 21:26:24 +00007348class MSP430TargetInfo : public TargetInfo {
7349 static const char *const GCCRegNames[];
Anton Korobeynikova0f54372009-05-03 13:43:08 +00007350
Eric Christopherc48497a2015-09-18 21:26:24 +00007351public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007352 MSP430TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7353 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007354 TLSSupported = false;
7355 IntWidth = 16;
7356 IntAlign = 16;
7357 LongWidth = 32;
7358 LongLongWidth = 64;
7359 LongAlign = LongLongAlign = 16;
7360 PointerWidth = 16;
7361 PointerAlign = 16;
7362 SuitableAlign = 16;
7363 SizeType = UnsignedInt;
7364 IntMaxType = SignedLongLong;
7365 IntPtrType = SignedInt;
7366 PtrDiffType = SignedInt;
7367 SigAtomicType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00007368 resetDataLayout("e-m:e-p:16:16-i32:16:32-a:16-n8:16");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00007369 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007370 void getTargetDefines(const LangOptions &Opts,
7371 MacroBuilder &Builder) const override {
7372 Builder.defineMacro("MSP430");
7373 Builder.defineMacro("__MSP430__");
7374 // FIXME: defines for different 'flavours' of MCU
7375 }
Craig Topper6c03a542015-10-19 04:51:35 +00007376 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00007377 // FIXME: Implement.
Craig Topper6c03a542015-10-19 04:51:35 +00007378 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00007379 }
7380 bool hasFeature(StringRef Feature) const override {
7381 return Feature == "msp430";
7382 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007383 ArrayRef<const char *> getGCCRegNames() const override;
7384 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00007385 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00007386 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00007387 }
7388 bool validateAsmConstraint(const char *&Name,
7389 TargetInfo::ConstraintInfo &info) const override {
7390 // FIXME: implement
7391 switch (*Name) {
7392 case 'K': // the constant 1
7393 case 'L': // constant -1^20 .. 1^19
7394 case 'M': // constant 1-4:
Eli Friedmana9c3d712009-08-19 20:47:07 +00007395 return true;
7396 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007397 // No target constraints for now.
7398 return false;
7399 }
7400 const char *getClobbers() const override {
7401 // FIXME: Is this really right?
7402 return "";
7403 }
7404 BuiltinVaListKind getBuiltinVaListKind() const override {
7405 // FIXME: implement
7406 return TargetInfo::CharPtrBuiltinVaList;
7407 }
7408};
7409
7410const char *const MSP430TargetInfo::GCCRegNames[] = {
7411 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
7412 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"};
7413
Craig Topperf054e3a2015-10-19 03:52:27 +00007414ArrayRef<const char *> MSP430TargetInfo::getGCCRegNames() const {
7415 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00007416}
7417
7418// LLVM and Clang cannot be used directly to output native binaries for
7419// target, but is used to compile C code to llvm bitcode with correct
7420// type and alignment information.
7421//
7422// TCE uses the llvm bitcode as input and uses it for generating customized
7423// target processor and program binary. TCE co-design environment is
7424// publicly available in http://tce.cs.tut.fi
7425
7426static const unsigned TCEOpenCLAddrSpaceMap[] = {
Yaxun Liub34ec822017-04-11 17:24:23 +00007427 0, // Default
Eric Christopherc48497a2015-09-18 21:26:24 +00007428 3, // opencl_global
7429 4, // opencl_local
7430 5, // opencl_constant
7431 // FIXME: generic has to be added to the target
7432 0, // opencl_generic
7433 0, // cuda_device
7434 0, // cuda_constant
7435 0 // cuda_shared
7436};
7437
7438class TCETargetInfo : public TargetInfo {
7439public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007440 TCETargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7441 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007442 TLSSupported = false;
7443 IntWidth = 32;
7444 LongWidth = LongLongWidth = 32;
7445 PointerWidth = 32;
7446 IntAlign = 32;
7447 LongAlign = LongLongAlign = 32;
7448 PointerAlign = 32;
7449 SuitableAlign = 32;
7450 SizeType = UnsignedInt;
7451 IntMaxType = SignedLong;
7452 IntPtrType = SignedInt;
7453 PtrDiffType = SignedInt;
7454 FloatWidth = 32;
7455 FloatAlign = 32;
7456 DoubleWidth = 32;
7457 DoubleAlign = 32;
7458 LongDoubleWidth = 32;
7459 LongDoubleAlign = 32;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007460 FloatFormat = &llvm::APFloat::IEEEsingle();
7461 DoubleFormat = &llvm::APFloat::IEEEsingle();
7462 LongDoubleFormat = &llvm::APFloat::IEEEsingle();
Pekka Jaaskelainen67354482016-11-16 15:22:31 +00007463 resetDataLayout("E-p:32:32:32-i1:8:8-i8:8:32-"
7464 "i16:16:32-i32:32:32-i64:32:32-"
7465 "f32:32:32-f64:32:32-v64:32:32-"
7466 "v128:32:32-v256:32:32-v512:32:32-"
7467 "v1024:32:32-a0:0:32-n32");
Eric Christopherc48497a2015-09-18 21:26:24 +00007468 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
7469 UseAddrSpaceMapMangling = true;
7470 }
7471
7472 void getTargetDefines(const LangOptions &Opts,
7473 MacroBuilder &Builder) const override {
7474 DefineStd(Builder, "tce", Opts);
7475 Builder.defineMacro("__TCE__");
7476 Builder.defineMacro("__TCE_V1__");
7477 }
7478 bool hasFeature(StringRef Feature) const override { return Feature == "tce"; }
7479
Craig Topper6c03a542015-10-19 04:51:35 +00007480 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007481 const char *getClobbers() const override { return ""; }
7482 BuiltinVaListKind getBuiltinVaListKind() const override {
7483 return TargetInfo::VoidPtrBuiltinVaList;
7484 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007485 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007486 bool validateAsmConstraint(const char *&Name,
7487 TargetInfo::ConstraintInfo &info) const override {
7488 return true;
7489 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007490 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7491 return None;
7492 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007493};
Eli Friedmana9c3d712009-08-19 20:47:07 +00007494
Pekka Jaaskelainen67354482016-11-16 15:22:31 +00007495class TCELETargetInfo : public TCETargetInfo {
7496public:
7497 TCELETargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7498 : TCETargetInfo(Triple, Opts) {
7499 BigEndian = false;
7500
7501 resetDataLayout("e-p:32:32:32-i1:8:8-i8:8:32-"
7502 "i16:16:32-i32:32:32-i64:32:32-"
7503 "f32:32:32-f64:32:32-v64:32:32-"
7504 "v128:32:32-v256:32:32-v512:32:32-"
7505 "v1024:32:32-a0:0:32-n32");
7506
7507 }
7508
7509 virtual void getTargetDefines(const LangOptions &Opts,
7510 MacroBuilder &Builder) const {
7511 DefineStd(Builder, "tcele", Opts);
7512 Builder.defineMacro("__TCE__");
7513 Builder.defineMacro("__TCE_V1__");
7514 Builder.defineMacro("__TCELE__");
7515 Builder.defineMacro("__TCELE_V1__");
7516 }
7517
7518};
7519
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007520class BPFTargetInfo : public TargetInfo {
7521public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007522 BPFTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7523 : TargetInfo(Triple) {
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007524 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
7525 SizeType = UnsignedLong;
7526 PtrDiffType = SignedLong;
7527 IntPtrType = SignedLong;
7528 IntMaxType = SignedLong;
7529 Int64Type = SignedLong;
7530 RegParmMax = 5;
7531 if (Triple.getArch() == llvm::Triple::bpfeb) {
James Y Knightb214cbc2016-03-04 19:00:41 +00007532 resetDataLayout("E-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007533 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00007534 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007535 }
7536 MaxAtomicPromoteWidth = 64;
7537 MaxAtomicInlineWidth = 64;
7538 TLSSupported = false;
7539 }
7540 void getTargetDefines(const LangOptions &Opts,
7541 MacroBuilder &Builder) const override {
7542 DefineStd(Builder, "bpf", Opts);
7543 Builder.defineMacro("__BPF__");
7544 }
7545 bool hasFeature(StringRef Feature) const override {
7546 return Feature == "bpf";
7547 }
7548
Craig Topper6c03a542015-10-19 04:51:35 +00007549 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007550 const char *getClobbers() const override {
7551 return "";
7552 }
7553 BuiltinVaListKind getBuiltinVaListKind() const override {
7554 return TargetInfo::VoidPtrBuiltinVaList;
7555 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007556 ArrayRef<const char *> getGCCRegNames() const override {
7557 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007558 }
7559 bool validateAsmConstraint(const char *&Name,
7560 TargetInfo::ConstraintInfo &info) const override {
7561 return true;
7562 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007563 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7564 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007565 }
7566};
7567
Daniel Sanders4672af62016-05-27 11:51:02 +00007568class MipsTargetInfo : public TargetInfo {
7569 void setDataLayout() {
Daniel Sanders55e40692016-06-03 10:11:01 +00007570 StringRef Layout;
7571
7572 if (ABI == "o32")
7573 Layout = "m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
7574 else if (ABI == "n32")
Daniel Sanders6a738832016-07-19 10:49:03 +00007575 Layout = "m:e-p:32:32-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Daniel Sanders55e40692016-06-03 10:11:01 +00007576 else if (ABI == "n64")
Daniel Sanders6a738832016-07-19 10:49:03 +00007577 Layout = "m:e-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Daniel Sanders55e40692016-06-03 10:11:01 +00007578 else
7579 llvm_unreachable("Invalid ABI");
7580
7581 if (BigEndian)
7582 resetDataLayout(("E-" + Layout).str());
7583 else
7584 resetDataLayout(("e-" + Layout).str());
Daniel Sanders4672af62016-05-27 11:51:02 +00007585 }
7586
Akira Hatanaka9064e362013-10-29 18:30:33 +00007587
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00007588 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007589 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00007590 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00007591 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007592 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00007593 bool IsSingleFloat;
Simon Dardisdf827a72017-02-21 16:01:00 +00007594 bool IsNoABICalls;
7595 bool CanUseBSDABICalls;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007596 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00007597 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007598 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007599 enum DspRevEnum {
7600 NoDSP, DSP1, DSP2
7601 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00007602 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007603
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007604protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00007605 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007606 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007607
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007608public:
Daniel Sanders4672af62016-05-27 11:51:02 +00007609 MipsTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007610 : TargetInfo(Triple), IsMips16(false), IsMicromips(false),
Simon Dardisdf827a72017-02-21 16:01:00 +00007611 IsNan2008(false), IsSingleFloat(false), IsNoABICalls(false),
7612 CanUseBSDABICalls(false), FloatABI(HardFloat), DspRev(NoDSP),
7613 HasMSA(false), HasFP64(false) {
Zoran Jovanovic26a12162015-02-18 15:21:35 +00007614 TheCXXABI.set(TargetCXXABI::GenericMIPS);
Daniel Sanders4672af62016-05-27 11:51:02 +00007615
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007616 setABI((getTriple().getArch() == llvm::Triple::mips ||
7617 getTriple().getArch() == llvm::Triple::mipsel)
7618 ? "o32"
7619 : "n64");
7620
7621 CPU = ABI == "o32" ? "mips32r2" : "mips64r2";
Simon Dardisdf827a72017-02-21 16:01:00 +00007622
7623 CanUseBSDABICalls = Triple.getOS() == llvm::Triple::FreeBSD ||
7624 Triple.getOS() == llvm::Triple::OpenBSD;
Zoran Jovanovic26a12162015-02-18 15:21:35 +00007625 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007626
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007627 bool isNaN2008Default() const {
7628 return CPU == "mips32r6" || CPU == "mips64r6";
7629 }
7630
7631 bool isFP64Default() const {
7632 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
7633 }
7634
Petar Jovanovicd55ae6b2015-02-26 18:19:22 +00007635 bool isNan2008() const override {
7636 return IsNan2008;
7637 }
7638
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007639 bool processorSupportsGPR64() const {
7640 return llvm::StringSwitch<bool>(CPU)
7641 .Case("mips3", true)
7642 .Case("mips4", true)
7643 .Case("mips5", true)
7644 .Case("mips64", true)
7645 .Case("mips64r2", true)
7646 .Case("mips64r3", true)
7647 .Case("mips64r5", true)
7648 .Case("mips64r6", true)
7649 .Case("octeon", true)
7650 .Default(false);
7651 return false;
7652 }
7653
Alp Toker4925ba72014-06-07 23:30:42 +00007654 StringRef getABI() const override { return ABI; }
Daniel Sanders4672af62016-05-27 11:51:02 +00007655 bool setABI(const std::string &Name) override {
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007656 if (Name == "o32") {
7657 setO32ABITypes();
7658 ABI = Name;
7659 return true;
Daniel Sanders4672af62016-05-27 11:51:02 +00007660 }
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007661
7662 if (Name == "n32") {
7663 setN32ABITypes();
7664 ABI = Name;
7665 return true;
7666 }
7667 if (Name == "n64") {
7668 setN64ABITypes();
7669 ABI = Name;
7670 return true;
Daniel Sanders4672af62016-05-27 11:51:02 +00007671 }
7672 return false;
7673 }
7674
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007675 void setO32ABITypes() {
7676 Int64Type = SignedLongLong;
7677 IntMaxType = Int64Type;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007678 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007679 LongDoubleWidth = LongDoubleAlign = 64;
7680 LongWidth = LongAlign = 32;
7681 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
7682 PointerWidth = PointerAlign = 32;
7683 PtrDiffType = SignedInt;
7684 SizeType = UnsignedInt;
7685 SuitableAlign = 64;
7686 }
7687
7688 void setN32N64ABITypes() {
7689 LongDoubleWidth = LongDoubleAlign = 128;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007690 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007691 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
7692 LongDoubleWidth = LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007693 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007694 }
7695 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
7696 SuitableAlign = 128;
7697 }
7698
Daniel Sanders4672af62016-05-27 11:51:02 +00007699 void setN64ABITypes() {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007700 setN32N64ABITypes();
Brad Smith8e55bd52017-03-06 23:48:31 +00007701 if (getTriple().getOS() == llvm::Triple::OpenBSD) {
7702 Int64Type = SignedLongLong;
7703 } else {
7704 Int64Type = SignedLong;
7705 }
Daniel Sanders4672af62016-05-27 11:51:02 +00007706 IntMaxType = Int64Type;
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007707 LongWidth = LongAlign = 64;
7708 PointerWidth = PointerAlign = 64;
7709 PtrDiffType = SignedLong;
7710 SizeType = UnsignedLong;
Daniel Sanders4672af62016-05-27 11:51:02 +00007711 }
7712
7713 void setN32ABITypes() {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007714 setN32N64ABITypes();
Daniel Sanders4672af62016-05-27 11:51:02 +00007715 Int64Type = SignedLongLong;
7716 IntMaxType = Int64Type;
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007717 LongWidth = LongAlign = 32;
7718 PointerWidth = PointerAlign = 32;
7719 PtrDiffType = SignedInt;
7720 SizeType = UnsignedInt;
Daniel Sanders4672af62016-05-27 11:51:02 +00007721 }
7722
Craig Topper3164f332014-03-11 03:39:26 +00007723 bool setCPU(const std::string &Name) override {
Eric Christopher0b26a612010-03-02 02:41:08 +00007724 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007725 return llvm::StringSwitch<bool>(Name)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007726 .Case("mips1", true)
7727 .Case("mips2", true)
Simon Atanasyan26610c52014-07-04 12:36:56 +00007728 .Case("mips3", true)
7729 .Case("mips4", true)
7730 .Case("mips5", true)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007731 .Case("mips32", true)
7732 .Case("mips32r2", true)
7733 .Case("mips32r3", true)
7734 .Case("mips32r5", true)
7735 .Case("mips32r6", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007736 .Case("mips64", true)
7737 .Case("mips64r2", true)
Simon Atanasyan162feb52015-02-20 23:37:40 +00007738 .Case("mips64r3", true)
7739 .Case("mips64r5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007740 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00007741 .Case("octeon", true)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007742 .Case("p5600", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007743 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00007744 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00007745 const std::string& getCPU() const { return CPU; }
Eric Christopher8c47b422015-10-09 18:39:55 +00007746 bool
7747 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7748 StringRef CPU,
7749 const std::vector<std::string> &FeaturesVec) const override {
Bhushan D. Attardebacb988732016-03-04 06:56:29 +00007750 if (CPU.empty())
7751 CPU = getCPU();
Simon Atanasyan4e16a422014-07-04 12:37:04 +00007752 if (CPU == "octeon")
7753 Features["mips64r2"] = Features["cnmips"] = true;
7754 else
7755 Features[CPU] = true;
Eric Christopher007b0a02015-08-28 22:32:01 +00007756 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Eric Christopher0b26a612010-03-02 02:41:08 +00007757 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007758
Craig Topper3164f332014-03-11 03:39:26 +00007759 void getTargetDefines(const LangOptions &Opts,
7760 MacroBuilder &Builder) const override {
Daniel Sanders4672af62016-05-27 11:51:02 +00007761 if (BigEndian) {
7762 DefineStd(Builder, "MIPSEB", Opts);
7763 Builder.defineMacro("_MIPSEB");
7764 } else {
7765 DefineStd(Builder, "MIPSEL", Opts);
7766 Builder.defineMacro("_MIPSEL");
7767 }
7768
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007769 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00007770 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007771 if (Opts.GNUMode)
7772 Builder.defineMacro("mips");
7773
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007774 if (ABI == "o32") {
Daniel Sanders4672af62016-05-27 11:51:02 +00007775 Builder.defineMacro("__mips", "32");
7776 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
7777 } else {
7778 Builder.defineMacro("__mips", "64");
7779 Builder.defineMacro("__mips64");
7780 Builder.defineMacro("__mips64__");
7781 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
7782 }
7783
7784 const std::string ISARev = llvm::StringSwitch<std::string>(getCPU())
7785 .Cases("mips32", "mips64", "1")
7786 .Cases("mips32r2", "mips64r2", "2")
7787 .Cases("mips32r3", "mips64r3", "3")
7788 .Cases("mips32r5", "mips64r5", "5")
7789 .Cases("mips32r6", "mips64r6", "6")
7790 .Default("");
7791 if (!ISARev.empty())
7792 Builder.defineMacro("__mips_isa_rev", ISARev);
7793
7794 if (ABI == "o32") {
7795 Builder.defineMacro("__mips_o32");
7796 Builder.defineMacro("_ABIO32", "1");
7797 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
Daniel Sanders07c86542016-05-27 14:30:23 +00007798 } else if (ABI == "n32") {
Daniel Sanders4672af62016-05-27 11:51:02 +00007799 Builder.defineMacro("__mips_n32");
7800 Builder.defineMacro("_ABIN32", "2");
7801 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
7802 } else if (ABI == "n64") {
7803 Builder.defineMacro("__mips_n64");
7804 Builder.defineMacro("_ABI64", "3");
7805 Builder.defineMacro("_MIPS_SIM", "_ABI64");
7806 } else
7807 llvm_unreachable("Invalid ABI.");
7808
Simon Dardisdf827a72017-02-21 16:01:00 +00007809 if (!IsNoABICalls) {
7810 Builder.defineMacro("__mips_abicalls");
7811 if (CanUseBSDABICalls)
7812 Builder.defineMacro("__ABICALLS__");
7813 }
7814
Simon Atanasyan683535b2012-08-29 19:14:58 +00007815 Builder.defineMacro("__REGISTER_PREFIX__", "");
7816
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007817 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007818 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00007819 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007820 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007821 case SoftFloat:
7822 Builder.defineMacro("__mips_soft_float", Twine(1));
7823 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00007824 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00007825
Simon Atanasyan16071912013-04-14 14:07:30 +00007826 if (IsSingleFloat)
7827 Builder.defineMacro("__mips_single_float", Twine(1));
7828
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007829 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
7830 Builder.defineMacro("_MIPS_FPSET",
7831 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
7832
Simon Atanasyan72244b62012-07-05 16:06:06 +00007833 if (IsMips16)
7834 Builder.defineMacro("__mips16", Twine(1));
7835
Simon Atanasyan60777612013-04-14 14:07:51 +00007836 if (IsMicromips)
7837 Builder.defineMacro("__mips_micromips", Twine(1));
7838
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007839 if (IsNan2008)
7840 Builder.defineMacro("__mips_nan2008", Twine(1));
7841
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007842 switch (DspRev) {
7843 default:
7844 break;
7845 case DSP1:
7846 Builder.defineMacro("__mips_dsp_rev", Twine(1));
7847 Builder.defineMacro("__mips_dsp", Twine(1));
7848 break;
7849 case DSP2:
7850 Builder.defineMacro("__mips_dsp_rev", Twine(2));
7851 Builder.defineMacro("__mips_dspr2", Twine(1));
7852 Builder.defineMacro("__mips_dsp", Twine(1));
7853 break;
7854 }
7855
Jack Carter44ff1e52013-08-12 17:20:29 +00007856 if (HasMSA)
7857 Builder.defineMacro("__mips_msa", Twine(1));
7858
Simon Atanasyan26f19672012-04-05 19:28:31 +00007859 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
7860 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
7861 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00007862
7863 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
7864 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Daniel Sanders5176f7e2015-12-22 12:59:30 +00007865
7866 // These shouldn't be defined for MIPS-I but there's no need to check
7867 // for that since MIPS-I isn't supported.
7868 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
7869 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
7870 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007871
7872 // 32-bit MIPS processors don't have the necessary lld/scd instructions
7873 // found in 64-bit processors. In the case of O32 on a 64-bit processor,
7874 // the instructions exist but using them violates the ABI since they
7875 // require 64-bit GPRs and O32 only supports 32-bit GPRs.
7876 if (ABI == "n32" || ABI == "n64")
Daniel Sanders4672af62016-05-27 11:51:02 +00007877 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007878 }
7879
Craig Topper6c03a542015-10-19 04:51:35 +00007880 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7881 return llvm::makeArrayRef(BuiltinInfo,
7882 clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin);
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007883 }
Craig Topper3164f332014-03-11 03:39:26 +00007884 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00007885 return llvm::StringSwitch<bool>(Feature)
7886 .Case("mips", true)
7887 .Case("fp64", HasFP64)
7888 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00007889 }
Craig Topper3164f332014-03-11 03:39:26 +00007890 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00007891 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007892 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007893 ArrayRef<const char *> getGCCRegNames() const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00007894 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00007895 // CPU register names
7896 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007897 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
7898 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
7899 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00007900 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
7901 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007902 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
7903 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
7904 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
7905 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00007906 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007907 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Hrvoje Varga14c42ee2016-03-29 12:46:16 +00007908 "$fcc5","$fcc6","$fcc7","$ac1hi","$ac1lo","$ac2hi","$ac2lo",
7909 "$ac3hi","$ac3lo",
Daniel Sanders8b59af12013-11-12 12:56:01 +00007910 // MSA register names
7911 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
7912 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
7913 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
7914 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
7915 // MSA control register names
7916 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
7917 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007918 };
Craig Topperf054e3a2015-10-19 03:52:27 +00007919 return llvm::makeArrayRef(GCCRegNames);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007920 }
Craig Topper3164f332014-03-11 03:39:26 +00007921 bool validateAsmConstraint(const char *&Name,
7922 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007923 switch (*Name) {
7924 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00007925 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007926 case 'r': // CPU registers.
7927 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00007928 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007929 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00007930 case 'c': // $25 for indirect jumps
7931 case 'l': // lo register
7932 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007933 Info.setAllowsRegister();
7934 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00007935 case 'I': // Signed 16-bit constant
7936 case 'J': // Integer 0
7937 case 'K': // Unsigned 16-bit constant
7938 case 'L': // Signed 32-bit constant, lower 16-bit zeros (for lui)
7939 case 'M': // Constants not loadable via lui, addiu, or ori
7940 case 'N': // Constant -1 to -65535
7941 case 'O': // A signed 15-bit constant
7942 case 'P': // A constant between 1 go 65535
7943 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00007944 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00007945 Info.setAllowsMemory();
7946 return true;
Daniel Sanders48fa39e2015-03-30 13:47:23 +00007947 case 'Z':
7948 if (Name[1] == 'C') { // An address usable by ll, and sc.
7949 Info.setAllowsMemory();
7950 Name++; // Skip over 'Z'.
7951 return true;
7952 }
7953 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007954 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007955 }
7956
Daniel Sanders48fa39e2015-03-30 13:47:23 +00007957 std::string convertConstraint(const char *&Constraint) const override {
7958 std::string R;
7959 switch (*Constraint) {
7960 case 'Z': // Two-character constraint; add "^" hint for later parsing.
7961 if (Constraint[1] == 'C') {
7962 R = std::string("^") + std::string(Constraint, 2);
7963 Constraint++;
7964 return R;
7965 }
7966 break;
7967 }
7968 return TargetInfo::convertConstraint(Constraint);
7969 }
7970
Craig Topper3164f332014-03-11 03:39:26 +00007971 const char *getClobbers() const override {
Toma Tabacucfab40f2015-01-12 14:41:30 +00007972 // In GCC, $1 is not widely used in generated code (it's used only in a few
7973 // specific situations), so there is no real need for users to add it to
7974 // the clobbers list if they want to use it in their inline assembly code.
7975 //
7976 // In LLVM, $1 is treated as a normal GPR and is always allocatable during
7977 // code generation, so using it in inline assembly without adding it to the
7978 // clobbers list can cause conflicts between the inline assembly code and
7979 // the surrounding generated code.
7980 //
7981 // Another problem is that LLVM is allowed to choose $1 for inline assembly
7982 // operands, which will conflict with the ".set at" assembler option (which
7983 // we use only for inline assembly, in order to maintain compatibility with
7984 // GCC) and will also conflict with the user's usage of $1.
7985 //
7986 // The easiest way to avoid these conflicts and keep $1 as an allocatable
7987 // register for generated code is to automatically clobber $1 for all inline
7988 // assembly code.
7989 //
7990 // FIXME: We should automatically clobber $1 only for inline assembly code
7991 // which actually uses it. This would allow LLVM to use $1 for inline
7992 // assembly operands if the user's assembly code doesn't use it.
Toma Tabacu99411952014-12-17 12:02:58 +00007993 return "~{$1}";
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007994 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007995
Craig Topper3164f332014-03-11 03:39:26 +00007996 bool handleTargetFeatures(std::vector<std::string> &Features,
7997 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00007998 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00007999 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00008000 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00008001 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00008002 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00008003 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00008004 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00008005
Eric Christopher610fe112015-08-26 08:21:55 +00008006 for (const auto &Feature : Features) {
8007 if (Feature == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00008008 IsSingleFloat = true;
Eric Christopher610fe112015-08-26 08:21:55 +00008009 else if (Feature == "+soft-float")
Simon Atanasyan9f444d52012-07-05 15:32:46 +00008010 FloatABI = SoftFloat;
Eric Christopher610fe112015-08-26 08:21:55 +00008011 else if (Feature == "+mips16")
Simon Atanasyan72244b62012-07-05 16:06:06 +00008012 IsMips16 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00008013 else if (Feature == "+micromips")
Simon Atanasyan60777612013-04-14 14:07:51 +00008014 IsMicromips = true;
Eric Christopher610fe112015-08-26 08:21:55 +00008015 else if (Feature == "+dsp")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00008016 DspRev = std::max(DspRev, DSP1);
Eric Christopher610fe112015-08-26 08:21:55 +00008017 else if (Feature == "+dspr2")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00008018 DspRev = std::max(DspRev, DSP2);
Eric Christopher610fe112015-08-26 08:21:55 +00008019 else if (Feature == "+msa")
Jack Carter44ff1e52013-08-12 17:20:29 +00008020 HasMSA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00008021 else if (Feature == "+fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00008022 HasFP64 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00008023 else if (Feature == "-fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00008024 HasFP64 = false;
Eric Christopher610fe112015-08-26 08:21:55 +00008025 else if (Feature == "+nan2008")
Simon Atanasyan22127ce2013-09-24 09:09:16 +00008026 IsNan2008 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00008027 else if (Feature == "-nan2008")
Daniel Sanders9500d2d2014-07-09 13:56:23 +00008028 IsNan2008 = false;
Simon Dardisdf827a72017-02-21 16:01:00 +00008029 else if (Feature == "+noabicalls")
8030 IsNoABICalls = true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00008031 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00008032
James Y Knightb214cbc2016-03-04 19:00:41 +00008033 setDataLayout();
Akira Hatanaka9064e362013-10-29 18:30:33 +00008034
Rafael Espindolaeb265472013-08-21 21:59:03 +00008035 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00008036 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00008037
Craig Topper3164f332014-03-11 03:39:26 +00008038 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00008039 if (RegNo == 0) return 4;
8040 if (RegNo == 1) return 5;
8041 return -1;
8042 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00008043
8044 bool isCLZForZeroUndef() const override { return false; }
Daniel Sanders4672af62016-05-27 11:51:02 +00008045
8046 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8047 static const TargetInfo::GCCRegAlias O32RegAliases[] = {
8048 {{"at"}, "$1"}, {{"v0"}, "$2"}, {{"v1"}, "$3"},
8049 {{"a0"}, "$4"}, {{"a1"}, "$5"}, {{"a2"}, "$6"},
8050 {{"a3"}, "$7"}, {{"t0"}, "$8"}, {{"t1"}, "$9"},
8051 {{"t2"}, "$10"}, {{"t3"}, "$11"}, {{"t4"}, "$12"},
8052 {{"t5"}, "$13"}, {{"t6"}, "$14"}, {{"t7"}, "$15"},
8053 {{"s0"}, "$16"}, {{"s1"}, "$17"}, {{"s2"}, "$18"},
8054 {{"s3"}, "$19"}, {{"s4"}, "$20"}, {{"s5"}, "$21"},
8055 {{"s6"}, "$22"}, {{"s7"}, "$23"}, {{"t8"}, "$24"},
8056 {{"t9"}, "$25"}, {{"k0"}, "$26"}, {{"k1"}, "$27"},
8057 {{"gp"}, "$28"}, {{"sp", "$sp"}, "$29"}, {{"fp", "$fp"}, "$30"},
8058 {{"ra"}, "$31"}};
8059 static const TargetInfo::GCCRegAlias NewABIRegAliases[] = {
8060 {{"at"}, "$1"}, {{"v0"}, "$2"}, {{"v1"}, "$3"},
8061 {{"a0"}, "$4"}, {{"a1"}, "$5"}, {{"a2"}, "$6"},
8062 {{"a3"}, "$7"}, {{"a4"}, "$8"}, {{"a5"}, "$9"},
8063 {{"a6"}, "$10"}, {{"a7"}, "$11"}, {{"t0"}, "$12"},
8064 {{"t1"}, "$13"}, {{"t2"}, "$14"}, {{"t3"}, "$15"},
8065 {{"s0"}, "$16"}, {{"s1"}, "$17"}, {{"s2"}, "$18"},
8066 {{"s3"}, "$19"}, {{"s4"}, "$20"}, {{"s5"}, "$21"},
8067 {{"s6"}, "$22"}, {{"s7"}, "$23"}, {{"t8"}, "$24"},
8068 {{"t9"}, "$25"}, {{"k0"}, "$26"}, {{"k1"}, "$27"},
8069 {{"gp"}, "$28"}, {{"sp", "$sp"}, "$29"}, {{"fp", "$fp"}, "$30"},
8070 {{"ra"}, "$31"}};
Daniel Sanders26a56ad2016-06-06 09:07:08 +00008071 if (ABI == "o32")
Daniel Sanders4672af62016-05-27 11:51:02 +00008072 return llvm::makeArrayRef(O32RegAliases);
8073 return llvm::makeArrayRef(NewABIRegAliases);
8074 }
8075
8076 bool hasInt128Type() const override {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00008077 return ABI == "n32" || ABI == "n64";
Daniel Sanders4672af62016-05-27 11:51:02 +00008078 }
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00008079
8080 bool validateTarget(DiagnosticsEngine &Diags) const override {
8081 // FIXME: It's valid to use O32 on a 64-bit CPU but the backend can't handle
8082 // this yet. It's better to fail here than on the backend assertion.
8083 if (processorSupportsGPR64() && ABI == "o32") {
8084 Diags.Report(diag::err_target_unsupported_abi) << ABI << CPU;
8085 return false;
8086 }
8087
8088 // 64-bit ABI's require 64-bit CPU's.
8089 if (!processorSupportsGPR64() && (ABI == "n32" || ABI == "n64")) {
8090 Diags.Report(diag::err_target_unsupported_abi) << ABI << CPU;
8091 return false;
8092 }
8093
8094 // FIXME: It's valid to use O32 on a mips64/mips64el triple but the backend
8095 // can't handle this yet. It's better to fail here than on the
8096 // backend assertion.
8097 if ((getTriple().getArch() == llvm::Triple::mips64 ||
8098 getTriple().getArch() == llvm::Triple::mips64el) &&
8099 ABI == "o32") {
8100 Diags.Report(diag::err_target_unsupported_abi_for_triple)
8101 << ABI << getTriple().str();
8102 return false;
8103 }
8104
8105 // FIXME: It's valid to use N32/N64 on a mips/mipsel triple but the backend
8106 // can't handle this yet. It's better to fail here than on the
8107 // backend assertion.
8108 if ((getTriple().getArch() == llvm::Triple::mips ||
8109 getTriple().getArch() == llvm::Triple::mipsel) &&
8110 (ABI == "n32" || ABI == "n64")) {
8111 Diags.Report(diag::err_target_unsupported_abi_for_triple)
8112 << ABI << getTriple().str();
8113 return false;
8114 }
8115
8116 return true;
8117 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008118};
8119
Daniel Sanders4672af62016-05-27 11:51:02 +00008120const Builtin::Info MipsTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00008121#define BUILTIN(ID, TYPE, ATTRS) \
8122 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
8123#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
8124 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00008125#include "clang/Basic/BuiltinsMips.def"
8126};
8127
Ivan Krasindd7403e2011-08-24 20:22:22 +00008128class PNaClTargetInfo : public TargetInfo {
8129public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008130 PNaClTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8131 : TargetInfo(Triple) {
Ivan Krasindd7403e2011-08-24 20:22:22 +00008132 this->LongAlign = 32;
8133 this->LongWidth = 32;
8134 this->PointerAlign = 32;
8135 this->PointerWidth = 32;
8136 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00008137 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00008138 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00008139 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00008140 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00008141 this->SizeType = TargetInfo::UnsignedInt;
8142 this->PtrDiffType = TargetInfo::SignedInt;
8143 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00008144 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00008145 }
8146
Craig Toppere6f17d02014-03-11 04:07:52 +00008147 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00008148 Builder.defineMacro("__le32__");
8149 Builder.defineMacro("__pnacl__");
8150 }
Craig Topper3164f332014-03-11 03:39:26 +00008151 void getTargetDefines(const LangOptions &Opts,
8152 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00008153 getArchDefines(Opts, Builder);
8154 }
Craig Topper3164f332014-03-11 03:39:26 +00008155 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00008156 return Feature == "pnacl";
8157 }
Craig Topper6c03a542015-10-19 04:51:35 +00008158 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Craig Topper3164f332014-03-11 03:39:26 +00008159 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00008160 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00008161 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008162 ArrayRef<const char *> getGCCRegNames() const override;
8163 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00008164 bool validateAsmConstraint(const char *&Name,
8165 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00008166 return false;
8167 }
8168
Craig Topper3164f332014-03-11 03:39:26 +00008169 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00008170 return "";
8171 }
8172};
8173
Craig Topperf054e3a2015-10-19 03:52:27 +00008174ArrayRef<const char *> PNaClTargetInfo::getGCCRegNames() const {
8175 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00008176}
8177
Craig Topperf054e3a2015-10-19 03:52:27 +00008178ArrayRef<TargetInfo::GCCRegAlias> PNaClTargetInfo::getGCCRegAliases() const {
8179 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00008180}
Ivan Krasindd7403e2011-08-24 20:22:22 +00008181
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008182// We attempt to use PNaCl (le32) frontend and Mips32EL backend.
Daniel Sanders4672af62016-05-27 11:51:02 +00008183class NaClMips32TargetInfo : public MipsTargetInfo {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008184public:
Daniel Sanders4672af62016-05-27 11:51:02 +00008185 NaClMips32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8186 : MipsTargetInfo(Triple, Opts) {}
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008187
8188 BuiltinVaListKind getBuiltinVaListKind() const override {
8189 return TargetInfo::PNaClABIBuiltinVaList;
8190 }
8191};
8192
JF Bastien643817d2014-09-12 17:52:47 +00008193class Le64TargetInfo : public TargetInfo {
8194 static const Builtin::Info BuiltinInfo[];
8195
8196public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008197 Le64TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
8198 : TargetInfo(Triple) {
JF Bastien643817d2014-09-12 17:52:47 +00008199 NoAsmVariants = true;
8200 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
8201 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00008202 resetDataLayout("e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128");
JF Bastien643817d2014-09-12 17:52:47 +00008203 }
8204
8205 void getTargetDefines(const LangOptions &Opts,
8206 MacroBuilder &Builder) const override {
Saleem Abdulrasool56027092017-02-07 19:00:06 +00008207 DefineStd(Builder, "unix", Opts);
JF Bastien643817d2014-09-12 17:52:47 +00008208 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
8209 Builder.defineMacro("__ELF__");
8210 }
Craig Topper6c03a542015-10-19 04:51:35 +00008211 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
8212 return llvm::makeArrayRef(BuiltinInfo,
8213 clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin);
JF Bastien643817d2014-09-12 17:52:47 +00008214 }
8215 BuiltinVaListKind getBuiltinVaListKind() const override {
8216 return TargetInfo::PNaClABIBuiltinVaList;
8217 }
8218 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00008219 ArrayRef<const char *> getGCCRegNames() const override {
8220 return None;
JF Bastien643817d2014-09-12 17:52:47 +00008221 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008222 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8223 return None;
JF Bastien643817d2014-09-12 17:52:47 +00008224 }
8225 bool validateAsmConstraint(const char *&Name,
8226 TargetInfo::ConstraintInfo &Info) const override {
8227 return false;
8228 }
8229
8230 bool hasProtectedVisibility() const override { return false; }
JF Bastien643817d2014-09-12 17:52:47 +00008231};
Dan Gohmanc2853072015-09-03 22:51:53 +00008232
8233class WebAssemblyTargetInfo : public TargetInfo {
8234 static const Builtin::Info BuiltinInfo[];
8235
8236 enum SIMDEnum {
8237 NoSIMD,
8238 SIMD128,
8239 } SIMDLevel;
8240
8241public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008242 explicit WebAssemblyTargetInfo(const llvm::Triple &T, const TargetOptions &)
Dan Gohmanc2853072015-09-03 22:51:53 +00008243 : TargetInfo(T), SIMDLevel(NoSIMD) {
Dan Gohmanc2853072015-09-03 22:51:53 +00008244 NoAsmVariants = true;
8245 SuitableAlign = 128;
8246 LargeArrayMinWidth = 128;
8247 LargeArrayAlign = 128;
8248 SimdDefaultAlign = 128;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00008249 SigAtomicType = SignedLong;
Dan Gohman6db46402015-11-10 21:01:46 +00008250 LongDoubleWidth = LongDoubleAlign = 128;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00008251 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Derek Schuffacdc8e62016-09-01 22:38:37 +00008252 SizeType = UnsignedInt;
8253 PtrDiffType = SignedInt;
8254 IntPtrType = SignedInt;
Dan Gohmanc2853072015-09-03 22:51:53 +00008255 }
8256
8257protected:
8258 void getTargetDefines(const LangOptions &Opts,
8259 MacroBuilder &Builder) const override {
8260 defineCPUMacros(Builder, "wasm", /*Tuning=*/false);
8261 if (SIMDLevel >= SIMD128)
8262 Builder.defineMacro("__wasm_simd128__");
8263 }
8264
8265private:
Eric Christopher8c47b422015-10-09 18:39:55 +00008266 bool
8267 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
8268 StringRef CPU,
8269 const std::vector<std::string> &FeaturesVec) const override {
Dan Gohmanc2853072015-09-03 22:51:53 +00008270 if (CPU == "bleeding-edge")
8271 Features["simd128"] = true;
8272 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
8273 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00008274 bool hasFeature(StringRef Feature) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00008275 return llvm::StringSwitch<bool>(Feature)
8276 .Case("simd128", SIMDLevel >= SIMD128)
8277 .Default(false);
8278 }
8279 bool handleTargetFeatures(std::vector<std::string> &Features,
Hans Wennborg7eb54642015-09-10 17:07:54 +00008280 DiagnosticsEngine &Diags) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00008281 for (const auto &Feature : Features) {
8282 if (Feature == "+simd128") {
8283 SIMDLevel = std::max(SIMDLevel, SIMD128);
8284 continue;
8285 }
8286 if (Feature == "-simd128") {
8287 SIMDLevel = std::min(SIMDLevel, SIMDEnum(SIMD128 - 1));
8288 continue;
8289 }
8290
8291 Diags.Report(diag::err_opt_not_valid_with_opt) << Feature
8292 << "-target-feature";
8293 return false;
8294 }
8295 return true;
8296 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00008297 bool setCPU(const std::string &Name) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00008298 return llvm::StringSwitch<bool>(Name)
8299 .Case("mvp", true)
8300 .Case("bleeding-edge", true)
8301 .Case("generic", true)
8302 .Default(false);
8303 }
Craig Topper6c03a542015-10-19 04:51:35 +00008304 ArrayRef<Builtin::Info> getTargetBuiltins() const final {
8305 return llvm::makeArrayRef(BuiltinInfo,
8306 clang::WebAssembly::LastTSBuiltin - Builtin::FirstTSBuiltin);
Dan Gohmanc2853072015-09-03 22:51:53 +00008307 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00008308 BuiltinVaListKind getBuiltinVaListKind() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00008309 return VoidPtrBuiltinVaList;
8310 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008311 ArrayRef<const char *> getGCCRegNames() const final {
8312 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00008313 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008314 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const final {
8315 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00008316 }
8317 bool
8318 validateAsmConstraint(const char *&Name,
Hans Wennborg7eb54642015-09-10 17:07:54 +00008319 TargetInfo::ConstraintInfo &Info) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00008320 return false;
8321 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00008322 const char *getClobbers() const final { return ""; }
8323 bool isCLZForZeroUndef() const final { return false; }
8324 bool hasInt128Type() const final { return true; }
Dan Gohmanab0e31f2015-09-14 21:49:41 +00008325 IntType getIntTypeByWidth(unsigned BitWidth,
8326 bool IsSigned) const final {
8327 // WebAssembly prefers long long for explicitly 64-bit integers.
8328 return BitWidth == 64 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
8329 : TargetInfo::getIntTypeByWidth(BitWidth, IsSigned);
8330 }
8331 IntType getLeastIntTypeByWidth(unsigned BitWidth,
8332 bool IsSigned) const final {
8333 // WebAssembly uses long long for int_least64_t and int_fast64_t.
8334 return BitWidth == 64
8335 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
8336 : TargetInfo::getLeastIntTypeByWidth(BitWidth, IsSigned);
8337 }
Dan Gohmanc2853072015-09-03 22:51:53 +00008338};
8339
8340const Builtin::Info WebAssemblyTargetInfo::BuiltinInfo[] = {
8341#define BUILTIN(ID, TYPE, ATTRS) \
8342 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
8343#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
8344 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
8345#include "clang/Basic/BuiltinsWebAssembly.def"
8346};
8347
8348class WebAssembly32TargetInfo : public WebAssemblyTargetInfo {
8349public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008350 explicit WebAssembly32TargetInfo(const llvm::Triple &T,
8351 const TargetOptions &Opts)
8352 : WebAssemblyTargetInfo(T, Opts) {
Dan Gohmanf1c34e62015-09-14 21:56:37 +00008353 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
James Y Knightb214cbc2016-03-04 19:00:41 +00008354 resetDataLayout("e-m:e-p:32:32-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00008355 }
8356
8357protected:
8358 void getTargetDefines(const LangOptions &Opts,
8359 MacroBuilder &Builder) const override {
8360 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
8361 defineCPUMacros(Builder, "wasm32", /*Tuning=*/false);
8362 }
8363};
8364
8365class WebAssembly64TargetInfo : public WebAssemblyTargetInfo {
8366public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008367 explicit WebAssembly64TargetInfo(const llvm::Triple &T,
8368 const TargetOptions &Opts)
8369 : WebAssemblyTargetInfo(T, Opts) {
Dan Gohmanc2853072015-09-03 22:51:53 +00008370 LongAlign = LongWidth = 64;
8371 PointerAlign = PointerWidth = 64;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00008372 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Derek Schuffacdc8e62016-09-01 22:38:37 +00008373 SizeType = UnsignedLong;
8374 PtrDiffType = SignedLong;
8375 IntPtrType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00008376 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00008377 }
8378
8379protected:
8380 void getTargetDefines(const LangOptions &Opts,
8381 MacroBuilder &Builder) const override {
8382 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
8383 defineCPUMacros(Builder, "wasm64", /*Tuning=*/false);
8384 }
8385};
8386
JF Bastien643817d2014-09-12 17:52:47 +00008387const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
8388#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00008389 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
JF Bastien643817d2014-09-12 17:52:47 +00008390#include "clang/Basic/BuiltinsLe64.def"
8391};
8392
Eric Christopherc48497a2015-09-18 21:26:24 +00008393static const unsigned SPIRAddrSpaceMap[] = {
Yaxun Liub34ec822017-04-11 17:24:23 +00008394 0, // Default
Eric Christopherc48497a2015-09-18 21:26:24 +00008395 1, // opencl_global
8396 3, // opencl_local
8397 2, // opencl_constant
8398 4, // opencl_generic
8399 0, // cuda_device
8400 0, // cuda_constant
8401 0 // cuda_shared
8402};
8403class SPIRTargetInfo : public TargetInfo {
8404public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008405 SPIRTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
8406 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00008407 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
8408 "SPIR target must use unknown OS");
8409 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
8410 "SPIR target must use unknown environment type");
Eric Christopherc48497a2015-09-18 21:26:24 +00008411 TLSSupported = false;
8412 LongWidth = LongAlign = 64;
8413 AddrSpaceMap = &SPIRAddrSpaceMap;
8414 UseAddrSpaceMapMangling = true;
8415 // Define available target features
8416 // These must be defined in sorted order!
8417 NoAsmVariants = true;
8418 }
8419 void getTargetDefines(const LangOptions &Opts,
8420 MacroBuilder &Builder) const override {
8421 DefineStd(Builder, "SPIR", Opts);
8422 }
8423 bool hasFeature(StringRef Feature) const override {
8424 return Feature == "spir";
8425 }
Craig Topper3164f332014-03-11 03:39:26 +00008426
Craig Topper6c03a542015-10-19 04:51:35 +00008427 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00008428 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00008429 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00008430 bool validateAsmConstraint(const char *&Name,
8431 TargetInfo::ConstraintInfo &info) const override {
8432 return true;
8433 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008434 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8435 return None;
8436 }
Eric Christopherc48497a2015-09-18 21:26:24 +00008437 BuiltinVaListKind getBuiltinVaListKind() const override {
8438 return TargetInfo::VoidPtrBuiltinVaList;
8439 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00008440
Eric Christopherc48497a2015-09-18 21:26:24 +00008441 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Nikolay Haustov8c6538b2016-06-30 09:06:33 +00008442 return (CC == CC_SpirFunction || CC == CC_OpenCLKernel) ? CCCR_OK
8443 : CCCR_Warning;
Eric Christopherc48497a2015-09-18 21:26:24 +00008444 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00008445
Eric Christopherc48497a2015-09-18 21:26:24 +00008446 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
8447 return CC_SpirFunction;
8448 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00008449
8450 void setSupportedOpenCLOpts() override {
8451 // Assume all OpenCL extensions and optional core features are supported
8452 // for SPIR since it is a generic target.
Yaxun Liu5b746652016-12-18 05:18:55 +00008453 getSupportedOpenCLOpts().supportAll();
Yaxun Liu39cf40f2016-05-16 17:06:34 +00008454 }
Eric Christopherc48497a2015-09-18 21:26:24 +00008455};
Guy Benyeib798fc92012-12-11 21:38:14 +00008456
Eric Christopherc48497a2015-09-18 21:26:24 +00008457class SPIR32TargetInfo : public SPIRTargetInfo {
8458public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008459 SPIR32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8460 : SPIRTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00008461 PointerWidth = PointerAlign = 32;
8462 SizeType = TargetInfo::UnsignedInt;
8463 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +00008464 resetDataLayout("e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
8465 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00008466 }
8467 void getTargetDefines(const LangOptions &Opts,
8468 MacroBuilder &Builder) const override {
8469 DefineStd(Builder, "SPIR32", Opts);
8470 }
8471};
Guy Benyeib798fc92012-12-11 21:38:14 +00008472
Eric Christopherc48497a2015-09-18 21:26:24 +00008473class SPIR64TargetInfo : public SPIRTargetInfo {
8474public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008475 SPIR64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8476 : SPIRTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00008477 PointerWidth = PointerAlign = 64;
8478 SizeType = TargetInfo::UnsignedLong;
8479 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00008480 resetDataLayout("e-i64:64-v16:16-v24:32-v32:32-v48:64-"
8481 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00008482 }
8483 void getTargetDefines(const LangOptions &Opts,
8484 MacroBuilder &Builder) const override {
8485 DefineStd(Builder, "SPIR64", Opts);
8486 }
8487};
Guy Benyeib798fc92012-12-11 21:38:14 +00008488
Robert Lytton0e076492013-08-13 09:43:10 +00008489class XCoreTargetInfo : public TargetInfo {
8490 static const Builtin::Info BuiltinInfo[];
8491public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008492 XCoreTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
8493 : TargetInfo(Triple) {
Robert Lytton0e076492013-08-13 09:43:10 +00008494 NoAsmVariants = true;
8495 LongLongAlign = 32;
8496 SuitableAlign = 32;
8497 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00008498 SizeType = UnsignedInt;
8499 PtrDiffType = SignedInt;
8500 IntPtrType = SignedInt;
8501 WCharType = UnsignedChar;
8502 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00008503 UseZeroLengthBitfieldAlignment = true;
James Y Knightb214cbc2016-03-04 19:00:41 +00008504 resetDataLayout("e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32"
8505 "-f64:32-a:0:32-n32");
Robert Lytton0e076492013-08-13 09:43:10 +00008506 }
Craig Topper3164f332014-03-11 03:39:26 +00008507 void getTargetDefines(const LangOptions &Opts,
8508 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008509 Builder.defineMacro("__XS1B__");
8510 }
Craig Topper6c03a542015-10-19 04:51:35 +00008511 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
8512 return llvm::makeArrayRef(BuiltinInfo,
8513 clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin);
Robert Lytton0e076492013-08-13 09:43:10 +00008514 }
Craig Topper3164f332014-03-11 03:39:26 +00008515 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008516 return TargetInfo::VoidPtrBuiltinVaList;
8517 }
Craig Topper3164f332014-03-11 03:39:26 +00008518 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008519 return "";
8520 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008521 ArrayRef<const char *> getGCCRegNames() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008522 static const char * const GCCRegNames[] = {
8523 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
8524 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
8525 };
Craig Topperf054e3a2015-10-19 03:52:27 +00008526 return llvm::makeArrayRef(GCCRegNames);
Robert Lytton0e076492013-08-13 09:43:10 +00008527 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008528 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8529 return None;
Robert Lytton0e076492013-08-13 09:43:10 +00008530 }
Craig Topper3164f332014-03-11 03:39:26 +00008531 bool validateAsmConstraint(const char *&Name,
8532 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008533 return false;
8534 }
Craig Topper3164f332014-03-11 03:39:26 +00008535 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00008536 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
8537 return (RegNo < 2)? RegNo : -1;
8538 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00008539 bool allowsLargerPreferedTypeAlignment() const override {
8540 return false;
8541 }
Robert Lytton0e076492013-08-13 09:43:10 +00008542};
8543
8544const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00008545#define BUILTIN(ID, TYPE, ATTRS) \
8546 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
8547#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
8548 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Robert Lytton0e076492013-08-13 09:43:10 +00008549#include "clang/Basic/BuiltinsXCore.def"
8550};
Robert Lytton0e076492013-08-13 09:43:10 +00008551
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008552// x86_32 Android target
8553class AndroidX86_32TargetInfo : public LinuxTargetInfo<X86_32TargetInfo> {
8554public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008555 AndroidX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8556 : LinuxTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008557 SuitableAlign = 32;
8558 LongDoubleWidth = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00008559 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008560 }
8561};
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008562
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008563// x86_64 Android target
8564class AndroidX86_64TargetInfo : public LinuxTargetInfo<X86_64TargetInfo> {
8565public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008566 AndroidX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8567 : LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Stephan Bergmann17c7f702016-12-14 11:57:17 +00008568 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008569 }
Chih-Hung Hsieh0b0eeaa2015-07-24 18:12:54 +00008570
8571 bool useFloat128ManglingForLongDouble() const override {
8572 return true;
8573 }
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008574};
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008575
8576// 32-bit RenderScript is armv7 with width and align of 'long' set to 8-bytes
8577class RenderScript32TargetInfo : public ARMleTargetInfo {
8578public:
8579 RenderScript32TargetInfo(const llvm::Triple &Triple,
8580 const TargetOptions &Opts)
8581 : ARMleTargetInfo(llvm::Triple("armv7", Triple.getVendorName(),
8582 Triple.getOSName(),
8583 Triple.getEnvironmentName()),
8584 Opts) {
Pirama Arumuga Nainarbb846a32016-07-27 19:01:51 +00008585 IsRenderScriptTarget = true;
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008586 LongWidth = LongAlign = 64;
8587 }
8588 void getTargetDefines(const LangOptions &Opts,
8589 MacroBuilder &Builder) const override {
8590 Builder.defineMacro("__RENDERSCRIPT__");
8591 ARMleTargetInfo::getTargetDefines(Opts, Builder);
8592 }
8593};
8594
8595// 64-bit RenderScript is aarch64
8596class RenderScript64TargetInfo : public AArch64leTargetInfo {
8597public:
8598 RenderScript64TargetInfo(const llvm::Triple &Triple,
8599 const TargetOptions &Opts)
8600 : AArch64leTargetInfo(llvm::Triple("aarch64", Triple.getVendorName(),
8601 Triple.getOSName(),
8602 Triple.getEnvironmentName()),
Pirama Arumuga Nainarbb846a32016-07-27 19:01:51 +00008603 Opts) {
8604 IsRenderScriptTarget = true;
8605 }
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008606
8607 void getTargetDefines(const LangOptions &Opts,
8608 MacroBuilder &Builder) const override {
8609 Builder.defineMacro("__RENDERSCRIPT__");
8610 AArch64leTargetInfo::getTargetDefines(Opts, Builder);
8611 }
8612};
8613
Dylan McKayecb6e7b2017-02-07 06:04:18 +00008614/// Information about a specific microcontroller.
8615struct MCUInfo {
8616 const char *Name;
8617 const char *DefineName;
8618};
8619
8620// This list should be kept up-to-date with AVRDevices.td in LLVM.
8621static ArrayRef<MCUInfo> AVRMcus = {
8622 { "at90s1200", "__AVR_AT90S1200__" },
Dylan McKay315edb02017-02-11 21:06:07 +00008623 { "attiny11", "__AVR_ATtiny11__" },
8624 { "attiny12", "__AVR_ATtiny12__" },
8625 { "attiny15", "__AVR_ATtiny15__" },
8626 { "attiny28", "__AVR_ATtiny28__" },
8627 { "at90s2313", "__AVR_AT90S2313__" },
8628 { "at90s2323", "__AVR_AT90S2323__" },
8629 { "at90s2333", "__AVR_AT90S2333__" },
8630 { "at90s2343", "__AVR_AT90S2343__" },
8631 { "attiny22", "__AVR_ATtiny22__" },
8632 { "attiny26", "__AVR_ATtiny26__" },
8633 { "at86rf401", "__AVR_AT86RF401__" },
8634 { "at90s4414", "__AVR_AT90S4414__" },
8635 { "at90s4433", "__AVR_AT90S4433__" },
8636 { "at90s4434", "__AVR_AT90S4434__" },
8637 { "at90s8515", "__AVR_AT90S8515__" },
8638 { "at90c8534", "__AVR_AT90c8534__" },
8639 { "at90s8535", "__AVR_AT90S8535__" },
8640 { "ata5272", "__AVR_ATA5272__" },
8641 { "attiny13", "__AVR_ATtiny13__" },
8642 { "attiny13a", "__AVR_ATtiny13A__" },
8643 { "attiny2313", "__AVR_ATtiny2313__" },
8644 { "attiny2313a", "__AVR_ATtiny2313A__" },
8645 { "attiny24", "__AVR_ATtiny24__" },
8646 { "attiny24a", "__AVR_ATtiny24A__" },
8647 { "attiny4313", "__AVR_ATtiny4313__" },
8648 { "attiny44", "__AVR_ATtiny44__" },
8649 { "attiny44a", "__AVR_ATtiny44A__" },
8650 { "attiny84", "__AVR_ATtiny84__" },
8651 { "attiny84a", "__AVR_ATtiny84A__" },
8652 { "attiny25", "__AVR_ATtiny25__" },
8653 { "attiny45", "__AVR_ATtiny45__" },
8654 { "attiny85", "__AVR_ATtiny85__" },
8655 { "attiny261", "__AVR_ATtiny261__" },
8656 { "attiny261a", "__AVR_ATtiny261A__" },
8657 { "attiny461", "__AVR_ATtiny461__" },
8658 { "attiny461a", "__AVR_ATtiny461A__" },
8659 { "attiny861", "__AVR_ATtiny861__" },
8660 { "attiny861a", "__AVR_ATtiny861A__" },
8661 { "attiny87", "__AVR_ATtiny87__" },
8662 { "attiny43u", "__AVR_ATtiny43U__" },
8663 { "attiny48", "__AVR_ATtiny48__" },
8664 { "attiny88", "__AVR_ATtiny88__" },
8665 { "attiny828", "__AVR_ATtiny828__" },
8666 { "at43usb355", "__AVR_AT43USB355__" },
8667 { "at76c711", "__AVR_AT76C711__" },
8668 { "atmega103", "__AVR_ATmega103__" },
8669 { "at43usb320", "__AVR_AT43USB320__" },
8670 { "attiny167", "__AVR_ATtiny167__" },
8671 { "at90usb82", "__AVR_AT90USB82__" },
8672 { "at90usb162", "__AVR_AT90USB162__" },
8673 { "ata5505", "__AVR_ATA5505__" },
8674 { "atmega8u2", "__AVR_ATmega8U2__" },
8675 { "atmega16u2", "__AVR_ATmega16U2__" },
8676 { "atmega32u2", "__AVR_ATmega32U2__" },
8677 { "attiny1634", "__AVR_ATtiny1634__" },
8678 { "atmega8", "__AVR_ATmega8__" },
8679 { "ata6289", "__AVR_ATA6289__" },
8680 { "atmega8a", "__AVR_ATmega8A__" },
8681 { "ata6285", "__AVR_ATA6285__" },
8682 { "ata6286", "__AVR_ATA6286__" },
8683 { "atmega48", "__AVR_ATmega48__" },
8684 { "atmega48a", "__AVR_ATmega48A__" },
8685 { "atmega48pa", "__AVR_ATmega48PA__" },
8686 { "atmega48p", "__AVR_ATmega48P__" },
8687 { "atmega88", "__AVR_ATmega88__" },
8688 { "atmega88a", "__AVR_ATmega88A__" },
8689 { "atmega88p", "__AVR_ATmega88P__" },
8690 { "atmega88pa", "__AVR_ATmega88PA__" },
8691 { "atmega8515", "__AVR_ATmega8515__" },
8692 { "atmega8535", "__AVR_ATmega8535__" },
8693 { "atmega8hva", "__AVR_ATmega8HVA__" },
8694 { "at90pwm1", "__AVR_AT90PWM1__" },
8695 { "at90pwm2", "__AVR_AT90PWM2__" },
8696 { "at90pwm2b", "__AVR_AT90PWM2B__" },
8697 { "at90pwm3", "__AVR_AT90PWM3__" },
8698 { "at90pwm3b", "__AVR_AT90PWM3B__" },
8699 { "at90pwm81", "__AVR_AT90PWM81__" },
8700 { "ata5790", "__AVR_ATA5790__" },
8701 { "ata5795", "__AVR_ATA5795__" },
8702 { "atmega16", "__AVR_ATmega16__" },
8703 { "atmega16a", "__AVR_ATmega16A__" },
8704 { "atmega161", "__AVR_ATmega161__" },
8705 { "atmega162", "__AVR_ATmega162__" },
8706 { "atmega163", "__AVR_ATmega163__" },
8707 { "atmega164a", "__AVR_ATmega164A__" },
8708 { "atmega164p", "__AVR_ATmega164P__" },
8709 { "atmega164pa", "__AVR_ATmega164PA__" },
8710 { "atmega165", "__AVR_ATmega165__" },
8711 { "atmega165a", "__AVR_ATmega165A__" },
8712 { "atmega165p", "__AVR_ATmega165P__" },
8713 { "atmega165pa", "__AVR_ATmega165PA__" },
8714 { "atmega168", "__AVR_ATmega168__" },
8715 { "atmega168a", "__AVR_ATmega168A__" },
8716 { "atmega168p", "__AVR_ATmega168P__" },
8717 { "atmega168pa", "__AVR_ATmega168PA__" },
8718 { "atmega169", "__AVR_ATmega169__" },
8719 { "atmega169a", "__AVR_ATmega169A__" },
8720 { "atmega169p", "__AVR_ATmega169P__" },
8721 { "atmega169pa", "__AVR_ATmega169PA__" },
8722 { "atmega32", "__AVR_ATmega32__" },
8723 { "atmega32a", "__AVR_ATmega32A__" },
8724 { "atmega323", "__AVR_ATmega323__" },
8725 { "atmega324a", "__AVR_ATmega324A__" },
8726 { "atmega324p", "__AVR_ATmega324P__" },
8727 { "atmega324pa", "__AVR_ATmega324PA__" },
8728 { "atmega325", "__AVR_ATmega325__" },
8729 { "atmega325a", "__AVR_ATmega325A__" },
8730 { "atmega325p", "__AVR_ATmega325P__" },
8731 { "atmega325pa", "__AVR_ATmega325PA__" },
8732 { "atmega3250", "__AVR_ATmega3250__" },
8733 { "atmega3250a", "__AVR_ATmega3250A__" },
8734 { "atmega3250p", "__AVR_ATmega3250P__" },
8735 { "atmega3250pa", "__AVR_ATmega3250PA__" },
8736 { "atmega328", "__AVR_ATmega328__" },
8737 { "atmega328p", "__AVR_ATmega328P__" },
8738 { "atmega329", "__AVR_ATmega329__" },
8739 { "atmega329a", "__AVR_ATmega329A__" },
8740 { "atmega329p", "__AVR_ATmega329P__" },
8741 { "atmega329pa", "__AVR_ATmega329PA__" },
8742 { "atmega3290", "__AVR_ATmega3290__" },
8743 { "atmega3290a", "__AVR_ATmega3290A__" },
8744 { "atmega3290p", "__AVR_ATmega3290P__" },
8745 { "atmega3290pa", "__AVR_ATmega3290PA__" },
8746 { "atmega406", "__AVR_ATmega406__" },
8747 { "atmega64", "__AVR_ATmega64__" },
8748 { "atmega64a", "__AVR_ATmega64A__" },
8749 { "atmega640", "__AVR_ATmega640__" },
8750 { "atmega644", "__AVR_ATmega644__" },
8751 { "atmega644a", "__AVR_ATmega644A__" },
8752 { "atmega644p", "__AVR_ATmega644P__" },
8753 { "atmega644pa", "__AVR_ATmega644PA__" },
8754 { "atmega645", "__AVR_ATmega645__" },
8755 { "atmega645a", "__AVR_ATmega645A__" },
8756 { "atmega645p", "__AVR_ATmega645P__" },
8757 { "atmega649", "__AVR_ATmega649__" },
8758 { "atmega649a", "__AVR_ATmega649A__" },
8759 { "atmega649p", "__AVR_ATmega649P__" },
8760 { "atmega6450", "__AVR_ATmega6450__" },
8761 { "atmega6450a", "__AVR_ATmega6450A__" },
8762 { "atmega6450p", "__AVR_ATmega6450P__" },
8763 { "atmega6490", "__AVR_ATmega6490__" },
8764 { "atmega6490a", "__AVR_ATmega6490A__" },
8765 { "atmega6490p", "__AVR_ATmega6490P__" },
8766 { "atmega64rfr2", "__AVR_ATmega64RFR2__" },
8767 { "atmega644rfr2", "__AVR_ATmega644RFR2__" },
8768 { "atmega16hva", "__AVR_ATmega16HVA__" },
8769 { "atmega16hva2", "__AVR_ATmega16HVA2__" },
8770 { "atmega16hvb", "__AVR_ATmega16HVB__" },
8771 { "atmega16hvbrevb", "__AVR_ATmega16HVBREVB__" },
8772 { "atmega32hvb", "__AVR_ATmega32HVB__" },
8773 { "atmega32hvbrevb", "__AVR_ATmega32HVBREVB__" },
8774 { "atmega64hve", "__AVR_ATmega64HVE__" },
8775 { "at90can32", "__AVR_AT90CAN32__" },
8776 { "at90can64", "__AVR_AT90CAN64__" },
8777 { "at90pwm161", "__AVR_AT90PWM161__" },
8778 { "at90pwm216", "__AVR_AT90PWM216__" },
8779 { "at90pwm316", "__AVR_AT90PWM316__" },
8780 { "atmega32c1", "__AVR_ATmega32C1__" },
8781 { "atmega64c1", "__AVR_ATmega64C1__" },
8782 { "atmega16m1", "__AVR_ATmega16M1__" },
8783 { "atmega32m1", "__AVR_ATmega32M1__" },
8784 { "atmega64m1", "__AVR_ATmega64M1__" },
8785 { "atmega16u4", "__AVR_ATmega16U4__" },
8786 { "atmega32u4", "__AVR_ATmega32U4__" },
8787 { "atmega32u6", "__AVR_ATmega32U6__" },
8788 { "at90usb646", "__AVR_AT90USB646__" },
8789 { "at90usb647", "__AVR_AT90USB647__" },
8790 { "at90scr100", "__AVR_AT90SCR100__" },
8791 { "at94k", "__AVR_AT94K__" },
8792 { "m3000", "__AVR_AT000__" },
8793 { "atmega128", "__AVR_ATmega128__" },
8794 { "atmega128a", "__AVR_ATmega128A__" },
8795 { "atmega1280", "__AVR_ATmega1280__" },
8796 { "atmega1281", "__AVR_ATmega1281__" },
8797 { "atmega1284", "__AVR_ATmega1284__" },
8798 { "atmega1284p", "__AVR_ATmega1284P__" },
8799 { "atmega128rfa1", "__AVR_ATmega128RFA1__" },
8800 { "atmega128rfr2", "__AVR_ATmega128RFR2__" },
8801 { "atmega1284rfr2", "__AVR_ATmega1284RFR2__" },
8802 { "at90can128", "__AVR_AT90CAN128__" },
8803 { "at90usb1286", "__AVR_AT90USB1286__" },
8804 { "at90usb1287", "__AVR_AT90USB1287__" },
8805 { "atmega2560", "__AVR_ATmega2560__" },
8806 { "atmega2561", "__AVR_ATmega2561__" },
8807 { "atmega256rfr2", "__AVR_ATmega256RFR2__" },
8808 { "atmega2564rfr2", "__AVR_ATmega2564RFR2__" },
8809 { "atxmega16a4", "__AVR_ATxmega16A4__" },
8810 { "atxmega16a4u", "__AVR_ATxmega16a4U__" },
8811 { "atxmega16c4", "__AVR_ATxmega16C4__" },
8812 { "atxmega16d4", "__AVR_ATxmega16D4__" },
8813 { "atxmega32a4", "__AVR_ATxmega32A4__" },
8814 { "atxmega32a4u", "__AVR_ATxmega32A4U__" },
8815 { "atxmega32c4", "__AVR_ATxmega32C4__" },
8816 { "atxmega32d4", "__AVR_ATxmega32D4__" },
8817 { "atxmega32e5", "__AVR_ATxmega32E5__" },
8818 { "atxmega16e5", "__AVR_ATxmega16E5__" },
8819 { "atxmega8e5", "__AVR_ATxmega8E5__" },
8820 { "atxmega32x1", "__AVR_ATxmega32X1__" },
8821 { "atxmega64a3", "__AVR_ATxmega64A3__" },
8822 { "atxmega64a3u", "__AVR_ATxmega64A3U__" },
8823 { "atxmega64a4u", "__AVR_ATxmega64A4U__" },
8824 { "atxmega64b1", "__AVR_ATxmega64B1__" },
8825 { "atxmega64b3", "__AVR_ATxmega64B3__" },
8826 { "atxmega64c3", "__AVR_ATxmega64C3__" },
8827 { "atxmega64d3", "__AVR_ATxmega64D3__" },
8828 { "atxmega64d4", "__AVR_ATxmega64D4__" },
8829 { "atxmega64a1", "__AVR_ATxmega64A1__" },
8830 { "atxmega64a1u", "__AVR_ATxmega64A1U__" },
8831 { "atxmega128a3", "__AVR_ATxmega128A3__" },
8832 { "atxmega128a3u", "__AVR_ATxmega128A3U__" },
8833 { "atxmega128b1", "__AVR_ATxmega128B1__" },
8834 { "atxmega128b3", "__AVR_ATxmega128B3__" },
8835 { "atxmega128c3", "__AVR_ATxmega128C3__" },
8836 { "atxmega128d3", "__AVR_ATxmega128D3__" },
8837 { "atxmega128d4", "__AVR_ATxmega128D4__" },
8838 { "atxmega192a3", "__AVR_ATxmega192A3__" },
8839 { "atxmega192a3u", "__AVR_ATxmega192A3U__" },
8840 { "atxmega192c3", "__AVR_ATxmega192C3__" },
8841 { "atxmega192d3", "__AVR_ATxmega192D3__" },
8842 { "atxmega256a3", "__AVR_ATxmega256A3__" },
8843 { "atxmega256a3u", "__AVR_ATxmega256A3U__" },
8844 { "atxmega256a3b", "__AVR_ATxmega256A3B__" },
8845 { "atxmega256a3bu", "__AVR_ATxmega256A3BU__" },
8846 { "atxmega256c3", "__AVR_ATxmega256C3__" },
8847 { "atxmega256d3", "__AVR_ATxmega256D3__" },
8848 { "atxmega384c3", "__AVR_ATxmega384C3__" },
8849 { "atxmega384d3", "__AVR_ATxmega384D3__" },
8850 { "atxmega128a1", "__AVR_ATxmega128A1__" },
8851 { "atxmega128a1u", "__AVR_ATxmega128A1U__" },
8852 { "atxmega128a4u", "__AVR_ATxmega128a4U__" },
8853 { "attiny4", "__AVR_ATtiny4__" },
8854 { "attiny5", "__AVR_ATtiny5__" },
8855 { "attiny9", "__AVR_ATtiny9__" },
8856 { "attiny10", "__AVR_ATtiny10__" },
8857 { "attiny20", "__AVR_ATtiny20__" },
8858 { "attiny40", "__AVR_ATtiny40__" },
8859 { "attiny102", "__AVR_ATtiny102__" },
8860 { "attiny104", "__AVR_ATtiny104__" },
Dylan McKayecb6e7b2017-02-07 06:04:18 +00008861};
Dylan McKay924fa3a2017-01-05 05:20:27 +00008862
8863// AVR Target
8864class AVRTargetInfo : public TargetInfo {
8865public:
8866 AVRTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
8867 : TargetInfo(Triple) {
8868 TLSSupported = false;
8869 PointerWidth = 16;
8870 PointerAlign = 8;
8871 IntWidth = 16;
8872 IntAlign = 8;
8873 LongWidth = 32;
8874 LongAlign = 8;
8875 LongLongWidth = 64;
8876 LongLongAlign = 8;
8877 SuitableAlign = 8;
8878 DefaultAlignForAttributeAligned = 8;
8879 HalfWidth = 16;
8880 HalfAlign = 8;
8881 FloatWidth = 32;
8882 FloatAlign = 8;
8883 DoubleWidth = 32;
8884 DoubleAlign = 8;
8885 DoubleFormat = &llvm::APFloat::IEEEsingle();
8886 LongDoubleWidth = 32;
8887 LongDoubleAlign = 8;
8888 LongDoubleFormat = &llvm::APFloat::IEEEsingle();
8889 SizeType = UnsignedInt;
8890 PtrDiffType = SignedInt;
8891 IntPtrType = SignedInt;
8892 Char16Type = UnsignedInt;
8893 WCharType = SignedInt;
8894 WIntType = SignedInt;
8895 Char32Type = UnsignedLong;
8896 SigAtomicType = SignedChar;
8897 resetDataLayout("e-p:16:16:16-i8:8:8-i16:16:16-i32:32:32-i64:64:64"
8898 "-f32:32:32-f64:64:64-n8");
8899 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008900
Dylan McKay924fa3a2017-01-05 05:20:27 +00008901 void getTargetDefines(const LangOptions &Opts,
8902 MacroBuilder &Builder) const override {
Dylan McKayecb6e7b2017-02-07 06:04:18 +00008903 Builder.defineMacro("AVR");
8904 Builder.defineMacro("__AVR");
Dylan McKay924fa3a2017-01-05 05:20:27 +00008905 Builder.defineMacro("__AVR__");
Dylan McKayecb6e7b2017-02-07 06:04:18 +00008906
8907 if (!this->CPU.empty()) {
8908 auto It = std::find_if(AVRMcus.begin(), AVRMcus.end(),
8909 [&](const MCUInfo &Info) { return Info.Name == this->CPU; });
8910
8911 if (It != AVRMcus.end())
8912 Builder.defineMacro(It->DefineName);
8913 }
Dylan McKay924fa3a2017-01-05 05:20:27 +00008914 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008915
Dylan McKay924fa3a2017-01-05 05:20:27 +00008916 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
8917 return None;
8918 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008919
Dylan McKay924fa3a2017-01-05 05:20:27 +00008920 BuiltinVaListKind getBuiltinVaListKind() const override {
8921 return TargetInfo::VoidPtrBuiltinVaList;
8922 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008923
Dylan McKay924fa3a2017-01-05 05:20:27 +00008924 const char *getClobbers() const override {
8925 return "";
8926 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008927
Dylan McKay924fa3a2017-01-05 05:20:27 +00008928 ArrayRef<const char *> getGCCRegNames() const override {
8929 static const char * const GCCRegNames[] = {
8930 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
8931 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
8932 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
Dylan McKay95aa2652017-01-05 07:17:46 +00008933 "r24", "r25", "X", "Y", "Z", "SP"
Dylan McKay924fa3a2017-01-05 05:20:27 +00008934 };
8935 return llvm::makeArrayRef(GCCRegNames);
8936 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008937
Dylan McKay924fa3a2017-01-05 05:20:27 +00008938 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8939 return None;
8940 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008941
Dylan McKay924fa3a2017-01-05 05:20:27 +00008942 ArrayRef<TargetInfo::AddlRegName> getGCCAddlRegNames() const override {
8943 static const TargetInfo::AddlRegName AddlRegNames[] = {
8944 { { "r26", "r27"}, 26 },
8945 { { "r28", "r29"}, 27 },
8946 { { "r30", "r31"}, 28 },
8947 { { "SPL", "SPH"}, 29 },
8948 };
8949 return llvm::makeArrayRef(AddlRegNames);
8950 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008951
Dylan McKay924fa3a2017-01-05 05:20:27 +00008952 bool validateAsmConstraint(const char *&Name,
8953 TargetInfo::ConstraintInfo &Info) const override {
Dylan McKayd31534c2017-02-06 09:01:59 +00008954 // There aren't any multi-character AVR specific constraints.
8955 if (StringRef(Name).size() > 1) return false;
8956
8957 switch (*Name) {
8958 default: return false;
8959 case 'a': // Simple upper registers
8960 case 'b': // Base pointer registers pairs
8961 case 'd': // Upper register
8962 case 'l': // Lower registers
8963 case 'e': // Pointer register pairs
8964 case 'q': // Stack pointer register
8965 case 'r': // Any register
8966 case 'w': // Special upper register pairs
8967 case 't': // Temporary register
8968 case 'x': case 'X': // Pointer register pair X
8969 case 'y': case 'Y': // Pointer register pair Y
8970 case 'z': case 'Z': // Pointer register pair Z
8971 Info.setAllowsRegister();
8972 return true;
8973 case 'I': // 6-bit positive integer constant
8974 Info.setRequiresImmediate(0, 63);
8975 return true;
8976 case 'J': // 6-bit negative integer constant
8977 Info.setRequiresImmediate(-63, 0);
8978 return true;
8979 case 'K': // Integer constant (Range: 2)
8980 Info.setRequiresImmediate(2);
8981 return true;
8982 case 'L': // Integer constant (Range: 0)
8983 Info.setRequiresImmediate(0);
8984 return true;
8985 case 'M': // 8-bit integer constant
8986 Info.setRequiresImmediate(0, 0xff);
8987 return true;
8988 case 'N': // Integer constant (Range: -1)
8989 Info.setRequiresImmediate(-1);
8990 return true;
8991 case 'O': // Integer constant (Range: 8, 16, 24)
8992 Info.setRequiresImmediate({8, 16, 24});
8993 return true;
8994 case 'P': // Integer constant (Range: 1)
8995 Info.setRequiresImmediate(1);
8996 return true;
8997 case 'R': // Integer constant (Range: -6 to 5)
8998 Info.setRequiresImmediate(-6, 5);
8999 return true;
9000 case 'G': // Floating point constant
9001 case 'Q': // A memory address based on Y or Z pointer with displacement.
9002 return true;
9003 }
9004
Dylan McKay924fa3a2017-01-05 05:20:27 +00009005 return false;
9006 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00009007
Dylan McKay924fa3a2017-01-05 05:20:27 +00009008 IntType getIntTypeByWidth(unsigned BitWidth,
9009 bool IsSigned) const final {
9010 // AVR prefers int for 16-bit integers.
9011 return BitWidth == 16 ? (IsSigned ? SignedInt : UnsignedInt)
9012 : TargetInfo::getIntTypeByWidth(BitWidth, IsSigned);
9013 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00009014
Dylan McKay924fa3a2017-01-05 05:20:27 +00009015 IntType getLeastIntTypeByWidth(unsigned BitWidth,
9016 bool IsSigned) const final {
9017 // AVR uses int for int_least16_t and int_fast16_t.
9018 return BitWidth == 16
9019 ? (IsSigned ? SignedInt : UnsignedInt)
9020 : TargetInfo::getLeastIntTypeByWidth(BitWidth, IsSigned);
9021 }
Dylan McKayecb6e7b2017-02-07 06:04:18 +00009022
9023 bool setCPU(const std::string &Name) override {
9024 bool IsFamily = llvm::StringSwitch<bool>(Name)
9025 .Case("avr1", true)
9026 .Case("avr2", true)
9027 .Case("avr25", true)
9028 .Case("avr3", true)
9029 .Case("avr31", true)
9030 .Case("avr35", true)
9031 .Case("avr4", true)
9032 .Case("avr5", true)
9033 .Case("avr51", true)
9034 .Case("avr6", true)
9035 .Case("avrxmega1", true)
9036 .Case("avrxmega2", true)
9037 .Case("avrxmega3", true)
9038 .Case("avrxmega4", true)
9039 .Case("avrxmega5", true)
9040 .Case("avrxmega6", true)
9041 .Case("avrxmega7", true)
9042 .Case("avrtiny", true)
9043 .Default(false);
9044
9045 if (IsFamily) this->CPU = Name;
9046
9047 bool IsMCU = std::find_if(AVRMcus.begin(), AVRMcus.end(),
9048 [&](const MCUInfo &Info) { return Info.Name == Name; }) != AVRMcus.end();
9049
9050 if (IsMCU) this->CPU = Name;
9051
9052 return IsFamily || IsMCU;
9053 }
9054
9055protected:
9056 std::string CPU;
Dylan McKay924fa3a2017-01-05 05:20:27 +00009057};
9058
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009059} // end anonymous namespace
9060
Chris Lattner5ba61f02006-10-14 07:39:34 +00009061//===----------------------------------------------------------------------===//
9062// Driver code
9063//===----------------------------------------------------------------------===//
9064
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009065static TargetInfo *AllocateTarget(const llvm::Triple &Triple,
9066 const TargetOptions &Opts) {
Daniel Dunbar52322032009-08-18 05:47:58 +00009067 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00009068
Daniel Dunbar52322032009-08-18 05:47:58 +00009069 switch (Triple.getArch()) {
9070 default:
Craig Topperf1186c52014-05-08 06:41:40 +00009071 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00009072
Tim Northover2a0783d2014-05-30 14:14:07 +00009073 case llvm::Triple::xcore:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009074 return new XCoreTargetInfo(Triple, Opts);
Tim Northover2a0783d2014-05-30 14:14:07 +00009075
9076 case llvm::Triple::hexagon:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009077 return new HexagonTargetInfo(Triple, Opts);
Tim Northover2a0783d2014-05-30 14:14:07 +00009078
Jacques Pienaard964cc22016-03-28 21:02:54 +00009079 case llvm::Triple::lanai:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009080 return new LanaiTargetInfo(Triple, Opts);
Jacques Pienaard964cc22016-03-28 21:02:54 +00009081
Tim Northover2a0783d2014-05-30 14:14:07 +00009082 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00009083 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009084 return new DarwinAArch64TargetInfo(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00009085
9086 switch (os) {
Ed Schoutenea9448e2015-10-15 15:07:07 +00009087 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009088 return new CloudABITargetInfo<AArch64leTargetInfo>(Triple, Opts);
Ed Maste6a9eda52014-11-13 16:55:42 +00009089 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009090 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Petr Hosek9834fcd2016-10-24 22:55:57 +00009091 case llvm::Triple::Fuchsia:
9092 return new FuchsiaTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00009093 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009094 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple, Opts);
James Molloy5e73df52014-04-16 15:06:20 +00009095 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009096 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Brad Smith9aa2bf22017-02-21 23:13:09 +00009097 case llvm::Triple::OpenBSD:
9098 return new OpenBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00009099 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009100 return new AArch64leTargetInfo(Triple, Opts);
James Molloy5e73df52014-04-16 15:06:20 +00009101 }
9102
Christian Pirker9b019ae2014-02-25 13:51:00 +00009103 case llvm::Triple::aarch64_be:
9104 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00009105 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009106 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Petr Hosek9834fcd2016-10-24 22:55:57 +00009107 case llvm::Triple::Fuchsia:
9108 return new FuchsiaTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00009109 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009110 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00009111 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009112 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00009113 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009114 return new AArch64beTargetInfo(Triple, Opts);
Tim Northover9bb857a2013-01-31 12:13:10 +00009115 }
9116
Daniel Dunbar52322032009-08-18 05:47:58 +00009117 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00009118 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00009119 if (Triple.isOSBinFormatMachO())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009120 return new DarwinARMTargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00009121
Daniel Dunbar52322032009-08-18 05:47:58 +00009122 switch (os) {
Ed Schoutenc6d1a732016-09-05 18:38:34 +00009123 case llvm::Triple::CloudABI:
9124 return new CloudABITargetInfo<ARMleTargetInfo>(Triple, Opts);
Rafael Espindolaad8fed52010-06-10 00:46:51 +00009125 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009126 return new LinuxTargetInfo<ARMleTargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009127 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009128 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009129 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009130 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00009131 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009132 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00009133 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009134 return new BitrigTargetInfo<ARMleTargetInfo>(Triple, Opts);
Douglas Gregor9fabd852011-07-01 22:41:14 +00009135 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009136 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00009137 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009138 return new NaClTargetInfo<ARMleTargetInfo>(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00009139 case llvm::Triple::Win32:
9140 switch (Triple.getEnvironment()) {
Yaron Keren321249c2015-07-15 13:32:23 +00009141 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009142 return new CygwinARMTargetInfo(Triple, Opts);
Yaron Keren321249c2015-07-15 13:32:23 +00009143 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009144 return new MinGWARMTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00009145 case llvm::Triple::Itanium:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009146 return new ItaniumWindowsARMleTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00009147 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00009148 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009149 return new MicrosoftARMleTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00009150 }
Daniel Dunbar52322032009-08-18 05:47:58 +00009151 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009152 return new ARMleTargetInfo(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009153 }
9154
9155 case llvm::Triple::armeb:
9156 case llvm::Triple::thumbeb:
9157 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009158 return new DarwinARMTargetInfo(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009159
9160 switch (os) {
9161 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009162 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009163 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009164 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009165 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009166 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009167 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009168 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009169 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009170 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009171 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009172 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009173 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009174 return new NaClTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009175 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009176 return new ARMbeTargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009177 }
Eli Friedmanb5366062008-05-20 14:21:01 +00009178
Dylan McKay924fa3a2017-01-05 05:20:27 +00009179 case llvm::Triple::avr:
9180 return new AVRTargetInfo(Triple, Opts);
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00009181 case llvm::Triple::bpfeb:
9182 case llvm::Triple::bpfel:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009183 return new BPFTargetInfo(Triple, Opts);
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00009184
Daniel Dunbar52322032009-08-18 05:47:58 +00009185 case llvm::Triple::msp430:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009186 return new MSP430TargetInfo(Triple, Opts);
Eli Friedmanb5366062008-05-20 14:21:01 +00009187
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00009188 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009189 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009190 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00009191 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009192 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00009193 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009194 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009195 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009196 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009197 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009198 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00009199 return new MipsTargetInfo(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009200 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00009201
9202 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009203 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009204 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00009205 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009206 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00009207 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009208 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009209 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009210 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009211 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00009212 case llvm::Triple::NaCl:
Daniel Sanders4672af62016-05-27 11:51:02 +00009213 return new NaClTargetInfo<NaClMips32TargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009214 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00009215 return new MipsTargetInfo(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009216 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00009217
Akira Hatanakabef17452011-09-20 19:21:49 +00009218 case llvm::Triple::mips64:
9219 switch (os) {
9220 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00009221 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009222 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00009223 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009224 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009225 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009226 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009227 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00009228 case llvm::Triple::OpenBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009229 return new OpenBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009230 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00009231 return new MipsTargetInfo(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009232 }
9233
9234 case llvm::Triple::mips64el:
9235 switch (os) {
9236 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00009237 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009238 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00009239 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009240 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009241 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009242 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009243 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00009244 case llvm::Triple::OpenBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009245 return new OpenBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009246 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00009247 return new MipsTargetInfo(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009248 }
9249
Ivan Krasindd7403e2011-08-24 20:22:22 +00009250 case llvm::Triple::le32:
9251 switch (os) {
Douglas Katzman78d7c542015-05-12 21:18:10 +00009252 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009253 return new NaClTargetInfo<PNaClTargetInfo>(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00009254 default:
9255 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00009256 }
9257
JF Bastien643817d2014-09-12 17:52:47 +00009258 case llvm::Triple::le64:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009259 return new Le64TargetInfo(Triple, Opts);
JF Bastien643817d2014-09-12 17:52:47 +00009260
Daniel Dunbar52322032009-08-18 05:47:58 +00009261 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00009262 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009263 return new DarwinPPC32TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009264 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00009265 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009266 return new LinuxTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009267 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009268 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009269 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009270 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00009271 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009272 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009273 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009274 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009275 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009276 return new PPC32TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009277 }
Daniel Dunbar52322032009-08-18 05:47:58 +00009278
9279 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00009280 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009281 return new DarwinPPC64TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009282 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00009283 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009284 return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009285 case llvm::Triple::Lv2:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009286 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009287 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009288 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009289 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009290 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009291 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009292 return new PPC64TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009293 }
Daniel Dunbar52322032009-08-18 05:47:58 +00009294
Bill Schmidt778d3872013-07-26 01:36:11 +00009295 case llvm::Triple::ppc64le:
9296 switch (os) {
9297 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009298 return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger22a2d992015-04-10 20:53:48 +00009299 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009300 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Bill Schmidt778d3872013-07-26 01:36:11 +00009301 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009302 return new PPC64TargetInfo(Triple, Opts);
Bill Schmidt778d3872013-07-26 01:36:11 +00009303 }
9304
Peter Collingbournec947aae2012-05-20 23:28:41 +00009305 case llvm::Triple::nvptx:
Justin Lebarb6626592017-01-05 16:53:21 +00009306 return new NVPTXTargetInfo(Triple, Opts, /*TargetPointerWidth=*/32);
Peter Collingbournec947aae2012-05-20 23:28:41 +00009307 case llvm::Triple::nvptx64:
Justin Lebarb6626592017-01-05 16:53:21 +00009308 return new NVPTXTargetInfo(Triple, Opts, /*TargetPointerWidth=*/64);
Peter Collingbournec947aae2012-05-20 23:28:41 +00009309
Tom Stellardd8e38a32015-01-06 20:34:47 +00009310 case llvm::Triple::amdgcn:
Eli Friedmand13b41e2012-10-12 23:32:00 +00009311 case llvm::Triple::r600:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009312 return new AMDGPUTargetInfo(Triple, Opts);
Eli Friedmand13b41e2012-10-12 23:32:00 +00009313
Daniel Dunbar52322032009-08-18 05:47:58 +00009314 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009315 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00009316 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009317 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009318 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009319 return new SolarisTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009320 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009321 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00009322 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009323 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009324 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009325 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009326 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009327 return new SparcV8TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009328 }
Daniel Dunbar52322032009-08-18 05:47:58 +00009329
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009330 // The 'sparcel' architecture copies all the above cases except for Solaris.
9331 case llvm::Triple::sparcel:
9332 switch (os) {
9333 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009334 return new LinuxTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009335 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009336 return new NetBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009337 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009338 return new OpenBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009339 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009340 return new RTEMSTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009341 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009342 return new SparcV8elTargetInfo(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009343 }
9344
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009345 case llvm::Triple::sparcv9:
9346 switch (os) {
9347 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009348 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009349 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009350 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009351 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009352 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009353 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009354 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009355 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009356 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009357 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009358 return new SparcV9TargetInfo(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009359 }
9360
Ulrich Weigand47445072013-05-06 16:26:41 +00009361 case llvm::Triple::systemz:
9362 switch (os) {
9363 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009364 return new LinuxTargetInfo<SystemZTargetInfo>(Triple, Opts);
Ulrich Weigand47445072013-05-06 16:26:41 +00009365 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009366 return new SystemZTargetInfo(Triple, Opts);
Ulrich Weigand47445072013-05-06 16:26:41 +00009367 }
9368
Eli Friedmana9c3d712009-08-19 20:47:07 +00009369 case llvm::Triple::tce:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009370 return new TCETargetInfo(Triple, Opts);
Eli Friedmana9c3d712009-08-19 20:47:07 +00009371
Pekka Jaaskelainen67354482016-11-16 15:22:31 +00009372 case llvm::Triple::tcele:
9373 return new TCELETargetInfo(Triple, Opts);
9374
Daniel Dunbar52322032009-08-18 05:47:58 +00009375 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00009376 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009377 return new DarwinI386TargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00009378
Daniel Dunbar52322032009-08-18 05:47:58 +00009379 switch (os) {
Ed Schouten7893e682015-06-13 21:33:49 +00009380 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009381 return new CloudABITargetInfo<X86_32TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009382 case llvm::Triple::Linux: {
9383 switch (Triple.getEnvironment()) {
9384 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009385 return new LinuxTargetInfo<X86_32TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009386 case llvm::Triple::Android:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009387 return new AndroidX86_32TargetInfo(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009388 }
9389 }
Daniel Dunbar52322032009-08-18 05:47:58 +00009390 case llvm::Triple::DragonFly:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009391 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009392 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009393 return new NetBSDI386TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009394 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009395 return new OpenBSDI386TargetInfo(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00009396 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009397 return new BitrigI386TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009398 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009399 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00009400 case llvm::Triple::KFreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009401 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009402 case llvm::Triple::Minix:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009403 return new MinixTargetInfo<X86_32TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009404 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009405 return new SolarisTargetInfo<X86_32TargetInfo>(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009406 case llvm::Triple::Win32: {
9407 switch (Triple.getEnvironment()) {
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009408 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009409 return new CygwinX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009410 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009411 return new MinGWX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00009412 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009413 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00009414 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009415 return new MicrosoftX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009416 }
9417 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00009418 case llvm::Triple::Haiku:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009419 return new HaikuX86_32TargetInfo(Triple, Opts);
Douglas Gregor9fabd852011-07-01 22:41:14 +00009420 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009421 return new RTEMSX86_32TargetInfo(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00009422 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009423 return new NaClTargetInfo<X86_32TargetInfo>(Triple, Opts);
Alexey Bataevc99b0492015-11-25 09:24:26 +00009424 case llvm::Triple::ELFIAMCU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009425 return new MCUX86_32TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009426 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009427 return new X86_32TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009428 }
9429
9430 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009431 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009432 return new DarwinX86_64TargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00009433
Daniel Dunbar52322032009-08-18 05:47:58 +00009434 switch (os) {
Ed Schoutenf33c6072015-03-11 08:42:46 +00009435 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009436 return new CloudABITargetInfo<X86_64TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009437 case llvm::Triple::Linux: {
9438 switch (Triple.getEnvironment()) {
9439 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009440 return new LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009441 case llvm::Triple::Android:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009442 return new AndroidX86_64TargetInfo(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009443 }
9444 }
Chris Lattner002ba6b2010-01-09 05:41:14 +00009445 case llvm::Triple::DragonFly:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009446 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009447 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009448 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009449 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009450 return new OpenBSDX86_64TargetInfo(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00009451 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009452 return new BitrigX86_64TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009453 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009454 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Petr Hosek9834fcd2016-10-24 22:55:57 +00009455 case llvm::Triple::Fuchsia:
9456 return new FuchsiaTargetInfo<X86_64TargetInfo>(Triple, Opts);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00009457 case llvm::Triple::KFreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009458 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009459 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009460 return new SolarisTargetInfo<X86_64TargetInfo>(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009461 case llvm::Triple::Win32: {
9462 switch (Triple.getEnvironment()) {
Yaron Kerend030d112015-07-22 17:38:19 +00009463 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009464 return new CygwinX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009465 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009466 return new MinGWX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009467 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00009468 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009469 return new MicrosoftX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009470 }
9471 }
Reid Kleckner330fb172016-05-11 16:19:05 +00009472 case llvm::Triple::Haiku:
9473 return new HaikuTargetInfo<X86_64TargetInfo>(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00009474 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009475 return new NaClTargetInfo<X86_64TargetInfo>(Triple, Opts);
Alex Rosenberg12207fa2015-01-27 14:47:44 +00009476 case llvm::Triple::PS4:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009477 return new PS4OSTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009478 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009479 return new X86_64TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009480 }
Guy Benyeib798fc92012-12-11 21:38:14 +00009481
Douglas Katzman78d7c542015-05-12 21:18:10 +00009482 case llvm::Triple::spir: {
9483 if (Triple.getOS() != llvm::Triple::UnknownOS ||
9484 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
9485 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009486 return new SPIR32TargetInfo(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00009487 }
9488 case llvm::Triple::spir64: {
9489 if (Triple.getOS() != llvm::Triple::UnknownOS ||
9490 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
9491 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009492 return new SPIR64TargetInfo(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00009493 }
Dan Gohmanc2853072015-09-03 22:51:53 +00009494 case llvm::Triple::wasm32:
Dan Gohman839f2152017-01-17 21:46:38 +00009495 if (Triple.getSubArch() != llvm::Triple::NoSubArch ||
9496 Triple.getVendor() != llvm::Triple::UnknownVendor ||
9497 Triple.getOS() != llvm::Triple::UnknownOS ||
9498 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment ||
9499 !(Triple.isOSBinFormatELF() || Triple.isOSBinFormatWasm()))
Dan Gohmanc2853072015-09-03 22:51:53 +00009500 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009501 return new WebAssemblyOSTargetInfo<WebAssembly32TargetInfo>(Triple, Opts);
Dan Gohmanc2853072015-09-03 22:51:53 +00009502 case llvm::Triple::wasm64:
Dan Gohman839f2152017-01-17 21:46:38 +00009503 if (Triple.getSubArch() != llvm::Triple::NoSubArch ||
9504 Triple.getVendor() != llvm::Triple::UnknownVendor ||
9505 Triple.getOS() != llvm::Triple::UnknownOS ||
9506 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment ||
9507 !(Triple.isOSBinFormatELF() || Triple.isOSBinFormatWasm()))
Dan Gohmanc2853072015-09-03 22:51:53 +00009508 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009509 return new WebAssemblyOSTargetInfo<WebAssembly64TargetInfo>(Triple, Opts);
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00009510
9511 case llvm::Triple::renderscript32:
9512 return new LinuxTargetInfo<RenderScript32TargetInfo>(Triple, Opts);
9513 case llvm::Triple::renderscript64:
9514 return new LinuxTargetInfo<RenderScript64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009515 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00009516}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009517
9518/// CreateTargetInfo - Return the target info object for the specified target
Eric Christophere4f73b32015-08-07 19:07:08 +00009519/// options.
Alp Toker80758082014-07-06 05:26:44 +00009520TargetInfo *
9521TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
Saleem Abdulrasool10a49722016-04-08 16:52:00 +00009522 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00009523 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009524
9525 // Construct the target
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009526 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple, *Opts));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009527 if (!Target) {
9528 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00009529 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009530 }
Alp Toker80758082014-07-06 05:26:44 +00009531 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009532
Daniel Dunbaracde99e2009-12-18 18:42:37 +00009533 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00009534 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
9535 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00009536 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00009537 }
9538
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009539 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00009540 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
9541 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00009542 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009543 }
9544
Rafael Espindolaeb265472013-08-21 21:59:03 +00009545 // Set the fp math unit.
9546 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
9547 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00009548 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00009549 }
9550
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009551 // Compute the default target features, we need the target to handle this
9552 // because features may have dependencies on one another.
9553 llvm::StringMap<bool> Features;
Eric Christopher007b0a02015-08-28 22:32:01 +00009554 if (!Target->initFeatureMap(Features, Diags, Opts->CPU,
9555 Opts->FeaturesAsWritten))
Eric Christopher6b454372015-08-25 13:45:24 +00009556 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009557
9558 // Add the features to the compile options.
Douglas Gregorf8715de2012-11-16 04:24:59 +00009559 Opts->Features.clear();
Aaron Ballmanb226d3d2015-08-12 13:38:59 +00009560 for (const auto &F : Features)
9561 Opts->Features.push_back((F.getValue() ? "+" : "-") + F.getKey().str());
9562
Eric Christopher3ff21b32013-10-16 21:26:26 +00009563 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00009564 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009565
Yaxun Liu39cf40f2016-05-16 17:06:34 +00009566 Target->setSupportedOpenCLOpts();
Alexey Bader0ea07532016-11-01 15:50:52 +00009567 Target->setOpenCLExtensionOpts();
Yaxun Liu39cf40f2016-05-16 17:06:34 +00009568
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00009569 if (!Target->validateTarget(Diags))
9570 return nullptr;
9571
Ahmed Charles9a16beb2014-03-07 19:33:25 +00009572 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009573}